Имя: Пароль:
1C
1C 7.7
v7: как работает " IN (SELECT Val"
,
0 Evgenchik
 
07.07.11
09:56
в запросе надо написать отрицание условия
| WHERE (Модель Not IN (SELECT Val from #СписокИсключенийМоделей))

модель - это просто строка

Запрос.УложитьСписокОбъектов(СписокИсключений, "#СписокИсключенийМоделей");

СписокИсключений - список значений строк

так не работает, а очень хотелось бы.
Если возможность поставить в условие отрицание вхождения строки в список строк?
1 AeDen
 
07.07.11
09:58
не может быть чтобы не работало
пробуй что ли значения не в СЗ закинуть, а в строку через точку с запятой
2 AeDen
 
07.07.11
09:58
а вообще посмотри что выдает SELECT Val from #СписокИсключенийМоделей
3 Admin_Net_1C
 
07.07.11
09:58
попробуй

WHERE NOT (Модель IN (SELECT Val from #СписокИсключенийМоделей))
4 el-gamberro
 
07.07.11
10:01
(3) оригинально :)
5 el-gamberro
 
07.07.11
10:02
(0) а модель это тоже строка? напиши текст ошибки.
6 Evgenchik
 
07.07.11
10:07
вот такой код пусто выдает

   Запрос1 = СоздатьОбъект("ODBCRecordSet");
   ТекстЗапроса1="
   | SELECT Val from #СписокИсключенийМоделей
   |";
   СписокИсключений1 = СоздатьОбъект("СписокЗначений");
   СписокИсключений1.ДобавитьЗначение("ййййй");
   СписокИсключений1.ДобавитьЗначение("ццццц");
   Запрос1.УложитьСписокОбъектов(СписокИсключений1, "#СписокИсключенийМоделей");
   ТЗ1 = Запрос1.ВыполнитьИнструкцию(ТекстЗапроса1);
   ТЗ1.ВыбратьСтроки();
   Пока ТЗ1.ПолучитьСтроку() = 1 Цикл
       Сообщить(""+ТЗ1.Val);
   КонецЦикла;
7 ДенисЧ
 
07.07.11
10:08
УложитьСписокОбъектов() только справочники и документы укладывает.
8 Evgenchik
 
07.07.11
10:08
блин, а как со строками быть? есть способы?
9 ДенисЧ
 
07.07.11
10:09
(8) руками таблицу создать - не предлагать?
10 ДенисЧ
 
07.07.11
10:09
И наполнить её?
11 Evgenchik
 
07.07.11
10:13
таблицу в запросе прямо создать? или как?
12 Mikeware
 
07.07.11
10:14
(11) да хоть как
13 nicxxx
 
07.07.11
10:15
(9) а че, вариант, но можно проще (просто список констант):

SELECT FirstName, LastName, e.Title
FROM HumanResources.Employee AS e
   JOIN Person.Contact AS c
   ON e.ContactID = c.ContactID
WHERE e.Title IN ('Design Engineer', 'Tool Designer', 'Marketing Assistant');
14 acsent
 
07.07.11
10:17
а зачем временная таблица?
15 nicxxx
 
07.07.11
10:18
ну чтобы сделать
WHERE NOT (Модель IN (SELECT Val from #СписокИсключенийМоделей))
16 ДенисЧ
 
07.07.11
10:20
(14) А если у тебя (у автора) динамически наполняемый список исключений?
17 Evgenchik
 
07.07.11
10:23
ну список не особо динамический, но длинный.
подскажите пожалуйста кодом, как сделать таблицу, чтобы использовать WHERE (Модель NOT IN (SELECT Val from #СписокИсключенийМоделей))

через такую конструкцию WHERE e.Title IN ('Design Engineer', 'Tool Designer', 'Marketing Assistant'); - работает
18 ДенисЧ
 
07.07.11
10:25
(17)

стрЗапрос = "
|IF EXISTS (select name from tempdb..sysobjects where id = OBJECT_ID('tempdb..#Vinovnye', 'U'))
|    DROP table #Vinovnye
|";
Запрос1с.ВыполнитьИнструкцию(стрЗапрос);
стрЗапрос = "
|CREATE TABLE #Vinovnye (val char(9))
|";
Запрос1с.ВыполнитьИнструкцию(стрЗапрос);
стрЗапрос = "INSERT INTO #Vinovnye (val) VALUES (:зн)";
Для сч = 1 По сзВиновные.РазмерСписка() Цикл
   Если сзВиновные.Пометка(сч) = 1 Тогда
       Запрос1с.УстановитьТекстовыйПараметр("зн", сзВиновные.ПолучитьЗначение(сч));
       //Запрос1с.УстановитьТекстовыйПараметр("зн", СокрЛП(сзВиновные.ПолучитьЗначение(сч)));
       Запрос1с.ВыполнитьИнструкцию(стрЗапрос);
   КонецЕсли;
КонецЦикла;
19 AeDen
 
07.07.11
10:28
стр = "ййй; ццц;"
"where str not in @стр" как-то так попробовать не вариант?
20 Evgenchik
 
07.07.11
10:40
(19) "получаемая строка превысит допустимые размеры" :)
21 Ёпрст
 
07.07.11
10:42
блин.. везде дублируют темы.
22 Evgenchik
 
07.07.11
10:45
(21) тут быстрее :)
23 Evgenchik
 
07.07.11
10:53
всем спасибо, все получилось!
24 TeddySlaf
 
07.07.11
11:06
(23) а как получилось, через какой вариант?
25 Evgenchik
 
07.07.11
11:16
через (18)
26 Evgenchik
 
07.07.11
11:16
+(25) со строками слишком длинная строка получалась
27 Evgenchik
 
07.07.11
15:49
оказалось, что если Модель - пустая строка то она тоже попадает в условие, а так не должно быть..
как сделать условие, чтобы если будет строка пустая то значение в запросе выводилось любое?
28 ДенисЧ
 
07.07.11
15:52
Запрос правильно собирай...
29 Evgenchik
 
07.07.11
15:55
да вроде правильно все.

SELECT t.Контрагент [Контрагент $Справочник.Контрагенты]
   ,t.Товар [Товар $Справочник]
   ,t.ВидНоменклатуры [ВидыНоменклатуры $Справочник.ВидыНоменклатуры]
   ,NullIf(t.Документ_дата, '17530101') Документ_дата
   ,t.Модель Модель

... все это собирается из двух подзапросов. Как только ставлю условие WHERE (Модель Not IN (SELECT Val from #IsklModel))
то если модель - пустая строка - она не попадает в результат
30 Evgenchik
 
07.07.11
15:56
NullIf(t.Модель, 'ПустаяМодель') Модель
- так не срабатывает
31 Evgenchik
 
07.07.11
15:58
case when t.Модель='' then 'ПустаяМодель' else t.Модель end as Модель
и так не срабатывает
32 Evgenchik
 
07.07.11
16:08
хелпппп
33 Ёпрст
 
07.07.11
16:09
SELECT Val from #IsklModel where val is not null
34 Evgenchik
 
07.07.11
16:15
но там нет пустых значений! не получается так..
35 Ёпрст
 
07.07.11
16:28
(34) ты в во временную табличку пустую строку пихаешь, или что ?
36 Evgenchik
 
07.07.11
16:53
во временной табличке
   Запрос1с=СоздатьОбъект("ODBCRecordSet");
   стрЗапрос = "
   |IF EXISTS (select name from tempdb..sysobjects where id = OBJECT_ID('tempdb..#IsklModel', 'U'))
   |    DROP table #IsklModel
   |";
   Запрос1с.ВыполнитьИнструкцию(стрЗапрос);

   стрЗапрос = "
   |CREATE TABLE #IsklModel (val char(55))
   |";
   Запрос1с.ВыполнитьИнструкцию(стрЗапрос);
   
   стрЗапрос = "INSERT INTO #IsklModel (val) VALUES (:зн)";
   Для сч = 1 По СписокИсключений.РазмерСписка() Цикл
       Запрос1с.УстановитьТекстовыйПараметр("зн", СписокИсключений.ПолучитьЗначение(сч));
       Запрос1с.ВыполнитьИнструкцию(стрЗапрос);
   КонецЦикла;
   
   ТекстЗапроса = ТекстЗапроса+"
   | WHERE (Модель Not IN (SELECT Val from #IsklModel where val is not null))
   |";


похоже придется переделывать, чтобы был не список строк, а значений справочника....
37 Mikeware
 
07.07.11
17:00
(36) нахрена такие сложности?
генерируй имя временной таблицы автоматом, случайным образом - например, как GUID - и после завершения сеанса они дропнутся автоматически.
38 Evgenchik
 
21.07.11
12:05
в условии
$ВозвратОтПокупателяСтроки.Товар not IN (SELECT val from #СписокИсключенийТоваровВ)
потом делаю
Запрос.УложитьСписокОбъектов13(СписокИсключенийНоменклатуры, "#СписокИсключенийТоваровВ");
но если в СписокИсключенийНоменклатуры входят группы то не срабатывает условие. как это исправить можно?
нашел, что УложитьСписокОбъектов13 не сработает с группами. тогда пишу
                                  ТаблицаИсключенийНоменклатуры=СоздатьОбъект("ТаблицаЗначений");
Запрос1 = СоздатьОбъект("ODBCRecordSet");
Запрос1.УложитьСписокОбъектов(СписокИсключенийНоменклатуры, "#vt1", "Номенклатура");
ТаблицаИсключенийНоменклатуры=Запрос1.ВыполнитьИнструкцию("Select val from #vt1");
СписокVT1 = СоздатьОбъект("СписокЗначений");
ТаблицаИсключенийНоменклатуры.Выгрузить(СписокVT1);
Запрос.УложитьСписокОбъектов13(СписокVT1, "#СписокИсключенийТоваровВ");
и что-то все равно не пашет
Основная теорема систематики: Новые системы плодят новые проблемы.