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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 18.06.2003, 05:48   #1  
Artild is offline
Artild
Участник
 
38 / 10 (1) +
Регистрация: 24.01.2003
Адрес: Новосибирск
? Cвязь данных между двумя формами
Здравствуйте!

Ситуация следующая.
Для одной из форм требуется доработка, заключающаяся в том, чтобы новые записи в таблице создавались не в этой же форме, а в отдельной. Dialog нельзя использовать из-за недостаточной функциональности.
То есть создание новой записи в нашей форме будет похоже на создание производственного заказа в форме "Производственные заказы" (там тоже выскакивает отдельная форма)

Форму создание сделал, запускаю ее в методе create() источника данных начальной формы.
Вопрос в следуещем: как запись созданную в новой форме после нажатия кнопки "Ok" перенисти в старую???

В "Производственных заказах" это сделано достаточно сложно. Интересуют простые по логике методы реализации.

Заранее благодарен.
Старый 18.06.2003, 08:23   #2  
Антон Солдатов is offline
Антон Солдатов
Соучастник
Аватар для Антон Солдатов
 
386 / 27 (1) +++
Регистрация: 29.12.2002
Адрес: Новосибирск
что значит "перенести из новой формы в старую"? обновить данные в первой форме? заставить перечитать все из базы? или взять отдельный элемент дизайна этой формы, и насильно что-то туда запихать?
Старый 18.06.2003, 12:02   #3  
EVGL is offline
EVGL
Banned
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
4,445 / 3001 (0) ++++++++++
Регистрация: 09.07.2002
Адрес: Parndorf, AT
Способов не так уж и много. Мой любимый: вставить новую запись в таблицу, перечитать источник данных и спозиционировать курсор на нужной строке:
PHP код:
if (_formRun.dataSource())
    {
        
dataSource _formRun.dataSource();
        
dataSource .executeQuery(); // or research()
        
dataSource.findRecord(_newRecord);
    } 
Старый 18.06.2003, 12:46   #4  
macklakov is offline
macklakov
NavAx
Аватар для macklakov
 
2,253 / 980 (37) +++++++
Регистрация: 03.04.2002
2 Artild
Как я понимаю, ты хочешь создать что-то вроде мастера.
На днях решил подобную задачу, может и не очень элегантно, но работает без проблем.
Из create() вызываешь новую форму, через menuFunction, передаешь ей текущую форму, через args.caller() и датасорс, через parmObject(). В create нужно добавить дополнительный аргумент, чтобы его вызове из внешней формы создавалась строка, а не вызывалась форма.
void create(boolean aPPEND = false,
boolean extern = false // If created externally
){
Args args;
;
if(!extern){
args = new args();
args.caller(element);
args.parmObject(custTable_ds);
new menuFunction(menuItemDisplayStr(ISP_CustWizard),MenuItemType:isplay).run(args);
} else {
super(aPPEND);
}
}
В новой форме, в run, после super, создаешь временную таблицу, создаешь в ней новую запись и подставляешь ее в датасорс.
custTableTmp.setTmp();
custTableTmp.initValue();
custTableTmp.doInsert();
custTable.setTmpData(custTableTmp);
custTable_ds.executeQuery();
в датасорсе перебиваешь init:
public void init()
{
super();
custTable.setTmp();
}
Так же запрещаешь пользователю все лишние движения, кроме редактирования созданной записи.
По завершении редактирования (я ловлю closeOk), переносишь данные из временной в реальную, берешь курсор вызывавшей формы, создаешь новую запись и загоняешь в нее данные из временной таблицы.
public void closeOk()
{
FormDataSource formDataSource;
Object formDatasourceObj;
CustTable custTableDB;
;
select custTableTmp;
custTableDB.data(custTableTmp);
custTableDB.insert();
formDataSource = element.args().caller().dataSource(1);
formDatasourceObj = formDataSource;
formDatasourceObj.create(false,true);
formDataSource.cursor().data(custTableDB);

super();
}
Если что-то не сработало, сверься с InventTableWizard, я с него списывал, все работает.
P.S. Не бойся разбираться в коде, это полезно и не так долго, как кажется
Старый 18.06.2003, 14:54   #5  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Посмотрите как создаются обычные заказы в модуле заказы
Старый 23.06.2003, 09:24   #6  
Artild is offline
Artild
Участник
 
38 / 10 (1) +
Регистрация: 24.01.2003
Адрес: Новосибирск
Всем спасибо за ответы.
Частично они помогли разобраться в ситуации.
Но все таки не до конца.

в основной форме в методе create() перед запуском формы создания уже выполнен метод super(), то есть некоторым полям уже присвоены какие-то значения.
Есть ли возможность эту еще не до конца созданную строку каким-то образом получить в форме создания?

C уважением.
Старый 23.06.2003, 09:36   #7  
Антон Солдатов is offline
Антон Солдатов
Соучастник
Аватар для Антон Солдатов
 
