Форум на Kuban.ru (http://forums.kuban.ru/)
-   Территория 1С (http://forums.kuban.ru/f1040/)
-   -   SQL -запрос под 7.7 (http://forums.kuban.ru/f1040/sql_-zapros_pod_7_7_a-5528704.html)

Wanderer27 19.03.2014 16:59

SQL -запрос под 7.7
 
Есть запрос
ТекстЗапроса = "
|select
| pos.idmanufactdoc
|from
| manufactdocpyramidpos pos
|where
| pos.idmanufactdoc IN " + сзПП + "
|";

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

Вопрос, как правильно написать условие в конструкции "where", чтобы выбирал записи, у которых значение поля pos.idmanufactdoc есть в СпискеЗначений "сзПП"? Конструкция, указанная в запросе, не работает.

Wanderer27 19.03.2014 17:00

Ругается "ТаблицаРезультата = ЗапросА.ВыполнитьИнструкцию(ТекстЗапроса);
{D:\BASE1C\COPY\PUB_POZ_2012\EXTFORMS\ПРОГРАММИСТ\РАЗВЕРНУТЫЙОТЧЕТПОЗАКАЗУ.ERT(135)**: FAILED! ICommandText::Execute(): Неправильный синтаксис около конструкции "СписокЗначений"."

Billi 19.03.2014 17:31

Как то так:
ТекстЗапроса = "
|select
| pos.idmanufactdoc
|from
| manufactdocpyramidpos pos
|where
| pos.idmanufactdoc IN (";
Для сч=1 По сзПП.РазмерСписка() Цикл
ТекстЗапроса=ТекстЗапроса+СокрЛП(сзПП.ПолучитьЗначение(сч))+",";
КонецЦикла;
ТекстЗапроса=ТекстЗапроса+")";

Billi 19.03.2014 18:27

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

USSR 19.03.2014 19:05

а проще использовать метод - УложитьСписокЗначений
А что за запрос несколько странный, он не к 1с-ным данным ?

Wanderer27 19.03.2014 21:15

3-Billi >Спасибо! Я догадался ;)

4-USSR >Что за метод УложитьСписокЗначений? в 1С 7.7 такого точно нет.
Запрос нормальный, я просто упростил вопрос, не стал писать полный его вид, чтобы не забивать голову. :)

oxo 20.03.2014 02:56

[url][/url]
[quote=Wanderer27;34580569]Что за метод УложитьСписокЗначений? в 1С 7.7 такого точно нет. Запрос нормальный, я просто упростил вопрос, не стал писать полный его вид, чтобы не забивать голову. :)[/quote]1) Внимательно: [url=http://j.mp/1drkg29]Прямой доступ через ODBC[/url]. 2) Поиском примеры.. 3) В личку.

smaharbA 20.03.2014 08:18

ВСтрокуСРазделителями

Wanderer27 20.03.2014 10:19

7-smaharbA > не пройдет
Т.к. на выходе будет ""значение1","значение2",....."значениеК""
А надо "значение1,значение2,.....значениеК"

USSR 20.03.2014 15:46

Функция УсловиеНаРеквизит (Запрос,
ТекстЗапроса,
Значение,
ИмяПараметра,
ИмяРеквизита,
БазаSQL = 0) Экспорт

Если ПустоеЗначение(Значение) = 1 Тогда
Возврат ТекстЗапроса;
КонецЕсли;

ИмяТекстПараметра = ИмяПараметра;
Если ТипЗначенияСтр(Значение) = "Справочник" Тогда

Если Значение.ЭтоГруппа() = 0 Тогда
Запрос.SetTextParam (ИмяТекстПараметра, Значение);
Условие = " AND (" + ИмяРеквизита + "=:" + ИмяТекстПараметра + ")";
Иначе
Если БазаSQL = 0 Тогда
ВремЗначение = "";
Запрос.УложитьСписокОбъектов (Значение, ВремЗначение, Значение.Вид());
Запрос.SetTextParam (ИмяТекстПараметра, ВремЗначение);
ИмяТекстПараметра = ":" + ИмяТекстПараметра;
ТекстЗапроса = ТекстЗапроса + " AND " + РазделительСтрок +
ИмяРеквизита + " IN (SELECT Val FROM " + ИмяТекстПараметра + ")";
Иначе
ИмяТекстПараметра = "#" + ИмяТекстПараметра;
Запрос.УложитьСписокОбъектов (Значение, ИмяТекстПараметра, Значение.Вид());
ТекстЗапроса = ТекстЗапроса + " AND " + РазделительСтрок +
ИмяРеквизита + " IN (SELECT Val FROM " + ИмяТекстПараметра + ")";
КонецЕсли;
КонецЕсли;

ИначеЕсли ТипЗначенияСтр(Значение) = "СписокЗначений" Тогда
Если БазаSQL = 0 Тогда
ВремЗначение = "";
ИмяПараметра = ":" + ИмяТекстПараметра;
Запрос.УложитьСписокОбъектов (Значение, ВремЗначение);
Запрос.SetTextParam (ИмяТекстПараметра, ВремЗначение);
Иначе
ИмяПараметра = "#" + ИмяТекстПараметра;
Запрос.УложитьСписокОбъектов (Значение, ИмяПараметра);
КонецЕсли;
Условие = " AND (" + ИмяРеквизита + " IN (SELECT Val FROM " + ИмяПараметра + "))";
Иначе
Запрос.SetTextParam (ИмяТекстПараметра, Значение);
Условие = " AND (" + ИмяРеквизита + "=:" + ИмяТекстПараметра + ")";
КонецЕсли;

Возврат ТекстЗапроса + Условие;

КонецФункции //УсловиеНаРеквизит()

smaharbA 20.03.2014 19:48

8-Wanderer27 > пойдет


Текущее время: 23:18. Часовой пояс GMT +3.