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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 04.04.2007, 20:28   #1  
konfet is offline
konfet
Снова балуюсь косаптой :)
 
143 / 50 (2) ++++
Регистрация: 23.04.2003
Адрес: Moscow
Казалось бы, простая задача...
Задача: есть некая таблица 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);
Теперь добавляем на форму контролы, ссылающиеся на датасурс VendTable - например, наименование поставщика.
Все работает замечательно - датасурсы связываются, мы можем менять в форме наименование поставщика, соответствующего текущей записи в датасурсе 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();
}
После этого, запись на подчиненном датасурсе VendTable стала позиционироваться на новом поставщике сразу после изменения Table1.VendAccount.
Но что-то мне подсказывает, что данное решение является безграмотным и можно достичь этой цели - перепозиционирования записи в подчиненном датасурсе при изменении поля записи родительского датасурса - БЕЗ research() или executeQuery().

Вопрос к уважаемым гуру: я прав или неправ?
__________________
Бесты и регарды!
Старый 04.04.2007, 21:12   #2  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Не совсем понятно, зачем добавлять 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  
konfet is offline
konfet
Снова балуюсь косаптой :)
 
143 / 50 (2) ++++
Регистрация: 23.04.2003
Адрес: Moscow
Цитата:
Не совсем понятно, зачем добавлять VendTable и связывать датасорсы из кода.
Ну, из кода - потому что в таблице Table1 не одно поле VendAccount ссылалось на VendTable... и автоматический Query смотрел не туда.

Цитата:
...
В данном случае отображается при сохранении. Но можно точно так же сделать и для модификации
СПАСИБО! Собака оказалась зарыта именно в необходимости применения метода SetCurrent(). Нижеследующий код полностью решил поставленную задачу, executeQuery() при этом не вызывается.

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  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Цитата:
наименование поставщика - должно меняться пользователем непосредственно в форме
Есть еще edit методы
Старый 05.04.2007, 15:39   #5  
konfet is offline
konfet
Снова балуюсь косаптой :)
 
143 / 50 (2) ++++
Регистрация: 23.04.2003
Адрес: Moscow
Цитата:
Сообщение от belugin Посмотреть сообщение
Есть еще edit методы
edit-методы не подходят: нужен поиск и сортировка. Название поставщика находится в одном гриде с полями из родительского датасурса table1.

Кстати, я несколько поторопился Метод setCurrent похоже здесь не при чем... все прекрасно работает, если его закомментировать. Достаточно сделать

X++:
VendTable.data(VendTable::find(table1.VendAccount));
VendTable_ds.refresh();
все фунциклирует точно также...

Более того - залез в стандартный функционал, в форму "Закупки" (PurchTable). Метод Write датасурса PurchLine - закомментировал там строчку с setCurrent.

PHP код:
void  write()
{;
    if (
purchTable.checkUpdate())
    {
        
purchLine.inventDimId InventDim::findOrCreate(inventDim).inventDimId;
        
InventMovement::bufferSetRemainQty(purchLine);

        
super();

        if (
purchLine.inventDimId != inventDim.inventdimId)
        {
            
inventDim.data(InventDim::find(purchLine.inventDimId));
//            inventDim_ds.setCurrent();
        
}

        
purchTable_ds.reRead();
        
purchTable_ds.reFresh();
    }

попробовал после этого повводить / посохранять строки, изменял в них аналитику... блин, все работает точно также БЕЗ setCurrent ! Может ли кто-нибудь из гуру объяснить в чем сакральный смысл setCurrent и почему без него будет хуже?
__________________
Бесты и регарды!
Старый 05.04.2007, 16:58   #6  
Dron AKA andy is offline
Dron AKA andy
Moderator
 
944 / 253 (10) ++++++
Регистрация: 27.03.2002
Адрес: Москва
Цитата:
Сообщение от konfet Посмотреть сообщение
edit-методы не подходят: нужен поиск и сортировка.
Тогда outer join не подойдет, нужно динамически при наложении фильтра менять тип связи на inner...
__________________
Андрей.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Задача: запретить удалять строки разнесённых журналов. jeky DAX: Программирование 12 28.01.2009 22:22
Задача оптимизации rusalaudinov DAX: Программирование 62 16.11.2007 08:22
Задача оптимизации загрузки производственых мощностей SevA DAX: Программирование 23 01.11.2004 18:12
Простая загадка Wamr DAX: Программирование 5 18.07.2003 18:10
Нешуточная задача Wamr DAX: Программирование 8 02.04.2003 10:23

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

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

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