12.12.2019, 19:48 | #1 |
Участник
|
D365FO Создать новую строку при открытии диалога
D365FO Необходимо при открытии дилога создать новую строку в DataSource и перевести на нее курсор что бы дать возможность полдьзователю ввести данные.
Перепробовал кучу способов, единственный который частично сработал: - Свойство DataSource InsertAtEnd = Yes - Потом такой код: X++: [DataSource] class MyDS { public void init() { super(); this.setPosition(this.last()); } } |
|
13.12.2019, 06:48 | #2 |
Участник
|
1) за D365FO не скажу, но по идее на датасорсе есть метод create (который вызывается при создании новой строки на форме)
2) но в целом, то мне кажется что вы чего-то весьма странного хотите. Если есть форма, есть датасорс - создавайте в коде новую запись в таблице (заполняйте и .insert()) - а потом сделайте на датасорсе .executeQuery(), чтобы эту запись увидеть. |
|
13.12.2019, 11:48 | #3 |
Участник
|
Мне нужно сделать диалог создания новой записи, перед insert() пользователь должен заполнить определенный набор полей. datasource().create() не отрабатывает или я его не там где надо вставляю, т.к. датасорц отображает строку которую передал caller (хотя явно она в аргументы не указывалась, специфика работы D365)
|
|
13.12.2019, 12:02 | #4 |
Участник
|
То есть у вас есть форма, вы на ней нажимаете кнопку, открывается диалог - там заполняете поля создается запись с этими значениями и вы хотите увидеть её на форме?
Тогда вам не надо никаких "вставок записи на датасорсе", как я и говорю - в коде класса, который вызывается по кнопку вы открываете диалог, получаете данные из полей диалога, затем создаете запись и вставляете её в таблицу (T)TableName.insert(). И на датасорсе потом делаете executeQuery какой-нибудь, чтобы обновить список отображаемых записей и увидеть новую |
|
13.12.2019, 13:15 | #5 |
Участник
|
У меня часть полей реализована через ReferenceGroup, что то без датасорца они работать не хотят
|
|
13.12.2019, 13:26 | #6 |
Участник
|
Ну если нет возможности от reference-полей отказаться, то сделайте свой диалог в виде формы, на которой будет датасорс с нужной вам таблицей, единственной записью, можно даже временной. А по закрытию вы будете уже создавать запись в постоянной таблице и на датасорсе основной форме обновлять, чтобы её увидеть.
Вызывать методы create и т.д. на самом датасорсе вам в любом случае не надо. |
|
13.12.2019, 13:35 | #7 |
Участник
|
Так и пытаюсь сделать, но как сделать что бы датасорц был пустым и форма создала новую запись по insrtIfEmpty
|
|
13.12.2019, 13:40 | #8 |
Участник
|
Сделайте его временным.
Ну и как всегда - см. как сделано в стандарте. Не знаю, что там в D365FO, но в Ax2012 есть какая-нибудь отдельная форма создания продукта, или заказа покупки (форма PurchCreateOrder). Посмотрите, как там реализовано. |
|
13.12.2019, 14:33 | #9 |
Участник
|
PurchCreateOrder реализовано через класс контроллер, еще смотрел EcoResProductCreate - там без датасорца вообще. Уверен что есть решение проще, как то можно создать новую строку и заставить диалог на нее переключиться. Может есть идеи в этом направлении?
|
|
13.12.2019, 14:46 | #10 |
Участник
|
Как и говорил решение простое
X++: [DataSource] class MyTable { public void executeQuery() { this.query().dataSourceTable(tableNum(MyTable)).addRange(fieldNum(MyTable, RecId)).value(queryValue(0)); super(); } } Кнопки Ok, Cancel диалога (при условии использования правильного template) сами реализуют логику сохранения/отмены. Pandasama - спасибо за помощь |
|
13.12.2019, 15:35 | #11 |
Участник
|
Цитата:
Сообщение от Pandasama
Ну если нет возможности от reference-полей отказаться, то сделайте свой диалог в виде формы, на которой будет датасорс с нужной вам таблицей, единственной записью, можно даже временной. А по закрытию вы будете уже создавать запись в постоянной таблице и на датасорсе основной форме обновлять, чтобы её увидеть.
Вызывать методы create и т.д. на самом датасорсе вам в любом случае не надо. 1. Открытие диалога не должно создавать запись. 2. Закрытие диалога при корректном заполнении полей должно создать запись. Другой вопрос как вы это сделаете. По хорошему должен быть некий класс обработчик. Свойства InsertIfEmpty и InsertAtEnd вообще трогать не надо. После того как диалог закроется надо просто обновить записи в DS. |
|
13.12.2019, 16:18 | #12 |
Участник
|
Попросите того кто ставит вам задачу показать место в системе, где подобное уже реализовано.
Если такого в системе нет, задумайтесь. Если есть, то флаг вам в руки. Работающий пример - всё что вам нужно. |
|
|
За это сообщение автора поблагодарили: Pustik (7), Ace of Database (5). |
13.12.2019, 18:25 | #13 |
Участник
|
Цитата:
Сообщение от smailik
Не знаю как там в 365, но я бы сделал как вот тут описано. В любом случае вам надо разделять вот какие вещи
1. Открытие диалога не должно создавать запись. 2. Закрытие диалога при корректном заполнении полей должно создать запись. Другой вопрос как вы это сделаете. По хорошему должен быть некий класс обработчик. Свойства InsertIfEmpty и InsertAtEnd вообще трогать не надо. После того как диалог закроется надо просто обновить записи в DS. |
|
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|