AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 21.04.2016, 12:26   #1  
fed is offline
fed
Moderator
Аватар для fed
Ex AND Project
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
2,913 / 5736 (197) ++++++++++
Регистрация: 13.03.2002
Адрес: Hüfingen,DE
В общем - по моим наблюдениям, SQL вообще очень неважно оптимизирует запросы с OR в условиях джойна.
Я бы пошел по такому пути:
1. Создал бы вспомогательную таблицу с полями клиент, группа, профиль и счет ГК.
2. Заполнил бы эту таблицу декартовым произведением профилей и клиентов
3. Потом прогнал бы по этой таблице три update. Первый update джойнит вспомогательную таблицу с custLedger по условию совпадения профиля и клиента. Второй update обновляет только строки с пустым счетом ГК и по условию совпадения профиля и группы клиентов.Третий update действует аналогично но работает уже только по профилю разноски.
4. Каждый из запросов в пункте 3 надо проанализировать и построить подходящие индексы (поскольку каждый из джойнов только по AND, проблем быть не должно).
5. Потом джойнишь custTrans со вспомогательной таблицей.

P.S. Пожалуй что декартово произведение из пункта 2, можно заменить просто сбором уникальных комбинаций клиента и профиля из custTrans

Последний раз редактировалось fed; 21.04.2016 в 12:31.
За это сообщение автора поблагодарили: Alexius (3), Logger (3).
Старый 21.04.2016, 12:36   #2  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Alexius Посмотреть сообщение
А совпадения РК - ГК пользователи не ожидают ?
конечно ожидают. и конечно не получают. но это отдельная тема.
вернемся к T-SQL запросу для выборки настройки Table/Group/Al.


Цитата:
Сообщение от fed Посмотреть сообщение
В общем - по моим наблюдениям, SQL вообще очень неважно оптимизирует запросы с OR в условиях джойна.
а при чем здесь or?
проблема:
Цитата:
Сообщение от mazzy Посмотреть сообщение
Основная проблема - в настроечной таблице для одной проводки может быть несколько разных подходящих настроек для одной исходной мастер-записи.
если вернуться к примеру, то для одного клиента в базе может быть ОДНОВРЕМЕННО несколько настроек: для него самого, для его группы и для всех.
некоторые (или все) настройки могут отсутствовать.

Цитата:
Сообщение от fed Посмотреть сообщение
1. Создал бы вспомогательную таблицу с полями клиент, групп, профиль и счет ГК.
2. Заполнил бы эту таблицу декартовым произведением профилей и клиентов
3. Потом прогнал бы по этой таблице три update.
дык, код получается нереентерабельным.
возможно, что этот запрос выполняется одновременно несколькими внешними программами с разными критериями выборки. будешь эмулировать временную таблицу?

если будешь эмулировать, то нафига она вообще нужна, давай сформулируем как сделать select, который реализует твой алгоритм.
Старый 21.04.2016, 12:39   #3  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от fed Посмотреть сообщение
Я бы пошел по такому пути:
кстати, ты просто переформулировал мой второй пример наивной реализации с isnull )))

Код:
with trans as (
SELECT
    isnull(accTable.SUMACCOUNT, isnull(accGroup.SumAccount, accAll.SumAccount)) as pSumAccount,
    tr.*
from custtrans as tr
join custtable as tab on (tab.DATAAREAID = tr.DATAAREAID and tab.accountnum = tr.accountnum)
left join CUSTLEDGERACCOUNTS as accTable
    on (accTable.DATAAREAID = tr.DATAAREAID
    and accTable.POSTINGPROFILE = tr.POSTINGPROFILE
    and accTable.AccountCode = 0 and accTable.NUM = tab.ACCOUNTNUM)
left join CUSTLEDGERACCOUNTS as accGroup 
    on (accTable.DATAAREAID = tr.DATAAREAID
    and accGroup.POSTINGPROFILE = tr.POSTINGPROFILE
    and accGroup.AccountCode = 1 and accGroup.NUM = tab.CUSTGROUP)
left join CUSTLEDGERACCOUNTS as accAll
    on (accAll.DATAAREAID = tr.DATAAREAID
    and accAll.POSTINGPROFILE = tr.POSTINGPROFILE
    and accAll.AccountCode = 2)
)
select *
from trans
--where trans.DATAAREAID in ('dmr')
Старый 21.04.2016, 13:58   #4  
Alexius is offline
Alexius
Участник
Аватар для Alexius
 
461 / 248 (9) ++++++
Регистрация: 13.12.2001
Цитата:
Сообщение от mazzy Посмотреть сообщение
Цитата:
Сообщение от fed Посмотреть сообщение
Я бы пошел по такому пути:
кстати, ты просто переформулировал мой второй пример наивной реализации с isnull )))
Не-е-е, это другой подход и идея очень интересная:
1. Создаем временную таблицу КодКлиента (группа клиента не нужна), Профиль, СчетГК
2. Заполняем всеми пересечениями КодКлиента, Профиль из проводок (желателен такой индекс)
3. Делаем обновление в ней СчетаГК из настроек 3-мя запросами: сначала Все, потом Группа и наконец Таблица
4. Строим запрос по проводкам с привязкой временной таблицы по INNER JOIN
5. Индексы по вкусу
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Произвольный SQL-запрос listener DAX: База знаний и проекты 26 26.07.2016 09:31
Пользовательские настройки. Выборки формы r2d2 DAX: Функционал 1 13.11.2014 11:37
Автоматический выбор профиля разноски при создании заказа ada DAX: Функционал 15 30.06.2005 14:46
Настройка профиля разноски модуля Основные средства mnu DAX: Функционал 24 23.06.2004 09:45
Собственный SQL запрос в FormDataSource Alexey DAX: База знаний и проекты 0 20.12.2001 00:35
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 10:53.