AXForum  
Go Back   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Forgotten Your Password?
Register Forum Rules FAQ Members List Today's Posts Search

 
 
Thread Tools Search this Thread Display Modes
Old 15.11.2005, 12:56   #21  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2494 (89) +++++++++
Join Date: 20.08.2005
Вы не поняли.
В расширенном диапазоне (т.е. при добавлении условий в Range) нельзя обратиться к полям входящим в массив полей кроме первого. К первому можно обратиться по имени поля (т.е. dimension без указания квадратных скобок и индекса в массиве).
Парсер запросов проверяет поле на сущестрование ч-з AOT. Если указать dimension5_ - то такого поля нет в AOT - по-этому возникает ошибка, хотя поле есть в базе данных. Фактически проверяется только существует это поле или нет (с учетом конфигурационных ключей) и если существует - то подставляется в запрос, если нет - выбрасывается exception (если отключен конфигурационный ключ, то подставляется условие 1=?). К сожалению нельзя создать фейковое поле (например, dimension5_) для обхода этого ограничения - не проходит синхронизация AOT с б/д

Вообще-же в датасоурсе обратиться к полю с произвольным индексом ч-з AddRange() можно - по его extId
__________________
Axapta v.3.0 sp5 kr2
Old 15.11.2005, 12:57   #22  
rkrivov is offline
rkrivov
Участник
rkrivov's Avatar
 
31 / 10 (1) +
Join Date: 18.02.2005
Location: Москва
Quote:
Originally Posted by oblin
Вместо

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 );

Часто помогает.
Пробовал.. Может и частно помогает... только не в этом случае
Old 15.11.2005, 12:59   #23  
rkrivov is offline
rkrivov
Участник
rkrivov's Avatar
 
