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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 12.09.2018, 23:13   #1  
Blog bot is offline
Blog bot
Участник
 
21,171 / 725 (67) +++++++
Регистрация: 28.10.2006
Lookup and Modified methods for FormReferenceGroup fields in D365
Источник: http://alexvoy.blogspot.com/2018/09/...thods-for.html
==============

<div dir="ltr" style="text-align: left;" trbidi="on">Let's say we need to keep in Purchase line a manufacturer code for a particular product. So each Product/Manufacturer code combination is unique.



Three tables are referenced via RecId fields.





So once Manufacturer code field is placed in the form, we end up with a FormReferenceGroup.



We can easily override its lookup method by subscribing to the relevant event on it.

[FormControlEventHandler(formControlStr(PurchTable, avrEcoResManufacturerProduct_avrEcoResManufacturerProductRecId), FormControlEventType::Lookup)]
public static void avrEcoResManufacturerProduct_avrEcoResManufacturerProductRecId_OnLookup(FormControl sender, FormControlEventArgs e)
{
PurchLine purchLine = sender.formRun().dataSource(formDataSourceStr(PurchTable, PurchLine)).cursor() as PurchLine;
FormControlCancelableSuperEventArgs cancelableArgs = e as FormControlCancelableSuperEventArgs;

avrEcoResManufacturerProduct::lookupByItem(sender, purchLine.itemId);

cancelableArgs.CancelSuperCall();
}


public client static Common lookupByItem(FormReferenceControl _formReferenceControl, ItemId _itemId)
{
SysReferenceTableLookup sysReferenceTableLookup;
Query query;
QueryBuildDataSource avrEcoResMan;

sysReferenceTableLookup = SysReferenceTableLookup::newParameters(tableNum(avrEcoResManufacturerProduct), _formReferenceControl);
sysReferenceTableLookup.addLookupfield(fieldNum(avrEcoResManufacturerProduct, EcoResManufacturerRecId));
sysReferenceTableLookup.addLookupfield(fieldNum(avrEcoResManufacturerProduct, EcoResManufacturerPartNbr));

query = new Query();
avrEcoResMan = query.addDataSource(tableNum(avrEcoResManufacturerProduct));
avrEcoResMan.addRange(fieldNum(avrEcoResManufacturerProduct, EcoResProductRecId)).value(SysQuery::value(InventTable::find(_itemId).Product));

sysReferenceTableLookup.parmQuery(query);

return sysReferenceTableLookup.performFormLookup() as avrEcoResManufacturerProduct;
}





But what if the user wants to create new values in appropriate tables if them do not exist yet?



We can catch the modified event in order to create new values before failing the validation.
However, given that its content may be changed, it is impossible to get access to its fields at design time.

We can do it during run-time by means of getting sought field form controls by their names and overloading then their Modified() methods. (see the similar trick for AX 2012 https://alexvoy.blogspot.com/2014/01...reference.html)





The code you need to add.

[ExtensionOf(formStr(PurchTable))]
final class avrPurchTableForm_PurchTableManuf_Extension
{
private const str avrFieldNameDisplayProductNumber = 'EcoResManufacturerPartNbr';
private const str avrFieldNameEcoResManufacturerName = 'EcoResManufacturerName';
private FormStringControl avrFSCDisplayProductNumber;
private FormStringControl avrFSCEcoResManufacturerName;

// the only way to change the standard modified method for a control inside of a dynamically populated reference group
// is to get it by its name looping all form controls of this group during run-time. then to overload it
[FormEventHandler(formStr(PurchTable), FormEventType::Initialized)]
public void PurchTable_OnInitialized(xFormRun sender, FormEventArgs e)
{
FormDesign formDesign = sender.design();
FormReferenceGroupControl formReferenceGroupControl;
formReferenceGroupControl = formDesign.controlName(formControlStr(PurchTable, avrEcoResManufacturerProduct_avrEcoResManufacturerProductRecId)) as formReferenceGroupControl;
this.registerManufacturerNameOverload(formReferenceGroupControl);
}

private void registerManufacturerNameOverload(FormReferenceGroupControl _formReferenceGroupControl )
{
int i;
Object childControl;
FormStringControl formStringControl;

for (i = 1; i
public static avrEcoResManufacturerProduct findOrCreateEcoResManufacturerProduct(ItemId _itemId,
avrEcoResManufacturerName _manufacturerName,
avrEcoResManufacturerPartNbr _manufacturerPartNbr)
{
avrEcoResManufacturerProduct avrEcoResManufacturerProduct;
avrEcoResManufacturer avrEcoResManufacturer;
InventTable inventTable = InventTable::find(_itemId);
// item and part number are given and exist
if(inventTable.Product && _manufacturerPartNbr)
{
// such a manufacturer exists, so just try to find it for given combination
avrEcoResManufacturer = avrEcoResManufacturer::findOrCreateByName(_manufacturerName);
avrEcoResManufacturerProduct = avrEcoResManufacturerProduct::find(inventTable.Product, avrEcoResManufacturer.RecId);
if(!avrEcoResManufacturerProduct)
{
if(Box::confirm("Do you want to create new part number", strFmt(avrEcoResManufacturerProduct::txtNotExist(), _manufacturerPartNbr)))
{
try
{
avrEcoResManufacturerProduct.EcoResProductRecId = inventTable.Product;
avrEcoResManufacturerProduct.EcoResManufacturerRecId = avrEcoResManufacturer.RecId;
avrEcoResManufacturerProduct.EcoResManufacturerPartNbr = _manufacturerPartNbr;
avrEcoResManufacturerProduct.EcoResManufacturerDefault = NoYes::Yes;
if(avrEcoResManufacturerProduct.validateWrite())
{
avrEcoResManufacturerProduct.insert();
}
}
catch
{
Error("Failed to create new part number");
}
}
}
}
return avrEcoResManufacturerProduct;
}






Источник: http://alexvoy.blogspot.com/2018/09/...thods-for.html
__________________
Расскажите о новых и интересных блогах по Microsoft Dynamics, напишите личное сообщение администратору.
Старый 13.09.2018, 13:36   #2  
skuull is offline
skuull
Участник
Most Valuable Professional
Лучший по профессии 2014
 
532 / 538 (19) +++++++
Регистрация: 08.03.2013
Адрес: ХЗ
И после таких чудо модификаций пользователи заводят баги "почему это я ввожу не сушествующую номенклатуру, а она не создаваться сама, ведь на другое форме так работает!!!"
Старый 15.09.2018, 17:18   #3  
wojzeh is offline
wojzeh
Участник
Аватар для wojzeh
Соотечественники
 
493 / 232 (8) ++++++
Регистрация: 27.04.2006
Адрес: Montreal
Цитата:
Сообщение от skuull Посмотреть сообщение
И после таких чудо модификаций пользователи заводят баги "почему это я ввожу не сушествующую номенклатуру, а она не создаваться сама, ведь на другое форме так работает!!!"
Поясни. Я автор модификации. В чем тут тебе видится чудо? Странный запрос или кривая реализация?

У клиента каждый заказ на продажу - это новый проект с кучей новых комплектующих, большую часть которых они никогда ещё не покупали. Соответственно никто заранее эти товары не создает. Поэтому они Используют общий товар project material, а к нему на лету добавляют внешние коды поставщиков. Что с ними не так? По-моему, всё нормально
__________________
Felix nihil admirari
-----------------------------------------------------------------------------------------------
AX2012
Старый 15.09.2018, 21:18   #4  
trud is offline
trud
Участник
Лучший по профессии 2017
 
611 / 630 (23) +++++++
Регистрация: 07.06.2003
Сама тема раскрыта хорошо, однако к коду примера можно попридираться,
-во первых вы миксуете данные и интерфейс - т.е. наверняка если кому-нибудь понадобится выполнить создание строк из файла(с вашей логикой) он не сможет использовать ваши методы.
-далее - если modified выполнился(записи создались), а строчку закупки пользователь решил финально не сохранять, получаются они будут висеть
-проверку на существование записи надо делать и после Box, за то время пока пользователь размышлял, запись могла уже и создаться
-это тоже странная конструкция - если validateWrite() прошел, то создаем строчку, если нет, то и фиг бы с ним? может стоит сюда генерацию ошибки добавить
X++:
   if(avrEcoResManufacturer.validateWrite())
                    {                     
avrEcoResManufacturer.insert();
                    }
Старый 15.09.2018, 22:14   #5  
wojzeh is offline
wojzeh
Участник
Аватар для wojzeh
Соотечественники
 
493 / 232 (8) ++++++
Регистрация: 27.04.2006
Адрес: Montreal
наверняка можно шлифовать, ибо нет предела совершенству. Этот код даже не тестировался. Целью было показать, как добраться до элементов референсной группы.
__________________
Felix nihil admirari
-----------------------------------------------------------------------------------------------
AX2012
Старый 15.09.2018, 23:52   #6  
skuull is offline
skuull
Участник
Most Valuable Professional
Лучший по профессии 2014
 
532 / 538 (19) +++++++
Регистрация: 08.03.2013
Адрес: ХЗ
Цитата:
Сообщение от wojzeh Посмотреть сообщение
Поясни. Я автор модификации. В чем тут тебе видится чудо? Странный запрос или кривая реализация?

У клиента каждый заказ на продажу - это новый проект с кучей новых комплектующих, большую часть которых они никогда ещё не покупали. Соответственно никто заранее эти товары не создает. Поэтому они Используют общий товар project material, а к нему на лету добавляют внешние коды поставщиков. Что с ними не так? По-моему, всё нормально
Претензий к реализации нет. Но людям часто хочется, чтобы на лету создавались "мастер" данные. Типа я ввожу группу клиентов или пул (может не самый лучший пример), а ее нет, что, тупая аксапта не может создать ее для меня также как у тебя в примере? И ты им: "Нет не может", и это работает до момента пока на какай-то форме она вдруг не смогла и начинается "там работает же, почините теперь везде!" Несогласованное поведение системы

Ну и что делать с опечатками? Насоздают ведь дубликатов вагон
Старый 17.09.2018, 17:02   #7  
wojzeh is offline
wojzeh
Участник
Аватар для wojzeh
Соотечественники
 
493 / 232 (8) ++++++
Регистрация: 27.04.2006
Адрес: Montreal
Цитата:
Сообщение от skuull Посмотреть сообщение
И ты им: "Нет не может", и это работает до момента пока на какай-то форме она вдруг не смогла и начинается "там работает же, почините теперь везде!" Несогласованное поведение системы
с кем не согласованное? захотят везде - будет везде

Цитата:
Сообщение от skuull Посмотреть сообщение
Ну и что делать с опечатками? Насоздают ведь дубликатов вагон
да то же самое делать, что и с дубликатами, созданными обычным способом.
__________________
Felix nihil admirari
-----------------------------------------------------------------------------------------------
AX2012
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Как вызвать lookup метод из события modified AX_Dan DAX: Программирование 4 02.09.2016 18:44
dynamicsaxhints: Top modified EDT properties in AX 2012 R3 Blog bot DAX Blogs 0 10.08.2016 23:16
vasantharivali: Filter Second lookup based on First Value – Ax 2012 SSRS Blog bot DAX Blogs 0 24.09.2014 13:11
wiki.dynamicsbook: Changes Made in Navision Attain 3.60 Blog bot Dynamics CRM: Blogs 0 02.09.2008 13:23
lookup не закрывается до завершения метода modified Morpheus DAX: Программирование 4 09.08.2006 16:43
Опции темы Поиск в этой теме
Поиск в этой теме:

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

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 21:45.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.