28.09.2012, 12:49 | #1 |
Участник
|
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(); } Тут возникает несколько непонятных мне моментов. Во-первых вроде для того чтобы была произведена запись в таблицу она должна быть открыта для записи (FORUPDATE). В коде этого нет, однако сработало. Во-вторых, в ситуации если я например открыл Форму2 на первой записи, а потом не закрыв ее перешел на вторую запись в Форме1, то изменения по нажатию ОК затронут как раз эту вторую запись! Но как? Каким образом полученный мной в инициализации формы, вектор t1 обновился? Ведь переинициализации формы не происходило, она не была заново открыта. Или я что-то не так понимаю в этом моменте: X++: t1 = element.args().record();
__________________
Axapta 3.0, Build #1951.17, SP1 |
|
28.09.2012, 13:24 | #2 |
Молодой, подающий надежды
|
Ядро автоматически связывает курсоры dynalink'ом. Если хотите избежать автоматического связывания, то вместо инициализации t1 через
X++: t1 = element.args().record(); X++: Table1 t1Caller = element.args().record(); t1 = Table1::find( t1Caller) Вобще для тех целей, что вы хотите достигнуть, лучше использовать паттерн RunBase. Последний раз редактировалось pedrozzz; 28.09.2012 в 13:33. |
|
28.09.2012, 13:28 | #3 |
Участник
|
При присвоении t1 вы получаете ссылку на строку датасорса формы.
Потому при перемещении по гриду (поскольку запись для датасорса изменяется) меняется и запись в t1. Посмотрите понятие dynaLink. По поводу обновления без forupdate - вероятно датасорс формы по умолчанию предполагает этот forupdate. Как-то никогда не задумывался над этим вопросом
__________________
If it ain't broke, take it apart and find out why (с) |
|
28.09.2012, 14:26 | #4 |
Участник
|
Цитата:
При присвоении t1 вы получаете ссылку на строку датасорса формы.
т.к. у Формы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 |
Молодой, подающий надежды
|
Для передачи параметров между объектами в Ax используется класс Args. Когда для вызова объекта на форме используется менюайтем, экземпляр класса Args создается ядром автоматически. При этом если у менюайтема заполнены свойства Parameters, EnumParameter или EnumTypeParameter, то ядро передает эти значения через соответствующие методы в класс Args (Parm, ParmEnum, ParmEnumType). Если у менюайтема на форме, заполнено свойство DataSource, то через метод Args.record передается текущий курсор этого датасорса (свойство DataSource может быть и пустым, тогда передается курсор первого датасорса на форме). Таким образом в новом объекте (в данном случае Форме 2), через
X++: element.args().record(); X++: t1 = element.args().record(); xRecord.orig() возвращает последнее сохраненное состояние записи и используется для других целей, например, чтобы перед непосредственной записью значений в БД проверить поля по типу "было/стало". |
|
|
За это сообщение автора поблагодарили: Samuel (1), potential (1), kpoxa (0). |