05.06.2010, 09:34 | #1 |
Участник
|
Создание запроса программно
Задача определить корреспонденцию балансовых с забалансовыми счетами.
В плане счетов ввела галки Балансовый/Забалансовый. Идею условие с чем может корреспондировать на плане счетов не предлагать, по некоторым причинам не подходит. Пишу код X++: Query qryLTbl1; QueryRun qrunLTbl1; QueryBuildDataSource qbdsLTbl1; QueryBuildRange qbrOutBalance1; LedgerTable _LTbl1Q; QueryBuildDataSource qbdsLT1; QueryBuildRange qbrPeriod1; QueryBuildRange qbrPeriodType1; QueryBuildRange qbrType1; QueryBuildRange qbrAccountNum1; QueryBuildRange qbrD_C; QueryBuildRange qbrBalanceC1; LedgerTrans _LTQ1; QueryBuildDataSource qbdsLT2; LedgerTrans _LTQ2; QueryBuildRange qbrD_C2; QueryBuildDataSource qbdsLTbl2; QueryBuildRange qbrOutBalance2; LedgerTable _LTbl2Q; str 254 _periodLT; str 254 _periodCode; qryLTbl1 = new Query(); qbdsLTbl1 = qryLTbl1.addDataSource(tablenum(LedgerTable),'lbdt2'); qbrOutBalance1 = qbdsLTbl1.addRange(fieldnum(LedgerTable,OutBalance)); qbrOutBalance1.value(enum2str(NoYes::Yes)); qbdsLT1 = qbdsLTbl1.addDataSource(tablenum(LedgerTrans),'lbdt20'); qbdsLT1.fetchMode(JoinMode::INNERJOIN); qbdsLT1.relations(true); qbdsLT1.addLink(fieldnum(LedgerTrans, accountNum), fieldnum(LedgerTable, accountNum)); qbrPeriod1 = qbdsLT1.addRange(fieldnum(LedgerTrans,TransDate)); _periodLT = Date2str(fromdate,12,2,2,2,2,2)+'..'+Date2str(todate,12,2,2,2,2,2); qbrPeriod1.value(_periodLT); qbrPeriodType1 = qbdsLT1.addRange(fieldnum(LedgerTrans,PeriodCode)); qbrPeriodType1.value(enum2str(PeriodCode::Regular)); qbrD_C = qbdsLT1.addRange(fieldnum(LedgerTrans,Crediting)); qbrD_C.value(enum2str(NoYes::No)); qbdsLT2 = qbdsLT1.addDataSource(tablenum(LedgerTrans),'lbdt21'); qbdsLT2.fetchMode(JoinMode::INNERJOIN); qbdsLT2.relations(false); qbdsLT2.addLink(fieldnum(LedgerTrans, accountNum), fieldnum(LedgerTrans, accountNum)); qbdsLT2.addLink(fieldnum(LedgerTrans, BondBatch_RU), fieldnum(LedgerTrans, BondBatch_RU)); qbdsLT2.addLink(fieldnum(LedgerTrans, BondBatchTrans_RU), fieldnum(LedgerTrans, BondBatchTrans_RU)); qbrD_C2 = qbdsLT2.addRange(fieldnum(LedgerTrans,Crediting)); qbrD_C2.value(enum2str(NoYes::Yes)); qbdsLTbl2 = qbdsLT2.addDataSource(tablenum(LedgerTable),'lbdt211'); qbrOutBalance2 = qbdsLTbl2.addRange(fieldnum(LedgerTable,OutBalance)); qbrOutBalance2.value(enum2str(NoYes::No)); qbdsLTbl2.fetchMode(JoinMode::INNERJOIN); qbdsLTbl2.addLink(fieldnum(LedgerTrans, accountNum), fieldnum(LedgerTable, accountNum)); qrunLTbl1 = new QueryRun(qryLTbl1); while (qrunLTbl1.next()) { info ('11'); } Итоговый запрос выглядит так SELECT * FROM LedgerTable WHERE ((OutBalance = Да)) JOIN * FROM LedgerTrans WHERE LedgerTable.AccountNum = LedgerTrans.AccountNum AND LedgerTable.AccountNum = LedgerTrans.AccountNum AND ((TransDate>=01.05.10 AND TransDate<=30.06.10)) AND ((PeriodCode = Обычный)) AND ((Crediting = Нет)) JOIN * FROM LedgerTrans WHERE LedgerTrans.AccountNum = LedgerTrans.AccountNum AND LedgerTrans.BondBatch_RU = LedgerTrans.BondBatch_RU AND LedgerTrans.BondBatchTrans_RU = LedgerTrans.BondBatchTrans_RU AND ((Crediting = Да)) JOIN * FROM LedgerTable WHERE LedgerTrans.AccountNum = LedgerTable.AccountNum AND ((OutBalance = Нет)) |
|
05.06.2010, 10:21 | #2 |
Участник
|
Вроде бы логика запроса понятна. Данные удовлетворяющие этому запросу имеются? Попробуйте сначала переписать его на обычном select. Несколько замечаний к построению запроса:
вместо enum2str используйте queryValue здесь нужно не fetchMode, а joinMode Цитата:
Используйте qbrPeriod1.value(SysQuery::range(fromdate, todate)); |
|
|
За это сообщение автора поблагодарили: RVS (1). |
05.06.2010, 19:20 | #3 |
Участник
|
Тут проблема в том, что таблицы одинаковые. Данные точно есть.
X++: _LTbl1 = null; _LT2 = null; _LT1 = null; _LTbl2 = null; while select _LTbl1 join _LT1 join _LT2 join _LTbl2 where _LT1.AccountNum == _LTbl1.AccountNum && _LTbl1.OutBalance == NoYes::Yes && _LT1.PeriodCode == PeriodCode::Regular && _LT2.BondBatchTrans_RU == _LT1.BondBatchTrans_RU && _LT2.BondBatch_RU == _LT1.BondBatch_RU && _LT2.RecId != _LT1.RecId && _LTbl2.OutBalance == NoYes::No && _LT2.AccountNum == _LTbl2.AccountNum { info (_LT2.Voucher); } Последний раз редактировалось Arahnid; 05.06.2010 в 19:45. |
|
07.06.2010, 13:01 | #4 |
Участник
|
А нужен ли линк по полю AccountNum ?
X++: qbdsLT2.addLink(fieldnum(LedgerTrans, accountNum), fieldnum(LedgerTrans, accountNum)); Цитата:
Сообщение от Arahnid
Итоговый запрос выглядит так
SELECT * FROM LedgerTable WHERE ((OutBalance = Да)) JOIN * FROM LedgerTrans WHERE LedgerTable.AccountNum = LedgerTrans.AccountNum AND LedgerTable.AccountNum = LedgerTrans.AccountNum AND ((TransDate>=01.05.10 AND TransDate<=30.06.10)) AND ((PeriodCode = Обычный)) AND ((Crediting = Нет)) JOIN * FROM LedgerTrans WHERE LedgerTrans.AccountNum = LedgerTrans.AccountNum AND LedgerTrans.BondBatch_RU = LedgerTrans.BondBatch_RU AND LedgerTrans.BondBatchTrans_RU = LedgerTrans.BondBatchTrans_RU AND ((Crediting = Да)) JOIN * FROM LedgerTable WHERE LedgerTrans.AccountNum = LedgerTable.AccountNum AND ((OutBalance = Нет))
__________________
Sergey Nefedov |
|