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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 07.04.2010, 06:38   #1  
Raduga is offline
Raduga
Участник
 
6 / 10 (1) +
Регистрация: 12.03.2010
Проблема с запросом
Всем добрый день.
Подскажите, пожалуйста, как построить запрос.
В таблице LedgerJournalTrans есть поле BudgetDimId (Код БК), и в таблице BankAccountTable есть поле BudgetDim, в котором указывается критерий, например КодБК1, КодБК5.. КодБК10, !КодБК15 (все значения выбираются из таблицы кодов БК).
Таблицы нужно связать по полям Банковский счет и Код БК.
Как можно создать запрос, чтобы связать эти таблицы по полю Код БК, т.е. на поле LedgerJournalTrans.BudgetDimId наложить условие из BankAccountTable.BudgetDim.

X++:
query = new Query();
qbds = query.addDataSource(tablenum(BankAccountTable));
qbds = qbds.addDataSource(tablenum(LedgerJournalTrans));
qbds.addLink(fieldnum(BankAccountTable, AccountId), fieldnum(LedgerJournalTrans, OffsetAccount));
а как по коду БК?
Старый 07.04.2010, 08:45   #2  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
А на сколько сложные условия фильтрации могут содержаться в поле BudgetDim? Вы хотите использовать все возможности стандартного синтаксиса фильтрации (http://axapta.mazzy.ru/lib/search/)? А если в следующей версии системы возможности стандартного фильтра изменятся, вы хотите обеспечить совместимость? Т.е уже сейчас стоит задача использовать стандартный парсер запросов? или можно придумать свой собственный вариант, удовлетворяющий текущим требованиям?

1) С использованием стандартного парсера выход только один - вложенные подзапросы по каждому BankAccountTable.
2) Если городить свою систему, то я бы предложил хранить фильтры в следующем виде:
- тип критерия (больше/меньше/равно/неравно)
- критерий (непосредственно значение)
Если необходимо предусмотреть комбинацию критериев (и/или), то прийдётся вынести их в отдельную таблицу 1:n

P.S.: Рекомендация: постройте сначала запрос на чистом SQL, а потом пекреносите на аксапту.
Конечно, не всё то что можно сделать на SQL также легко реализуется в аксапте, но зато то что на SQL не реализуется, в аксапте точно сделать за один запрос не получится
Старый 07.04.2010, 10:50   #3  
Raduga is offline
Raduga
Участник
 
6 / 10 (1) +
Регистрация: 12.03.2010
В поле BudgetDim могут указываться значения с учетом символов «,», «*», «..», «!».
Но даже если в нем будет указано не очень сложное условие фильтрации, например !Код6 или Код7*, то я, честно говоря, не представляю, как можно и на SQL составить запрос, где на LedgerJournalTrans.BudgetDimId будет наложено такое условие.
Старый 07.04.2010, 11:10   #4  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от Raduga Посмотреть сообщение
я, честно говоря, не представляю, как можно и на SQL составить запрос, где на LedgerJournalTrans.BudgetDimId будет наложено такое условие.
если хранить условие (именно хранить, вводить можете как вам угодно) не в виде произвольной строки, а в виде пары тип rangeType/rangeValue, то запрос можно написать следующим образом

X++:
select LedgerJournalTrans
exists join BankAccountTable
where
    BankAccountTable.AccountId == LedgerJournalTrans.OffsetAccount &&
    (
        (BankAccountTable.rangeType == rangeType::Great && LedgerJournalTrans.BudgetDimId > BankAccountTable.rangeValue) ||
        (BankAccountTable.rangeType == rangeType::Less && LedgerJournalTrans.BudgetDimId < BankAccountTable.rangeValue) ||
        (BankAccountTable.rangeType == rangeType::Equal && LedgerJournalTrans.BudgetDimId == BankAccountTable.rangeValue) ||
        ...
    )