31 / 10 (1) +
Join Date: 18.02.2005
Location: Москва
что-то странно... чего бы я не пробовал - результат один (за исключением случая когда удаляю это вырожение)... может нельзя в одном query использовать одну и туже таблицу? (или может как-то нужно прописать alias'ы на таблицы?)
Old 15.11.2005, 13:11   #24  
rkrivov is offline
rkrivov
Участник
rkrivov's Avatar
 
31 / 10 (1) +
Join Date: 18.02.2005
Location: Москва
?
Quote:
Originally Posted by AndyD
Вы не поняли.
В расширенном диапазоне (т.е. при добавлении условий в Range) нельзя обратиться к полям входящим в массив полей кроме первого. К первому можно обратиться по имени поля (т.е. dimension без указания квадратных скобок и индекса в массиве).
Парсер запросов проверяет поле на сущестрование ч-з AOT. Если указать dimension5_ - то такого поля нет в AOT - по-этому возникает ошибка, хотя поле есть в базе данных. Фактически проверяется только существует это поле или нет (с учетом конфигурационных ключей) и если существует - то подставляется в запрос, если нет - выбрасывается exception (если отключен конфигурационный ключ, то подставляется условие 1=?). К сожалению нельзя создать фейковое поле (например, dimension5_) для обхода этого ограничения - не проходит синхронизация AOT с б/д

Вообще-же в датасоурсе обратиться к полю с произвольным индексом ч-з AddRange() можно - по его extId
Но ведь следующие строки отрабатывают:
X++:
fieldName = strFmt( "dimension[%1]", _dimensionNumber );
fieldId = fieldName2Id( tableNum(LedgerBalancesDimTrans), fieldId );
все отрабатывает... или это именно в value нельзя добавлять выражения с такими полями?
Old 15.11.2005, 13:16   #25  
Peter Savintsev is offline
Peter Savintsev
Участник
 
246 / 124 (5) +++++
Join Date: 14.12.2001
А почему NOT, OR и AND, а не !, || и &&?
Old 15.11.2005, 13:22   #26  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2494 (89) +++++++++
Join Date: 20.08.2005
Quote:
или это именно в value нельзя добавлять выражения с такими полями?
Да.
__________________
Axapta v.3.0 sp5 kr2
Old 15.11.2005, 13:22   #27  
rkrivov is offline
rkrivov
Участник
rkrivov's Avatar
 
31 / 10 (1) +
Join Date: 18.02.2005
Location: Москва
Quote:
Originally Posted by Peter Savintsev
А почему NOT, OR и AND, а не !, || и &&?
Это просто как вариант... но не то и не другое не прокатывает... ибо не работает с такими полями как dimension[2]
Old 15.11.2005, 13:23   #28  
rkrivov is offline
rkrivov
Участник
rkrivov's Avatar
 
31 / 10 (1) +
Join Date: 18.02.2005
Location: Москва
Quote:
Originally Posted by AndyD
Да.
Old 15.11.2005, 13:36   #29  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 868 (32) +++++++
Join Date: 15.01.2002
Location: Москва
Blog Entries: 7
Quote:
Originally Posted by rkrivov
что-то странно... чего бы я не пробовал - результат один (за исключением случая когда удаляю это вырожение)... может нельзя в одном query использовать одну и туже таблицу? (или может как-то нужно прописать alias'ы на таблицы?)
addDataSource(tableNum(LedgerBalancesDimTrans), "LedgerBalancesDimTrans1");
Old 15.11.2005, 13:44   #30  
Ruff is offline
Ruff
Дмитрий Ерин
Ruff's Avatar
1C
 
475 / 396 (14) ++++++
Join Date: 18.09.2003
Location: Тула
2 rkrivov:
Развернувшаяся здесь дискуссия по поводу использования массивов полей в Range сама по себе интересна и познавательна... Но позволю себе еще раз обратить Ваше внимание на изначальную постановку задачи. Возможно, что Вы либо ошиблись при построении запроса, либо зря тратите время, ковыряясь в расширенных диапазонах, поскольку в таком виде задача решается стандартным путем.

Процитирую свое сообщение:
Quote:
Originally Posted by Ruff
...сдается мне, что в Ваш запрос закралась какая-то бяка... Попытка оптимизировать (по правилу поглощения, кажется) условие:

"(%2 != %1) && ((%2 == %1) || (!%1))"

привела к следующему:

"(%2 != %1) && (!%1)"

Что по сути означает "первый параметр всегда пустой, а второй - всегда непустой". Может быть это именно то, что Вам и нужно, но зачем тогда такие сложные сравнения?
Чтобы стало совсем понятно, к чему я прицепился , последнюю строку можно преобразовать далее:

"(%2) && (!%1)" или "(%2 != "") && (%1 == "")"

Таким образом, остается просто добавить к запросу два простых Range с условиями (!"") и ("") соответственно (насколько я понимаю, это будут Dimension[i], причем из разных DataSource-ов). В любом случае добавить их "по одиночке" (в разные Range) не составит труда, и эти условия объединятся по И.

Хотя, на самом деле мне кажется, что Вы что-то упустили при построении запроса, вряд ли все так просто
__________________
Old 15.11.2005, 14:02   #31  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2494 (89) +++++++++
Join Date: 20.08.2005
2 Ruff
Не получится сделать это (%1 == "")

Хотя по поводу запроса я согласен
__________________
Axapta v.3.0 sp5 kr2
Old 15.11.2005, 14:10   #32  
Ruff is offline
Ruff
Дмитрий Ерин
Ruff's Avatar
1C
 
475 / 396 (14) ++++++
Join Date: 18.09.2003
Location: Тула
Quote:
Originally Posted by AndyD
Не получится сделать это (%1 == "")
Почему? А как же
Code:
  qbr.value(SysQuery::valueEmptyString());
?
Old 15.11.2005, 14:16   #33  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2494 (89) +++++++++
Join Date: 20.08.2005
А что это за qbr? На какое поле и на какой датасоурс?
__________________
Axapta v.3.0 sp5 kr2
Old 15.11.2005, 14:22   #34  
Ruff is offline
Ruff
Дмитрий Ерин
Ruff's Avatar
1C
 
475 / 396 (14) ++++++
Join Date: 18.09.2003
Location: Тула
Честно говоря не вникал. Цитата из кода rkrivov:

Quote:
q = new Query();
qbds_lb = q.addDataSource(tableNum(LedgerBalancesDimTrans));
...
qbr = qbds_lb.addRange(fieldName2Id(tableNum(LedgerBalancesDimTrans), "dimension[2]"));
Old 19.12.2005, 13:11   #35  
latvik is offline
latvik
Участник
 
74 / 13 (1) ++
Join Date: 27.05.2004
Location: Moscow, YS
Quote:
Originally Posted by AndyD
Вообще-же в датасоурсе обратиться к полю с произвольным индексом ч-з AddRange() можно - по его extId
qbr = qbds.addRange(fieldid2ext(fieldnum(RassetTrans,dimension),1));
qbr.value(queryValue("значение"));


у меня вот так все отлично работает
Old 06.03.2007, 09:31   #36  
VAlek is offline
VAlek
Участник
 
12 / 10 (1) +
Join Date: 13.06.2006
Вопрос - решение по теме найдено?
Поиск мне не дал ответ(честно искал), может за год есть вариант реализации сабжа?

Как все таки решается проблема EDT массива в query? Подскажите.

X++:
    qbd = q.addDataSource(tablenum(LedgerTrans));
    qbd.addRange(fieldnum(LedgerTrans,RecId)).value(strfmt("(%1.Dimension[2] == 0234)",qbd.name()));
Old 06.03.2007, 10:09   #37  
kashperuk is offline
kashperuk
Участник
kashperuk's Avatar
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Join Date: 30.05.2004
Location: Atlanta, GA, USA
Так а чем вас не устраивает предложенный выше вариант с fieldId2Ext() ?
Old 06.03.2007, 10:36   #38  
VAlek is offline
VAlek
Участник
 
12 / 10 (1) +
Join Date: 13.06.2006
Quote:
Так а чем вас не устраивает предложенный выше вариант с fieldId2Ext() ?
вариант устраивает для простого фильтра на одно поле, но нужна реализация запроса по сложнее, включающая операторы,наприме "OR" и т.п., что то типа:

X++:
qbd = q.addDataSource([color=blue]tablenum[/color](LedgerTrans));    
qbd.addRange([color=blue]fieldnum[/color](LedgerTrans,RecId)).value(strfmt([color=red]"((%1.Dimension[2] == 0234) || (%1.Dimension[2] == 34) && (%1.Dimension[1] == 4))"[/color],qbd.name()));
Old 06.03.2007, 11:37   #39  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2494 (89) +++++++++
Join Date: 20.08.2005
Если условия OR накладываются на значания только одного поля, то можно обойтись без расширенных запросов
X++:
qbd.addRange(fieldid2ext(fieldnum(LedgerTrans, Dimension), 2)).value("0234");
qbd.addRange(fieldid2ext(fieldnum(LedgerTrans, Dimension), 2)).value("34");
qbd.addRange(fieldid2ext(fieldnum(LedgerTrans, Dimension), 1)).value("4");
__________________
Axapta v.3.0 sp5 kr2
Old 06.03.2007, 12:01   #40  
VAlek is offline
VAlek
Участник
 
12 / 10 (1) +
Join Date: 13.06.2006
Quote:
Originally Posted by AndyD View Post
Если условия OR накладываются на значания только одного поля, то можно обойтись без расширенных запросов
X++:
qbd.addRange(fieldid2ext(fieldnum(LedgerTrans, Dimension), 2)).value("0234");
qbd.addRange(fieldid2ext(fieldnum(LedgerTrans, Dimension), 2)).value("34");
qbd.addRange(fieldid2ext(fieldnum(LedgerTrans, Dimension), 1)).value("4");
Спасибо. Но дело в том, что задача не в реализации конкретного случая, а в возможности реализации именно расширенного запроса использующего EDT массив. Я понимаю есть альтернативное решение (и мне его продемонстрировали), но есть желание получить запрос именно вида

X++:
value(strfmt("(%1.Dimension[2] == 0234)",qbd.name()
поясню почему, может возникнуть запрос,связывающий несколько таблиц и в котором участвует оператор "OR", и реализовать этот запрос в расширенном виде было бы удобнее. Например (взято из головы, не пеняте на логику, просто возможность реализации):

X++:
    qbds = q.addDataSource(tableNum(EmplTrans_RU));
    qbds2 = qbds.addDataSource(tableNum(LedgerTrans));
    qbds2.addLink(fieldnum(EmplTrans_RU,TransDate),fieldnum(LedgerTrans,TransDate));
    qbds2.addLink(fieldnum(EmplTrans_RU,Voucher),fieldnum(LedgerTrans,Voucher));
    qbds2.addLink(fieldnum(EmplTrans_RU,LedgerAccount),fieldnum(LedgerTrans,AccountNum));
    qbr = qbd2.addRange(fieldnum(LedgerTrans,RecId));
 
    qbr.value( strfmt(
            "(((%1.AmountMST > 0) && (%2.Dimension[1] == 11)) ||"+
            " ((%1.AmountMST < 0) && (%2.Dimension[2] == 21)) ||"+
            " ((%1.Dimension[3] == 6) && (%2.Dimension[3] == 51)) )"
            ,qbd.name(),qbd2.name() ) );
Tags
query, программно, фильтр, запрос (query)

 

Similar Threads
Thread Thread Starter Forum Replies Last Post
Вопрос по Query с агрегатной функцией Jarad DAX: Программирование 11 31.10.2006 21:10
Вопрос про Query 6apcyk DAX: Программирование 5 16.11.2005 19:08
Вопрос по query и join tischenko DAX: Программирование 2 20.07.2005 13:05
Вопрос по запросу (query) Александр_1975 DAX: Программирование 2 23.01.2004 17:35
Вопрос знатокам QBE и Query в AXAPTA Maxim Gorbunov DAX: Программирование 6 27.12.2002 13:19

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Forum Jump

Рейтинг@Mail.ru
All times are GMT +3. The time now is 10:21.
Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Contacts E-mail, Advertising.