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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 01.07.2004, 12:12   #1  
Pustik is offline
Pustik
Участник
 
807 / 372 (14) ++++++
Регистрация: 04.06.2004
Как в range на одно и тоже контейнерное поле поставить условие: "исключ." && like
У меня проблема с контейнерными полями:
В классе который вызывает отчет я задаю Range'и на таблицу ledgerJournalTrans. На поле Dimension[3] мне необходимо установить условие, которое в обычном Аксаптовском SQL-e работало бы так :
select ledgerJournalTrans where
ledgerJournalTrans.Dimension[3] like "ОТВ*" &&
ledgerJournalTrans.Dimension[3] != "ОТВ-00"
т.е. мне нужны строки где в поле Dimension[3] встречается фрагмент "ОТВ" но без "ОТВ-00".

На этом форуме нашел обсуждения по этой теме и по аналогии получилось:

1-ый вариант : query.dataSourceTable(tablenum(LedgerJournalTrans)).addRange(fieldId2Ext(fieldNum(LedgerJournalTrans,Dimension),3)).value(strfmt('((%3 like "%1") && (%3 !="%2"))', "ОТВ","ОТВ-00","Dimension"));

2-й вариант :
query.dataSourceTable(tablenum(LedgerJournalTrans)).addRange(fieldId2Ext(fieldNum(LedgerJournalTrans,Dimension),3)).value("ОТВ*");
query.dataSourceTable(tablenum(LedgerJournalTrans)).addRange(fieldId2Ext(fieldNum(LedgerJournalTrans,Dimension),3)).value("!ОТВ-00");
Но ни 1-ый ни 2-ой вариант не работает. Help me plz, если это возможно.
Старый 01.07.2004, 12:29   #2  
Berty Wooster is offline
Berty Wooster
Участник
Аватар для Berty Wooster
 
82 / 16 (1) ++
Регистрация: 15.12.2002
А если попробовать так ...
PHP код:
qbds  query.addDataSource (tablenum(LedgerJournalTrans));
qbds .addrange (fieldId2Ext(fieldNum(LedgerJournalTrans,Dimension),3)).value("ОТВ*");
    
qbds1 qbds.addDataSource(tablenum(LedgerJournalTrans));
qbds1.relations(true);
qbds1.joinMode(JoinMode::NoExistsJoin);
qbds 1.addrange (fieldId2Ext(fieldNum(LedgerJournalTrans,Dimension),3)).value("ОТВ-00"); 
Старый 01.07.2004, 13:17   #3  
rinugun is offline
rinugun
Участник
Аватар для rinugun
 
26 / 10 (1) +
Регистрация: 04.08.2003
Advanced query range value expressions
Кстати, а можно ли как-нибудь в "advanced query range" вставить условие на Dimension[3]?
Вроде '(Dimension[3]="a" || Dimension[3]="b")...
Старый 01.07.2004, 13:42   #4  
Berty Wooster is offline
Berty Wooster
Участник
Аватар для Berty Wooster
 
82 / 16 (1) ++
Регистрация: 15.12.2002
rinugun
PHP код:
qbds.addrange (fieldId2Ext(fieldNum(LedgerJournalTrans,Dimension),3)).value(a,b); 
... или "advanced query range" это не QueryBuildRange?
Старый 01.07.2004, 14:02   #5  
Pustik is offline
Pustik
Участник
 
807 / 372 (14) ++++++
Регистрация: 04.06.2004
Дело в том что я использую стандартный класс унаследованный от RunBaseReport.
И в методе InitQuery я ставлю Range'и выглядит это так :

X++:
public Query initQuery()
{
    Query   query;
    QueryBuildDataSource  qbds,qbds1;
    ;
    query = super();
   
      query.dataSourceTable(TableNum(LedgerJournalTrans)).findRange(fieldNum(LedgerJournalTrans,AccountType)).value(QueryValue(2));

      qbds  = query.adddataSource (tablenum(LedgerJournalTrans));
      qbds.addrange (fieldId2Ext(fieldNum(LedgerJournalTrans,Dimension),3)).value("ОТВ*");

      qbds1 = qbds.addDataSource(tablenum(LedgerJournalTrans));
      qbds1.relations(true);
      qbds1.joinMode(JoinMode::NoExistsJoin);
      qbds1.addrange (fieldId2Ext(fieldNum(LedgerJournalTrans,Dimension),3)).value("ОТВ-00");
я стал пробовать и он мне выдал кучу строк на 100 листов (кстати фильтр не сработал) т.е.
}qbds.addDataSource -- добавляет мне лишние Датасоурсы. У меня ДатаСоурс определен в отчете.

