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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 12.01.2010, 14:28   #1  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
? args.record - как заставить работать в форме PurchLine?
Аксапта 3.0, SP4, приложение GMCS, СУБД - Oracle

Хочу, чтобы корректно работал нижеследующий джоб. Собственно до него мои представления об args.record позволяли это вполне законно ожидать.
X++:
static void Job243_1(Args _args)
{
    PurchIdBase purchId = 'ПЗ0050395';

    PurchTable  purchTable = PurchTable::find(purchId);
    PurchLine   purchLine  = PurchLine::find(purchId, 2);
    Args        args = new Args();
    FormRun     formRun;
    ;
    args.name(formstr(PurchLine));
    args.record(purchLine);

    formRun = classFactory.formRunClass(args);

    formRun.init();
    formRun.run();
    formRun.wait();
}
Не работает, вместо одной ожидаемой записи форма PurchLine открывается со всеми записями (все строки всех закупок) и с активной первой строкой.

С какого-то перепуга (?), ломая мои представления об args.record, работает другой джоб, отбирая только строки заданной закупки:
X++:
static void Job243_2(Args _args)
{
    PurchIdBase purchId = 'ПЗ0050395';

    PurchTable  purchTable = PurchTable::find(purchId);
    PurchLine   purchLine  = PurchLine::find(purchId, 2);
    Args        args = new Args();
    FormRun     formRun;
    ;
    args.name(formstr(PurchLine));
    args.record(purchTable); // ЗДЕСЬ ИЗМЕНИЛОСЬ

    formRun = classFactory.formRunClass(args);

    formRun.init();
    formRun.run();
    formRun.wait();
}
Законен ли такой эффект, когда датасорсу типа PurchLine через args.record передается "неродная" переменная типа PurchTable? Или это очередная недокументированная возможность?

Наконец, если во второй джоб добавить findRecord (он получается по небольшому кол-ву уже отобранных записей одной закупки, а потому вполне быстр), то курсор позиционируется на нужную запись:
X++:
static void Job243_3(Args _args)
{
    PurchIdBase purchId = 'ПЗ0050395';

    PurchTable  purchTable = PurchTable::find(purchId);
    PurchLine   purchLine  = PurchLine::find(purchId, 2);
    Args        args = new Args();
    FormRun     formRun;
    ;
    args.name(formstr(PurchLine));
    args.record(purchTable); // ЗДЕСЬ ИЗМЕНИЛОСЬ

    formRun = classFactory.formRunClass(args);

    formRun.init();
    formRun.run();
    formRun.dataSource(1).findRecord(purchLine); // ЗДЕСЬ ДОБАВИЛОСЬ
    formRun.wait();
}
Нажмите на изображение для увеличения
Название: PurchLine.JPG
Просмотров: 476
Размер:	38.3 Кб
ID:	5499
Но мне-то нужно, чтобы запись в гриде появлялась только одна, как если бы правильно отработал первый джоб.

Что думаете, коллеги? Всем откликнувшимся заранее большое спасибо.
Старый 12.01.2010, 14:49   #2  
Bishop is offline
Bishop
Участник
 
89 / 60 (3) ++++
Регистрация: 12.08.2004
Адрес: Москва
Попробуйте в первом варианте:
X++:
    formRun.init();
    formRun.run();
    formRun.dataSource(1).linkActive();
    formRun.wait();
Старый 12.01.2010, 14:52   #3  
SRF is offline
SRF
Участник
MCBMSS
Axapta Retail User
 
375 / 562 (19) +++++++
Регистрация: 08.08.2007
Записей в блоге: 1
Попробуйте на таблицу PurchLine добавить relation на ее саму, скажем так, по полю inventTransId и запустите первый job и закоментировать блок методе init датасорса PurchLine связанный с данной таблицей.(точнее вызов clearDynalinks)

UPD : по второму job'у есть предположение, что так отрабатывает, поскольку не вызывается clearDynalinks из метода init датасорса PurchLine
__________________
Sergey Nefedov

Последний раз редактировалось SRF; 12.01.2010 в 15:00. Причина: Дополнение
За это сообщение автора поблагодарили: Gustav (2).
Старый 12.01.2010, 14:55   #4  
egorych is offline
egorych
Участник
Самостоятельные клиенты AX
Oracle
 
761 / 154 (7) ++++++
Регистрация: 09.11.2006
Адрес: Краснодарский край
в init датасорса PurchLine есть
X++:
public void init()
{
    super();
    switch(element.args().dataset())
    {
        case tablenum(PurchLine),
             tableNum(ProjTable),
             tableNum(ProjWIPTable)      : this.query().dataSourceTable(tablenum(PurchLine)).[COLOR=red]clearDynalinks()[/COLOR];
                                         break;
    }
}
Может это дает такой фефект?
За это сообщение автора поблагодарили: Gustav (2).
Старый 12.01.2010, 14:56   #5  
Bishop is offline
Bishop
Участник
 
89 / 60 (3) ++++
Регистрация: 12.08.2004
Адрес: Москва
Цитата:
Сообщение от SRF Посмотреть сообщение
Попробуйте на таблицу PurchLine добавить relation на ее саму, скажем так, по полю inventTransId и запустите первый job.
Тут дело не в Relation'ах, а в самой форме PurchLine - там перекрыты методы init() и linkActive() на источнике данных (по крайней мере, должны быть перекрыты в стандарте )
Судя по коду, принудительный вызов linkActive() должен помочь.
Старый 12.01.2010, 15:10   #6  
Bishop is offline
Bishop
Участник
 
89 / 60 (3) ++++
Регистрация: 12.08.2004
Адрес: Москва
Извиняюсь, linkActive() не поможет в данном случае (он предусмотрен для какого-то особого вызова этой формы).
Самое простое, пожалуй, будет так:
X++:
static void Job243_1(Args _args)
{
    PurchIdBase purchId = 'ПЗ0050395';
 
    PurchTable  purchTable = PurchTable::find(purchId);
    PurchLine   purchLine  = PurchLine::find(purchId, 2);
    Args        args = new Args();
    FormRun     formRun;
    FormDataSource formDS;
    ;
    args.name(formstr(PurchLine));
    args.record(purchLine);
 
    formRun = classFactory.formRunClass(args);
 
    formRun.init();
    formDS = formRun.dataSource(1);
    formDS.query().dataSourceNo(1).addRange(fieldNum(PurchLine, InventTransId)).value(purchLine.InventTransId);
    formRun.run();
    formRun.wait();
}
За это сообщение автора поблагодарили: Gustav (3).
Старый 12.01.2010, 15:23   #7  
tricky is offline
tricky
Участник
 
140 / 64 (3) ++++
Регистрация: 03.05.2005
Адрес: Гуково
Не знаю, корректно это или нет, но у меня сработало вот так
X++:
    PurchIdBase purchId = 'ПЗ0050395';

    PurchTable  purchTable = PurchTable::find(purchId);
    PurchLine   purchLine  = PurchLine::find(purchId, 3);
    Args        args = new Args();
    FormRun     formRun;
    FormDataSource fds; // добавил
    ;
    args.name(formstr(PurchLine));
    //args.record(purchLine);  // закомментил

    formRun = classFactory.formRunClass(args);

    formRun.init();
    //-------- добавил -----
    fds = formRun.dataSource();
    fds.query().dataSourceTable(tablenum(PurchLine)).addDynalink(fieldNum(PurchLine,PurchId),purchLine,fieldNum(PurchLine,PurchId));
    fds.query().dataSourceTable(tablenum(PurchLine)).addDynalink(fieldNum(PurchLine,LineNum),purchLine,fieldNum(PurchLine,LineNum));
    //------------------------
    formRun.run();
    formRun.wait();
За это сообщение автора поблагодарили: Gustav (2).
Старый 12.01.2010, 15:52   #8  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Не уверен, насчет AX3.0, но в AX2.5 параметр (args) - это не есть источник данных. Как правило, это всего-лишь дополнительный "фильтр", накладываемый на главный DataSource формы. Точнее, дополнительный DynaLink. Да и то, только в том случае, если установлено свойство AutoQuery = Yes

Чтобы понять, что происходит, посмотрите текущий Query по форме (хотя, в Ax3.0 это сделать проблематично) сразу после открытия формы

В общем, при передаче в качестве параметра строки таблицы увидите, что в запросе по форме для главной таблицы формы (в данном случае PurchLine) будет добавлен DynaLink к той таблице, которая была передана в качестве параметра.

Естесственно, DynaLink от PurchLine к таблице PurchTable будет организован по PurchId. Поскольку выбрана конкретная запись PurchTable, то и будут "отфильтрованы" только записи данной закупки

А вот как организовать DynaLink между PurchLine и PurchLine? Да никак! Вот и не будет никакой "фильтрации".

Точнее, организация DynaLink в этом случае в форме PurchLine выполняется в методе LinkActive. Но он "заточен" под вполне конкретную связь с прикрепленной закупкой. С произвольной строкой PurchLine, скорее всего, как раз и будут отображены почти все строки всех закупок

Собственно, решение сводится к тому, чтобы через args() передать еще какой-либо признак по значению которого сделать ветвление кода в LinkActive. Т.е. да, как параметр передано значение PurchLine, но вместо организации Link надо просто наложить фильтр.

Или просто передать как параметр RecId, но опять же, писать код в форме PurchLine
За это сообщение автора поблагодарили: Gustav (6).
Старый 12.01.2010, 16:35   #9  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Доложу о некоторых изысканиях по мотивам обсуждения.

1-й вариант изысканий. Создал копию формы PurchLine, удалил из нее весь перекрытый код - поведение всех 3-х джобов абсолютно не изменилось.

2-й вариант. "Полувосстановил" метод init датасорса PurchLine в таком виде:
X++:
public void init()
{
    super();
    this.query().dataSourceTable(tablenum(PurchLine)).clearDynalinks();
}
Результаты:
джоб 1 - то же самое
джоб 2 - перестал фильтровать (как и предполагал SRF)
джоб 3 - findRecord стал долгим и полным

3-й вариант. Джобы Bishop'а и tricky имитируют правильный эффект. Это мне пригодится, хотя и с оговорками.

"Чистый вход" по args.record мне был нужен, чтобы воспользоваться классом SysInfoAction_FormName_RU, но, похоже, придется его перекрывать на этот мой конкретный случай с PurchLine.
Старый 12.01.2010, 16:53   #10  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Для SysInfoAction можно сделать без модификации существующиго кода

Для этого надо в AOT создать временную таблицу с полями, соответствующими уникальным полям в таблице PurchLine (к примеру, InventTransId или пару полей itemId и refRecId).
Для этой таблицы создать релейшен на PurchLine с выбранными полями

В коде инициализировать выбранные поля из найденной PurchLine и передавать в SysInfoAction_FormName_RU эту запись

X++:
    PurchIdBase purchId = 'ПЗ0050395';

    PurchTable  purchTable = PurchTable::find(purchId);
    PurchLine   purchLine  = PurchLine::find(purchId, 2);
    PurchLineTmp purchLineTmp;

    SysInfoAction_FormName_RU   SysInfoAction_FormName_RU;
    ;
    purchLineTmp.ItemId =  purchLine.itemId;
    purchLineTmp.RefRecId =  purchLine.RecId;
    SysInfoAction_FormName_RU  = new SysInfoAction_FormName_RU(purchLineTmp, formstr(PurchLine));
    info(strfmt("Закупка %1", purchId), "", SysInfoAction_FormName_RU);
__________________
Axapta v.3.0 sp5 kr2
За это сообщение автора поблагодарили: Gustav (3).
Теги
args, dynalink, formdatasource, formrun

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Почему может не передаваться args().record() ? egorych DAX: Программирование 5 03.11.2009 13:43
Как заставить работать TopEdge? KingPeas DAX: Программирование 1 06.11.2007 17:19
args.dataset() и args.record().tableid - могут ли отличаться? gl00mie DAX: Программирование 5 06.08.2007 13:21
Как заставить работать hideToolbar() exceptor DAX: Программирование 3 13.02.2007 14:58
Как заставить работать xRecord.suppressWarnings() Logger DAX: Программирование 13 29.08.2005 16:22

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

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

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