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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 21.03.2007, 11:07   #1  
moid is offline
moid
Участник
 
84 / 10 (1) +
Регистрация: 05.02.2007
Как собрать запрос?
Мне нужно реализовать в аксапте вот такой запрос:
Код:
SELECT * FROM OutlookTaskTable A
INNER JOIN EmplTable B ON A.User = B.EmplId
WHERE A.USER = 'ANV' OR B.HRMORGANIZATIONID = 'IS'
Проблема как добавить условие по OR


Подробнее:

Есть два запроса

такой:
X++:
               StrRange = '(((OutlookTaskTable.Ot = "%1") || (OutlookTaskTable.User = "%2")))';
               rq = OutlookTaskTable_q.dataSourceTable(TableNum(OutlookTaskTable)).addRange(FieldNum(OutlookTaskTable, RecId));
               rq.value(strfmt(StrRange, CurUserId(), CurUserId()));
и такой:
X++:
               ds = OutlookTaskTable_q.dataSourceTable(TableNum(OutlookTaskTable));

               ds2 = OutlookTaskTable_q.dataSourceTable(TableNum(EmplTable));
               if (!ds2)
               {
                  ds2 = ds.addDataSource(TableNum(EmplTable));
                  ds2.addLink(FieldNum(OutlookTaskTable, User), FieldNum(EmplTable, EmplId));
                  ds2.joinMode(JoinMode::ExistsJoin);
                  ds2.addRange(FieldNum(EmplTable, HRMOrganizationId)).value(ArrayStr);
               }
               else ds2.findRange(FieldNum(EmplTable, HRMOrganizationId)).value(ArrayStr);
Если я их пишу вместе, то получается они работают как условие"И". Как сделать, чтобы второй запрос присоединялся к первому как условие"ИЛИ"?

Второй запрос смотрит поле User из таблицы OutlookTaskTable и проверяет по таблице EmplTable принадлежность к подразделению CurUserId().

Последний раз редактировалось moid; 21.03.2007 в 13:53.
Старый 21.03.2007, 14:25   #2  
Ed1k is offline
Ed1k
Участник
 
102 / 42 (2) +++
Регистрация: 19.07.2006
Цитата:
Сообщение от moid Посмотреть сообщение
Мне нужно реализовать в аксапте вот такой запрос:
Код:
SELECT * FROM OutlookTaskTable A
INNER JOIN EmplTable B ON A.User = B.EmplId
WHERE A.USER = 'ANV' OR B.HRMORGANIZATIONID = 'IS'
Проблема как добавить условие по OR
Может как-то так извратиться
Код:
    qbds = query.addDataSource(tablenum(OutlookTaskTable), "OutlookTaskTableDS");
    qbds.fetchMode(QueryFetchMode::One2One);
    qbds.relations(false);

    qbds2 = qbds.addDataSource(tablenum(EmplTable), "EmplTable1DS");
    qbds2.fetchMode(QueryFetchMode::One2One);
    qbds2.relations(false);
    qbds2.joinMode(JoinMode::OuterJoin);
    qbds2.addLink(fieldnum(OutlookTaskTable, User), fieldnum(EmplTable, EmplId));
    qbds2.addRange(fieldnum(EmplTable, EmplId)).value("ANV");

    qbds1 = qbds.addDataSource(tablenum(EmplTable), "EmplTableDS");
    qbds1.fetchMode(QueryFetchMode::One2One);
    qbds1.relations(false);
    qbds1.joinMode(JoinMode::InnerJoin);
    qbds1.addLink(fieldnum(OutlookTaskTable, User), fieldnum(EmplTable, EmplId));
    s = strfmt("((%1.EmplId == %2.EmplId) && (%1.RecId == %2.RecId))", qbds1.name(), qbds2.name());
    qbds1.addRange(fieldnum(OutlookTaskTable, HRMORGANIZATIONID)).value(s);
    qbds1.addRange(fieldnum(OutlookTaskTable, HRMORGANIZATIONID)).value("IS");
Старый 22.03.2007, 11:00   #3  
moid is offline
moid
Участник
 
84 / 10 (1) +
Регистрация: 05.02.2007
Вот так надо было:
X++:
               ds = OutlookTaskTable_q.dataSourceTable(TableNum(OutlookTaskTable));

               ds2 = OutlookTaskTable_q.dataSourceTable(TableNum(EmplTable));
               if (!ds2)
               {
                  ds2 = ds.addDataSource(TableNum(EmplTable));
                  StrRange = '((((OutlookTaskTable.Ot = "%1") || (OutlookTaskTable.User = "%2") || (HRMOrganizationId = "%3")) && (EmplId = OutlookTaskTable.User)))';
                  ds2.addRange(FieldNum(EmplTable, RecId)).value(strfmt(StrRange, CurUserId(), CurUserId(), "ИС"));
               }
Старый 23.03.2007, 09:32   #4  
moid is offline
moid
Участник
 
84 / 10 (1) +
Регистрация: 05.02.2007
А как мне теперь удалить такой рэнжь?
Старый 23.03.2007, 09:46   #5  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от moid Посмотреть сообщение
А как мне теперь удалить такой рэнжь?
myRange.value("");