Сработал такой вариант :
X++:
public Query initQuery()
{
    Query   query;
    QueryBuildDataSource  qbds,qbds1;
    ;
    query = super();
   
      query.dataSourceTable(TableNum(LedgerJournalTrans)).findRange(fieldNum(LedgerJournalTrans,AccountType)).value(QueryValue(2));

      qbds  = query.dataSourceTable(tablenum(LedgerJournalTrans));
      qbds.addrange (fieldId2Ext(fieldNum(LedgerJournalTrans,Dimension),3)).value("ОТВ*");
      qbds1 = qbds;
      qbds1.relations(true);
      qbds1.joinMode(JoinMode::NoExistsJoin);
      qbds1.addrange (fieldId2Ext(fieldNum(LedgerJournalTrans,Dimension),3)).value("ОТВ-00");
}
В этом случае он формирует правильное количество трок с фрагментом "ОТВ" но и с "ОТВ-00"


Старый 01.07.2004, 14:04   #6  
Pustik is offline
Pustik
Участник
 
807 / 372 (14) ++++++
Регистрация: 04.06.2004
Т.е. я хотел сказать что все равно не получилось исключить "ОТВ-00" ((((
Старый 01.07.2004, 14:17   #7  
rinugun is offline
rinugun
Участник
Аватар для rinugun
 
26 / 10 (1) +
Регистрация: 04.08.2003
Цитата:
Изначально опубликовано Berty Wooster
rinugun
PHP код:
qbds.addrange (fieldId2Ext(fieldNum(LedgerJournalTrans,Dimension),3)).value(a,b); 
... или "advanced query range" это не QueryBuildRange?
Да, в данном случае так сработает, но что делать в случае, если надо установить условие
Dimension[1]='a' || Dimension[2]='b'?
Возникает проблема впихивания Dimension[i] в advanced range.
Я так и не нашел решения, пришлось вводить дополнительное поле Dimension2Copy, которое всегда равно Dimension[2].
Старый 01.07.2004, 14:26   #8  
Berty Wooster is offline
Berty Wooster
Участник
Аватар для Berty Wooster
 
82 / 16 (1) ++
Регистрация: 15.12.2002
PHP код:
qbds1 qbds
Это откуда? Нужно добавить еще один DataSource с таблицей LedgerJournalTrans.
Должно быть именно:

PHP код:
qbds1 qbds.addDataSource(LedgerJournalTrans); 
А в первом примере вместо
PHP код:
...
query.dataSourceTable(TableNum(LedgerJournalTrans)).findRange(fieldNum(LedgerJournalTrans,AccountType)).value(QueryValue(2));

qbds query.adddataSource (tablenum(LedgerJournalTrans));
qbds.addrange (fieldId2Ext(fieldNum(LedgerJournalTrans,Dimension),3)).value("ОТВ*");
... 
должно быть:
PHP код:
...
qbds  query.dataSourceTable(TableNum(LedgerJournalTrans)).findRange(fieldNum(LedgerJournalTrans,AccountType)).value(QueryValue(2));
qbds.addrange (fieldId2Ext(fieldNum(LedgerJournalTrans,Dimension),3)).value("ОТВ*");
... 
Старый 01.07.2004, 14:27   #9  
Pustik is offline
Pustik
Участник
 
807 / 372 (14) ++++++
Регистрация: 04.06.2004
Rinugun читай на этом форуме тему : "Как добавить в addRange условие по "или" на контейнерные поля? "
Старый 01.07.2004, 14:58   #10  
rinugun is offline
rinugun
Участник
Аватар для rinugun
 
26 / 10 (1) +
Регистрация: 04.08.2003
Цитата:
Изначально опубликовано Pustik
Rinugun читай на этом форуме тему : "Как добавить в addRange условие по "или" на контейнерные поля? "
Прочитал, но решения там нет. Точнее, есть только для первых элементов - Dimension[1].
Старый 01.07.2004, 15:06   #11  
Pustik is offline
Pustik
Участник
 
807 / 372 (14) ++++++
Регистрация: 04.06.2004
я наверное достал, но все-таки, вот что я у меня получилось в итоге в методе InitQuery :


X++:
public Query initQuery()
{
    Query   query;
    QueryBuildDataSource  qbds,qbds1;
     ;
 
   query = super();
   qbds = query.dataSourceTable(TableNum(LedgerJournalTrans));
   qbds.addrange (fieldId2Ext(fieldNum(LedgerJournalTrans,Dimension),3)).value("ОТВ*");

   qbds1 = qbds.addDataSource(tablenum(LedgerJournalTrans));
   qbds1.relations(true);
   qbds1.joinMode(JoinMode::NoExistsJoin);
   qbds1.addrange (fieldId2Ext(fieldNum(LedgerJournalTrans,Dimension),3)).value("ОТВ-00");
}
Результат:
выдает огромное количество строк т.е. по видимому мы добавили еще один DataSource - LedgerJournalTrans но не связали его с тем dataSourse который уже был жестко указан в отчете !!! .т.е. получились две не связанные таблицы.(у меня такое впечатление). Может не хватает связи между qbds и qbds1? . Или может быть это лучше делать в методах отчета? (я все равно туда передаю все свои параметры).
Старый 01.07.2004, 15:11   #12  
rinugun is offline
rinugun
Участник
Аватар для rinugun
 
26 / 10 (1) +
Регистрация: 04.08.2003
Так и правильно, у LedgerJournalTrans нет relation'а на самого себя.
Надо просто вместо
qbds1.relations(true);
писать что-то вроде
qbds1.addLink(fieldNum(LedgerJournalTrans,RecID),fieldNum(LedgerJournalTrans,RecID))

Ещё, кстати, в последнем value должно стоять не ОТВ-00, а !ОТВ-00.
Старый 01.07.2004, 15:22   #13  
Pustik is offline
Pustik
Участник
 
807 / 372 (14) ++++++
Регистрация: 04.06.2004
rinugun , ты прав получилось -- кол-во строк то что нужно, но исключить значение "ОТВ-00" не удалось. Неужели это невозможно ? Неужели возможности range'ей в Axapte так скудны?. Делать это через SQL запрос - значит создавать временную таблицу -- не супер.
Старый 01.07.2004, 15:39   #14  
Vadik is offline
Vadik
Модератор
Аватар для Vadik
Лучший по профессии 2017
Лучший по профессии 2015
 
3,631 / 1849 (69) ++++++++
Регистрация: 18.11.2002
Адрес: гражданин Москвы
Вариант с range OTB-01..OTB-99 (не знаю, к сожалению, как на самом деле у вас нумерация идет) не рассматривали?
Старый 01.07.2004, 16:09   #15  
rinugun is offline
rinugun
Участник
Аватар для rinugun
 
26 / 10 (1) +
Регистрация: 04.08.2003
Цитата:
Изначально опубликовано Pustik
rinugun , ты прав получилось -- кол-во строк то что нужно, но исключить значение "ОТВ-00" не удалось. Неужели это невозможно ? Неужели возможности range'ей в Axapte так скудны?. Делать это через SQL запрос - значит создавать временную таблицу -- не супер.
А! Прошу прощения, я не заметил, что там NotExistsJoin. В этом случае, конечно, не нужен восклицательный знак во втором value.
У меня работает вот такой код (с поправкой на другие значения третьей аналитики) в форме:
PHP код:
public void init()
{
Query query;
QueryBuildDataSource qbds,qbds1;
;

super();
query this.query();
qbds query.dataSourceTable(TableNum(LedgerJournalTrans));
qbds.addrange (fieldId2Ext(fieldNum(LedgerJournalTrans,Dimension),3)).value("IS*");


qbds1 qbds.addDataSource(tablenum(LedgerJournalTrans));
qbds1.addLink(fieldNum(LedgerJournalTrans,RecID), fieldNum(LedgerJournalTrans,RecID));
qbds1.joinMode(JoinMode::NoExistsJoin);
qbds1.addrange (fieldId2Ext(fieldNum(LedgerJournalTrans,Dimension),3)).value("ISPR");

Показывает все IS без ISPR.
Старый 03.07.2004, 11:54   #16  
Pustik is offline
Pustik
Участник
 
807 / 372 (14) ++++++
Регистрация: 04.06.2004
Огромное Спасибо всем, все получилось.Приятно было пообщаться.
Теги
container, like, query, xor, запрос (query), фильтр

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Advanced query range value expressions: поле таблицы - имя вcтроенной функции year(). ATimTim DAX: Программирование 12 27.03.2009 18:16
Использование "like" при работе с классом "QueryBuildRange" poul DAX: Программирование 18 11.08.2006 12:20
"Тип" должности. что определяет это поле? alpin DAX: Функционал 3 05.01.2004 10:30
Поле "Закрытие" в профилях поставщиков/клиентов xconsul DAX: Функционал 2 10.11.2003 14:04
Для чего используется поле "Тип учета" Axapta DAX: Функционал 23 19.08.2003 11:46
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

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

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