Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Как сделать выборку с фильтром по документам? (число прочтений - 3450 )
ReLock
Full Member
***
Отсутствует



Сообщений: 155
Местоположение: За компом
Зарегистрирован: 01. Февраля 2007
Пол: Мужской
Как сделать выборку с фильтром по документам?
02. Февраля 2007 :: 08:08
Печать  
Сразу предупреждаю: БАЗА DBF-формата

В общем запрос, примерно такой:
Код
Выбрать все
Текст = "
|SELECT DISTINCT
|$ДокРевизия.Товар as [Товар $Справочник.Номенклатура]
|FROM
|1SJOURN Журн
|JOIN
|$ДокументСтроки.Ревизия ДокРевизия
|ON
|Журн.IDDOC = ДокРевизия.IDDOC
|WHERE
|Журн.Closed = 1 AND $ДокРевизия.IDDOC IN (SELECT Val FROM СписДок) 



Есть список документов. Как мне их правильно "засунуть" в СписДок?
« Последняя редакция: 02. Февраля 2007 :: 12:39 - ReLock »  
Наверх
 
IP записан
 
pavel_tr
Senior Member
****
Отсутствует



Сообщений: 279
Местоположение: Казань
Зарегистрирован: 14. Октября 2006
Пол: Мужской
Re: Как сделать выборку с фильтром по документам?
Ответ #1 - 02. Февраля 2007 :: 08:36
Печать  
Засунуть документы в список значений сз и потом сделать УложитьСписокОбъектов(сз, "СписДок"); И писать ДокРевизия.id IN (SELECT Val FROM СписДок)

Ещё вопрос, смысл делать select из 1SJOURN а не из дока напрямую, если не накладываешь условие по периоду? Или критично условие проведения дока?
  
Наверх
 
IP записан
 
DrACe
1c++ donor
1c++ power user
Отсутствует


1С++ любитель

Сообщений: 447
Местоположение: г. Новосибирск
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Как сделать выборку с фильтром по документам?
Ответ #2 - 02. Февраля 2007 :: 09:19
Печать  
еще раз говорю: читаем документацию на метод OLEDBCommand::УложитьСписокОбъектов()
на всякий случай приведу из нее (документации) выдержку:
Цитата:
Синтаксис: УложитьСписокОбъектов(Объект, ИмяТабл, ВидСпр)

Параметры:
Объект - тип: Справочник/Документ/СписокЗначений (содержащий элементы типа Справочник, Документ). Объект, который необходимо уложить во временную таблицу.
ИмяТабл - тип: Строка. Возвращаемое значение. Имя временной таблицы, которое будет сгенерировано методом и возвращено через этот параметр.
ВидСпр - тип: Строка. Вид справочника для иерархического включения элементов.
Описание: сохраняет Объект (или список объектов, если передан список значений) во временную таблицу. Имя временной таблицы генерируется методом и возвращается через второй параметр (именем является GUID). Временная таблица имеет поле VAL CHAR(9) и служебное поле ISFOLDER NUMERIC(1,0).

Если указан параметр ВидСпр (вид многоуровневого справочника), то таблица будет содержать элементы (без групп), иерархически принадлежащие группам (Подобно оператору "в" встроенного языка запросов 1С).

Уничтожать временные таблицы явным образом не обязательно ( прим: DROP TABLE MyTmpTbl ) - все временные таблицы будут уничтожены в момент закрытия команды ( Закрыть() ) или при уничтожении объекта OLEDBCommand.

Пример:

ВрТабл = "";
cmd.УложитьСписокОбъектов(ТекГруппа, ВрТабл, "Номенклатура");
Сообщить("Что тут: " + ВрТабл); // Например, "Что тут: 858573b1-5a6f-459e-9c75-ec63e2a1d858"

  
Наверх
 
IP записан
 
ReLock
Full Member
***
Отсутствует



Сообщений: 155
Местоположение: За компом
Зарегистрирован: 01. Февраля 2007
Пол: Мужской
Re: Как сделать выборку с фильтром по документам?
Ответ #3 - 02. Февраля 2007 :: 12:57
Печать  
pavel_tr писал(а) 02. Февраля 2007 :: 08:36:
Засунуть документы в список значений сз и потом сделать УложитьСписокОбъектов(сз, "СписДок"); И писать ДокРевизия.id IN (SELECT Val FROM СписДок)

Ещё вопрос, смысл делать select из 1SJOURN а не из дока напрямую, если не накладываешь условие по периоду? Или критично условие проведения дока?

Факт проверки проведения дока - критичен. Поэтому использую 1SJOURN.
Про метод УложитьСписокОбъектов знаю, поэтому прежде, чем писать на форум, проверил его в действии на своем примере. Привожу код:
Код
Выбрать все
База = СоздатьОбъект("OLEDBData");
Соединение = "Provider=VFPOLEDB.1;Deleted=Yes;Data Source=" + КаталогИБ()+ ";Mode=ReadWrite;Extended Properties="";User ID="";Password="";Mask Password=False;Collating Sequence=RUSSIAN;DSN=""";
Рез = База.Соединение(Соединение);
Команда = База.СоздатьКоманду();

СписДок = СоздатьОбъект("СписокЗначений");
ТДок.Выгрузить(СписДок,,,"Док");

ТекстЗапроса = "
|SELECT DISTINCT
|$ДокРевизия.Товар as [Товар $Справочник.Номенклатура]
|FROM
|1SJOURN Журн
|JOIN
|$ДокументСтроки.Ревизия ДокРевизия
|ON
|Журн.IDDOC = ДокРевизия.IDDOC
|WHERE
|Журн.Closed = 1 AND Журн.IDDOC IN (SELECT Val FROM СписДок)
|";

Команда.УложитьСписокОбъектов(СписДок,"СписДок");

Команда.Отладка(1);
ТЗ = СоздатьОбъект("ТаблицаЗначений");
ТЗ = Команда.ВыполнитьИнструкцию(ТекстЗапроса);
 



И естественно вышла ошибка. Привожу мессагу из окна сообщений:
Код
Выбрать все
SELECT DISTINCT
    ДокРевизия.sp4922 as [Товар_1c_type_Справочник_Номенклатура]
FROM
    1SJOURN Журн
JOIN
    dt4901 ДокРевизия
ON
    Журн.IDDOC = ДокРевизия.IDDOC
WHERE
    Журн.Closed = 1 AND Журн.IDDOC IN (SELECT Val FROM СписДок)

ТЗ = Команда.ВыполнитьИнструкцию(ТекстЗапроса);
{\\1C\BASE_NEW\EXTFORMS\ТРЕВИЗИОННЫЙКОНТРОЛЬ.ERT(223)}: FAILED! ICommandText::Execute(): File 'списдок.dbf' does not exist.
 


Если же написать в запросе:
Код
Выбрать все
Журн.Closed = 1 AND Журн.IDDOC IN (SELECT Val FROM #СписДок)
 


и
Код
Выбрать все
Команда.УложитьСписокОбъектов(СписДок,"#СписДок");
 


, то получим:
Код
Выбрать все
{\\1C\BASE_NEW\EXTFORMS\ТРЕВИЗИОННЫЙКОНТРОЛЬ.ERT(223)}: FAILED! ICommandText::Execute(): File '#списдок.dbf' does not exist.
 



З.Ы. Версия библы: 2.0.3.2 Nightly Build 2006-12-20
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как сделать выборку с фильтром по документам?
Ответ #4 - 02. Февраля 2007 :: 13:21
Печать  
Внимательно курим доку на метод OLEDBCommand::УложитьСписокОбъектов()
Цитата:
Синтаксис: УложитьСписокОбъектов(Объект, ИмяТабл, ВидСпр)

Параметры:
ИмяТабл - тип: Строка. Возвращаемое значение. Имя временной таблицы, которое будет СГЕНЕРИРОВАНО методом и возвращено через этот параметр.

Имя временной таблицы ГЕНЕРИРУЕТСЯ методом и возвращается через второй параметр (именем является GUID).


Поэтому в твои слова Цитата:
Про метод УложитьСписокОбъектов знаю

не верю Печаль
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
ReLock
Full Member
***
Отсутствует



Сообщений: 155
Местоположение: За компом
Зарегистрирован: 01. Февраля 2007
Пол: Мужской
Re: Как сделать выборку с фильтром по документам?
Ответ #5 - 02. Февраля 2007 :: 14:09
Печать  
artbear писал(а) 02. Февраля 2007 :: 13:21:
Внимательно курим доку на метод OLEDBCommand::УложитьСписокОбъектов()
Цитата:
Синтаксис: УложитьСписокОбъектов(Объект, ИмяТабл, ВидСпр)

Параметры:
ИмяТабл - тип: Строка. Возвращаемое значение. Имя временной таблицы, которое будет СГЕНЕРИРОВАНО методом и возвращено через этот параметр.

Имя временной таблицы ГЕНЕРИРУЕТСЯ методом и возвращается через второй параметр (именем является GUID).


Поэтому в твои слова Цитата:
Про метод УложитьСписокОбъектов знаю

не верю Печаль

Если бы Вы меня еще упрекнули в том, что команду:
Код
Выбрать все
Команда.УложитьСписокОбъектов(СписДок,TempDoc);
 


нужно выполнить перед объявлением
Код
Выбрать все
ТекстЗапроса = "...
 


я был бы очень рад  Улыбка

В общем сработало так:
Код
Выбрать все
База = СоздатьОбъект("OLEDBData");
Соединение = "Provider=VFPOLEDB.1;Deleted=Yes;Data Source=" + КаталогИБ()+ ";Mode=ReadWrite;Extended Properties="";User ID="";Password="";Mask Password=False;Collating Sequence=RUSSIAN;DSN=""";
Рез = База.Соединение(Соединение);
Команда = База.СоздатьКоманду();

СписДок = СоздатьОбъект("СписокЗначений");
ТДок.Выгрузить(СписДок,,,"Док");
TempDoc = "";
Команда.УложитьСписокОбъектов(СписДок,TempDoc);

ТекстЗапроса = "
|SELECT DISTINCT
|$ДокРевизия.Товар as [Товар $Справочник.Номенклатура]
|FROM
|1SJOURN Журн
|JOIN
|$ДокументСтроки.Ревизия ДокРевизия
|ON
|Журн.IDDOC = ДокРевизия.IDDOC
|WHERE
|Журн.Closed = 1 AND Журн.IDDOC IN (SELECT Val FROM " + TempDoc + ")
|";

Команда.Отладка(1);
ТЗ = СоздатьОбъект("ТаблицаЗначений");
ТЗ = Команда.ВыполнитьИнструкцию(ТекстЗапроса);
Сообщить("Количество строк: " + Строка(ТЗ.КоличествоСтрок()));
ТЗ.ВыбратьСтроку();
 



Спасибо всем за консультации, помощь и критику  Подмигивание
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать