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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 02.04.2013, 15:04   #41  
user_ax is offline
user_ax
Участник
Аватар для user_ax
 
599 / 39 (3) +++
Регистрация: 07.10.2012
Адрес: ZP
Мне наш ещё один программист подсказал почти такой же способ, как и вы, но с одним "но": создать 2 объекта datasource для двух таблиц EmplTable и VendSpListJour и в источник EmplTable привязать к VendSpListJour, как дочерний, после активировать их связи и тогда получается то, что мне необходимо В любом случае спасибку нажал вам за то, что потратили своё время и помогли мне.
Старый 02.04.2013, 18:31   #42  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
873 / 649 (23) +++++++
Регистрация: 14.10.2004
Если когда-нибудь будете делать через Query в АОТ, то метод paсk должен выглядеть так:
X++:
public container pack()
{
    return [#CurrentVersion, #CurrentList, (queryRun) ? queryRun.pack() : conNull()];
}
а метод unpack так:
X++:
public boolean unpack(container packedClass)
{
    version     version = runbase::getVersion(packedClass);
    container   queryCon;

    switch (version)
    {
        case #CurrentVersion:
            [version,#CurrentList,queryCon] = packedClass;
            if (sysQuery::isPackedOk(queryCon))
                queryRun = new queryRun(queryCon);
            else
                this.initQuery();
            break;
        default:
            return false;
    }

    return true;
}
Старый 02.04.2013, 18:36   #43  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
873 / 649 (23) +++++++
Регистрация: 14.10.2004
Еще для себя напишу, чтобы не забыть
На моем примере на картинке в начале этой темы я показал форму, которая построена на Query, использующую таблицу InventBatch. Это необычная таблица, привязанная сразу к двум таблицам в запросе: к таблице InventDim по полю InventBatchId и к таблице InventTable по полю ItemId.

Чтобы запрос с этой таблицей работал корректно, я источник данных для нее сделал дочерним к InventDim через дизайнер Query в АОТ, а в методе initQuery() моего класса программно добавил связку с источником данных InventTable
X++:
void initQuery()
{
    Query query = new Query(queryStr(zInventAdvanceProdDateReport));
    QueryBuildDatasource    qbds;
    QueryBuildRange         qbr;
    ;

    qbds = query.dataSourceTable(tableNum(InventBatch));
    qbr = sysQuery::findOrCreateRange(qbds, fieldNum(InventBatch, ItemId));
    qbr.value("((ItemId == InventTable_1.ItemId))");
    qbr.status(RangeStatus::Hidden);

    queryRun = new QueryRun(query);
}

Последний раз редактировалось Ace of Database; 02.04.2013 в 18:40.
Старый 29.05.2013, 18:14   #44  
user_ax is offline
user_ax
Участник
Аватар для user_ax
 
599 / 39 (3) +++
Регистрация: 07.10.2012
Адрес: ZP
Подниму этот вопрос.

Мне нужно производить определённые действия(проставлять checkbox-ы) только для тех строк в таблице, в которых поле сотрудник равно тому, что я выбрал в динамическом фильтре. В туториалах нет такого. Подскажите, как мне сравнивать со значением из дин.фильтра моё значение?

Заранее спасибо за ответы.
Старый 29.05.2013, 18:26   #45  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Global::inRange(), хотя если есть "динамический фильтр", то, наверно, есть и запрос, и лучше использовать запрос, а не пытаться его расковырять и анализировать "вручную".
Старый 29.05.2013, 20:50   #46  
user_ax is offline
user_ax
Участник
Аватар для user_ax
 
599 / 39 (3) +++
Регистрация: 07.10.2012
Адрес: ZP
Цитата:
Сообщение от gl00mie Посмотреть сообщение
Global::inRange(), хотя если есть "динамический фильтр", то, наверно, есть и запрос, и лучше использовать запрос, а не пытаться его расковырять и анализировать "вручную".
Да, вы правы, запрос есть. Я и хочу в запросе использовать значение из этого фильтра. Не знаю как, правда. Поэтому и спрашиваю.
Старый 30.05.2013, 00:38   #47  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Если читать тему с начала, то получается, что уже есть QueryRun с запросом, критерии фильтрации записей уже определены пользователем (через э.. динамический фильтр), запрос этот включает ту таблицу, записи в которой надо обновить. Так что еще нужно для полного счастья? По идее - только прописать в запросе для нужной таблицы qbds.update(true), открыть транзакцию и начать выбирать записи для обновления согласно указанным пользователем критериям. В чем же загвоздка-то?
Старый 30.05.2013, 10:03   #48  
user_ax is offline
user_ax
Участник
Аватар для user_ax
 
599 / 39 (3) +++
Регистрация: 07.10.2012
Адрес: ZP
Цитата:
Сообщение от gl00mie Посмотреть сообщение
Если читать тему с начала, то получается, что уже есть QueryRun с запросом, критерии фильтрации записей уже определены пользователем (через э.. динамический фильтр), запрос этот включает ту таблицу, записи в которой надо обновить. Так что еще нужно для полного счастья? По идее - только прописать в запросе для нужной таблицы qbds.update(true), открыть транзакцию и начать выбирать записи для обновления согласно указанным пользователем критериям. В чем же загвоздка-то?
Есть просто queryrun, запрос делал не через query, а через while select.
Старый 30.05.2013, 10:08   #49  
online
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от user_ax Посмотреть сообщение
Есть queryrun ... запрос делал через while select.

А зачем тогда есть queryrun?
Старый 31.05.2013, 17:02   #50  
user_ax is offline
user_ax
Участник
Аватар для user_ax
 
599 / 39 (3) +++
Регистрация: 07.10.2012
Адрес: ZP
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение

А зачем тогда есть queryrun?
Я вот тоже теперь думаю..надо переписывать запрос под квери... или же предложить просто тот динамический фильтр сделать в виде поля и всё ))
Старый 10.06.2013, 09:56   #51  
user_ax is offline
user_ax
Участник
Аватар для user_ax
 
599 / 39 (3) +++
Регистрация: 07.10.2012
Адрес: ZP
Что-то нашаманил, что критерии в динамическом фильтре не выбираются вообще, будто заблокированы. Буду переписывать этот запрос с нуля. И, да, уважаемый gl00mie, вы меня неправильно поняли. Я не буду через квери обновлять записи в таблице, я с его помощью просто хочу выбрать их

Последний раз редактировалось user_ax; 10.06.2013 в 09:58.
Старый 10.06.2013, 10:07   #52  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Цитата:
Сообщение от user_ax Посмотреть сообщение
Что-то нашаманил, что критерии в динамическом фильтре не выбираются вообще, будто заблокированы.
А покажите код, который формирует запрос. Скорее всего у Вас там есть строчка типа:
X++:
QueryBuildRange.status(RangeStatus::Locked);
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 10.06.2013, 10:16   #53  
user_ax is offline
user_ax
Участник
Аватар для user_ax
 
599 / 39 (3) +++
Регистрация: 07.10.2012
Адрес: ZP
Цитата:
Сообщение от lev Посмотреть сообщение
А покажите код, который формирует запрос. Скорее всего у Вас там есть строчка типа:
X++:
QueryBuildRange.status(RangeStatus::Locked);
Нет такой строчки. Я нашёл в чём была проблема блокировки. Это группировка записей. Если заккоментировать строку

X++:
qbds_vendinvoice.orderMode(OrderMode::GroupBy);
Тогда можно выбрать поле для выборки. Мне не критично это, всё равно мне нужно делать выборку из 3-х таблиц , в двух из которых группировать записи по определённым полям, а динамический фильтр по третьей таблице.
Старый 10.06.2013, 11:46   #54  
user_ax is offline
user_ax
Участник
Аватар для user_ax
 
599 / 39 (3) +++
Регистрация: 07.10.2012
Адрес: ZP
Всё-таки не до конца понятно, как применить этот динамический фильтр. В методе initQuery находится мой запрос и динамический фильтр на него не действует, то есть, если выбираю критерии - в запрос они не добавляются...
Может быть его нужно как-то активизировать или что ?
Подскажите, пожалуйста.

Метод initParmDefault

X++:
public void initParmDefault()
{

    this.initQuery();
    super();


}
Метод initQuery

