|
Определить факт оплаты по заказу: самый быстрый алгоритм | ☑ | ||
---|---|---|---|---|
0
Cyberhawk
03.04.13
✎
06:01
|
Друзья!
Имеем УТ 10.3. Появилась интересная (надеюсь, не только мне) задача: зная документ заказа ("Заказ покупателя"), определить, есть ли по нему хоть один проведенный документ оплаты (ПКО или ППВх). Нужно узнавать только сам факт наличия оплаты (сам документ оплаты, например, выдергивать не нужно). Мой вариант алгоритма: ВЫБРАТЬ ДвиженияДенежныхСредствОбороты.ПриходРасход КАК ПриходРасход ИЗ РегистрНакопления.ДвиженияДенежныхСредств.Обороты(, , , (ВЫРАЗИТЬ(Сделка КАК Документ.ЗаказПокупателя)) = &ЗаказСсылка) КАК ДвиженияДенежныхСредствОбороты Ну а далее, собственно, Ответ = НЕ Результат.Пустой() Вопросы к сообществу: 1. Влияет ли в теории свойство "Индексировать" у выбираемого измерения на скорость выборки? К примеру, у измерения "ДокументОплаты" индексирование = ложь, а у "ПриходРасход" из текста выше индексирование = истина. Замер производительности разницы мне не показал, но это видимо потому что регистр у меня небольшой. 2. Может, есть более быстрый вариант решения задачи? Если знаете - напишите. |
|||
1
echo77
03.04.13
✎
06:19
|
Из регистра взаиморасчетов взять тоже самое
|
|||
2
Cyberhawk
03.04.13
✎
06:25
|
(1) во взаиморасчеты делают движения не только ПКО и ППВх, но и реализации, и корректировки долга, и возвраты.
Придется делать отбор по виду регистратора, который недоступен в параметрах виртуальных таблиц (остатки, обороты, остатки+обороты), следовательно, не катит такой вариант. Я прав? |
|||
3
hhhh
03.04.13
✎
07:51
|
(2) с индексированием раз в 30 будет быстрее.
|
|||
4
Ursus maritimus
03.04.13
✎
07:55
|
(0) Открой для себя регистр РасчетыСКонтрагентами (НЕ Взаиморасчеты)
|
|||
5
Cyberhawk
03.04.13
✎
08:09
|
(4) аналогично: смотри (2)
|
|||
6
Cyberhawk
03.04.13
✎
08:10
|
(3) как это относится к (2)?
|
|||
7
Ursus maritimus
03.04.13
✎
08:12
|
(5) Задействуй мозг.
|
|||
8
Cyberhawk
03.04.13
✎
08:16
|
(7) напиши свой вариант решения задачи (код или запрос)
|
|||
9
Ursus maritimus
03.04.13
✎
08:38
|
(8) 1500 руб.
|
|||
10
Cyberhawk
03.04.13
✎
08:40
|
(9) прилюдно заключаю пари: если ты покажешь и докажешь, что твой код будет быстрее варианта в (0), то Я переведу тебе запрошенную сумму :)
|
|||
11
Ursus maritimus
03.04.13
✎
08:42
|
(10) Прилюдно обещаю, что за 1500 ты получишь работоспособную функцию возвращающую булево (была оплата или нет). А доказывать и показывать можешь самостоятельно.
|
|||
12
Ursus maritimus
03.04.13
✎
08:45
|
(11)+ И да. там не будет запроса оборотов по открытому периоду
|
|||
13
mikecool
03.04.13
✎
08:45
|
насыпьте кто-нить попкорну ))
(11) такая у автора уже есть |
|||
14
mzelensky
03.04.13
✎
08:46
|
(11) работоспособная функция у него и так есть. Он от тебя более "производительную" хочет.
|
|||
15
mikecool
03.04.13
✎
08:48
|
(12) а вот с закрытым периодом - это уже интереснее...
|
|||
16
Ksandr
03.04.13
✎
08:50
|
(0) Да поможет тебе денормализация.
|
|||
17
mzelensky
03.04.13
✎
08:53
|
(0) кстати, советую вот так написать:
"(ВЫРАЗИТЬ(Сделка КАК Документ.ЗаказПокупателя)).ссылка = &ЗаказСсылка" Лично столкнулся с проблемой. что в некоторых случаях вот так: "(ВЫРАЗИТЬ(Сделка КАК Документ.ЗаказПокупателя)) = &ЗаказСсылка" криво отрабатывало |
|||
18
Cyberhawk
03.04.13
✎
08:56
|
(17) благодарю
(12), (15) а что там с закрытым периодом? Вы свертку регистра имеете в виду? Т.е. документ будет в базе проведен, а в таблице оборотов его не будет? |
|||
19
crazy_killer
03.04.13
✎
09:03
|
На большой базе должно работать быстрее, чем (0)
ВЫБРАТЬ РасчетыСКонтрагентамиОбороты.СуммаВзаиморасчетовРасход КАК СуммаОплаты ИЗ РегистрНакопления.РасчетыСКонтрагентами.Обороты( , , , ДоговорКонтрагента = &Договор И (ВЫРАЗИТЬ(Сделка КАК Документ.ЗаказПокупателя)) = &Сделка) КАК РасчетыСКонтрагентамиОбороты ГДЕ РасчетыСКонтрагентамиОбороты.СуммаВзаиморасчетовРасход > 0 |
|||
20
Cyberhawk
03.04.13
✎
09:05
|
(19) а за счет чего быстрее? Условие из "Где" наложится уже после выборки строк из таблицы оборотов, следовательно из-за него быстрее не будет. В остальном разницы не вижу: выборка из таблицы оборотов с параметром
|
|||
21
Cyberhawk
03.04.13
✎
09:06
|
+(20) Я не утверждаю, Я делюсь соображениями. Если не прав, то поправьте - буду благодарен за новые знания :)
|
|||
22
crazy_killer
03.04.13
✎
09:07
|
(21) за счет попадания в кластерный индекс регистра накопления
|
|||
23
Cyberhawk
03.04.13
✎
09:11
|
(22) т.е. за счет того что два измерения подряд идут друг за другом, так? :)
Круто, не знал, благодарствую! |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |