Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Уложить в запрос список значений (число прочтений - 4871 )
ReLock
Full Member
***
Отсутствует



Сообщений: 155
Местоположение: За компом
Зарегистрирован: 01. Февраля 2007
Пол: Мужской
Уложить в запрос список значений
06. Января 2009 :: 13:30
Печать  
База DBF. Задача такая. Обновить реквизит у нескольких документов. Каждый документ имеет идентификатор в виде GUID.
Имеем в списке значений идентификаторы документов, которые надо обновить. Если документов 2-5, то можно просто список значений развернуть ВСтрокуСРазделителями и подсунуть в запрос. Но если их много, то 1С возвращает ошибку: Получаемая строка превысит допустимые размеры. Метод УложитьСписокОбъектов для списка значений не подходит. Во временную таблицу ничего не попадает, т.к. список значений содержит строковые значения.

В примере получаю идентификаторы справочника "Номенклатура" и пытаюсь положить их во временную таблицу.
Код
Выбрать все
СЗ = СоздатьОбъект("СписокЗначений");
СпрНом = СоздатьОбъект("Справочник.Номенклатура");
Счетчик = 0;
СпрНом.ВыбратьЭлементы();
Пока СпрНом.ПолучитьЭлемент() = 1 Цикл
   СЗ.ДобавитьЗначение(СпрНом.Идентификатор);
   Счетчик = Счетчик + 1;
   Если Счетчик = 100 Тогда
      Прервать;
   КонецЕсли;
КонецЦикла;
глЗапрос = глТПодготовитьЗапрос();
Табл = "";
глЗапрос.УложитьСписокОбъектов(СЗ,Табл);
глТекст = "SELECT VAL FROM "+Табл;

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


Во временнной таблице получаю 100 записей, где поле Val пустое, а поле IsFolder = 2 по всем записям.

Может кто знает вариант решения проблемы?
  
Наверх
 
IP записан
 
Вадимко
God Member
*****
Отсутствует


Нам бы чего про ОдноЦэ...

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Уложить в запрос список значений
Ответ #1 - 06. Января 2009 :: 17:12
Печать  
Может лучше подзапрос использовать?
Но можно и свою табличку сделать, т.к. Уложить... укладывает ссылочные объекты (9, 13 длина)
А можно и тупо составить строку условия in ("+СтрокаУсловия+") вида '6546', 'dfsgd'
  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
ReLock
Full Member
***
Отсутствует



Сообщений: 155
Местоположение: За компом
Зарегистрирован: 01. Февраля 2007
Пол: Мужской
Re: Уложить в запрос список значений
Ответ #2 - 06. Января 2009 :: 20:11
Печать  
Вадимко писал(а) 06. Января 2009 :: 17:12:
Может лучше подзапрос использовать?

А в подзапросе к чему обращаться?

Вадимко писал(а) 06. Января 2009 :: 17:12:
А можно и тупо составить строку условия in ("+СтрокаУсловия+") вида '6546', 'dfsgd'

Я уже писал, что если условий много, то выходит ошибка: "Получаемая строка превысит допустимые размеры"

Тогда я попробовал сделать преобразование строки условий так:
Код
Выбрать все
ИдентСтр = СЗ.ВСтрокуСРазделителями();
ИдентСтр = СтрЗаменить(ИдентСтр,",",","+РазделительСтрок); 


Если в списке значений у меня 150 элементов, то прокатывает. Если 200, то выходит ошибка: "FAILED! ICommandText::Execute(): SQL: Statement too long."
  
Наверх
 
IP записан
 
Burlak
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 65
Зарегистрирован: 28. Апреля 2008
Re: Уложить в запрос список значений
Ответ #3 - 06. Января 2009 :: 21:37
Печать  
>База DBF. Задача такая. Обновить реквизит у нескольких документов ...
Локальный курсор не подойдет? Например так:

  //-- Удалим локальный курсор
  Попытка
    cmdOLEDB.Выполнить("EXEC('SELECT cur')");
    cmdOLEDB.Выполнить("USE");
  Исключение
  КонецПопытки;

  cmdOLEDB.Выполнить("EXEC('CREATE CURSOR cur (IDDoc C(9),Дата D,Номер C(15), ...)')"); //-- К примеру

  ТекстЗапроса = "INSERT INTO cur ...";

В цикле перепишите Ваши значения в локальный курсор.
    cmdOLEDB.Выполнить(ТекстЗапроса);

Далее можно блокировать таблицу документов с реквизитом и UPDATE

  
Наверх
 
IP записан
 
Вадимко
God Member
*****
Отсутствует


Нам бы чего про ОдноЦэ...

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Уложить в запрос список значений
Ответ #4 - 06. Января 2009 :: 22:45
Печать  
ReLock писал(а) 06. Января 2009 :: 20:11:
А в подзапросе к чему обращаться?


Я далек от мысли... но вот это вполне можно отзапросить:
Код
Выбрать все
Пока СпрНом.ПолучитьЭлемент() = 1 Цикл 



  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
ReLock
Full Member
***
Отсутствует



Сообщений: 155
Местоположение: За компом
Зарегистрирован: 01. Февраля 2007
Пол: Мужской
Re: Уложить в запрос список значений
Ответ #5 - 08. Января 2009 :: 06:14
Печать  
Запрос в цикле. Изначально был такой вариант. Но если потребуется обновлять много элементов, то это может сказаться на работу других пользователей.  Печаль
  
Наверх
 
IP записан
 
ReLock
Full Member
***
Отсутствует



Сообщений: 155
Местоположение: За компом
Зарегистрирован: 01. Февраля 2007
Пол: Мужской
Re: Уложить в запрос список значений
Ответ #6 - 09. Января 2009 :: 07:55
Печать  
В общем решили сделать свою временную DBF-ку, заполнить ее необходимыми данными и использовать её в запросе. Работает очень быстро!  Очень довольный
  
Наверх
 
IP записан
 
Burlak
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 65
Зарегистрирован: 28. Апреля 2008
Re: Уложить в запрос список значений
Ответ #7 - 09. Января 2009 :: 13:40
Печать  
>ReLock
>В общем решили сделать свою временную DBF-ку, заполнить ее ...

А почему не локальный курсор?
  
Наверх
 
IP записан
 
ReLock
Full Member
***
Отсутствует



Сообщений: 155
Местоположение: За компом
Зарегистрирован: 01. Февраля 2007
Пол: Мужской
Re: Уложить в запрос список значений
Ответ #8 - 09. Января 2009 :: 21:17
Печать  
С локальными курсорами не работал. А разбираться с ними времени нету. Сроки по задаче ограничены. Может как-нибудь посмотрю и перепишу...
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать