Имя: Пароль:
1C
1C 7.7
v7: ПрямойЗапрос подчиненных документов
0 Dolly_EV
 
17.04.12
08:06
Вобщем запутался я, требуется хелп :(

[code]        // ПрямойЗапрос ВТ $ПодчиненныеДокументы
       ЗапросПодч = СоздатьОбъект("ПрямойЗапрос");
       ЗапросПодч.БухгалтерскийУчет = 0;
       ЗапросПодч.ОперативныйУчет = 0;
       ЗапросПодч.ПериодическиеЗначения = 0;
       ЗапросПодч.РежимОтладки = 0;
       ЗапросПодч.Текст="
       |ВЫБРАТЬ
       |    ПодчДок.ТекущийДокумент КАК [ДокПодч $Документ]
       |    ,ПодчДок.ВидДокумента КАК [ДокПодч_вид $ВидДокумента]
       |ИЗ
       |    $ПодчиненныеДокументы.Потомки(@ДокОсн) КАК ПодчДок
       |ГДЕ";
       Если глЭтоSQL=1    Тогда
           ЗапросПодч.Текст=ЗапросПодч.Текст+"
           |    ВидДокумента = @лВидДок";
           лЗначВидДок=глМетаДата.ИДДокумента("ПриходныйОрдер");
       Иначе
           ЗапросПодч.Текст=ЗапросПодч.Текст+"
           |    СОКРЛ(ВидДокумента) = @лВидДок";
           лЗначВидДок=глМетаДата.ЧислоВСтроку(глМетаДата.ИДДокумента("ПриходныйОрдер"),36);
       КонецЕсли;
       
       ЗапросПодч.ОписаниеПараметра("ДокОсн","Неопределенный");
       ЗапросПодч.ОписаниеПараметра("лВидДок","ВидДокумента");
       ЗапросПодч.ПодготовитьПараметризованныйЗапрос();
       
       ВремяВып = _GetPerformanceCounter();
       тзДок.ВыбратьСтроки();
       Пока тзДок.ПолучитьСтроку()=1 Цикл
           ЗапросПодч.ПодставлятьПараметры("ДокОсн",тзДок.Док);
           ЗапросПодч.ПодставлятьПараметры("лВидДок",лЗначВидДок);
           тзВрем = ЗапросПодч.ВыполнитьПараметризованныйЗапрос();
           тзВрем.ВыбратьСтроки();
           Пока тзВрем.ПолучитьСтроку()=1 Цикл
               тзПодч.НоваяСтрока();
               тзПодч.Док=тзДок.Док;
               тзПодч.ДокПодч=тзВрем.ДокПодч;
               тзПодч.ВсегоПодч=тзПодч.ДокПодч.Сумма;
           КонецЦикла;
       КонецЦикла;
[/code]

Для СКЛя условие ГДЕ не срабатывает - выдает пустую таблицу с подчиненными :(
Пните в нужном направлении?? и как-нибудь так пните, чтобы в параметр Запроса можно было просто передать "ПриходныйОрдер" и все взлетело?
1 kalleka
 
17.04.12
09:30
(0) Велосипед изобретаешь, все давно есть, куча обработок по структуре подчиненности
2 kalleka
 
17.04.12
09:31
(0) тебе для других целей, не посмотрел спросоня, сорри
3 Mikeware
 
17.04.12
09:35
Функция  глВыбратьПодчиненные(ДокОснование,ВидПодчДокумента="", НачДата="",КонДата="", флПроведенные="") Экспорт
       ТекстЗапроса="
   |SELECT
   |    distinct
   |    Жур.IDDoc [Док $Документ],
   |    Жур.IDDocDef Док_вид
   |FROM
   |    _1SJourn Жур (nolock)
   |INNER JOIN
   |    _1SCRDOC Отбор ON Отбор.ChildID = Жур.IDDoc AND
   |                      Отбор. MDID = 0 AND
   |                    Отбор.ParentVal = :ВыбОснование* ";
   Если ПустоеЗначение(НачДата)=0 Тогда
       ТекстЗапроса=ТекстЗапроса+"
   |                    AND  Отбор.Child_Date_Time_IDDoc >:НачДата ";
   КонецЕсли;
   Если ПустоеЗначение(КонДата)=0 Тогда
       ТекстЗапроса=ТекстЗапроса+"
   |                    AND  Отбор.Child_Date_Time_IDDoc < :КонДата~";
   КонецЕсли;
ТекстЗапроса=ТекстЗапроса+"
   |where  Жур.ismark=0";
   Если ПустоеЗначение(флПроведенные)=0 Тогда
       ТекстЗапроса=ТекстЗапроса+"
       |    and Жур.closed&1=:Проведенные";
   КонецЕсли;
   Если ПустоеЗначение(ВидПодчДокумента)=0 Тогда
   ТекстЗапроса=ТекстЗапроса+"
   |    and Жур.IDDocDef=$ВидДокумента."+ВидПодчДокумента;
   КонецЕсли;
   ТекстЗапроса=ТекстЗапроса+"    
   |order by Жур.iddoc
   |";
   рс=СоздатьОбъект("ODBCRecordset");
   Если ПустоеЗначение(НачДата)=0 Тогда
       рс.УстановитьТекстовыйПараметр("НачДата", НачДата);
   КонецЕсли;
   Если ПустоеЗначение(КонДата)=0 Тогда
       рс.УстановитьТекстовыйПараметр("КонДата",КонДата);
   КонецЕсли;
   рс.УстановитьТекстовыйПараметр("ВыбОснование",ДокОснование);
   Если ПустоеЗначение(флПроведенные)=0 Тогда
       рс.УстановитьТекстовыйПараметр("Проведенные",флПроведенные);
   КонецЕсли;
   результат=рс.ВыполнитьИнструкцию(текстЗапроса);
   Возврат результат;
КонецФункции // глВыбратьПодчиненные
4 Dolly_EV
 
17.04.12
09:59
(3) Не канает.. надо ПАРАМЕТРИЗОВАННЫЙ запрос.. Т.к. он выполняется на форме в некоторых местах, твой вариант будет медленный
5 Mikeware
 
17.04.12
10:01
Если у тебя условия все время одинаковые - переделать в параметризованный - раз плюнуть.
а тут функция на кучу случаев жизни - найти такие подчиненные, сякие, проведенные-непроведенные, и т.п....
6 Dolly_EV
 
17.04.12
10:02
(3) это я из отчета кусок вставил, а на самом деле с такой же функцией в глобальнике борюсь
7 Dolly_EV
 
17.04.12
10:05
(3) ну и универсальность (SQL/DBF)
8 Mikeware
 
17.04.12
10:17
(7) я не юзаю файловые базы в принципе, поэтому передо мной такого вопроса не стоит. Хотя стремление похвальное
9 Dolly_EV
 
17.04.12
10:54
(8) А если у тебя, к примеру, клиент, у которого один единственный какой-нить Celeron 1.6/DDR-2 512Мб/HDD 80Гб/ Ты ему на эту железяку Вин2003+МССкл ставишь?))
10 Mikeware
 
17.04.12
11:09
(9) у меня нет "клиентов" :-) мне легче
11 Dolly_EV
 
17.04.12
14:13
(0) все, вопрос закрыт. База SQL, на которой тесты гонял, была с битой таблицей _1SCRDOC. Так что все работает.
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший