Имя: Пароль:
1C
1С v8
Условие в запросе для виртуальной таблицы
0 bahtik
 
09.12.12
22:14
При создании запроса в параметрах виртуальной таблицы прописал условие:
Номенклатура В &МассивНоменклатуры
При отладке понял, что если массив пустой, то и результат будет пустым. В 7.7 привык, что передавался список значений и если он пустой, то условие не учитывалось. Здесь со всеми коллекциями так, как и с массивом, или можно что-то передавать, чтоб работало по аналогии с 7.7?
1 Starhan
 
09.12.12
22:35
Где &МассивПустой ИЛИ (Номенклатура В (&МассивНоменклатуры))

вариант через два параметра, и другие
2 Нуф-Нуф
 
09.12.12
22:36
если МассивНоменклатуры.Количество() тогда стрзаменить(текстзапроса, "Номенклатура В &МассивНоменклатуры", "истина")
3 Нуф-Нуф
 
09.12.12
22:36
(1) "или" в условиях запроса использовать не рекомендуется
4 bahtik
 
09.12.12
22:39
(2) То, что текст запроса можно заменить, я понимаю, пока что так и сделал. Но это не очень удобно, поэтому и интересуюсь. Пока что я так понимаю, что передавать пустой массив или список значений не прокатит?
5 Armando
 
09.12.12
22:41
{ГДЕ Номенклатура В (&МассивНоменклатуры)}
если параметр задан, то условие сработает
6 bahtik
 
09.12.12
22:43
Ну у меня выходит, что если параметр задан и он пустой, то в результат ничего не попадает. На всякий случай еще раз повторяю: это не "Где...", а условие-параметр виртуальной таблицы.
7 H A D G E H O G s
 
09.12.12
22:44
(3) Мозг тебе использовать похоже не рекомендуют.
8 bahtik
 
09.12.12
22:44
Может они по-разному работают просто...
9 H A D G E H O G s
 
09.12.12
22:44
Бить табуреткой по пальцам за динамические тексты запросов, особенно в таких случаях.
10 bahtik
 
09.12.12
22:45
(9) Вот и мне это не нравится. Может объяснишь, как тогда это решается?
11 H A D G E H O G s
 
09.12.12
22:47
Ну и что в (1) не нравится?

&МассивПустой
   ИЛИ Номенклатура В (&МассивНоменклатуры)
12 bahtik
 
09.12.12
22:48
Ща попробую...
13 Один С
 
09.12.12
22:57
кстате о виртуальных параметрах..
если взять срез последних на дату с каким либо условием,
то в результате получим срез на те даты, на которые они удовлетворяют условию..
а хотели получить срез на дату, отобранный по условию..
вот такие пирожки..
14 bahtik
 
09.12.12
22:57
Только &МассивПустой - это же все-таки тот же массив? Т.е.:
&МассивНоменклатуры Или Номенклатура В (&МассивНоменклатуры)
15 bahtik
 
09.12.12
22:58
"ВЫБРАТЬ
                  |    ОстаткиНоменклатурыОстатки.Номенклатура,
                  |    ОстаткиНоменклатурыОстатки.Партия,
                  |    ОстаткиНоменклатурыОстатки.КоличествоОстаток,
                  |    ОстаткиНоменклатурыОстатки.СуммаОстаток
                  |ИЗ
                  |    РегистрНакопления.ОстаткиНоменклатуры.Остатки(
                  |            &Период,
                  |            Организация = &Организация
                  |                И Склад = &Склад
                  |                И (&МассивНоменклатуры
                  |                    ИЛИ Номенклатура В (&МассивНоменклатуры))) КАК ОстаткиНоменклатурыОстатки";
16 bahtik
 
09.12.12
23:00
При выполнении вылетает ошибка:
Неверные параметры "Или" И (
17 bahtik
 
09.12.12
23:02
Все, сорри, я не сразу понял смысла написанного.
18 bahtik
 
09.12.12
23:03
Все таки ПустойМассив
19 bahtik
 
09.12.12
23:14
Сейчас написал так:

"ВЫБРАТЬ
                  |    ОстаткиНоменклатурыОстатки.Номенклатура,
                  |    ОстаткиНоменклатурыОстатки.Партия,
                  |    ОстаткиНоменклатурыОстатки.КоличествоОстаток,
                  |    ОстаткиНоменклатурыОстатки.СуммаОстаток
                  |ИЗ
                  |    РегистрНакопления.ОстаткиНоменклатуры.Остатки(
                  |            &Период,
                  |            Организация = &Организация
                  |                И Склад = &Склад
                  |                И (&ПустойМассив В (&МассивНоменклатуры)
                  |                    ИЛИ Номенклатура В (&МассивНоменклатуры))) КАК ОстаткиНоменклатурыОстатки";

Но при выполнении тоже ошибка:

{(11, 22)}: Неверные параметры в операции сравнения. Нельзя сравнивать поля
неограниченной длины и поля несовместимых типов.
И (&ПустойМассив <<?>>В (&МассивНоменклатуры)
20 H A D G E H O G s
 
09.12.12
23:16
ППЦ
21 H A D G E H O G s
 
09.12.12
23:16
Смени специальность
22 petrowsky
 
09.12.12
23:17
"ВЫБРАТЬ
                  |    ОстаткиНоменклатурыОстатки.Номенклатура,
                  |    ОстаткиНоменклатурыОстатки.Партия,
                  |    ОстаткиНоменклатурыОстатки.КоличествоОстаток,
                  |    ОстаткиНоменклатурыОстатки.СуммаОстаток
                  |ИЗ
                  |    РегистрНакопления.ОстаткиНоменклатуры.Остатки(
                  |            &Период,
                  |            Организация = &Организация
                  |                И Склад = &Склад
                  |                И (&ПустойМассив ИЛИ Номенклатура В (&МассивНоменклатуры))) КАК ОстаткиНоменклатурыОстатки";

Запрос.УстановитьПараметр("ПустойМассив", МассивНоменклатуры.Количество() = 0);
Запрос.УстановитьПараметр("МассивНоменклатуры", МассивНоменклатуры);

параметр ПустойМассив - булево и означает, что МассивНоменклатуры пуст
23 H A D G E H O G s
 
09.12.12
23:18
И Склад = &Склад
                  |                И (&МассивПустой =Истина
                  |                    ИЛИ Номенклатура В (&МассивНоменклатуры)))

Запрос.УстановитьПараметр("МассивПустой",МассивНоменклатуры.Количество()=0);
Запрос.УстановитьПараметр("МассивНоменклатуры",МассивНоменклатуры);
24 MadJhey
 
09.12.12
23:18
МассивПустой поставь Истину (см 11)
25 bahtik
 
09.12.12
23:20
Понял
26 bahtik
 
09.12.12
23:25
(21) А с чего ты взял, что это моя специальность? ))
27 bahtik
 
09.12.12
23:25
Иначе я б тут вопросы не задавал, а отвечал бы на них ;)
28 petrowsky
 
09.12.12
23:27
(26) а т.е. ты просто клавиатуру программисту протирал
ого! запрос! дайка подсоблю)))
29 H A D G E H O G s
 
09.12.12
23:28
Конец рабочего дня, приходит по почте вот такое письмо:

xxx, добрый день!

Извините, что обращаюсь к вам, я нашла у вас ошибку: нужно в форме yyy вместо
postIssueField.enabled(issueQty);
писать:
postIssueField.enabled(issueQty != 0);
некоторые системы (наверное Аксапта в их числе) не всегда верно понимают такую упрощенную запись.

С уважением,
мастер конфетного цеха
30 bahtik
 
09.12.12
23:32
(28) Нет, просто я стараюсь иметь знания не только в своей специальности ))
31 bahtik
 
09.12.12
23:35
Это как архитектору, например, полезно знать, как раствор для укладки кирпичей правильно делать. ;)
32 bahtik
 
09.12.12
23:36
Все получилось, всем спасибо! ))
33 Нуф-Нуф
 
10.12.12
00:25
H A D G E H O G s бить надо за ИЛИ в ГДЕ или в параметрах виртуальных. Когда подрастешь - поймешь
34 Armando
 
10.12.12
00:31
Спорим планы запросов сравнивать не начнете
35 vmv
 
10.12.12
01:33
(33) номекаешь, что в условии ГДЕ (&ПустойМассив ИЛИ Номенклатура В (&МассивНоменклатуры))

вернее по-русски если написать

ГДЕ (&ОтборНеЗаполнен ИЛИ Номенклатура В (&МассивНоменклатуры)) будут анализироваться оба условия и совершенно па-барабану, что первый равен ИСТИНА и кагбе 2-ое, 3-е и т.д. условия по ИЛИ уже не нужно проверять, мдя если это так, то бить надо разработчиков СУБД
36 mistеr
 
10.12.12
04:01
(13) И об этом даже в желтой книжке написано.
37 mistеr
 
10.12.12
04:03
(33) Если не про планы, то расскажите. Я уже большой.
38 Armando
 
12.12.12
22:52
(37) то о чем вещает нуф-нуф справедливо для индексированных реквизитов. например, нельзя писать
ГДЕ ИндексированныйРеквизит = &ЧтоТо Или ИндексированныйРеквизит = &ЧтоТоЕще
тогда будет full scan несмотря на индексы


а вот так можно писать
&ПустойМассив ИЛИ Номенклатура В (&МассивНоменклатуры)
39 H A D G E H O G s
 
12.12.12
23:36
(38) Мне лениво в портянках запросов лазать

ВЫБРАТЬ
   1 КАК Поле1
ИЗ
   Справочник.Номенклатура КАК Номенклатура
ГДЕ
   (Номенклатура.Ссылка = &Ссылка1
           ИЛИ Номенклатура.Ссылка = &Ссылка2)

Full or Index ?
40 H A D G E H O G s
 
12.12.12
23:37
Хотяя.
41 H A D G E H O G s
 
12.12.12
23:39
Хотя нет, кластерный, некластерный, монопенисуально.
Не Считайте SQL тупее паравоза

ВЫБРАТЬ
   1 КАК Поле1
ИЗ
   Справочник.Номенклатура КАК Номенклатура
ГДЕ
   (Номенклатура.Артикул = &Артикул1
           ИЛИ Номенклатура.Артикул = &Артикул2)
42 Armando
 
12.12.12
23:49
фулскан. по крайней мере на файловой базе. хз как там mssql крутанёт его.
43 H A D G E H O G s
 
12.12.12
23:52
(42) У меня - Index в обоих случаях.
Не зря же я ссылку беру для кластерного и артикул - для некластерного. Я еще и про селективность не забываю, шишки я свои все помню...
44 Armando
 
12.12.12
23:53
(43) mssql?
45 H A D G E H O G s
 
12.12.12
23:53
(44) Угу. Fullscan ты увидел из техжурнала?
46 Armando
 
12.12.12
23:54
У меня ща не на чем проверить. Только файловая. В любом случае надо учитывать "интересы" всех
47 Armando
 
12.12.12
23:54
(45) да
48 Armando
 
12.12.12
23:55
+(47) logcfg.xml:
<?xml version="1.0"?>
<config xmlns="http://v8.1c.ru/v8/tech-log">
 <log location="C:\ТЖ\" history="24">
   <event>
     <eq property="name" value="dbv8dbeng"/>
   </event>
   <property name="sql"/>
   <property name="plansqltext"/>
 </log>
 <plansql />
</config>
49 H A D G E H O G s
 
12.12.12
23:57
(46) Пока мои наблюдения говорят о том, что файловая в мельчайших подробностях повторяет MS SQL. Об этом говорит неявная сортировка РС, которая меняется от количества записей.
50 H A D G E H O G s
 
12.12.12
23:58
(49) Меняется одинакого в файловой и MS SQL. А вот в PostGree базах с этим были проблемы в каком-то релизе типовых.
51 Armando
 
