07.04.2010, 06:38 | #1 |
Участник
|
Проблема с запросом
Всем добрый день.
Подскажите, пожалуйста, как построить запрос. В таблице 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 |
Участник
|
А на сколько сложные условия фильтрации могут содержаться в поле BudgetDim? Вы хотите использовать все возможности стандартного синтаксиса фильтрации (http://axapta.mazzy.ru/lib/search/)? А если в следующей версии системы возможности стандартного фильтра изменятся, вы хотите обеспечить совместимость? Т.е уже сейчас стоит задача использовать стандартный парсер запросов? или можно придумать свой собственный вариант, удовлетворяющий текущим требованиям?
1) С использованием стандартного парсера выход только один - вложенные подзапросы по каждому BankAccountTable. 2) Если городить свою систему, то я бы предложил хранить фильтры в следующем виде: - тип критерия (больше/меньше/равно/неравно) - критерий (непосредственно значение) Если необходимо предусмотреть комбинацию критериев (и/или), то прийдётся вынести их в отдельную таблицу 1:n P.S.: Рекомендация: постройте сначала запрос на чистом SQL, а потом пекреносите на аксапту. Конечно, не всё то что можно сделать на SQL также легко реализуется в аксапте, но зато то что на SQL не реализуется, в аксапте точно сделать за один запрос не получится |
|
07.04.2010, 10:50 | #3 |
Участник
|
В поле BudgetDim могут указываться значения с учетом символов «,», «*», «..», «!».
Но даже если в нем будет указано не очень сложное условие фильтрации, например !Код6 или Код7*, то я, честно говоря, не представляю, как можно и на SQL составить запрос, где на LedgerJournalTrans.BudgetDimId будет наложено такое условие. |
|
07.04.2010, 11:10 | #4 |
Участник
|
Цитата:
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 |
Участник
|
По-моему, вам надо завести еще одну таблицу, куда складывать коды, удовлетворяющие условию в BudgetDim
Обновлять эту таблицу надо будет при изменении критерия и при добавлении/удалении записей в таблице БК ну и в запросе использовать не BankAccountTable, а эту таблицу
__________________
Axapta v.3.0 sp5 kr2 |
|
07.04.2010, 11:38 | #6 |
Участник
|
Такой вариант подошел бы, если в этом поле всегда был только один критерий, но в плохом случае там можно указать сложный критерий: Код1,Код5* и т.п.
И еще я все-таки хочу получить этот запрос через query, а не через select. В форме диалога я по кнопке "Выбрать" выбираю банковские счета, и потом к полученному query добавляю LedgerJournalTrans. А насчет вложенных запросов можно поподробней, как их можно сделать через query, ни разу их не писала. |
|
07.04.2010, 12:52 | #7 |
Участник
|
Цитата:
Цитата:
Цитата:
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 |
Участник
|
Такой вариант работает, конечно, помедленнее, но зато съедает даже сложные критерии. Спасибо, так все получилось.
|
|
Теги |
query, range |
|
Похожие темы | ||||
Тема | Ответов | |||
Проблема с SQL запросом | 15 | |||
Проблема с запросом | 2 | |||
Проблема с запросом | 7 | |||
Проблема с созданием объекта | 33 | |||
Проблема: русские шрифты в отчетах, формируемых на сервере. | 3 |
|