14.11.2005, 13:11 | #1 |
Участник
|
Очередной вопрос про Query
Доброго времени суток!
У меня очередной вопрос про Query. Как можно программно создать запрос, который реализовал бы следующий код на X++ : PHP код:
PHP код:
Последний раз редактировалось rkrivov; 14.11.2005 в 13:14. |
|
14.11.2005, 13:34 | #2 |
Administrator
|
Напишите вместо
X++: queryExression = strfmt("(%2 != %1) && ((%2 == %1) || (!%1))", ds1, ds2 ); X++: queryExression = strfmt("((%2 != %1) && ((%2 == %1) || (!%1)))", ds1, ds2 );
__________________
Возможно сделать все. Вопрос времени |
|
14.11.2005, 13:57 | #3 |
Участник
|
Такая же фигня... получил - Ошибка расширенного диапазона запроса: Ожидается правая круглая скобка рядом с 16.
|
|
14.11.2005, 14:45 | #4 |
Дмитрий Ерин
|
Хм... Честно говоря, не вникал в суть того, что Вы пытаетесь сделать, но сдается мне, что в Ваш запрос закралась какая-то бяка... Попытка оптимизировать (по правилу поглощения, кажется) условие:
"(%2 != %1) && ((%2 == %1) || (!%1))" привела к следующему: "(%2 != %1) && (!%1)" Что по сути означает "первый параметр всегда пустой, а второй - всегда непустой". Может быть это именно то, что Вам и нужно, но зачем тогда такие сложные сравнения? |
|
14.11.2005, 17:05 | #5 |
Участник
|
Цитата:
Попытка оптимизировать (по правилу поглощения, кажется) условие:
"(%2 != %1) && ((%2 == %1) || (!%1))" привела к следующему: "(%2 != %1) && (!%1)" |
|
14.11.2005, 17:07 | #6 |
Участник
|
Попробуй все выражение взять в скобки.
Код: "((%2 != %1) && ((%2 == %1) || (!%1)))" Последний раз редактировалось Hezl; 14.11.2005 в 17:11. |
|
14.11.2005, 17:12 | #7 |
Участник
|
Цитата:
Попробуй все выражение взять в скобки.
|
|
14.11.2005, 17:15 | #8 |
Участник
|
Скобки здесь не причем.
Разборщик Axapta'ы не понимает обращение к полям в виде массива ("A.dimension[1]"). Можно обратиться к первому полю массива просто указав его имя ("A.dimension"). К остальным достучаться не получается даже через имя поля в б/д ("dimension2_" или "dimension3_")
__________________
Axapta v.3.0 sp5 kr2 |
|
14.11.2005, 17:16 | #9 |
Участник
|
Цитата:
Разборщик Axapta'ы не понимает обращение к полям в виде массива ("A.dimension[1]"). Можно обратиться к первому полю массива просто указав его имя ("A.dimension"). К остальным достучаться не получается даже через имя поля в б/д ("dimension2_" или "dimension3_")
|
|
14.11.2005, 17:17 | #10 |
Участник
|
Если я правильно помню, то подобный "расширенный" фильтр нельзя использовать для элементов массива с индексом более 1. У тебя fieldName = dimension[...]
Немного опоздал Последний раз редактировалось Hezl; 14.11.2005 в 17:32. |
|
14.11.2005, 17:26 | #11 |
Участник
|
вот что аксапта выдала "Ошибка расширенного диапазона запроса: B.dimension_5 не является корректной парой datasource.field рядом с 21."
|
|
14.11.2005, 17:43 | #12 |
Участник
|
Цитата:
Сообщение от rkrivov
А как получить физическое имя поля (то, что в базе) по его коду или аксаптовскому имени?
X++: DictTable.fieldName(filedid2ext(fieldnum(LedgerBalancesDimTrans, Dimension), 5),
DBBackend::Sql); Цитата:
Сообщение от rkrivov
вот что аксапта выдала "Ошибка расширенного диапазона запроса: B.dimension_5 не является корректной парой datasource.field рядом с 21."
Во-вторых, все равно не поможет
__________________
Axapta v.3.0 sp5 kr2 |
|
|
За это сообщение автора поблагодарили: Ace of Database (2). |
14.11.2005, 17:48 | #13 |
Участник
|
Цитата:
Во-первых, поле называется dimension5_
Во-вторых, все равно не поможет |
|
14.11.2005, 17:59 | #14 |
Участник
|
Цитата:
Сообщение от rkrivov
Исчерпывающий ответ... главное поможет
Выше я уже писал, что можно обратиться только к первому полю массива. Не совсем понял какие ко мне претензии
__________________
Axapta v.3.0 sp5 kr2 |
|
14.11.2005, 18:05 | #15 |
Участник
|
Цитата:
Выше я уже писал, что можно обратиться только к первому полю массива. Не совсем понял какие ко мне претензии
|
|
14.11.2005, 18:42 | #16 |
Участник
|
Самое интересное что при обращение к первой аналитике (т.е. к полю DIMENSION, а не к DIMENSION5_) получаем сообщение "Ошибка расширенного диапазона запроса: Ожидается правая круглая скобка рядом с 36."
Называется от чего ушли к тому и пришли Последний раз редактировалось rkrivov; 14.11.2005 в 19:08. |
|
15.11.2005, 11:23 | #17 |
Участник
|
Ну не работает эта з(а)раза
В общем так... вот код, который формирует запрос (он несколько изменился) :
X++: q = new Query(); qbds_lb = q.addDataSource(tableNum(LedgerBalancesDimTrans)); qbds_lbbuf = qbds_lb.addDataSource(tableNum(LedgerBalancesDimTrans)); qbds_lbbuf.relations( false ); qbds_lbbuf.joinMode(JoinMode::NoExistsJoin); qbds_lb.orderMode(OrderMode::GroupBy); qbds_lb.addSortField(fieldId); qbr = qbds_lb.addRange(fieldNum(LedgerBalancesDimTrans, TransDate)); qbr.value(SysQuery::range(DateNull(), dateEndMth(ledgerJournalDistribTable.Period))); qbr = qbds_lbbuf.addRange(fieldNum(LedgerBalancesDimTrans, TransDate)); qbr.value(SysQuery::range(DateNull(), dateEndMth(ledgerJournalDistribTable.Period))); if (LedgerDistribByAlg.OffsetAccountNum) { qbr = qbds_lb.addRange(fieldNum(LedgerBalancesDimTrans, AccountNum)); qbr.value(SysQuery::value(LedgerDistribByAlg.OffsetAccountNum)); qbr = qbds_lbbuf.addRange(fieldNum(LedgerBalancesDimTrans, AccountNum)); qbr.value(SysQuery::value(LedgerDistribByAlg.OffsetAccountNum)); } if (LedgerDistribByAlg.BaseAccountNum) { qbr = qbds_lb.addRange(fieldNum(LedgerBalancesDimTrans, AccountNum)); qbr.value(SysQuery::value(LedgerDistribByAlg.BaseAccountNum)); qbr = qbds_lbbuf.addRange(fieldNum(LedgerBalancesDimTrans, AccountNum)); qbr.value(SysQuery::value(LedgerDistribByAlg.BaseAccountNum)); } switch (_dimensionNumber) { case 1: if (ledgerDistribByAlg.DimLedgerDistribByAlg[1]) { qbr = qbds_lb.addRange(fieldName2Id(tableNum(LedgerBalancesDimTrans), "dimension[1]")); qbr.value(ledgerDistribByAlg.DimLedgerDistribByAlg[1]); qbr = qbds_lbbuf.addRange(fieldName2Id(tableNum(LedgerBalancesDimTrans), "dimension[1]")); qbr.value(ledgerDistribByAlg.DimLedgerDistribByAlg[1]); } break; case 2: if (ledgerDistribByAlg.DimLedgerDistribByAlg[2]) { qbr = qbds_lb.addRange(fieldName2Id(tableNum(LedgerBalancesDimTrans), "dimension[2]")); qbr.value(ledgerDistribByAlg.DimLedgerDistribByAlg[2]); qbr = qbds_lbbuf.addRange(fieldName2Id(tableNum(LedgerBalancesDimTrans), "dimension[2]")); qbr.value(ledgerDistribByAlg.DimLedgerDistribByAlg[2]); } break; case 5: if (ledgerDistribByAlg.DimLedgerDistribByAlg[3]) { qbr = qbds_lb.addRange(fieldName2Id(tableNum(LedgerBalancesDimTrans), "dimension[5]")); qbr.value(ledgerDistribByAlg.DimLedgerDistribByAlg[3]); qbr = qbds_lbbuf.addRange(fieldName2Id(tableNum(LedgerBalancesDimTrans), "dimension[5]")); qbr.value(ledgerDistribByAlg.DimLedgerDistribByAlg[3]); } break; } ds1 = strfmt("%1.%2", qbds_lb.name(), fieldName); ds2 = strfmt("%1.%2", qbds_lbbuf.name(), fieldName); queryExression = strfmt("((NOT(%2 = %1)) AND ((%2 = %1) OR (NOT(%1 = ''))))", ds1, ds2 ); qbr = qbds_lbbuf.addRange(fieldId); qbr.value(queryExression); qR = new QueryRun(q); // qR.reset(); while (qR.next()) { lb = qR.getNo(1); // . . . // Something to do // . . . } Код: SELECT * FROM LedgerBalancesDimTrans GROUP BY LedgerBalancesDimTrans.Dimension[5] ASC WHERE ((TransDate<=30.11.2005)) AND ((AccountNum = 25.0200) OR (AccountNum = 20.0100)) NOTEXISTS JOIN * FROM LedgerBalancesDimTrans WHERE ((TransDate<=30.11.2005)) AND ((AccountNum = 25.0200) OR (AccountNum = 20.0100)) AND ((((NOT(LedgerBalancesDimTrans_1_1.dimension[5] = LedgerBalancesDimTrans_1.dimension[5])) AND ((LedgerBalancesDimTrans_1_1.dimension[5] = LedgerBalancesDimTrans_1.dimension[5]) OR (NOT(LedgerBalancesDimTrans_1.dimension[5] = '')))))) Попробовал практически все варинаты... так и не работает... Как это Аксапта парсит такие запросы.... или это вообще сделать не реально? (тогда нужно действовать напрямую) Если убрать строки X++: qbr = qbds_lbbuf.addRange(fieldId); qbr.value(queryExression); Последний раз редактировалось rkrivov; 15.11.2005 в 12:01. |
|
15.11.2005, 12:08 | #18 |
Участник
|
??
Я чего-то не пойму - вам же AndyD написал, что оно не будет работать с Dimension с index > 1 возможно попробуйте вместо попыток создания query убрать то условие, которое глючит, делать while (qr.next()) { //и здесь проверять ваше условие через if(dimension[5] != '34') так далее } Это дольше понятно работать будет - но зато будет. |
|
15.11.2005, 12:33 | #19 |
Участник
|
Цитата:
Сообщение от kashperuk
??
Я чего-то не пойму - вам же AndyD написал, что оно не будет работать с Dimension с index > 1 возможно попробуйте вместо попыток создания query убрать то условие, которое глючит, делать while (qr.next()) { //и здесь проверять ваше условие через if(dimension[5] != '34') так далее } Это дольше понятно работать будет - но зато будет. X++: ds1 = strfmt([color=red]"%1.%2"[/color], qbds_lb.name(), fieldName); ds2 = strfmt([color=red]"%1.%2"[/color], qbds_lbbuf.name(), fieldName); queryExression = strfmt([color=red]"((NOT(%2 = %1)) AND ((%2 = %1) OR (NOT(%1 = ''))))"[/color], ds1, ds2 ); qbr = qbds_lbbuf.addRange(fieldId); qbr.value(queryExression); К тому же с Index = 1 тоже не работает... я уже писал об этом... Последний раз редактировалось rkrivov; 15.11.2005 в 12:38. |
|
15.11.2005, 12:44 | #20 |
Участник
|
Вместо
queryExression = strfmt("((NOT(%2 = %1)) AND ((%2 = %1) OR (NOT(%1 = ''))))", ds1, ds2 ); Попробуйте queryExression = strfmt('((NOT(%2 = %1)) AND ((%2 = %1) OR (NOT(%1 = ""))))', ds1, ds2 ); Часто помогает. |
|
Теги |
query, программно, фильтр, запрос (query) |
|
Похожие темы | ||||
Тема | Ответов | |||
Вопрос по Query с агрегатной функцией | 11 | |||
Вопрос про Query | 5 | |||
Вопрос по query и join | 2 | |||
Вопрос по запросу (query) | 2 | |||
Вопрос знатокам QBE и Query в AXAPTA | 6 |
|