13.12.12
00:00
Запрос:
ВЫБРАТЬ
   Справочник1.Наименование
ИЗ
   Справочник.Справочник1 КАК Справочник1
ГДЕ
   (Справочник1.Наименование = "1"
           ИЛИ Справочник1.Наименование = "2")

Тех жернал:
59:28.3833-1,DBV8DBEng,3,Sql="SELECT
T1._Description
FROM _Reference7 T1
WHERE ((T1._Description = '1') OR (T1._Description = '2'))"
59:28.3834-3,DBV8DBEng,2,Sql="SELECT
T1._Description
FROM _Reference7 T1
WHERE ((T1._Description = '1') OR (T1._Description = '2'))",planSQLText='Fields:(
   T1._Description
)
_Reference7 (T1) FULL SCAN
WHERE
       ((T1._Description = 1) OR (T1._Description = 2))

Statistics: RecordsScanned = 4, ParseTime = 0, ExecuteTime = 0, BuffersMemory = 25832, ResultRecords = 2, RecordSize = 52'
52 Armando
 
13.12.12
00:03
+(51) 8.2.17.143
53 H A D G E H O G s
 
13.12.12
00:04
(51) Сколько элементов в справочнике?
54 Armando
 
13.12.12
00:04
(53) 4
55 H A D G E H O G s
 
13.12.12
00:05
У меня на 2500 элементах номенклатур твой запрос дает IndexScan
56 H A D G E H O G s
 
13.12.12
00:05
(54) Вопросов больше нет
57 H A D G E H O G s
 
13.12.12
00:05
Селективность.
58 H A D G E H O G s
 
13.12.12
00:07
Хотя может и без селективности SQL (1С) выбрать TableScan просто потому, что таблица мала.
59 H A D G E H O G s
 
13.12.12
00:08
Мне лениво короче, я спать, завтра почитаю.

Нуф-Нуфу передайте, чтобы шел работать внедренцем, там именно такие нужны, счастливые и успешные люди-пользователи продукции Apple.

А тебя - жду на Мистопьянке, приходи!
60 Armando
 
13.12.12
00:11
Напихал в справочник 2500 элементов
пох

10:15.3400-157,DBV8DBEng,4,Sql="SELECT
T1._Description
FROM _Reference7 T1
WHERE ((T1._Description = '1') OR (T1._Description = '2'))"
10:15.3401-159,DBV8DBEng,3,Sql="SELECT
T1._Description
FROM _Reference7 T1
WHERE ((T1._Description = '1') OR (T1._Description = '2'))",planSQLText='Fields:(
   T1._Description
)
_Reference7 (T1) FULL SCAN
WHERE
       ((T1._Description = 1) OR (T1._Description = 2))

Statistics: RecordsScanned = 2500, ParseTime = 0, ExecuteTime = 16, BuffersMemory = 25832, ResultRecords = 2, RecordSize = 52'
61 Armando
 
13.12.12
00:11
(59) может быть как-нибудь...))
62 H A D G E H O G s
 
13.12.12
00:12
(60) Я сдаюсь, у меня нет предположений.
63 H A D G E H O G s
 
13.12.12
00:14
У меня 2 раза выполнился IndexSeek
64 H A D G E H O G s
 
13.12.12
00:15
Ладно, все, я ушел.
65 Armando
 
13.12.12
00:16
как-нибудь на mssql попробую
66 Конфигуратор1с
 
13.12.12
00:17
Я жутко извиняюсь, что влажу в разговор мудрых старцев. но поясните тупому и жадному - &ПустойМассив ИЛИ Номенклатура В (&МассивНоменклатуры) - можно юзать или нет?
67 Armando
 
13.12.12
00:20
(66) да
68 Конфигуратор1с
 
13.12.12
01:28
(67)так а что Вы тогда обсуждали?
69 Armando
 
13.12.12
09:19
(68) что происходит, когда пишешь "или" в условиях с индексированными реквизитами.
Файловая база не использует индекс в этих случаях. А вот mssql судя по (43) использует.