|  16.06.2017, 09:25 | #1 | 
| Участник | добавить readonly датасорс на форму, для фильтрования 
			
			Задача крайне простая. Скажем, в грид с полями из 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);
    }X++: //VIEW public class AttributesView extends common { public void write() { //super(); } public boolean validateWrite() { boolean ret = true; //ret = super(); return ret; } Но при попытке добавить из формы запись в грид, получаю сообщения X++: Field 'Product' must be filled in. Field 'Item number' must be filled in. 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;
    }В общем, задача исключительно простая, но сделать ее на экстеншене формы вообще не получается. Проблема сейчас, в общем-то, в сообщениях о том, что поля вьюхи, которые мандатори в таблицах, из которых она состоит, пустые при добавлении новой записи в родительский датасорс. | 
|  | |
| За это сообщение автора поблагодарили: mazzy (2), Ace of Database (2). | |
|  16.06.2017, 10:10 | #2 | 
| Участник | 
			
			На грид скорее всего не выйдет. Через екстеншен можно добавить FormPart( ещё 1 грид или группа полей) как адреса на CustTable и там у вас будет полный контроль над новой формой/датасоурсом.
		 Последний раз редактировалось skuull; 16.06.2017 в 10:13. | 
|  | 
|  16.06.2017, 16:59 | #3 | 
| Участник | 
			
			Добавлю сюда еще неработающий метод: X++: [FormDataSourceEventHandler(formDataSourceStr(SalesTable, InventTable), FormDataSourceEventType::Writing)]
    public static void InventTable_OnWriting(FormDataSource sender, FormDataSourceEventArgs e)
    {
        // doesn't work
        FormDataSourceCancelEventArgs ce = e as FormDataSourceCancelEventArgs; //converting error here
        Ce.cancel(); //Ce.cancel(1); ?
       // it does work for form control:
       // FormControlCancelableSuperEventArgs ce = e as FormControlCancelableSuperEventArgs;
       // ce.CancelSuperCall();
    }https://ievgensaxblog.wordpress.com/...ut-overlaying/ https://docs.microsoft.com/en-us/dyn...m-data-sources | 
|  | |
| За это сообщение автора поблагодарили: mazzy (2). | |
|  16.06.2017, 18:26 | #4 | 
| Участник | Цитата: 
		
			Сообщение от alicedr
			   Я добавляю датасорс в дизайнере, а связь на уровне инита главной таблицы: 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 на view, писать в БД ? Разве форма в super() write вызывет write таблицы\представления? Еще не видно modified метода который бы заполнял курсор view при изменении ItemId, есть такой? | 
|  | 
|  16.06.2017, 19:48 | #5 | 
| Участник | Цитата: Цитата: ? | 
|  | 
|  16.06.2017, 20:30 | #6 | 
| Участник | 
			
			Так вот из-за такой лажи люди читают поперек и уходят с мыслью "АХ неоч, ничо низя сделать, го в PHP" и несут ее гордо по всему форуму.  Насколько я помню по АХ 2012 (каюсь в 7ке не проверял) ни write ни validateWrite на view не вызывается и поля на обязательность не проверяются. Раньше было достаточно добавить новый datasource, на init() добавить связь и на modified поля (скажем itemId) добавить код по поиску записи во view по новому ключу и заполнение курсора через data(). Откуда именно валится "Field 'Product' must be filled in. " ? | 
|  | 
|  16.06.2017, 21:32 | #7 | 
| Участник | Цитата: Хотя, как уже говорилось, я не проверяла, вызывается ли write на view из write датасорса, но надежда была, что таки вызывается. Это мандатори поля из InventTable, на котором построен view. | 
|  | 
|  16.06.2017, 22:16 | #8 | 
| Участник | |
|  | 
|  20.06.2017, 16:46 | #9 | 
| Участник | Цитата: 
		
			Сообщение от alicedr
			   Задача крайне простая. Скажем, в грид с полями из SalesLine добавить поля из кастомного view, созданного из Inventtable и других таблиц. Поля должны быть фильтровабельными. При добавлении/удалении поля не должны добавляться/удаляться. Делается это в AX7 в form.extension, так что для использования доступны только events. Я добавляю датасорс в дизайнере, а связь на уровне инита главной таблицы... Появилось время проверить. А давайте еще раз? вроде все нормально добавляется и в дизайнере. программировать ничего не нужно. решение поставленной задачи аналогично предыдущим версиям. можете подробнее пояснить выделенное болдом? а главное, можно еще раз - почему вам потребовалось лезть в код? было бы шикарно, если бы вы сделали упрощенный пример и приложили проектик. | 
|  | 
|  20.06.2017, 17:33 | #10 | 
| Участник | 
			
			на всякий случай, если у кого-то возникнут возражения типа Sys-слой или модель не та, повторил эксперимент в слое USR и в новой модели. нормально датасорсы в экстеншены добавляются. нормально поля в гриды перетаскиваются. не нужно ничего программировать, если связь нормально задана в таблицах | 
|  | 
|  18.07.2017, 17:10 | #11 | 
| Участник | 
			
			Спасибо, Маззи! Проблема была в том, что я, протупив, добавила relation между датасорсами на инит датасорса SalesLine вместо инита датасорса кастомного вью. Проблема решилась. Еще раз спасибо! | 
|  |