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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 09.07.2008, 19:40   #1  
Poleax is offline
Poleax
Модератор
Аватар для Poleax
MCP
MCBMSS
Злыдни
 
1,353 / 595 (22) +++++++
Регистрация: 17.02.2005
Адрес: msk
Записей в блоге: 34
? Обновление DataSource из формы Печать\Новый отчет.
Есть интересный вопрос, как и откуда этот вопрос появился.. надеюсь обсуждать не будем. Чтоб время не тратить.

Есть Управление запасами \ Журналы \ Складские проводки\ Проводка
У этой форму есть DataSource InventJournalTable
его как раз и надо обновить (текущую строку перечитать с БД)

Обновление должно происходить после изменения поля формы, которое редактируется в форме вызванной с отчета Печать \ Новый Отчет.
На форме отчета есть кнопка которая и вызывает дополнительную форму. A форме редактирую значение, и по нажатию Ок происходит измение в строке журнала в таблице InventJournalTable.

Таблица то обновилась, а чтоб увидеть новое значение в форме журнала Проводка, приходится переоткрывать форму журнала Проводки.

Как сделать так чтоб по нажатию Ок строка DataSource InventJournalTable обновлялась?
Старый 09.07.2008, 20:23   #2  
_scorp_ is offline
_scorp_
Участник
Аватар для _scorp_
MCBMSS
 
488 / 369 (13) ++++++
Регистрация: 25.07.2007
Адрес: Москва
После выполнения ваших действий в отчете(хотя что это за отчет, который меняет данные) делайте следующее
X++:
currentCursor = InventJournalTable_ds.cursor();
InventJournalTable_ds.research();
InventJournalTable_ds.findRecord(currentCursor);
За это сообщение автора поблагодарили: alex55 (1).
Старый 10.07.2008, 08:55   #3  
Peter Savintsev is offline
Peter Savintsev
Участник
 
246 / 119 (4) +++++
Регистрация: 14.12.2001
Если нужно обновить только одну запись, то лучше сделать так:

X++:
InventJournalTable_ds.reread();
InventJournalTable_ds.refresh();
В отличие от варианта, предложенного _scorp_, данный код вызовет обновление не всего датасорса, а только текущей записи.
Старый 10.07.2008, 09:57   #4  
Raven Melancholic is offline
Raven Melancholic
Участник
Аватар для Raven Melancholic
Самостоятельные клиенты AX
Лучший по профессии 2015
 
2,164 / 1293 (48) ++++++++
Регистрация: 21.03.2005
Адрес: Москва-Петушки
Navision
Если нужно это выполнять из вашего RunBase, а не в методе clicked формы вызова (например, обновление нужно только если нажата ОК, а не Отмена), то можно выполнить что-то подобное в методе main:
X++:
static void main(Args _args)
{
    FormDataSource          fdsCaller;
...
    if (importEngenie.prompt())
    {
        importEngenie.run();

        if (_args && _args.dataset() && _args.record().dataSource())
        {
            fdsCaller   = _args.record().dataSource();
            fdsCaller.reread();
            fdsCaller.refresh();
        }

    }
}
За это сообщение автора поблагодарили: Poleax (1).
Старый 10.07.2008, 09:58   #5  
konopello is offline
konopello
SAP
SAP
 
628 / 76 (4) ++++
Регистрация: 08.11.2005
Адрес: Минск
Цитата:
В отличие от варианта, предложенного _scorp_, данный код вызовет обновление не всего датасорса, а только текущей записи.
если необходимо обновить одну строку то используйте именно этот предложенный вариант.

Второй вариант подходит когда происходит изменение во многих строках, их необходимо обновить и спозицианировать курсор на нужной записи
Старый 10.07.2008, 10:57   #6  
Poleax is offline
Poleax
Модератор
Аватар для Poleax
MCP
MCBMSS
Злыдни
 
1,353 / 595 (22) +++++++
Регистрация: 17.02.2005
Адрес: msk
Записей в блоге: 34
Наверно вы немного не поняли суть вопроса. Команду обновления dataSource я знаю.
А вот как до него добраться из 3 формы. ;-)
1 форма - складской журнал Проводка
2 форма (создается классом) - сам отчет.
3 форма Таблица со значениями и сопоставлением должностей.
в 3 форме при нажатии Ок (cliked) нахожу нужное значение из всех введенных если такое есть я в InventJournalTable обновляю одно поле, если нет выхожу.
Так получается при нажатии в 3 форме Ок и должен вызываться обновление строки на форме складского журнала Проводка.

Сейчас подумаю над предложением Raven Melancholic
думаю смотреть надо в сторону _args.record().dataSource();
Старый 10.07.2008, 11:35   #7  
konopello is offline
konopello
SAP
SAP
 
628 / 76 (4) ++++
Регистрация: 08.11.2005
Адрес: Минск
Цитата:
А вот как до него добраться из 3 формы. ;-)
а тут и не чего долго думать необходимо протянуть ваш _ds (который нужно обновлять) до этой формы, или саму эту форму, для того что бы вы смогли произвести обновление.
Старый 10.07.2008, 11:49   #8  
Poleax is offline
Poleax
Модератор
Аватар для Poleax
MCP
MCBMSS
Злыдни
 
1,353 / 595 (22) +++++++
Регистрация: 17.02.2005
Адрес: msk
Записей в блоге: 34
Спасибо вопрос закрыт.

помог совет Raven Melancholic
_args.record().dataSource(); и т.д.
Старый 11.04.2011, 20:17   #9  
Geo is offline
Geo
Участник
Аватар для Geo
 
258 / 47 (2) +++
Регистрация: 04.04.2008
Подобная задача, только проще: как обновить DataSource из самой формы

Имею связанные по InnerJoin датасорсы и общий грид на них. По обычной Button вызывается (в Clicked()) обработка, меняющая значения в нескольких записях в подчиненной таблице. Хочу увидеть их обновленными в гриде.

Если делаю:
X++:
_ds.reread();
_ds.refresh();
, то обновляется только текущая запись. (Здесь и далее, х_ds - это главный датасорс.)

Если добавляю к этому
X++:
_ds.refreshEx();
(как работало на другой форме в практически аналогичном случае) - всё равно только текущая обновляется.

Если делаю
X++:
_ds.executeQuery();
, слетает фильтр пользователя, что нежелательно.

Если делаю, как написано в это теме:
X++:
anytype currentCursor;

currentCursor = _ds.cursor();

// обработка...

_ds.research();
_ds.findRecord(currentCursor);
, то курсор не остается на записи, а ускакивает таки на первую.

С подчиненным датасорсом тоже всё это пробовал - вообще ничего не обновляется.


Никак не удается обновить записи и при этом остаться на текущей
Старый 12.04.2011, 09:25   #10  
Peter Savintsev is offline
Peter Savintsev
Участник
 
246 / 119 (4) +++++
Регистрация: 14.12.2001
Какая версия AX? Если 2009, то у метода FormDataSource.research() появился булевый параметр _retainPosition, который позволяет сохранить позицию при обновлении данных формы.

Если версия более ранняя, то вроде так должно сработать:
X++:
Common common;

common.data();

// обработка...

_ds.research();
_ds.findRecord(common);
Как вариант модно вместо findRecord() использовать findValue(), с помощью которого можно найти запись по значению одного поля. В данном случае надо искать по уникальному полю, если оно есть, либо по RecId. Но если индекса по искомому полю нет, а записей много, этот вариант может долго отрабатывать:

X++:
anytype uniqueValue;

uniqueValue = x.UniqueField;

// обработка...

_ds.research();
_ds.findValue(fieldnum(X, UniqueField), SysQuery::value(uniqueValue));

Еще можно использовать element.args().lookupField() и element.args().lookupValue():
X++:
anytype uniqueValue;

uniqueValue = x.UniqueField;

// обработка...

element.args().lookupField(fieldnum(X, UniqueField)); 
element.args().lookupValue(SysQuery::value(uniqueValue));
_ds.research();
За это сообщение автора поблагодарили: Poleax (1), Geo (2), jeky (1).
Старый 12.04.2011, 10:35   #11  
kornix is offline
kornix
MCP
MCBMSS
Злыдни
Ex AND Project
 
414 / 146 (5) +++++
Регистрация: 24.02.2009
Адрес: Санкт-Петербург
[QUOTE=Raven Melancholic;171974]Если нужно это выполнять из вашего RunBase, а не в методе clicked формы вызова (например, обновление нужно только если нажата ОК, а не Отмена), то можно выполнить что-то подобное в методе main:

Хороший способ, но тогда придется искать запись на которой стоял курсор предложенными выше способами. Иногда это долго.
Предлагаю так:
X++:
static void main(Args _args)
{
    FormDataSource          fdsCaller;
    InventJournalTable        InventJournalTable;
    ...
    if (importEngenie.prompt())
    {
        importEngenie.run();

        if (_args && _args.record() && _args.record().tableId == tablenum(InventJournalTable))
        {
            InventJournalTable = _args.record();

            if(InventJournalTable.isFormDataSource())
            {
                fdsCaller   = InventJournalTable.dataSource();
                fdsCaller.reread();
                fdsCaller.activate(); // Тогда запись перечитается и курсор не слетит с текущей записи в гриде
            }
        }

    }
}

Последний раз редактировалось kornix; 12.04.2011 в 10:40.
Старый 12.04.2011, 11:37   #12  
Ivanhoe is offline
Ivanhoe
Участник
Аватар для Ivanhoe
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
4,143 / 2156 (80) +++++++++
Регистрация: 29.09.2005
Адрес: Санкт-Петербург
А просто ххх_ds.active() не поможет?
__________________
Ivanhoe as is..
Старый 12.04.2011, 13:01   #13  
kornix is offline
kornix
MCP
MCBMSS
Злыдни
Ex AND Project
 
