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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 29.02.2016, 16:26   #1  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
877 / 649 (23) +++++++
Регистрация: 14.10.2004
Очередной построитель запросов - на этот раз будет бомба!
Предлагаю вашему вниманию еще один построитель запросов.
Который должен, по идее, развить мысль Маззи о программистком подходе и довести эту мысль до апофеоза.
Время изучения этого инструмента - 2 минуты. Время использования - вся последующая жизнь.
Суть этой утилиты: пользователь вводит через запятую названия таблиц Аксапты - и в редакторе кода получает готовый запрос - с учетом связей между таблицами. Можно использовать синонимы и рекурсивные связи, когда одна и та же таблица джойнится сама с собой, например связать между собой корреспондирующие проводки ГК,
Данный инструмент позволяет, находясь прямо в редакторе кода, из строки вида "ledgerTrans ledgerTransDebit, LedgerTrans LedgerTransCredit, LedgerTable AccountDebit 1, LedgerTable AccountCredit 2" получить код вида
X++:
    LedgerTrans                             ledgerTransDebit;
    LedgerTrans                             LedgerTransCredit;
    LedgerTable                             AccountDebit;
    LedgerTable                             AccountCredit;
    ;

    while select ledgerTransDebit where
        ledgerTransDebit.Crediting == 0
        join LedgerTransCredit where
        LedgerTransCredit.Crediting == 1 &&
        LedgerTransCredit.BondBatchTrans_RU == ledgerTransDebit.BondBatchTrans_RU &&
        LedgerTransCredit.BondBatch_RU == ledgerTransDebit.BondBatch_RU
        join AccountDebit where
        AccountDebit.AccountNum == ledgerTransDebit.AccountNum
        join AccountCredit where
        AccountCredit.AccountNum == LedgerTransCredit.AccountNum
    {
        //пишите ваш код...
    }

Теперь хватит рекламы и по сути.
Проект тестировался на AX2009 и AX3.
1) Перенесите прилагаемый проект в вашу тестовую Аксапту.ВНИМАНИЕ: класс EditorSripts целиком не переносить - перенесите только метод QuickSelect.
2) Создайте в Аксапте Job или войдите в какой-нибудь метод в каком-нибудь классе.
3) Установите курсор в то место, куда должен быть вставлен сгенерированный запрос.
4) Нажмите правой кнопкой мыши и вызовите в контекстном меню пункт Scripts - QuickSelect. Это новый пункт, который должен был появиться после переноса метода QuickSelect в класс EditorSripts.
5) В открывшемся окне в поле ввода "Названия таблиц через запятую" введите названия таблиц и нажмите кнопку ОК. Вводить текст надо без кавычек - просто названия таблиц через запятые. Количество пробелов в тексте произвольное.
6) Проверьте результат.

По кнопке "Шаблоны запросов" можно сохранять ваши перечни таблиц, чтобы каждый раз их потом не набирать. В поле ввода можно выбирать из списка сохраненные перечни.

Правила написания запросов.
Допустим мы хотим вывести остатки в разрезе складских аналитик и с названием номенклатуры. Для этого нам надо написать запрос такого вида:
InventSum, InventDim, InventTable 1
Обратите внимание, что после таблицы InventTable стоит цифра 1. Это означает, что таблица должна быть приджойнена к первой таблице из запроса - к таблице InventSum. Если бы после таблицы InventTable мы не поставили цифру 1, то утилита подумала бы, что эту таблицу надо джойнить к предыдущей таблице в запросе - к таблице InventDim.
Общее правило: любая следующая таблица в запросе джойнится к предыдущей. Если надо ее приджойнить к другой таблице, то надо через пробел поставить порядковый номер той таблицы, к которой надо приджойнить текущую таблицу.

Синонимы
Если у вас в уже имеющемся коде используются табличные переменные, отличные от названия таблиц (например переменная, объявленная как "RContractTable contract"), или если вам надо использовать в запросе одну и ту же таблицу два или более раз - как в примере в самом начале темы - то вы можете присваивать синонимы используемым в запросе таблицам.
Рассмотрим пример:
ledgerTrans ledgerTransDebit, LedgerTrans LedgerTransCredit, LedgerTable AccountDebit 1, LedgerTable AccountCredit 2

Здесь первой табличной переменной присваивается синоним ledgerTransDebit - так как она отвечает только за проводки ГК по дебиту, а второй табличной переменной присваивается синоним LedgerTransCredit, так как она отвечает за проводки ГК по кредиту. Третья табличная переменная типа LedgerTable имеет синоним AccountDebit, так как она джойнится к первой табличной переменной (дебетовой проводке ГК). Четвертая табличная переменная типа LedgerTable имеет синоним AccountCredit, так как она джойнится ко второй табличной переменной (кредитовой проводке ГК).

Галка "Генерировать декларацию переменных"
Если вы хотите, чтобы утилита сгенерировала декларацию испольщуемых в запросе табличных переменных, то установите эту галку. При генерации будут учтены синонимы.

Итак, попробуйте следующие запросы (напомню - все пишется без кавычек простым текстом):
ledgerTrans ledgerTransDebit, LedgerTrans LedgerTransCredit, LedgerTable AccountDebit 1, LedgerTable AccountCredit 2

InventTrans, InventTransPosting

inventsum, inventDim, WMSLocation

CustInvoiceJour, CustInvoiceTrans, FactureTrans_RU

CustTrans, LedgerTrans, CustTransOpen 1
Вложения
Тип файла: xpo Z_DEM_QuickSelect_AX2009.xpo (63.7 Кб, 444 просмотров)
Тип файла: xpo Z_DEM_QuickSelect_AX30.xpo (82.1 Кб, 508 просмотров)

Последний раз редактировалось Ace of Database; 29.02.2016 в 16:39.
За это сообщение автора поблагодарили: mazzy (2), rumpleteazer (1), trud (3), Ruff (5), NetBus (1), Kabardian (2), Dreadlock (3), imir (2).
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
SimpleQueryBuilder - простой Х++ конструктор читабельных T-SQL запросов Ruff DAX: Программирование 18 04.02.2016 14:15
DAX 2009 - Трассировка долгих SQL-запросов в пакетном режиме N.D.P. DAX: Администрирование 4 18.03.2015 09:13
Просмотрщик запросов QueryBrowser DAX 3.0 SP4 Russland DAX: База знаний и проекты 30 11.03.2011 11:00
Оптимизация запросов к БД в коде Ace of Database DAX: База знаний и проекты 57 18.03.2010 09:38
Тормоза при получении очередной строки из ResultSet Alenka DAX: Программирование 14 04.08.2009 13:31

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

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

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