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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 12.12.2019, 19:48   #1  
syl is offline
syl
Участник
Аватар для syl
 
236 / 21 (1) +++
Регистрация: 10.06.2015
Адрес: Киев
D365FO Создать новую строку при открытии диалога
D365FO Необходимо при открытии дилога создать новую строку в DataSource и перевести на нее курсор что бы дать возможность полдьзователю ввести данные.

Перепробовал кучу способов, единственный который частично сработал:
- Свойство DataSource InsertAtEnd = Yes
- Потом такой код:
X++:
    [DataSource]
    class MyDS
    {
        public void init()
        {
            super();

            this.setPosition(this.last());
        }

    }
Новая строка создается и ее можно редактировать, но перестают работать ReferenceGroup lookup'ы, они появляются корректно но выбранное значение не записывается
Старый 13.12.2019, 06:48   #2  
Pandasama is offline
Pandasama
Участник
 
457 / 134 (5) +++++
Регистрация: 11.08.2014
Адрес: Барнаул
1) за D365FO не скажу, но по идее на датасорсе есть метод create (который вызывается при создании новой строки на форме)
2) но в целом, то мне кажется что вы чего-то весьма странного хотите. Если есть форма, есть датасорс - создавайте в коде новую запись в таблице (заполняйте и .insert()) - а потом сделайте на датасорсе .executeQuery(), чтобы эту запись увидеть.
Старый 13.12.2019, 11:48   #3  
syl is offline
syl
Участник
Аватар для syl
 
236 / 21 (1) +++
Регистрация: 10.06.2015
Адрес: Киев
Мне нужно сделать диалог создания новой записи, перед insert() пользователь должен заполнить определенный набор полей. datasource().create() не отрабатывает или я его не там где надо вставляю, т.к. датасорц отображает строку которую передал caller (хотя явно она в аргументы не указывалась, специфика работы D365)
Старый 13.12.2019, 12:02   #4  
Pandasama is offline
Pandasama
Участник
 
457 / 134 (5) +++++
Регистрация: 11.08.2014
Адрес: Барнаул
То есть у вас есть форма, вы на ней нажимаете кнопку, открывается диалог - там заполняете поля создается запись с этими значениями и вы хотите увидеть её на форме?
Тогда вам не надо никаких "вставок записи на датасорсе", как я и говорю - в коде класса, который вызывается по кнопку вы открываете диалог, получаете данные из полей диалога, затем создаете запись и вставляете её в таблицу (T)TableName.insert(). И на датасорсе потом делаете executeQuery какой-нибудь, чтобы обновить список отображаемых записей и увидеть новую
Старый 13.12.2019, 13:15   #5  
syl is offline
syl
Участник
Аватар для syl
 
236 / 21 (1) +++
Регистрация: 10.06.2015
Адрес: Киев
У меня часть полей реализована через ReferenceGroup, что то без датасорца они работать не хотят
Старый 13.12.2019, 13:26   #6  
Pandasama is offline
Pandasama
Участник
 
457 / 134 (5) +++++
Регистрация: 11.08.2014
Адрес: Барнаул
Ну если нет возможности от reference-полей отказаться, то сделайте свой диалог в виде формы, на которой будет датасорс с нужной вам таблицей, единственной записью, можно даже временной. А по закрытию вы будете уже создавать запись в постоянной таблице и на датасорсе основной форме обновлять, чтобы её увидеть.

Вызывать методы create и т.д. на самом датасорсе вам в любом случае не надо.
Старый 13.12.2019, 13:35   #7  
syl is offline
syl
Участник
Аватар для syl
 
236 / 21 (1) +++
Регистрация: 10.06.2015
Адрес: Киев
Так и пытаюсь сделать, но как сделать что бы датасорц был пустым и форма создала новую запись по insrtIfEmpty
Старый 13.12.2019, 13:40   #8  
Pandasama is offline
Pandasama
Участник
 
457 / 134 (5) +++++
Регистрация: 11.08.2014
Адрес: Барнаул
Сделайте его временным.

Ну и как всегда - см. как сделано в стандарте. Не знаю, что там в D365FO, но в Ax2012 есть какая-нибудь отдельная форма создания продукта, или заказа покупки (форма PurchCreateOrder). Посмотрите, как там реализовано.
Старый 13.12.2019, 14:33   #9  
syl is offline
syl
Участник
Аватар для syl
 
