|
Условие в запросе для виртуальной таблицы | ☑ | ||
---|---|---|---|---|
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) использует. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |