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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 11.10.2004, 14:28   #1  
olesh is offline
olesh
Участник
 
58 / 26 (1) +++
Регистрация: 02.04.2002
Адрес: Москва
FormDataSource.setCurrent
А кто-нибудь знает, что делает метод FormDataSource.setCurrent?
Старый 11.10.2004, 14:38   #2  
George Nordic is offline
George Nordic
Модератор
Аватар для George Nordic
Злыдни
 
4,479 / 1250 (50) ++++++++
Регистрация: 17.12.2003
Адрес: Moscow
Записей в блоге: 9
имхо, устанавливает запись (record) текущей.

С Уважением,
Георгий
Старый 11.10.2004, 14:54   #3  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 645 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
Нет, не совсем. То есть совсем нет.

Если в форме несколько DataSource, в любой момент времени активным является только один. Когда вы нажимаете на кнопку "Фильтр..." (это воронка такая), фильтр устанавливается именно для текущего DataSource.

setCurrent делает DataSource, для которого он вызван, текущим.
__________________
Not registered yet? Register here!
Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me
Старый 11.10.2004, 14:55   #4  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 645 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
Запись текущей можно сделать с помощью findRecord.
__________________
Not registered yet? Register here!
Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me
Старый 23.07.2019, 12:02   #5  
Perc is offline
Perc
Участник
 
194 / 57 (2) ++++
Регистрация: 05.03.2005
Через столько лет пришлось озадачится, что же все таки делает метод setCurrent. И правильного ответа здесь не нашел. Но выяснил.
setCurrent пихает данные из текущего курсора FormDataSource в кэш данных FormDataSource. Пример для понимания. cliked на форме с датасорсом table1:
X++:
void clicked()
{
    Table1   t1;
    ;
    super();
    info(strFmt("%1", table1.field1));
    t1.data(table1);
    t1.field1 = "новое значение";
    table1.data(t1);
    table1_DS.setCurrent();
    info(strFmt("%1", table1.field1));
}
Замысловатое изменение field1 через data() делалось для того чтобы не сработал write на датасорсе. Метод table1.data(t1) не провоцирует форму автоматически сохранять запись.
И получается что этот код не меняет данных в БД, но форма будет отображать "новое значение" в поле "field1" на всех записях на которых вызовете clicked(). Пока не произойдет вызов executeQuery() или reread().
А без setCurrent() форма не хранит "новое значение" и сбрасывает, например, при переходе к другой записи.
Проверял на DAX2012.
Старый 23.07.2019, 16:48   #6  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Что изменится в вашем примере если закомментировать строку с table1_DS.setCurrent(); ?

Чем вас не устроил ответ 2004 года про активный датасурс?
Старый 24.07.2019, 04:11   #7  
Perc is offline
Perc
Участник
 
194 / 57 (2) ++++
Регистрация: 05.03.2005
Издеваетесь). Ответ 2004 не устроил тем, что он не раскрывает смысла метода. Возможно он также делает и датасорс активным в некоторых случаях, с этим не разбирался, но это точно не его основное назначение.
Цитата:
Что изменится в вашем примере если закомментировать строку с table1_DS.setCurrent(); ?
Ну ответ выше). Без setCurrent - форма не сохраняет новое значение. Не таблица, а именно форма.У меня новое значение сбрасывается если я передвигаюсь на новую запись.
Надо попробовать и становится понятно)
Старый 24.07.2019, 09:56   #8  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
А может, что как раз сохранение значения является побочным эффектом установки активности, а не наоборот

Для чего вообще нужен эффект сохранения значения? При каком сценарии работы это может понадобится? Использовать элемент управления Grid без бинда к таблице? Ну такое ...

Для справки. У датасутса есть внутренний признак того изменена ли текущая запись или нет. В зависимости от значения этого признака получаем разное поведение. Изменить этот признак можно методом DS.ForeWrite()
Запись не сохраняется при переходе на другую в гриде
Старый 24.07.2019, 11:26   #9  
Perc is offline
Perc
Участник
 
194 / 57 (2) ++++
Регистрация: 05.03.2005
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
А может, что как раз сохранение значения является побочным эффектом установки активности, а не наоборот
Гы) Допускаю такую вероятность. Тем не менее не встречал в коде Акс использования этой функции по первому назначению, а вот по побочному эффекту полно) Ну типично inventDim. Все же видели:
X++:
    if (inventJournalTrans.InventDimId != inventDim.InventDimId)
    {
        inventDim.data(InventDim::find(inventJournalTrans.InventDimId));
        inventDim_ds.setCurrent();
    }
Цитата:
Для чего вообще нужен эффект сохранения значения?..
Ну для того же что и пример выше. Обновить в форме значения по датасорсу приджойненному по иннерджоин, в случае если родителя вдруг связали с другой записью. Чтобы не делать после трудные executeQuery с FindRecord. Просто меняем значение в буфере и оп!
Цитата:
..Изменить этот признак можно методом DS.ForсeWrite()..
Про это тоже наслышан. Но мне нужно было для демонстрации вынести простой работающий тест clicked. Простой вариант типа:
X++:
    table1.field1 = "новое значение";
    table1_DS.ForeWrite(false);
не помогает и write все равно вызывается при переходе на другую запись. Где в другом месте признак надо сносить видимо. И чтобы не рассказывать в примере, что мол надо еще перекрыть там то и там на датасорсе - поместил все в один метод таким образом.
За это сообщение автора поблагодарили: S.Kuskov (2).
Старый 24.07.2019, 11:48   #10  
Perc is offline
Perc
Участник
 
194 / 57 (2) ++++
Регистрация: 05.03.2005
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
А может, что как раз сохранение значения является побочным эффектом установки активности, а не наоборот
епта, эта дискуссия) проверил и эту версию следующим образом: Добавил на форму еще один датасорс table2, грид к нему и что полагается. В вышеупомянутый clicked в конце дописал table2_DS.setCurrent();
Запускаю форму, жму кликед. Нажимаю Ctrl+F3 и вижу запрос к table1. table2_DS не активизировался.

Т.е. основное, по вашей версии, назначение метода не срабатывает. Или я чтото сделал не так? )
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Как вызвать метод для поля в FormDataSource? Maxim Gorbunov DAX: Программирование 3 08.05.2007 11:28
FormDataSource sassas DAX: Функционал 13 05.08.2004 17:25
Различные типы связей (LinkType) для FormDataSource Maxim Gorbunov DAX: База знаний и проекты 1 16.05.2004 13:20
Гибрид FormTableControl и FormDataSource Андре DAX: Программирование 27 01.10.2003 09:58
Собственный SQL запрос в FormDataSource Alexey DAX: База знаний и проекты 0 20.12.2001 00:35

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

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

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