|
Не могу поставить условие в запросе | ☑ | ||
---|---|---|---|---|
0
yalanton
07.06.17
✎
09:51
|
Добрый день Помогите пожалуйста .
Я хочу выбрать дебетовые обороты по счету 91,02(прочие расходы) за исключением сумм дебетовых оборотов которые корреспондируют со счетом 68.02(Налог на добавленную стоимость) и при этом у которых Субконто1.ВидПрочихДоходовИРасходов=Прибыль(убыток) прошлых лет (субконто1 это субконто счета 91.02 и оно имеет тип справочник "прочие доходы и расходы") ВЫБРАТЬ ХозрасчетныйОбороты.Субконто1, ХозрасчетныйОбороты.Счет, ХозрасчетныйОбороты.СуммаОборотДт ИЗ РегистрБухгалтерии.Хозрасчетный.Обороты КАК ХозрасчетныйОбороты ГДЕ (ХозрасчетныйОбороты.Счет = &счет9102 И (ХозрасчетныйОбороты.Субконто1.ВидПрочихДоходовИРасходов <> &ПрибыльУбытокПрошлыхлет И ХозрасчетныйОбороты.КорСчет <> &корсчет6802)) а пока у меня запрос исключает все деб обор корреспондирующие с 68.02 не зависимо от ВидПрочихДоходовИРасходов и все деб обороты по субконто1= не зависимо от корреспондирующего счета ,а я хочу чтоб только в случае одновременного выполнения 2-х условий исключались дебетовые обороты |
|||
1
Мимохожий Однако
07.06.17
✎
09:54
|
Отбор в виртуальных таблицах рекомендуется делать в параметрах. Отладку запроса есть смысл делать с постепенным добавлением очередного условия.
|
|||
2
Fram
07.06.17
✎
09:56
|
(ХозрасчетныйОбороты.Субконто1.ВидПрочихДоходовИРасходов <> &ПрибыльУбытокПрошлыхлет
ИЛИ ХозрасчетныйОбороты.КорСчет <> &корсчет6802) но будет тупить при большом объеме данных |
|||
3
yalanton
07.06.17
✎
09:58
|
думаешь "ИЛИ", а на "И" сейчас проверю
|
|||
4
yalanton
07.06.17
✎
10:03
|
О спасибо сработало -про отбор в вирт табл в параметрах я понял сейчас переделаю
|
|||
5
Dmitrii
гуру
07.06.17
✎
10:08
|
(2) Чтобы не тупило (имена таблиц и предопределенных элементов могу соврать):
НЕ (ВЫРАЗИТЬ(ХозрасчетныйОбороты.Субконто1 КАК Справочник.ПрочиеДоходыИРасходы).ВидПрочихДоходовИРасходов = ЗНАЧЕНИЕ(Перечисление.ВидыПрочихДоходовИРасходов.ПрибыльУбытокПрошлыхлет) И ХозрасчетныйОбороты.КорСчет = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.НДС)) И добавить в параметры виртуальной таблицы условие на вид субконто. |
|||
6
cw014
07.06.17
✎
10:10
|
ВЫБРАТЬ
ХозрасчетныйОбороты.Субконто1, ХозрасчетныйОбороты.Счет, ХозрасчетныйОбороты.СуммаОборотДт ИЗ РегистрБухгалтерии.Хозрасчетный.Обороты(,Счет = &счет9102 И Субконто1.ВидПрочихДоходовИРасходов <> &ПрибыльУбытокПрошлыхлет И КорСчет <> &корсчет6802) КАК ХозрасчетныйОбороты |
|||
7
Fram
07.06.17
✎
10:12
|
(5) имелось ввиду, что использование ИЛИ и <> заставляет движок сканировать таблицу, а не использовать индексы
|
|||
8
Dmitrii
гуру
07.06.17
✎
10:13
|
(6) Это неверно.
Он потеряет вообще ВСЕ обороты с видом ПрибыльУбытокПроошлыхЛет и ВСЕ обороты с КорСчетом = 68.02, а ему надо только где ОДНОВРЕМЕННО и ПрибыльУбытокПроошлыхЛет И КорСчет=68.02. |
|||
9
cw014
07.06.17
✎
10:14
|
(8) Тогда через ИЛИ
|
|||
10
cw014
07.06.17
✎
10:15
|
ВЫБРАТЬ
ХозрасчетныйОбороты.Субконто1, ХозрасчетныйОбороты.Счет, ХозрасчетныйОбороты.СуммаОборотДт ИЗ РегистрБухгалтерии.Хозрасчетный.Обороты(,Счет = &счет9102 И НЕ (Субконто1.ВидПрочихДоходовИРасходов = &ПрибыльУбытокПрошлыхлет И КорСчет = &корсчет6802)) КАК ХозрасчетныйОбороты |
|||
11
Dmitrii
гуру
07.06.17
✎
10:19
|
(10) Не морочьте голову. Ну нужно это пихать в параметры виртуальной таблицы. С высокой долей вероятности производительность такого запроса упадёт на порядок по сравнения с размещением условий в "ГДЕ". Вполне достаточно отбора по Счет и (возможно) по виду субконто.
Рекомендация использовать параметры в ВТ является общей, но не нужно пихать её прям везде и всегда. |
|||
12
cw014
07.06.17
✎
10:23
|
(11) Дело в том, что вынос параметров за виртуальную таблицу не всегда дает тот вариант, который ожидаешь. В моем случае в мое время в результате не выдавало вообще ничего
|
|||
13
cw014
07.06.17
✎
10:24
|
+(11) к (5) - ВЫРАЗИТЬ не сильно повлияет на производительность - проверено на БУХ 3.0 экспериментальным путем
|
|||
14
yalanton
07.06.17
✎
10:27
|
так надо мне теперь все это осмыслить
|
|||
15
Fram
07.06.17
✎
10:31
|
(13) теоретически выразить должно избавить от кучи соединений, а на практике черт его знает. надо в профайлер глядеть
|
|||
16
Dmitrii
гуру
07.06.17
✎
10:32
|
(12) На значительных объемах данных твой вариант (с условием на КорСчет и ВидПрочихДоходовИРасходов в параметрах ВТ) будет работать медленнее.
Причина в том, что эти условия будут накладываться на весь массив данных, который может быть весьма большим. Поэтому гораздо дешевле будет получить небольшой объём данных (только обороты по счету 91.02 в параметрах ВТ) и уже там фильтровать по КорСчету и ВидПрочихДоходовИРасходов (в условии ГДЕ). |
|||
17
cw014
07.06.17
✎
10:33
|
(16) Возможно, однако так же замечу, что не только выполнение запроса нагружает SQL но и формирование результата. То есть чем больше результат - тем дольше будет вывод
|
|||
18
Dmitrii
гуру
07.06.17
✎
10:34
|
(13) Зависит от конкретных условий. Использование ВЫРАЗИТЬ практически никогда не бывает лишним.
В отличии от запихивания всего что попало в параметры ВТ. |
|||
19
Dmitrii
гуру
07.06.17
✎
10:35
|
(17) Вывод результата это уже другая история. К теме не имеющая никакого отношения, т.к. выводиться в ЛЮБОМ (что в твоём что в моём) случае будет одно и то же.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |