|
12.01.2010, 14:28 | #1 |
Moderator
|
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(); } С какого-то перепуга (?), ломая мои представления об 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(); } Наконец, если во второй джоб добавить 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(); } Но мне-то нужно, чтобы запись в гриде появлялась только одна, как если бы правильно отработал первый джоб. Что думаете, коллеги? Всем откликнувшимся заранее большое спасибо. |
|
12.01.2010, 14:49 | #2 |
Участник
|
Попробуйте в первом варианте:
X++: formRun.init(); formRun.run(); formRun.dataSource(1).linkActive(); formRun.wait(); |
|
12.01.2010, 14:52 | #3 |
Участник
|
Попробуйте на таблицу 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 |
Участник
|
в 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 |
Участник
|
Цитата:
Судя по коду, принудительный вызов linkActive() должен помочь. |
|
12.01.2010, 15:10 | #6 |
Участник
|
Извиняюсь, 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 |
Участник
|
Не знаю, корректно это или нет, но у меня сработало вот так
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 |
Участник
|
Не уверен, насчет 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 |
Moderator
|
Доложу о некоторых изысканиях по мотивам обсуждения.
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 |
Участник
|
Для 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 |
|
|