Обратите внимание, что такая конструкция удаляет range из запроса.
Такая конструкция не эквивалентна поиску пустой строки.
Для поиска пустой строки пользуйтесь SysQuery::valueEmptyString()
__________________
полезное на axForum, github, vk, coub.
Старый 23.03.2007, 09:55   #6  
moid is offline
moid
Участник
 
84 / 10 (1) +
Регистрация: 05.02.2007
Цитата:
myRange.value("");
сделал так:
X++:
ds2.findRange(FieldNum(EmplTable, RecId)).value("");
Но Range только очистился.
Если выключаю его:
X++:
 ds2.enabled(false);
то он исчезает, но при очередном повторе запроса создается еще один range.
Нужно именно удалять, а не очищать.
Старый 23.03.2007, 10:06   #7  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от moid Посмотреть сообщение
Нужно именно удалять, а не очищать.
Вы посмотрите на sql запрос.
по пустому range условие в sql запросе не создается.

обратите внимание на запросы в отчетах

я не очень понимаю зачем вам удалять именно range.
скорее всего, вам нужно избавиться от условия в sql запросе.
так избавьтесь от условия штатными средствами - установите пустую строку в range.
__________________
полезное на axForum, github, vk, coub.
Старый 23.03.2007, 11:00   #8  
moid is offline
moid
Участник
 
84 / 10 (1) +
Регистрация: 05.02.2007
сделал так:
X++:
Void ClearRg()
   {
     //Очищаем запрос
        ds2 = OutlookTaskTable_q.dataSourceTable(TableNum(EmplTable));
          ds4 = OutlookTaskTable_q.dataSourceTable(TableNum(EmplTable));
          if (ds2)
          {
              FRange = ds2.findRange(FieldNum(EmplTable, RecId));
              if(FRange)
              {
                 ds2.findRange(FieldNum(EmplTable, RecId)).value(SysQuery::valueUnlimited());
                 OutlookTaskTable_q.dataSourceTable(TableNum(EmplTable)).clearRanges();
                 ds2.enabled(false);
              }
          }
          if (ds4)
          {
              FRange = ds4.findRange(FieldNum(EmplTable, RecId));
              if (FRange)
              {
                  ds4.findRange(FieldNum(EmplTable, RecId)).value(SysQuery::valueUnlimited());
                  OutlookTaskTable_q.dataSourceTable(TableNum(EmplTable)).clearRanges();
                  ds4.enabled(false);
              }
          }
   }
Пока работает
Старый 29.06.2007, 15:36   #9  
gefr is offline
gefr
Участник
Аватар для gefr
MCBMSS
 
147 / 17 (1) ++
Регистрация: 01.11.2004
Адрес: МО, Котельники
А у меня не работает
Делаю:
X++:
        salesTable_ds.autoQuery(false);
        query   = new Query();
        DS=query.addDataSource(tablenum(SalesTable));
        qbr=DS.addRange(fieldnum(SalesTable, RecId));
        qbr.value(strfmt('(((SalesTable.SalesTaker=\"%1\") || (SalesTable.SalesResponsible=\"%1\")))',EmplTable::findByUserId_W(curuserid()).EmplId));
        salesTable_ds.query(query);
Запрос получается правильный:
Цитата:
SELECT * FROM SalesTable WHERE (((((SalesTable.SalesTaker="Иванов") || (SalesTable.SalesResponsible="Иванов")))))
но вылезает ошибка:
Цитата:
Ошибка расширенного диапазона запроса: SalesTable.SalesTaker не является корректной парой datasource.field рядом с 27.
Никто не подскажет?
Старый 29.06.2007, 15:41   #10  
Sada is offline
Sada
Программатор
Аватар для Sada
 
1,450 / 153 (8) ++++++
Регистрация: 29.03.2005
Адрес: Толи Барнаул, толи Москва
X++:
qbr.value(strfmt('((SalesTable.SalesTaker="%1") || (SalesTable.SalesResponsible="%1"))',EmplTable::findByUserId_W(curuserid()).EmplId));
Может так?
Старый 02.07.2007, 11:42   #11  
gefr is offline
gefr
Участник
Аватар для gefr
MCBMSS
 
147 / 17 (1) ++
Регистрация: 01.11.2004
Адрес: МО, Котельники
нет, там проблема была другая - salestable не нужно было писать, т.е.
X++:
        qbr.value(strfmt('(((SalesTaker=\"%1\") || (SalesResponsible=\"%1\")))',EmplTable::findByUserId_W(curuserid()).EmplId));
и все сразу заработало
Старый 02.07.2007, 12:07   #12  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Думаю проблема была связана с вот этим
RLS&Расширенный запрос
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
передача параметров в запрос while select tolstjak DAX: Программирование 13 15.02.2009 19:39
Почему join запрос разбивается на подзапросы!? 3oppo DAX: Программирование 59 28.06.2007 11:52
Долго отрабатывает запрос по таблице InventItemLocation AlexeyBP DAX: Администрирование 1 30.05.2007 17:33
Как очистить запрос? moid DAX: Программирование 9 21.03.2007 13:15
Не работает запрос на нескольких компаниях Bega DAX: Программирование 3 16.09.2005 10:21
Опции темы Поиск в этой теме
Поиск в этой теме:

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

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

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

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