236 / 21 (1) +++
Регистрация: 10.06.2015
Адрес: Киев
PurchCreateOrder реализовано через класс контроллер, еще смотрел EcoResProductCreate - там без датасорца вообще. Уверен что есть решение проще, как то можно создать новую строку и заставить диалог на нее переключиться. Может есть идеи в этом направлении?
Старый 13.12.2019, 14:46   #10  
syl is offline
syl
Участник
Аватар для syl
 
236 / 21 (1) +++
Регистрация: 10.06.2015
Адрес: Киев
Как и говорил решение простое
X++:
    [DataSource]
    class MyTable
    {
        public void executeQuery()
        {
            this.query().dataSourceTable(tableNum(MyTable)).addRange(fieldNum(MyTable, RecId)).value(queryValue(0));

            super();
        }

    }
Фильтруем датасорц чтобы он не вернул записей, убеждаемся что свойство InsertIfEmpty = Yes

Кнопки Ok, Cancel диалога (при условии использования правильного template) сами реализуют логику сохранения/отмены.

Pandasama - спасибо за помощь
Старый 13.12.2019, 15:35   #11  
smailik is offline
smailik
Участник
Аватар для smailik
 
250 / 70 (3) ++++
Регистрация: 10.04.2012
Адрес: Москва
Цитата:
Сообщение от Pandasama Посмотреть сообщение
Ну если нет возможности от reference-полей отказаться, то сделайте свой диалог в виде формы, на которой будет датасорс с нужной вам таблицей, единственной записью, можно даже временной. А по закрытию вы будете уже создавать запись в постоянной таблице и на датасорсе основной форме обновлять, чтобы её увидеть.

Вызывать методы create и т.д. на самом датасорсе вам в любом случае не надо.
Не знаю как там в 365, но я бы сделал как вот тут описано. В любом случае вам надо разделять вот какие вещи
1. Открытие диалога не должно создавать запись.
2. Закрытие диалога при корректном заполнении полей должно создать запись. Другой вопрос как вы это сделаете. По хорошему должен быть некий класс обработчик.
Свойства InsertIfEmpty и InsertAtEnd вообще трогать не надо. После того как диалог закроется надо просто обновить записи в DS.
Старый 13.12.2019, 16:18   #12  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Попросите того кто ставит вам задачу показать место в системе, где подобное уже реализовано.
Если такого в системе нет, задумайтесь. Если есть, то флаг вам в руки. Работающий пример - всё что вам нужно.
За это сообщение автора поблагодарили: Pustik (7), Ace of Database (5).
Старый 13.12.2019, 18:25   #13  
syl is offline
syl
Участник
Аватар для syl
 
236 / 21 (1) +++
Регистрация: 10.06.2015
Адрес: Киев
Цитата:
Сообщение от smailik Посмотреть сообщение
Не знаю как там в 365, но я бы сделал как вот тут описано. В любом случае вам надо разделять вот какие вещи
1. Открытие диалога не должно создавать запись.
2. Закрытие диалога при корректном заполнении полей должно создать запись. Другой вопрос как вы это сделаете. По хорошему должен быть некий класс обработчик.
Свойства InsertIfEmpty и InsertAtEnd вообще трогать не надо. После того как диалог закроется надо просто обновить записи в DS.
Ничего делать не надо вообще. Как я и писал - если у формы стоит template Dialog, то он сам понимает что по кнопке Cancel запись создавать не надо, а по CloseOk она будет создана. В предыдущем посте описал на 100% рабочее решение
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Как программно создать строку номенклатуры??? Сергей Щербак DAX: Программирование 25 02.09.2011 11:45
XMLDocument вставка нового xmlElement c переходом на новую строку? Gorynych DAX: Программирование 4 05.12.2006 14:31
Как создать новую непрерывную номерную серию? Hidden DAX: Программирование 1 28.03.2006 13:51
Как вставить новую строку в грид.... petrucc_io DAX: Программирование 2 17.10.2005 12:56
Перенос на новую строку. ArturK DAX: Программирование 5 16.03.2004 09:37

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

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

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