X++:
void initQuery()
{
    Query query = new Query();
    QueryBuildDataSource qbds_vendsp,qbds_vendsplist,qbds_vendinvoice;
     QueryBuildRange  qbr;
      
    ;

    qbds_vendsplist = query.addDataSource(tablenum(VendSpListTrans));
    qbds_vendsplist.orderMode(OrderMode::GroupBy);
    qbds_vendsplist.addSelectionField(fieldnum(VendSpListTrans,InternalSp));
    qbds_vendsplist.addSelectionField(fieldnum(VendSpListTrans,SpClosed));
    qbds_vendsplist.addSelectionField(fieldnum(VendSpListTrans,ItemId));
    qbds_vendsplist.addSelectionField(fieldnum(VendSpListTrans,SpQty));
    qbds_vendsplist.addSortField(fieldnum(VendSpListTrans,InternalSp));
    qbds_vendsplist.addSortField(fieldnum(VendSpListTrans,Itemid));
    qbds_vendsplist.addSortField(fieldnum(VendSpListTrans,SpClosed));
    qbds_vendsplist.addSortField(fieldnum(VendSpListTrans,SpQty));

     //->скрытие полей-индексов в динамических фильтрах
    qbr = qbds_vendsplist.addRange(fieldnum(VendSpListTrans,InternalSpTrans));
    qbr.status(RangeStatus::Hidden);
    //<-
    qbds_vendinvoice = qbds_vendsplist.addDataSource(tablenum(VendInvoiceTrans));
    qbds_vendinvoice.orderMode(OrderMode::GroupBy);
    qbds_vendinvoice.addSelectionField(fieldnum(VendInvoiceTrans,ItemId));
    qbds_vendinvoice.addSelectionField(fieldnum(VendInvoiceTrans,InternalSp));
    qbds_vendinvoice.addSortField(fieldnum(VendInvoiceTrans,ItemId));
    qbds_vendinvoice.addSortField(fieldnum(VendInvoiceTrans,InternalSp));
//    qbds_vendinvoice.addSortField(fieldnum(VendInvoiceTrans,Qty));
    qbds_vendinvoice.addSelectionField(fieldnum(VendInvoiceTrans,Qty),SelectionField::Sum);
    qbds_vendinvoice.addLink(fieldnum(VendSpListTrans,InternalSp), fieldnum(VendInvoiceTrans,InternalSp));
    //->скрытие полей-индексов в динамических фильтрах
    qbr = qbds_vendinvoice.addRange(fieldnum(VendInvoiceTrans,PurchId));
    qbr.status(RangeStatus::Hidden);
    qbr = qbds_vendinvoice.addRange(fieldnum(VendInvoiceTrans,InvoiceDate));
    qbr.status(RangeStatus::Hidden);
    qbr = qbds_vendinvoice.addRange(fieldnum(VendInvoiceTrans,InvoiceId));
    qbr.status(RangeStatus::Hidden);
    qbr = qbds_vendinvoice.addRange(fieldnum(VendInvoiceTrans,LineNum));
    qbr.status(RangeStatus::Hidden);
    qbr = qbds_vendinvoice.addRange(fieldnum(VendInvoiceTrans,numberSequenceGroup));
    qbr.status(RangeStatus::Hidden);
    qbr = qbds_vendinvoice.addRange(fieldnum(VendInvoiceTrans,InternalInvoiceId));
    qbr.status(RangeStatus::Hidden);
     //<-
    qbds_vendsp = qbds_vendinvoice.addDataSource(tablenum(VendSpListJour));
  
    qbds_vendsp.addSelectionField(fieldnum(VendSpListJour,SpClosed));
    qbds_vendsp.addRange(fieldnum(VendSpListJour,EmplId));
    qbds_vendsp.addLink(fieldnum(VendInvoiceTrans,InternalSp),fieldnum(VendSpListJour,InternalSp));

    info(qbds_vendsplist.toString());

    queryRun = new SysQueryRun(query);

Последний раз редактировалось user_ax; 10.06.2013 в 11:53.
Старый 10.06.2013, 12:11   #55  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от user_ax Посмотреть сообщение
вы меня неправильно поняли. Я не буду через квери обновлять записи в таблице, я с его помощью просто хочу выбрать их
Я не утверждал, что Query/QueryRun может генерить SQL-операторы update вместо select'а, однако, в Аксапте при обновлении записей в цикле (без использования update_recordset) принято в этом цикле выбирать записи на обновление (по аналогии с while select forupdate). Можно, конечно, в цикле их выбирать без указания, что они будут обновляться (по аналогии с while select), и потом либо перевыбирать на обновление, либо отрубать проверку, что запись была выбрана на обновление, но в общем случае надо понимать, зачем делать именно так, вместо того чтобы изначально просто выбирать записи на обновление и не усложнять код.
Цитата:
Сообщение от user_ax Посмотреть сообщение
В методе initQuery находится мой запрос и динамический фильтр на него не действует, то есть, если выбираю критерии - в запрос они не добавляются... Может быть его нужно как-то активизировать или что ?
А класс запускается изначально где, на сервере или на клиенте? И где он собственно использует запрос для выборки данных, на сервере или на клиенте? Если на сервере, то учитывают ли pack/unpack, что надо паковать запрос? Потому что без этого изменения, внесенные в критерии фильтрации запроса на клиенте, при возврате управления на сервер будут утеряны.
Старый 10.06.2013, 12:15   #56  
online
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от user_ax Посмотреть сообщение
Может быть его нужно как-то активизировать или что ?
Подскажите, пожалуйста.
А метод initParmDefault срабатывает? Поставьте в нём точку останова или выведите тестовое сообщение, что бы проверить.

Измените значение макроса CurrentVersion в методе classDeclaration, что бы указать что старые сохранённые значения параметров уже устарели и нужно заново проинициализировать их значениями поумолчанию.
Старый 10.06.2013, 12:17   #57  
user_ax is offline
user_ax
Участник
Аватар для user_ax
 
599 / 39 (3) +++
Регистрация: 07.10.2012
Адрес: ZP
Цитата:
Сообщение от gl00mie Посмотреть сообщение
Я не утверждал, что Query/QueryRun может генерить SQL-операторы update вместо select'а, однако, в Аксапте при обновлении записей в цикле (без использования update_recordset) принято в этом цикле выбирать записи на обновление (по аналогии с while select forupdate). Можно, конечно, в цикле их выбирать без указания, что они будут обновляться (по аналогии с while select), и потом либо перевыбирать на обновление, либо отрубать проверку, что запись была выбрана на обновление, но в общем случае надо понимать, зачем делать именно так, вместо того чтобы изначально просто выбирать записи на обновление и не усложнять код.А класс запускается изначально где, на сервере или на клиенте? И где он собственно использует запрос для выборки данных, на сервере или на клиенте? Если на сервере, то учитывают ли pack/unpack, что надо паковать запрос? Потому что без этого изменения, внесенные в критерии фильтрации запроса на клиенте, при возврате управления на сервер будут утеряны.
То есть, правильнее будет сделать update через query, а не обычным способом? То есть, должно быть какое-то условие обновления и если это условие выполняется - qbds.update(true) ? Никогда не применял раньше подобную констркцию и не сталкивался с динамическими фильтрами в принципе, посему и пишу здесь


В свойстве Run On стоит Called From.
В методе пакую запрос посредством
X++:
  return [#CurrentVersion,#CurrentList, queryrun.query().pack()];
и в unpack
X++:
 switch (version)
    {
        case #CurrentVersion:
            [version,#CurrentList] = packedClass;
           if (SysQuery::isPackedOk(queryCon))
                queryRun = new QueryRun(queryCon);
            else
                this.initQuery();
            break;
        default:
            return false;
    }
Старый 10.06.2013, 12:21   #58  
user_ax is offline
user_ax
Участник
Аватар для user_ax
 
599 / 39 (3) +++
Регистрация: 07.10.2012
Адрес: ZP
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
А метод initParmDefault срабатывает? Поставьте в нём точку останова или выведите тестовое сообщение, что бы проверить.

Измените значение макроса CurrentVersion в методе classDeclaration, что бы указать что старые сохранённые значения параметров уже устарели и нужно заново проинициализировать их значениями поумолчанию.
Да, срабатывает, при нажатии на ОК заходит в него.

Значение макросов менял, не помогает, всё равно делает выборку всех значений, независимо от фильтра.
Старый 10.06.2013, 12:33   #59  
online
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от user_ax Посмотреть сообщение
В методе пакую запрос посредством
X++:
  return [#CurrentVersion,#CurrentList, queryrun.query().pack()];
и в unpack
X++:
 switch (version)
    {
        case #CurrentVersion:
            [version,#CurrentList] = packedClass;
           if (SysQuery::isPackedOk(queryCon))
                queryRun = new QueryRun(queryCon);
            else
                this.initQuery();
            break;
        default:
            return false;
    }
я вижу что вы пакуете запрос, но не вижу где вы распаковываете его в переменную queryCon...

Код:
[version,#CurrentList, queryCon] = packedClass;
За это сообщение автора поблагодарили: gl00mie (1).
Старый 10.06.2013, 12:38   #60  
user_ax is offline
user_ax
Участник
Аватар для user_ax
 
599 / 39 (3) +++
Регистрация: 07.10.2012
Адрес: ZP
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
я вижу что вы пакуете запрос, но не вижу где вы распаковываете его в переменную queryCon...

Код:
[version,#CurrentList, queryCon] = packedClass;
Видимо недоизменял...Добавил переменную, изменил значения макроса, попробовал - тот же результат.
Может быть действительно дело в том, где запускается класс?
Теги
runbasereport, диалог, динамическая форма, периодическая операция, программно

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Универсальный изменятель значений полей wojzeh DAX: Программирование 17 26.09.2013 17:47
Последовательная замена множества уникальных значений на другие без возникновения дубликатов gl00mie DAX: Программирование 23 24.11.2010 15:05
Периодическая операция Приемка. Ошибка в спецификации. Объясните RSJustInTime DAX: Функционал 6 02.02.2006 14:02
Сводное планирование - изменения&изменения мин. Alexm DAX: Прочие вопросы 1 05.04.2005 10:43
Русская локализация Axapta 3 ? SlavaK DAX: Администрирование 59 01.07.2003 22:38
Опции темы Поиск в этой теме
Поиск в этой теме:

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

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

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

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