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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 28.09.2012, 12:49   #1  
Samuel is offline
Samuel
Участник
 
12 / 10 (1) +
Регистрация: 20.04.2010
element.args().record() вопрос...
Возник следующий вопрос!
Пожалуйста, гуру, проясните ситуацию.
Вообщем имеем 2 формы. На Форме1 находится грид с данными из Table1. Форма2 активируется из MenuButton Формы1 и предназначена для редактирования некоторых полей Table1.

На скрине сверху Форма1 снизу Форма2.
Привожу код методов Формы2.

X++:
//classDeclaration
public class FormRun extends ObjectRun
{
  Table1      t1;
}
X++:
public void init()
{
  ;
  super();
  t1 = element.args().record();
  WorkerQty.value(t1.MSA_WorkerQty);  //Фактическое количество работников
  TeamDiv.realValue(t1.MSA_TeamDiv);  //Отклонение рабочего времени бригады
  element.design().caption(strfmt("Корректировка карты задания " + t1.JournalId));
}
X++:
//OK clicked
void clicked()
{
  ttsbegin;

  t1.MSA_WorkerQty = WorkerQty.value();
  t1.MSA_TeamDiv   = TeamDiv.realValue();
  t1.doUpdate();

  ttscommit;
  element.close();
}
Так вот ситуация, если я находясь например на первой строчке таблице в гриде, запускаю Форму2 то в нее нормально экспортируются интересующие меня значения полей из Table1. Далее пользователь правит их в Форме2 и подтверждает изменения нажатием на клавишу ОК. После чего выполняется код из Clicked. По этому коду происходит изменение полей в Table1.
Тут возникает несколько непонятных мне моментов. Во-первых вроде для того чтобы была произведена запись в таблицу она должна быть открыта для записи (FORUPDATE). В коде этого нет, однако сработало. Во-вторых, в ситуации если я например открыл Форму2 на первой записи, а потом не закрыв ее перешел на вторую запись в Форме1, то изменения по нажатию ОК затронут как раз эту вторую запись! Но как? Каким образом полученный мной в инициализации формы, вектор t1 обновился? Ведь переинициализации формы не происходило, она не была заново открыта. Или я что-то не так понимаю в этом моменте:
X++:
t1 = element.args().record();
__________________
Axapta 3.0, Build #1951.17, SP1
Старый 28.09.2012, 13:24   #2  
pedrozzz is offline
pedrozzz
Молодой, подающий надежды
Аватар для pedrozzz
MCBMSS
Лучший по профессии 2015
 
164 / 218 (8) ++++++
Регистрация: 18.02.2010
Адрес: Краснодар
Ядро автоматически связывает курсоры dynalink'ом. Если хотите избежать автоматического связывания, то вместо инициализации t1 через
X++:
t1 = element.args().record();
используйте
X++:
Table1  t1Caller = element.args().record();
t1 = Table1::find(  t1Caller)
если уникального ключа в явном виде нет, то ищите по RecId. При этом запись нужно выбрать на update.
Вобще для тех целей, что вы хотите достигнуть, лучше использовать паттерн RunBase.

Последний раз редактировалось pedrozzz; 28.09.2012 в 13:33.
Старый 28.09.2012, 13:28   #3  
Alexanderis.ua is offline
Alexanderis.ua
Участник
 
53 / 40 (2) +++
Регистрация: 25.12.2008
Адрес: Киев, Украина
При присвоении t1 вы получаете ссылку на строку датасорса формы.
Потому при перемещении по гриду (поскольку запись для датасорса изменяется) меняется и запись в t1. Посмотрите понятие dynaLink.

По поводу обновления без forupdate - вероятно датасорс формы по умолчанию предполагает этот forupdate. Как-то никогда не задумывался над этим вопросом
__________________
If it ain't broke, take it apart and find out why (с)
Старый 28.09.2012, 14:26   #4  
Samuel is offline
Samuel
Участник
 
12 / 10 (1) +
Регистрация: 20.04.2010
Цитата:
При присвоении t1 вы получаете ссылку на строку датасорса формы.
ссылку на строку датасорса Формы1? (там стоит Table1)
т.к. у Формы2 в моем случае у Data Sources вообще ничего не проставлено...

Кстати вроде все нормально работает если я внесу такое изменение
t1 = element.args().record().orig()

в таком случае не дает записать без открытия таблицы на запись, что нормально, и не сбрасывает, при переходе на другую строку, вектор полученный при инициализации... (в дебаггере посмотрел). Или я бездумно что-то не то использую...
X++:
Table1  t1Caller = element.args().record();
t1 = Table1::find(  t1Caller)
Это все работает, мне просто интересно было почему в первоначальном варианте не заработало...
__________________
Axapta 3.0, Build #1951.17, SP1
Старый 28.09.2012, 15:13   #5  
pedrozzz is offline
pedrozzz
Молодой, подающий надежды
Аватар для pedrozzz
MCBMSS
Лучший по профессии 2015
 
164 / 218 (8) ++++++
Регистрация: 18.02.2010
Адрес: Краснодар
Для передачи параметров между объектами в Ax используется класс Args. Когда для вызова объекта на форме используется менюайтем, экземпляр класса Args создается ядром автоматически. При этом если у менюайтема заполнены свойства Parameters, EnumParameter или EnumTypeParameter, то ядро передает эти значения через соответствующие методы в класс Args (Parm, ParmEnum, ParmEnumType). Если у менюайтема на форме, заполнено свойство DataSource, то через метод Args.record передается текущий курсор этого датасорса (свойство DataSource может быть и пустым, тогда передается курсор первого датасорса на форме). Таким образом в новом объекте (в данном случае Форме 2), через
X++:
element.args().record();
вы получаете курсор датасорса вызывающего объекта. При этом при использовании присваивания вида
X++:
t1 = element.args().record();
происходит передача по ссылке, а не по значению. Тем самым при изменении положения курсора в Форме 1 меняется ссылка и соответственно в форме 2 тоже.
xRecord.orig() возвращает последнее сохраненное состояние записи и используется для других целей, например, чтобы перед непосредственной записью значений в БД проверить поля по типу "было/стало".
За это сообщение автора поблагодарили: Samuel (1), potential (1), kpoxa (0).
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
dynamicsaxtraining: Write down the record Blog bot DAX Blogs 0 08.12.2010 20:11
dynamics-ax-dev: Retrieving Record Values in an Enterprise Portal Wizard/Tunnel Blog bot DAX Blogs 0 02.11.2010 18:05
workflowax: How to auto-submit record into workflow Blog bot DAX Blogs 0 23.06.2010 20:05
Вопрос по Проектам PSA DAX: Функционал 35 19.01.2007 22:26
Вопрос по запросу (query) Александр_1975 DAX: Программирование 2 23.01.2004 17:35

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 07:44.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.