А вас точно не устраивает вариант разбиения одного запроса на два вложенных?
Старый 07.04.2010, 11:23   #5  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
По-моему, вам надо завести еще одну таблицу, куда складывать коды, удовлетворяющие условию в BudgetDim

Обновлять эту таблицу надо будет при изменении критерия и при добавлении/удалении записей в таблице БК

ну и в запросе использовать не BankAccountTable, а эту таблицу
__________________
Axapta v.3.0 sp5 kr2
Старый 07.04.2010, 11:38   #6  
Raduga is offline
Raduga
Участник
 
6 / 10 (1) +
Регистрация: 12.03.2010
Такой вариант подошел бы, если в этом поле всегда был только один критерий, но в плохом случае там можно указать сложный критерий: Код1,Код5* и т.п.
И еще я все-таки хочу получить этот запрос через query, а не через select.

В форме диалога я по кнопке "Выбрать" выбираю банковские счета, и потом к полученному query добавляю LedgerJournalTrans.
А насчет вложенных запросов можно поподробней, как их можно сделать через query, ни разу их не писала.
Старый 07.04.2010, 12:52   #7  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от Raduga Посмотреть сообщение
Такой вариант подошел бы, если в этом поле всегда был только один критерий, но в плохом случае там можно указать сложный критерий: Код1,Код5* и т.п.
и это можно сделать, только чуть сложнее. Как я уже писал пришлось бы добавлять ещё одну таблицу, для хранения критериев не "через запятую" а какждый в своей строчке.

Цитата:
Сообщение от Raduga Посмотреть сообщение
И еще я все-таки хочу получить этот запрос через query, а не через select.
Всё что можно сделать через select - можно сделать и через query.

Цитата:
Сообщение от Raduga Посмотреть сообщение
А насчет вложенных запросов можно поподробней, как их можно сделать через query, ни разу их не писала.
Я имел в виду что возможно не стоит пытаться обойти все строки LedgerJournalTrans за один раз, а пройтись по каждому выбранному BankAccountTable и отрабатывать каждый конкретный критерий по отдельности.
X++:
query = new Query();
qbds = query.addDataSource(tablenum(BankAccountTable));

queryLedgerJournalTrans = new Query();
qbds = LedgerJournalTrans.addDataSource(tablenum(LedgerJournalTrans));
qbrOffsetAccoun = qbds.addRange(fieldNum(LedgerJournalTrans, OffsetAccount));
qbrBudgetDim = qbds.addRange(fieldNum(LedgerJournalTrans, BudgetDim));

queryRun = new queryRun(query);
while (queryRun.next())
{
    BankAccountTable = queryRun.get(tablenum(BankAccountTable));
    qbrOffsetAccoun.value(queryvalue(BankAccountTable.AccountId));
    qbrBudgetDim.value(BankAccountTable.BudgetDimId);

    queryRunLedgerJournalTrans = new queryRun(queryLedgerJournalTrans);
    while (queryRunLedgerJournalTrans.next())
    {
        LedgerJournalTrans = queryRun.get(tablenum(LedgerJournalTrans));
        ...
    }
}

Последний раз редактировалось S.Kuskov; 07.04.2010 в 12:55.
За это сообщение автора поблагодарили: Raduga (1).
Старый 07.04.2010, 14:00   #8  
Raduga is offline
Raduga
Участник
 
6 / 10 (1) +
Регистрация: 12.03.2010
Такой вариант работает, конечно, помедленнее, но зато съедает даже сложные критерии. Спасибо, так все получилось.
Теги
query, range

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Проблема с SQL запросом kalex_a DAX: Программирование 15 31.03.2010 11:28
Проблема с запросом kalex_a DAX: Программирование 2 17.08.2009 08:05
Проблема с запросом Protey DAX: Программирование 7 10.07.2006 09:32
Проблема с созданием объекта Lelya DAX: Администрирование 33 27.06.2005 16:38
Проблема: русские шрифты в отчетах, формируемых на сервере. Anais DAX: Администрирование 3 17.11.2003 13:20

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

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

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