414 / 146 (5) +++++
Регистрация: 24.02.2009
Адрес: Санкт-Петербург
Цитата:
Сообщение от Ivanhoe Посмотреть сообщение
А просто ххх_ds.active() не поможет?
Нет, activate() не инициирует повторное чтение записи из БД. Произойдет activate записи из formDataSourse, в которой хранятся те значения, которые были на момент инициализации и заполнения датасорса, т.е. старые.
Старый 12.04.2011, 18:56   #14  
Geo is offline
Geo
Участник
Аватар для Geo
 
258 / 47 (2) +++
Регистрация: 04.04.2008
Цитата:
Сообщение от Peter Savintsev Посмотреть сообщение
...
Спасибо, вариант с _ds.findValue() по сохраненному RecId помог. Работает без задержек.
А разве не все таблицы имеют индекс по RecId?

Версия AX 2009, но вызов _ds.research(true) не приводил к сохранению позиции, курсор всё равно скакал наверх.
Старый 12.04.2011, 19:06   #15  
Geo is offline
Geo
Участник
Аватар для Geo
 
258 / 47 (2) +++
Регистрация: 04.04.2008
Здесь же спрошу, поскольку было в примере.

Есть ли какая-то разница между SysQuery::value() и queryValue() ?
Старый 12.04.2011, 22:20   #16  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Не знаю, актуально ли еще, но чтобы не изобретать велосипеды с ds.reread()/refresh(), локализаторы в 2009-й сделали в Global метод dsRefresh_RU(). При необходимости его можно допилить под собственные нужды, главное, что его вызов намного компактнее, чем copy-paste кусков кода, которые непосредственно работают с FormDataSource.
За это сообщение автора поблагодарили: kornix (1).
Старый 12.04.2011, 22:37   #17  
Geo is offline
Geo
Участник
Аватар для Geo
 
258 / 47 (2) +++
Регистрация: 04.04.2008
Цитата:
Сообщение от gl00mie Посмотреть сообщение
Не знаю, актуально ли еще, но чтобы не изобретать велосипеды с ds.reread()/refresh(), локализаторы в 2009-й сделали в Global метод dsRefresh_RU().
А где его можно посмотреть? MSDN молчит, в хелпе нет, и в АОТе в самом классе Global я метода тоже не нашел...
Старый 12.04.2011, 23:22   #18  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
X++:
static void dsRefresh_RU(Common                _record,
                         DSRefreshAction_RU    _action         = DSRefreshAction_RU::RereadRefresh,
                         NoYes                 _retainPosition = NoYes::Yes,
                         NoYes                 _forceActive    = NoYes::Yes)
{
    FormDataSource  formDataSource   = _record.dataSource();
    FormDataSource  parentDataSource = formDataSource;
    Common          retainPositionRecord;

    void refresh()
    {
        switch (_action)
        {
            case DSRefreshAction_RU::RereadRefresh:
                parentDataSource.reread();
                parentDataSource.refresh();
                break;
            case DSRefreshAction_RU::Research:
                parentDataSource.research();
                break;
            case DSRefreshAction_RU::ExecuteQuery:
                if (_retainPosition)
                {
                    retainPositionRecord = parentDataSource.cursor().data();
                }
                parentDataSource.executeQuery();
                if (_retainPosition)
                {
                    parentDataSource.findRecord(retainPositionRecord);
                }
                break;
        }
        if (_forceActive)
        {
            parentDataSource.active();
        }
    }
    ;

    if (formDataSource)
    {
        refresh();
        while (parentDataSource.joinSource() && parentDataSource.linkType() == FormLinkType::InnerJoin)
        {
            parentDataSource = formGetParentDatasource(parentDataSource);
            refresh();
        }
    }
}
За это сообщение автора поблагодарили: Molchun (1), kpoxa (1).
Старый 13.04.2011, 04:02   #19  
Geo is offline
Geo
Участник
Аватар для Geo
 
258 / 47 (2) +++
Регистрация: 04.04.2008
Спасибо.
Старый 13.04.2011, 09:28   #20  
Peter Savintsev is offline
Peter Savintsev
Участник
 
246 / 119 (4) +++++
Регистрация: 14.12.2001
Цитата:
Сообщение от Geo Посмотреть сообщение
Здесь же спрошу, поскольку было в примере.

Есть ли какая-то разница между SysQuery::value() и queryValue() ?
Принципиальной разницы нет. queryValue на самом деле вызывает SysQuery::value()

\Classes\Global\queryValue:
X++:
static str queryValue(anytype A)
{
    return SysQuery::value(a);
}
То же самое, кстати, касается практически всех методов Global::query*
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Обновление DS формы из дочерней формы breakpoint DAX: Программирование 3 24.12.2008 15:54
Обновление таблицы в DataSource при ее изменении Андре DAX: База знаний и проекты 7 22.04.2008 13:16
Как получить указатель на отчёт когда пользователь выбрал Печать на принтер в просмотрщике, в форму SysPrintForm? rkorchagin DAX: Программирование 10 17.04.2008 11:59
Русская локализация Axapta 3 ? SlavaK DAX: Администрирование 59 01.07.2003 22:38
Как получить доступ к текущей строке в DataSource формы Maxim Gorbunov DAX: База знаний и проекты 0 28.11.2001 13:46

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

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

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