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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 24.05.2013, 17:18   #21  
user_ax is offline
user_ax
Участник
Аватар для user_ax
 
599 / 39 (3) +++
Регистрация: 07.10.2012
Адрес: ZP
Цитата:
Сообщение от maldini Посмотреть сообщение
Странно все это. Ещё раз все аккуратно проверь, все должно получится.
Сейчас переписываю по вашему примеру, буду надеяться, что получиться
Старый 24.05.2013, 17:26   #22  
user_ax is offline
user_ax
Участник
Аватар для user_ax
 
599 / 39 (3) +++
Регистрация: 07.10.2012
Адрес: ZP
Если джойнить 2 таблицы - всё замечательно, когда пытаюсь приджойнить третью - qbds валится в null.



X++:
Queryrun main_query(boolean _count_query = false)
{

    Query query   =      new Query();
    QueryBuildDataSource qbds;
   
    ;
    qbds  = query.addDataSource(tablenum(VendInvoiceTrans));
    qbds.addSortField(fieldnum(VendInvoiceTrans,ItemId));
    qbds.addSortField(fieldnum(VendInvoiceTrans,InternalSp));
    qbds.addSelectionField(fieldnum(VendInvoiceTrans,Qty), SelectionField::Sum);
    qbds.orderMode(OrderMode::GroupBy);
    qbds  = qbds.addDataSource(tablenum(VendSpListTrans));
    qbds.addLink(fieldnum(VendSpListTrans,InternalSp),fieldnum(VendInvoiceTrans,InternalSp));
    qbds.joinMode(JoinMode::InnerJoin);
    
    qbds = query.dataSourceTable(tableNum(VendSpListJour));
    qbds.addLink(fieldnum(VendSpListTrans,InternalSp),fieldnum(VendSpListJour,InternalSP));
    qbds.joinMode(JoinMode::InnerJoin);
    
    if (datefromstr && datetostr)
    {
        qbds.addRange(fieldnum(VendSpListJour,SpDate)).value(SysQuery::range(datefrom.value(),dateto.value()));
    }
    if (vendaccountstr)
    {
        qbds.addRange(fieldnum(VendSpListJour,OrderAccount)).value(SysQuery::value(vendaccountstr));
    }
     //если введён регистранионный номер договора
    if (rcontractaccountstr)
    {
        qbds.addRange(fieldnum(VendSpListJour, RcontractAccount)).value(SysQuery::value(rcontractaccount.value()));
    }
    //если введён Владелец
    if (emplidstr)
    {
        qbds.addRange(fieldnum(VendSpListJour, Emplid)).value(SysQuery::value(emplid.value()));
    }
    switch(spclosedstr)
    {
        case (AllOpenPosted::All):
           qbds.addRange(fieldnum(VendSpListJour,SpClosed));
        break;

        case (AllOpenPosted::Open):
           qbds.addRange(fieldnum(VendSpListJour,SpClosed)).value('1');
        break;

        case (AllOpenPosted::Posted):
           qbds.addRange(fieldnum(VendSpListJour,SpClosed)).value('0');
        break;
        default:
        break;
    }
    qbds = query.dataSourceTable(tablenum(VendInvoiceTrans));
    
    if (_count_query)
    {
        qbds.addSelectionField(fieldnum(VendinvoiceTrans,RecId), SelectionField::Count);
    }
    
    qbds = query.dataSourceTable(tablenum(VendSpListTrans));

    return (new QueryRun(query));
   
}
валится на qbds = query.dataSourceTable(tableNum(VendSpListJour));
qbds.addLink(fieldnum(VendSpListTrans,InternalSp),fieldnum(VendSpListJour,InternalSP));

Если заккоментировать весь кусок от qbds = query.dataSourceTable(tableNum(VendSpListJour));
и до конца switch - всё замечательно работает.

Уважаемый maldini, не знаете, в чём причина?
Старый 24.05.2013, 17:29   #23  
user_ax is offline
user_ax
Участник
Аватар для user_ax
 
599 / 39 (3) +++
Регистрация: 07.10.2012
Адрес: ZP
А, я понял, я не добавляю датасорс, я пытаюсь узнать его id
Старый 24.05.2013, 17:36   #24  
user_ax is offline
user_ax
Участник
Аватар для user_ax
 
599 / 39 (3) +++
Регистрация: 07.10.2012
Адрес: ZP
Цитата:
Сообщение от maldini Посмотреть сообщение
А зачем так много таблиц, ведь данные, если я не ошибаюсь будут только в VendInvoiceTrans
Нет, данные будут из всех таблиц, которые я джойню.
Старый 24.05.2013, 17:39   #25  
ice is offline
ice
Участник
Аватар для ice
Лучший по профессии 2014
 
1,738 / 404 (17) +++++++
Регистрация: 23.03.2006
если я вас правильно понял, то вам не сделать это одним запросом. делайте while select по двум таблицам, и в цикле группировку по VendInvoiceTrans
Старый 24.05.2013, 17:40   #26  
user_ax is offline
user_ax
Участник
Аватар для user_ax
 
599 / 39 (3) +++
Регистрация: 07.10.2012
Адрес: ZP
Цитата:
Сообщение от maldini Посмотреть сообщение
Для того что бы получить значения полей из других таблиц их надо тоже включать в группировку.

Скажите, пожалуйста, а каким образом их добавить в группировку?

К какому Qbds их цеплять ?

Сейчас опять запрос валится с ошибкой что Источник данных не входит в состав родительского источника данных.
Старый 24.05.2013, 17:42   #27  
user_ax is offline
user_ax
Участник
Аватар для user_ax
 
