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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 16.06.2017, 09:25   #1  
alicedr is offline
alicedr
Участник
 
175 / 43 (2) +++
Регистрация: 06.07.2012
Адрес: Канада
добавить 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);
    }
Далее в самом вью я перекрываю метод 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;
    }


В общем, задача исключительно простая, но сделать ее на экстеншене формы вообще не получается.
Проблема сейчас, в общем-то, в сообщениях о том, что поля вьюхи, которые мандатори в таблицах, из которых она состоит, пустые при добавлении новой записи в родительский датасорс.
За это сообщение автора поблагодарили: mazzy (2), Ace of Database (2).
Старый 16.06.2017, 10:10   #2  
skuull is offline
skuull
Участник
Most Valuable Professional
Лучший по профессии 2014
 
700 / 752 (27) +++++++
Регистрация: 08.03.2013
Адрес: ХЗ
На грид скорее всего не выйдет. Через екстеншен можно добавить FormPart( ещё 1 грид или группа полей) как адреса на CustTable и там у вас будет полный контроль над новой формой/датасоурсом.

Последний раз редактировалось skuull; 16.06.2017 в 10:13.
Старый 16.06.2017, 16:59   #3  
alicedr is offline
alicedr
Участник
 
175 / 43 (2) +++
Регистрация: 06.07.2012
Адрес: Канада
Добавлю сюда еще неработающий метод:
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  
skuull is offline
skuull
Участник
Most Valuable Professional
Лучший по профессии 2014
 
700 / 752 (27) +++++++
Регистрация: 08.03.2013
Адрес: ХЗ
Цитата:
Сообщение от 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);
    }
Если датасоурс добавлен в дизайнере зачем его еще раз добавлять в коде через qbdsLines.addDatasource ?
Цитата:
Сообщение от alicedr Посмотреть сообщение
Далее в самом вью я перекрываю метод write и validatewrite:
Перед тем как их перекрывать вы проверили что они вызываются ? Что вообще должен делать write на view, писать в БД ? Разве форма в super() write вызывет write таблицы\представления?

Еще не видно modified метода который бы заполнял курсор view при изменении ItemId, есть такой?
Старый 16.06.2017, 19:48   #5  
alicedr is offline
alicedr
Участник
 
175 / 43 (2) +++
Регистрация: 06.07.2012
Адрес: Канада
Цитата:
Сообщение от skuull Посмотреть сообщение
Если датасоурс добавлен в дизайнере зачем его еще раз добавлять в коде через qbdsLines.addDatasource ?
Да, тут лажа, уже исправлено: вешаться надо на инит AttributesVeiw и просто добавлять связь через addLink.

Цитата:
Сообщение от skuull Посмотреть сообщение
Перед тем как их перекрывать вы проверили что они вызываются ? Что вообще должен делать write на view, писать в БД ? Разве форма в super() write вызывет write таблицы\представления?
Нет. но была надежда.

Цитата:
Сообщение от skuull Посмотреть сообщение
Еще не видно modified метода который бы заполнял курсор view при изменении ItemId, есть такой?
?
Старый 16.06.2017, 20:30   #6  
skuull is offline
skuull
Участник
Most Valuable Professional
Лучший по профессии 2014
 
700 / 752 (27) +++++++
Регистрация: 08.03.2013
Адрес: ХЗ
Цитата:
Сообщение от alicedr Посмотреть сообщение
Да, тут лажа
Так вот из-за такой лажи люди читают поперек и уходят с мыслью "АХ неоч, ничо низя сделать, го в PHP" и несут ее гордо по всему форуму.

Насколько я помню по АХ 2012 (каюсь в 7ке не проверял) ни write ни validateWrite на view не вызывается и поля на обязательность не проверяются. Раньше было достаточно добавить новый datasource, на init() добавить связь и на modified поля (скажем itemId) добавить код по поиску записи во view по новому ключу и заполнение курсора через data().

Откуда именно валится "Field 'Product' must be filled in. " ?
Старый 16.06.2017, 21:32   #7  
alicedr is offline
alicedr
Участник
 
