Burlak писал(а) 11. Декабря 2008 :: 13:48:>kiruha. Ответ #1 - Сегодня :: 15:14
>Не нужно создавать файл dbc.
Вопрос спорный. В документации написано, что при открытии DATABESE хранимые процедуры переписываются на рабочую станцию. Но моя ошибка заключается в том, что в тексте ХП применяю запрещенные конструкции, в частности, макроподстановку. Отсюда и ошибка, т.е.
*!* #DEFINE СПРАВОЧНИК [SC156]
&&-- Построим id Элементов, входящих в узел "Продукция"
*!* Select = " SELECT DISTINCT спр1.id as id"
*!* From = " FROM "+СПРАВОЧНИК+" as спр1, "+СПРАВОЧНИК+" as спр2"
*!* Where = " WHERE спр2.id=спр1.PARENTID AND спр1.ISMARK <> '*' AND спр2.ISFOLDER=1 AND UPPER(спр2.Descr) LIKE '"+UPPER(str_Узел)+"'"
*!* ТекстЗапроса = Select+From+Where+" INTO CURSOR cur_Элементы"
*!* &ТекстЗапроса &&-- Ошибка
а так ок
SELECT DISTINCT спр1.id as id;
FROM SC156 as спр1, SC156 as спр2;
WHERE спр2.id=спр1.PARENTID AND спр1.ISMARK <> '*' AND спр2.ISFOLDER=1 AND UPPER(спр2.Descr) LIKE 'ПРОДУКЦИЯ';
INTO CURSOR cur_Элементы
но это меня не устраивает
1.Ну я использую хранимые без dbc и без проблем.
Приведенная обработка - работает.
2. В файл dbc нужно добавлять таблицы через Fox - у тебя "пустая база"
3.Макроподстановку применять не рекомендуется. Для этого есть скобки.
Пример
SELECT RECNO() FROM (NameFile) WHERE (KEYVALUE)=PustoySymbol
4. Алгоритм не использует индекс, поэтому хуже стандартного УложитьСписокОбъектов,
так как в цикле происходит полное чтение таблицы на каждом шаге цикла
5.
Готовый работающий запрос для выборки (до 6 уровня, т.к. мне больше не надо, и не оптимизированный по индексу
- было лень)
//
Функция севдоним)
//КлючСловоОтбора IN или =
СтрОтбораИД=" "+КлючСловоОтбора+" "+ВыбТоварыСтр;
ТекстЗапроса = "";
ТекстЗапроса =ТекстЗапроса+ "
|
|SELECT
| Спр1.ID as Товар
|FROM $Справочник."+ВидСправочника+" as Спр1
|WHERE (Спр1.ISFOLDER=2) AND (Спр1.ID "+СтрОтбораИД+")
|";
Если Уровень>1 Тогда
ТекстЗапроса =ТекстЗапроса+ "
|UNION ALL
|
|SELECT
| Спр2_2.ID
|FROM $Справочник."+ВидСправочника+" as Спр2_2
|INNER JOIN $Справочник."+ВидСправочника+" as Спр1_2 ON (Спр2_2.ParentID = Спр1_2.ID) AND (Спр1_2.ISFOLDER=1) AND (Спр1_2.ID "+СтрОтбораИД+")
|WHERE Спр2_2.ISFOLDER=2
|";
КонецЕсли;
Если Уровень>2 Тогда
ТекстЗапроса =ТекстЗапроса +"
|UNION ALL
|
| SELECT
| Спр3.ID
|FROM $Справочник."+ВидСправочника+" as Спр3
|INNER JOIN $Справочник."+ВидСправочника+" as Спр2 ON (Спр3.ParentID = Спр2.ID) AND (Спр2.ISFOLDER=1)
|INNER JOIN $Справочник."+ВидСправочника+" as Спр1 ON (Спр2.ParentID = Спр1.ID) AND (Спр1.ISFOLDER=1) AND (Спр1.ID "+СтрОтбораИД+")
|WHERE Спр3.ISFOLDER=2
|";
КонецЕсли;
Если Уровень>3 Тогда
ТекстЗапроса =ТекстЗапроса +"
|UNION ALL
|
| SELECT
| Спр4.ID
|FROM $Справочник."+ВидСправочника+" as Спр4
|INNER JOIN $Справочник."+ВидСправочника+" as Спр3 ON (Спр4.ParentID = Спр3.ID) AND (Спр3.ISFOLDER=1)
|INNER JOIN $Справочник."+ВидСправочника+" as Спр2 ON (Спр3.ParentID = Спр2.ID) AND (Спр2.ISFOLDER=1)
|INNER JOIN $Справочник."+ВидСправочника+" as Спр1 ON (Спр2.ParentID = Спр1.ID) AND (Спр1.ISFOLDER=1) AND (Спр1.ID "+СтрОтбораИД+")
|WHERE Спр4.ISFOLDER=2
|";
КонецЕсли;
Если Уровень>4 Тогда
ТекстЗапроса =ТекстЗапроса +"
|UNION ALL
|
|SELECT
| Спр5.ID
|FROM $Справочник."+ВидСправочника+" as Спр5
|INNER JOIN $Справочник."+ВидСправочника+" as Спр4 ON (Спр5.ParentID = Спр4.ID) AND (Спр4.ISFOLDER=1)
|INNER JOIN $Справочник."+ВидСправочника+" as Спр3 ON (Спр4.ParentID = Спр3.ID) AND (Спр3.ISFOLDER=1)
|INNER JOIN $Справочник."+ВидСправочника+" as Спр2 ON (Спр3.ParentID = Спр2.ID) AND (Спр2.ISFOLDER=1)
|INNER JOIN $Справочник."+ВидСправочника+" as Спр1 ON (Спр2.ParentID = Спр1.ID) AND (Спр1.ISFOLDER=1) AND (Спр1.ID "+СтрОтбораИД+")
|WHERE Спр5.ISFOLDER=2
|";
КонецЕсли;
Если Уровень>5 Тогда
ТекстЗапроса =ТекстЗапроса +"
|UNION ALL
|
| SELECT
| Спр6.ID
|FROM $Справочник."+ВидСправочника+" as Спр6
|INNER JOIN $Справочник."+ВидСправочника+" as Спр5 ON (Спр6.ParentID = Спр5.ID) AND (Спр5.ISFOLDER=1)
|INNER JOIN $Справочник."+ВидСправочника+" as Спр4 ON (Спр5.ParentID = Спр4.ID) AND (Спр4.ISFOLDER=1)
|INNER JOIN $Справочник."+ВидСправочника+" as Спр3 ON (Спр4.ParentID = Спр3.ID) AND (Спр3.ISFOLDER=1)
|INNER JOIN $Справочник."+ВидСправочника+" as Спр2 ON (Спр3.ParentID = Спр2.ID) AND (Спр2.ISFOLDER=1)
|INNER JOIN $Справочник."+ВидСправочника+" as Спр1 ON (Спр2.ParentID = Спр1.ID) AND (Спр1.ISFOLDER=1) AND (Спр1.ID "+СтрОтбораИД+")
|WHERE Спр6.ISFOLDER=2
|";
КонецЕсли;
// Сообщить(ТекстЗапроса);
Возврат ТекстЗапроса;
КонецФункции
6. Использовать хранимую - в принципе идея правильная, но только если будет задействован индекс
7. После компиляции в каталоге базы (на сервере) появляется файл ИмяПроцедуры.FXP