|
v7: Условие в запросе через 2 точки | ☑ | ||
---|---|---|---|---|
0
Franchiser
гуру
08.05.18
✎
10:06
|
Есть универсальный отчёт по регистру (доработанный), заметил странное поведение запроса. В случае когда ставится условие, например, на реквизит измерения регистра, то если это измерение идёт в группировке первым по счету то результат корректный, если же последним то результат пустой. Профайлер показывает, что условие через 2 точки вообще не идёт в SQL, т.е. видимо обрабатывается bkend.dll. установлен sql2008.
|
|||
1
Ёпрст
08.05.18
✎
10:09
|
За 2 точки в условии, нужно пиз..ить металлической линейкой по пальчикам
|
|||
2
Ёпрст
08.05.18
✎
10:10
|
Ну и в профайлере, наглядно видно, во что ЭТО превращается и почему этого не надо делать, никогда.
|
|||
3
Franchiser
гуру
08.05.18
✎
10:55
|
Да я бы сделал без 2 точек, но тогда теряется вся универсальность : запрос динамический с итогами, иначе нужно делать свою функцию.
|
|||
4
Franchiser
гуру
08.05.18
✎
11:00
|
Можно ли сделать динамическую функцию: то есть например в условии я генерирую название функции в зависимости от выбранного реквизита с передачей в нее родительского элемента в условии и далее эту функцию как-то создать в коде с применением выполнить().
|
|||
5
Ёпрст
08.05.18
✎
11:17
|
(3) какая разница, как формируется текст запроса ?
Создавай отдельную переменную, её и пихай в условие. Всё. |
|||
6
Franchiser
гуру
08.05.18
✎
11:51
|
(5) не понял идею, какую переменную? Я думал сделать функцию туда передавать параметры: имя реквизита условия, родительский объект, тип условия, значения условия.
Сейчас пример динамического запроса выглядит так: КК = Регистр.Отгрузка.КК ; ЮридическоеЛицо = Регистр.Отгрузка.ЮридическоеЛицо; Контрагент = Регистр.Отгрузка.Контрагент; пзНДС = Регистр.Отгрузка.НДС; пзВсего = Регистр.Отгрузка.Всего; КонтрагентКодСистемы = Регистр.Отгрузка.Контрагент.КодСистемы; Группировка КК Без Групп; Группировка ЮридическоеЛицо Без Групп; Группировка Контрагент Без Групп; Функция СуммаНДС = Сумма(пзНДС); Функция СуммаВсего = Сумма(пзВсего); Условие (КК = гУсл1); Условие (ЮридическоеЛицо = гУсл2); Условие (СокрЛП(КонтрагентКодСистемы) >= СокрЛП(гУсл3)); Условие (СокрЛП(КонтрагентКодСистемы) < СокрЛП(гУсл4)); |
|||
7
Ёпрст
08.05.18
✎
12:59
|
(6)
такую: |Переменная = Регистр.Отгрузка.Измерение.Реквизит.Реквизит.Реквизит....Реквизит; |Условие Переменная = Вася; |
|||
8
serpentt
08.05.18
✎
13:11
|
(4) Это?
|Функция СчетчикСумм = Сумма(СчитаемЦену(Номенклатура,Количество,ДатаДокум)); |
|||
9
Franchiser
гуру
08.05.18
✎
16:05
|
(7) у меня такая переменная и прописана. Проблема в том что в регистре 3 измерения с типом справочника контрагенты и похоже из-за этого запрос глючит: реквизиты берутся из первой группировки с типом справочника Контрагенты.
|
|||
10
Franchiser
гуру
09.05.18
✎
00:33
|
Убрал из условия СокрЛП(), теперь все условия попадают в профайлер.
Но проблема осталась: условие упорно ставится на реквизит из первой группировки типа Справочник Контрагенты вместо нужной. Кто нибудь встречался с такой проблемой: в регистре 3 измерения одинакового типа, но при интерпретации запроса 1с 7.7 в sql условие не устанавливается на реквизиты нужной группировки? |
|||
11
Злопчинский
09.05.18
✎
05:52
|
Я как-то в меру своей няшности думаю что условие ставится не на группировку, а на переменную запроса. А то что получилось в результате - уже группируется (суммируется).
|
|||
12
Злопчинский
09.05.18
✎
05:55
|
..а вот от порядка Условий - стопудово результат будет зависеть имхо.
это как применение двух условий даст разный результат 1. Условие(ПокраситьЗаборБелым) Условие(ПокраситьЗаборЧерным) Результат -> Черный забор 2. Условие(ПокраситьЗаборЧерным) Условие(ПокраситьЗаборБелым) Результат -> Белый забор |
|||
13
Злопчинский
09.05.18
✎
05:57
|
.. и посмотреть - при изменении порядка условий - в профайлере код запроса как меняется?
|
|||
14
Злопчинский
09.05.18
✎
05:57
|
..а может я и не прав со своими измышлениями...
ждем Епрста |
|||
15
Chameleon1980
09.05.18
✎
06:49
|
(14) ИМХО - не прав.
забор - неудачный пример. может поесть и попить, например и наелся и напился оба условия выполнены :) С праздником всех !!! |
|||
16
Адинэснег
09.05.18
✎
07:03
|
(0) а в сырой восьмерке посаны не парятся
1. пакет + ВНУТРЕННЕЕ 2. В() 3. ИМЕЮЩИЕ |
|||
17
Franchiser
гуру
09.05.18
✎
10:20
|
Запрос 1с 7.7:
Период с ФормДатаНач по ФормДатаКон; ЮридическоеЛицо = Регистр.Отгрузка.ЮридическоеЛицо; Контрагент = Регистр.Отгрузка.Контрагент; пзКоличество = Регистр.Отгрузка.Количество; пзНДС = Регистр.Отгрузка.НДС; пзВсего = Регистр.Отгрузка.Всего; Комитент = Регистр.Отгрузка.Комитент; КомитентСимвольныйКод = Регистр.Отгрузка.Комитент.СимвольныйКод; КонтрагентКодСистемы = Регистр.Отгрузка.Контрагент.КодСистемы; Группировка ЮридическоеЛицо Без Групп; Группировка Контрагент Без Групп; Функция СуммаКоличество = Сумма(пзКоличество); Функция СуммаНДС = Сумма(пзНДС); Функция СуммаВсего = Сумма(пзВсего); Условие (Комитент = гУсл1); Условие (ЮридическоеЛицо = гУсл2); Условие (КомитентСимвольныйКод = гУсл3); Условие (КонтрагентКодСистемы > гУсл4); Профайлер (обрабатывает вместо кода системы контрагента код системы из Юр. Лица): select max(SC74.DESCR), max(SC74.PARENTID),RA1159.SP1162, max(SC74.DESCR), max(SC74.PARENTID),RA1159.SP1274, sum(RA1159.SP1166 ),sum(RA1159.SP1168 ),sum(RA1159.SP1167 ), min(RA1159.SP1166 ), min(RA1159.SP1168 ), min(RA1159.SP1167 ), min(RA1159.SP1161 ), min(SC74_1.SP103 ) from _1SJOURN(NOLOCK) left outer join RA1159(NOLOCK) on _1SJOURN.IDDOC=RA1159.IDDOC left outer join SC74(NOLOCK) on RA1159.SP1162=SC74.ID left outer join SC74 SC74_1(NOLOCK) on RA1159.SP1274=SC74_1.ID left outer join SC74 SC74_2(NOLOCK) on RA1159.SP1274=SC74_2.ID where _1SJOURN.RF1159 = 1 and _1SJOURN.DATE_TIME_IDDOC >= '20170130 0 0 ' and _1SJOURN.DATE_TIME_IDDOC < '20170131 0 0 ' and _1SJOURN.CLOSED&1 = 1 and (((RA1159.SP1161 =' B ')) and ((RA1159.SP1162 =' V ')) and ((SC74.SP103 >'1 '))) group by RA1159.SP1162,RA1159.SP1274 |
|||
18
Franchiser
гуру
09.05.18
✎
10:25
|
Запрос 1с 7.7
Период с ФормДатаНач по ФормДатаКон; Контрагент = Регистр.Отгрузка.Контрагент; ЮридическоеЛицо = Регистр.Отгрузка.ЮридическоеЛицо; пзКоличество = Регистр.Отгрузка.Количество; пзНДС = Регистр.Отгрузка.НДС; пзВсего = Регистр.Отгрузка.Всего; Комитент = Регистр.Отгрузка.Комитент; КонтрагентКодСистемы = Регистр.Отгрузка.Контрагент.КодСистемы; Группировка Контрагент Без Групп; Группировка ЮридическоеЛицо Без Групп; Функция СуммаКоличество = Сумма(пзКоличество); Функция СуммаНДС = Сумма(пзНДС); Функция СуммаВсего = Сумма(пзВсего); Условие (Комитент = гУсл1); Условие (ЮридическоеЛицо = гУсл2); Условие (КонтрагентКодСистемы > гУсл3); Профайлер (тут условие отрабатывает корректно): select max(SC74.DESCR), max(SC74.PARENTID),RA1159.SP1274, max(SC74.DESCR), max(SC74.PARENTID),RA1159.SP1162,sum(RA1159.SP1166 ), sum(RA1159.SP1168 ),sum(RA1159.SP1167 ), min(RA1159.SP1166 ), min(RA1159.SP1168 ), min(RA1159.SP1167 ), min(RA1159.SP1161 ), min(SC74_3.SP103 ) from _1SJOURN(NOLOCK) left outer join RA1159(NOLOCK) on _1SJOURN.IDDOC=RA1159.IDDOC left outer join SC74(NOLOCK) on RA1159.SP1274=SC74.ID left outer join SC74 SC74_3(NOLOCK) on RA1159.SP1274=SC74_3.ID left outer join SC74 SC74_4(NOLOCK) on RA1159.SP1274=SC74_4.ID where _1SJOURN.RF1159 = 1 and _1SJOURN.DATE_TIME_IDDOC >= '20170130 0 0 ' and _1SJOURN.DATE_TIME_IDDOC < '20170131 0 0 ' and _1SJOURN.CLOSED&1 = 1 and (((RA1159.SP1161 =' B ')) and ((RA1159.SP1162 =' V ')) and ((SC74.SP103 >'1 '))) group by RA1159.SP1274,RA1159.SP1162 |
|||
19
Franchiser
гуру
09.05.18
✎
10:30
|
вообще реквизиты неправильно берутся для измерений: например, наименование берется также из первой группировки, хотя в отчете оно и не используется.
|
|||
20
Franchiser
гуру
09.05.18
✎
10:35
|
обратите внимание на связь RA1159.SP1274=SC74...
Она во многих местах одинаковая |
|||
21
Franchiser
гуру
09.05.18
✎
10:45
|
Неправильно запросы указал:
Запрос 1 Период с ФормДатаНач по ФормДатаКон; ЮридическоеЛицо = Регистр.Отгрузка.ЮридическоеЛицо; Контрагент = Регистр.Отгрузка.Контрагент; пзКоличество = Регистр.Отгрузка.Количество; пзНДС = Регистр.Отгрузка.НДС; пзВсего = Регистр.Отгрузка.Всего; КонтрагентКодСистемы = Регистр.Отгрузка.Контрагент.КодСистемы; Группировка ЮридическоеЛицо Без Групп; Группировка Контрагент Без Групп; Функция СуммаКоличество = Сумма(пзКоличество); Функция СуммаНДС = Сумма(пзНДС); Функция СуммаВсего = Сумма(пзВсего); Условие (ЮридическоеЛицо = гусл1); Условие (КонтрагентКодСистемы > гусли); |
|||
22
Franchiser
гуру
09.05.18
✎
10:47
|
хотя нет, все верно...
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |