Задача крайне простая.
Скажем, в грид с полями из SalesLine добавить поля из кастомного view, созданного из Inventtable и других таблиц. Поля должны быть фильтровабельными. При добавлении/удалении поля не должны добавляться/удаляться.
Делается это в AX7 в form.extension, так что для использования доступны только events.
Я добавляю датасорс в дизайнере, а связь на уровне инита главной таблицы:
X++:
[FormDataSourceEventHandler(formDataSourceStr(SalesTable, SalesLine), FormDataSourceEventType::Initialized)]
public static void SalesLine_OnInitialized(FormDataSource sender, FormDataSourceEventArgs e)
{
FormDataSource lines_ds = sender;
QueryBuildDataSource qbdsLines = lines_ds.query().dataSourceName('SalesLine');
//qbdsLines.clearLinks();
QueryBuildDataSource qbdsProduct = qbdsLines.addDatasource(tableNum(AttributesView), "AttributesView_code");
QbdsProduct.addLink(fieldNum(SalesLine, itemId),fieldNum(AttributesView, itemId));
QbdsProduct.joinMode(JoinMode::InnerJoin);
}
Далее в самом вью я перекрываю метод write и validatewrite:
X++:
//VIEW
public class AttributesView extends common
{
public void write()
{
//super();
}
public boolean validateWrite()
{
boolean ret = true;
//ret = super();
return ret;
}
Перекрыть write прям на датасорсе формы не могу, потому что это экстеншен. Именно поэтому используется вью, а не таблица.
Но при попытке добавить из формы запись в грид, получаю сообщения
X++:
Field 'Product' must be filled in.
Field 'Item number' must be filled in.
Была попытка в порядке бреда дать ему значения для validate, не помогло:
X++:
[FormDataFieldEventHandler(formDataFieldStr(SalesTable, SalesLine, ItemId), FormDataFieldEventType::Modified)]
public static void ItemId_OnModified(FormDataObject sender, FormDataFieldEventArgs e)
{
FormDataSource fds = sender.datasource();
FormRun formRun = fds.formRun();
SalesLine salesLine = FormRun.dataSource(formdatasourcestr(Salestable, SalesLine)).cursor() as salesLine;
AttributesView view = FormRun.dataSource(formdatasourcestr(Salestable, AttributesView)).cursor() as AttributesView;
view.ItemId = SalesLine.ItemId;
view.Product = 1;
}
В общем, задача исключительно простая, но сделать ее на экстеншене формы вообще не получается.
Проблема сейчас, в общем-то, в сообщениях о том, что поля вьюхи, которые мандатори в таблицах, из которых она состоит, пустые при добавлении новой записи в родительский датасорс.