599 / 39 (3) +++
Регистрация: 07.10.2012
Адрес: ZP
Цитата:
Сообщение от ice Посмотреть сообщение
если я вас правильно понял, то вам не сделать это одним запросом. делайте while select по двум таблицам, и в цикле группировку по VendInvoiceTrans
Почему-то мне кажется, что я тоже не сделаю через query это.
Старый 24.05.2013, 17:53   #28  
user_ax is offline
user_ax
Участник
Аватар для user_ax
 
599 / 39 (3) +++
Регистрация: 07.10.2012
Адрес: ZP
Уважаемый maldini , если бы там было 3 таблицы, было бы более наглядно, с двумя у меня замечательно выходит и так.
Старый 24.05.2013, 18:13   #29  
maldini is offline
maldini
Участник
 
103 / 30 (2) +++
Регистрация: 06.03.2007
Адрес: москва
Цитата:
Сообщение от user_ax Посмотреть сообщение
Скажите, пожалуйста, а каким образом их добавить в группировку?

К какому Qbds их цеплять ?

Сейчас опять запрос валится с ошибкой что Источник данных не входит в состав родительского источника данных.
While select даст вам тоже самое что и query. Просто нужные поля надо добавить в группировку
X++:
qbds  = query.addDataSource(tablenum(VendInvoiceTrans));
    qbds.addSortField(fieldnumVendInvoiceTrans,ItemId));
    qbds.addSortField(fieldnum(VendInvoiceTrans,InternalSp));
    qbds.addSelectionField(fieldnumVendInvoiceTrans,Qty), SelectionField::Sum
    qbds.orderMode(OrderMode::GroupBy);
    qbds  = qbds.addDataSource(tablenum(VendSpListTrans));
    qbds.addLink(fieldnum(VendSpListTrans,InternalSp),fieldnum(VendInvoiceTrans,InternalSp));
qbds.addSortField(fieldnum(VendSpListTrans,InternalSp));
qbds.orderMode(OrderMode::GroupBy);
    qbds.joinMode(JoinMode::InnerJoin);
Вот так и перечислить все что нужно видеть.

Последний раз редактировалось maldini; 24.05.2013 в 18:16.
Старый 24.05.2013, 18:35   #30  
maldini is offline
maldini
Участник
 
103 / 30 (2) +++
Регистрация: 06.03.2007
Адрес: москва
Цитата:
Сообщение от user_ax Посмотреть сообщение
Уважаемый maldini , если бы там было 3 таблицы, было бы более наглядно, с двумя у меня замечательно выходит и так.
Вот пример из 3 таблиц, так же можно ещё добавить таблицы

X++:
void main_query(boolean _count_query = false)
{
    VendInvoiceJour     VendInvoiceJour;
    VendInvoiceTrans    VendInvoiceTrans;
    InventTable         inventTable;
    QueryRun            QueryRun;
    Query query   =      new Query();
    QueryBuildDataSource qbds;
    QueryBuildRange      qbr;
    ;
    qbds  = query.addDataSource(tablenum(VendInvoiceJour));
    qbds.addSortField(fieldnum(VendInvoiceJour,purchId));
    qbds.addSelectionField(fieldnum(VendInvoiceJour,Qty), SelectionField::Sum);
    qbds.orderMode(OrderMode::GroupBy);
    qbds.addRange(fieldnum(VendInvoiceJour,purchId)).value('ЗП-000006');
 
    qbds  = qbds.addDataSource(tablenum(VendInvoiceTrans));
    qbds.addSortField(fieldnum(VendInvoiceTrans,purchId));
    qbds.orderMode(OrderMode::GroupBy);
    qbds.addLink(fieldnum(VendInvoiceJour,purchId),fieldnum(VendInvoiceTrans,purchId));
    qbds  = qbds.addDataSource(tablenum(InventTable));
    qbds.addSortField(fieldnum(InventTable,ItemId));
    qbds.orderMode(OrderMode::GroupBy);
    qbds.addLink(fieldnum(InventTable,ItemId),fieldnum(VendInvoiceTrans,ItemId));
    qbds.relations(true);
 
    QueryRun = new QueryRun(query);
    while (queryRun.next())
    {
        VendInvoiceJour = QueryRun.get(tablenum(VendInvoiceJour));
        VendInvoiceTrans    = QueryRun.get(tablenum(VendInvoiceTrans));
        inventTable         = QueryRun.get(tablenum(InventTable));
        info(strFmt("%1  %2",VendInvoiceJour.PurchId,VendInvoiceJour.Qty));
        info(strFmt("%1",VendInvoiceTrans.PurchId));
        info(strFmt("%1",InventTable.itemId));
    }
}
Если в запросе есть группировка то доступными будут только сгруппированные данные. Так работает любой sql. Выводится только то что присутствует в группировке, например InventTable.ItemGroup будет пустым так как его нет в группировке

Последний раз редактировалось maldini; 24.05.2013 в 19:18.
Теги
group by, query, группировка

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
AX 2012 Наследование таблиц. Краткое описание механизма sukhanchik DAX: Программирование 32 21.09.2018 17:56
emeadaxsupport: Calling the Query Service Blog bot DAX Blogs 0 18.02.2012 01:13
AIF: OData Query Service Blog bot DAX Blogs 0 24.08.2011 09:11
jinx: Dynamics AX – Query-Ranges und Filtereinstellungen des Benutzers Blog bot DAX auf Deutsch 0 04.02.2010 00:05
Dynamics AX Geek: Using query() Blog bot DAX Blogs 0 04.05.2009 14:05

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

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

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