386 / 27 (1) +++
Регистрация: 29.12.2002
Адрес: Новосибирск
Один из способов:
В методе обработчика clicked кнопки или чего-то-там основной формы говоришь
MyChildFormCreator::create(this);
В классе MyChildFormCreator в статическом методе create инициализируешь дочернюю форму, в ее элементы запихиваешь то что тебе нужно, значения можно взять из обьекта родительской формы, который передавался как аргумент метода create...
Старый 23.06.2003, 18:40   #8  
EVGL is offline
EVGL
Banned
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
4,445 / 3001 (0) ++++++++++
Регистрация: 09.07.2002
Адрес: Parndorf, AT
Цитата:
Есть ли возможность эту еще не до конца созданную строку каким-то образом получить в форме создания?
Разумеется. Засунуть этот курсор в свойство record() класса Args, который передается вызываемой форме. Или добраться до него из вызываемой формы так: element.args().caller().datasource().cursor().
Старый 24.06.2003, 05:34   #9  
Антон Солдатов is offline
Антон Солдатов
Соучастник
Аватар для Антон Солдатов
 
386 / 27 (1) +++
Регистрация: 29.12.2002
Адрес: Новосибирск
Цитата:
Изначально опубликовано EVGL

Разумеется. Засунуть этот курсор в свойство record() класса Args, который передается вызываемой форме. Или добраться до него из вызываемой формы так: element.args().caller().datasource().cursor().
А каким образом(если это возможно), можно вызвать свой(не переопределенный от FormRun) метод произвольной формы из других форм и классов?

P.S.(флейм): Недоумеваю: почему используется такой неудобный механизм работы с формами? Да, конечно, есть бестпрактис, где написано no code in forms! Но почему бы не сделать все формы нормальными классами, потомками FormRun. Чтобы можно было добавлять и вызывать свои методы, чтобы можно было сделать new MyForm, а не использовать для этого только(!) ClassFactory. Зачем так сильно ограничивать свободу? только ради "no code"?
Старый 24.06.2003, 09:01   #10  
Artild is offline
Artild
Участник
 
38 / 10 (1) +
Регистрация: 24.01.2003
Адрес: Новосибирск
Следующая проблема.

В форме создания через element.args().record() получил строку таблицы, изменил ее.
В начальной форме ловлю closedOk формы закрытия, после чего курсор начальной формы устанавливаю в курсор формы создания.
В форме появляется строка с параметрами указанными в форме создания.
Но после выхода из формы при новом ее запуске строки уже нет. То есть она не сохраняется. Поэксперементировал с методами write(), insert(), reread(), refresh() источника данных, но результата не добился.

Help!!!!!

С уважением.
Старый 24.06.2003, 10:36   #11  
EVGL is offline
EVGL
Banned
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
4,445 / 3001 (0) ++++++++++
Регистрация: 09.07.2002
Адрес: Parndorf, AT
Цитата:
после выхода из формы при новом ее запуске строки уже нет. То есть она не сохраняется. Поэксперементировал с методами write(), insert()
Так не бывает. Посмотрите, что происходит с самой базой. Обычно такой эффект проявляется, если на query источника формы наложен range, link или dynalink, а создаваемая запись им не соответствует. Тогда после перечитывания таблицы запись "пропадает".

Цитата:
А каким образом(если это возможно), можно вызвать свой(не переопределенный от FormRun) метод произвольной формы из других форм и классов?
Элементарно.
PHP код:
Object    tmpObject;
tmpObject formRun;
tmpObject.callWhateverYouWant(); 
Чревато ошибками, которые не отлавливаются на этапе компиляции.
Старый 24.06.2003, 10:45   #12  
Антон Солдатов is offline
Антон Солдатов
Соучастник
Аватар для Антон Солдатов
 
386 / 27 (1) +++
Регистрация: 29.12.2002
Адрес: Новосибирск
Цитата:
Изначально опубликовано EVGL

Элементарно.
PHP код:
Object    tmpObject;
tmpObject formRun;
tmpObject.callWhateverYouWant(); 
Чревато ошибками, которые не отлавливаются на этапе компиляции.
спасибо. думал такое не скомпиляется. но уж лучше отдельный класс заводить, даже для презентэйшн-логики.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Как в динамическом запросе использовать исловие OR между двумя полями? yooshi DAX: Программирование 12 07.08.2009 16:34
Как сделать AND между двумя датасорсами на одном уровне в query rkorchagin DAX: Программирование 15 15.01.2009 17:42
Кэш данных с двумя АОСами Paul_ST DAX: Администрирование 4 15.08.2007 11:39
Передача данных между формами в Axapta AcNoD DAX: Программирование 2 03.08.2007 16:17
Как упростить, ускорить обмен данных: между 3-х уровневым клиентом и АОСом. Yura_Leon DAX: Администрирование 6 13.01.2005 08:55

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

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

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