04.04.2007, 20:28 | #1 |
Снова балуюсь косаптой :)
|
Казалось бы, простая задача...
Задача: есть некая таблица Table1. У нее есть поле VendAccount - ссылка на поставщика (AccountNum из VendAccount).
В форме Form1, которая "имеет дело" с данными Table1, есть, разумеется, датасурс Table1. Пользователь хочет видеть в форме Form1 не только код, но и наименование и другие атрибуты поставщика - поля из VendTable. Это не должны быть дисплей-методы: наименование поставщика - должно меняться пользователем непосредственно в форме Form1. Вешаем на форму Form1 подчиненный к Table1 датасурс VendTable; LinkType = OuterJoin. В методе init() датасурса VendTable формы пишем код, который актуализует именно нужный нам релейшен между таблицами VendTable и Table1: X++: qbds = qbds.addDataSource(tableNum(VendTable)); qbds.addLink(fieldNum(Table1, VendAccount), fieldNum(VendTable, AccountNum)); qbds.joinMode(joinMode::OuterJoin); this.query(q); Все работает замечательно - датасурсы связываются, мы можем менять в форме наименование поставщика, соответствующего текущей записи в датасурсе Table1. Но: когда мы меняем Table1.VendAccount - то есть собственно поставщика - связанная запись в датасурсе VendTable не меняется. То есть, изменили код ПОСТ-1 на ПОСТ-2 - а наименование осталось "Поставщик 1". Проблема была решена так: перекрыт метод modified() на поле Table1.VendAccount (в датасурсе VendTable формы), следующим образом: X++: public void modified() { ; super(); element.lock(); buffer.data(Table1); Table1.doUpdate(); Table1_ds.research(); if (Table1) { Table1_ds.findRecord(buffer); } element.unlock(); } Но что-то мне подсказывает, что данное решение является безграмотным и можно достичь этой цели - перепозиционирования записи в подчиненном датасурсе при изменении поля записи родительского датасурса - БЕЗ research() или executeQuery(). Вопрос к уважаемым гуру: я прав или неправ?
__________________
Бесты и регарды! |
|
04.04.2007, 21:12 | #2 |
Участник
|
Не совсем понятно, зачем добавлять VendTable и связывать датасорсы из кода.
Вообще же, подобная задача рашается на формах, где есть выбор складской аналитики (строки складские журналов, закупки, заказы) Например, для строк складских проводок класс InventJournalFormTrans_Movement, метод datasourceWritePost() X++: if (inventjournalTrans.inventDimId != inventDim.inventDimId)
{
inventDim.data(InventDim::find(inventJournalTrans.inventDimId));
inventDim_ds.setCurrent();
}
__________________
Axapta v.3.0 sp5 kr2 |
|
|
За это сообщение автора поблагодарили: konfet (1). |
04.04.2007, 22:02 | #3 |
Снова балуюсь косаптой :)
|
Цитата:
Не совсем понятно, зачем добавлять VendTable и связывать датасорсы из кода.
Цитата:
...
В данном случае отображается при сохранении. Но можно точно так же сделать и для модификации X++: public void modified() { ; super(); table1.doUpdate(); VendTable.data(VendTable::find(table1.VendAccount)); VendTable_ds.setCurrent(); VendTable_ds.refresh(); // RequestParam_ds.research(); }
__________________
Бесты и регарды! |
|
05.04.2007, 09:47 | #4 |
Участник
|
Цитата:
наименование поставщика - должно меняться пользователем непосредственно в форме
|
|
05.04.2007, 15:39 | #5 |
Снова балуюсь косаптой :)
|
edit-методы не подходят: нужен поиск и сортировка. Название поставщика находится в одном гриде с полями из родительского датасурса table1.
Кстати, я несколько поторопился Метод setCurrent похоже здесь не при чем... все прекрасно работает, если его закомментировать. Достаточно сделать X++: VendTable.data(VendTable::find(table1.VendAccount)); VendTable_ds.refresh(); Более того - залез в стандартный функционал, в форму "Закупки" (PurchTable). Метод Write датасурса PurchLine - закомментировал там строчку с setCurrent. PHP код:
__________________
Бесты и регарды! |
|
05.04.2007, 16:58 | #6 |
Moderator
|
Тогда outer join не подойдет, нужно динамически при наложении фильтра менять тип связи на inner...
__________________
Андрей. |
|
|
Похожие темы | ||||
Тема | Ответов | |||
Задача: запретить удалять строки разнесённых журналов. | 12 | |||
Задача оптимизации | 62 | |||
Задача оптимизации загрузки производственых мощностей | 23 | |||
Простая загадка | 5 | |||
Нешуточная задача | 8 |
|