175 / 43 (2) +++
Регистрация: 06.07.2012
Адрес: Канада
Цитата:
Сообщение от skuull Посмотреть сообщение
Насколько я помню по АХ 2012 (каюсь в 7ке не проверял) ни write ни validateWrite на view не вызывается и поля на обязательность не проверяются.
А на датасорсе? А супер() оттуда?
Хотя, как уже говорилось, я не проверяла, вызывается ли write на view из write датасорса, но надежда была, что таки вызывается.

Цитата:
Сообщение от skuull Посмотреть сообщение
Откуда именно валится "Field 'Product' must be filled in. " ?
Это мандатори поля из InventTable, на котором построен view.
Старый 16.06.2017, 22:16   #8  
skuull is offline
skuull
Участник
Most Valuable Professional
Лучший по профессии 2014
 
700 / 752 (27) +++++++
Регистрация: 08.03.2013
Адрес: ХЗ
Цитата:
Сообщение от alicedr Посмотреть сообщение
Это мандатори поля из InventTable, на котором построен view.
Это понятно, не понятно из какого метода вы получаете эти сообщения, validateWrite датасоурса? Но тогда почему "при попытке добавить", а не при попытке сохранить ?
Нужно больше информации
Старый 20.06.2017, 16:46   #9  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от alicedr Посмотреть сообщение
Задача крайне простая.
Скажем, в грид с полями из SalesLine добавить поля из кастомного view, созданного из Inventtable и других таблиц. Поля должны быть фильтровабельными. При добавлении/удалении поля не должны добавляться/удаляться.
Делается это в AX7 в form.extension, так что для использования доступны только events.
Я добавляю датасорс в дизайнере, а связь на уровне инита главной таблицы...
Эм... с самого начала подозревал что чего-то не понимаю.
Появилось время проверить.
А давайте еще раз?

вроде все нормально добавляется и в дизайнере. программировать ничего не нужно. решение поставленной задачи аналогично предыдущим версиям.

можете подробнее пояснить выделенное болдом?
а главное, можно еще раз - почему вам потребовалось лезть в код?

было бы шикарно, если бы вы сделали упрощенный пример и приложили проектик.
Миниатюры
Нажмите на изображение для увеличения
Название: 1.PNG
Просмотров: 626
Размер:	60.5 Кб
ID:	11524   Нажмите на изображение для увеличения
Название: 2.PNG
Просмотров: 525
Размер:	181.4 Кб
ID:	11525  

__________________
полезное на axForum, github, vk, coub.
Старый 20.06.2017, 17:33   #10  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
на всякий случай, если у кого-то возникнут возражения типа Sys-слой или модель не та,
повторил эксперимент в слое USR и в новой модели.

нормально датасорсы в экстеншены добавляются.
нормально поля в гриды перетаскиваются.
не нужно ничего программировать, если связь нормально задана в таблицах
Миниатюры
Нажмите на изображение для увеличения
Название: 1.PNG
Просмотров: 368
Размер:	226.5 Кб
ID:	11526  
__________________
полезное на axForum, github, vk, coub.
Старый 18.07.2017, 17:10   #11  
alicedr is offline
alicedr
Участник
 
175 / 43 (2) +++
Регистрация: 06.07.2012
Адрес: Канада
Спасибо, Маззи!
Проблема была в том, что я, протупив, добавила relation между датасорсами на инит датасорса SalesLine вместо инита датасорса кастомного вью.
Проблема решилась.
Еще раз спасибо!
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Как добавить назначение платежа в печатную форму velk DAX: Программирование 4 03.10.2016 10:37
mfp: X++ in AX7: Readonly keyword Blog bot DAX Blogs 3 15.12.2015 18:22
Добавить датасорс Eldar9x DAX: Программирование 1 01.10.2007 16:21
Добавить на форму всплывающее меню (PopupMenu) Zman DAX: Программирование 2 03.03.2005 12:21
как добавить в форму Memega DAX: Программирование 5 11.10.2003 00:50
Опции темы Поиск в этой теме
Поиск в этой теме:

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

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

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

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