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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 13.03.2009, 12:44   #1  
Eldar9x is offline
Eldar9x
MCTS
Аватар для Eldar9x
Oracle
MCBMSS
 
1,064 / 166 (8) ++++++
Регистрация: 29.09.2006
Адрес: Казань
обновление поля в заданной таблице
В диалоге вводится tableName. Для указанной таблицы, то есть в ней, есть поле TMN_ImportStatus. Дальше по нажатию ok происходит обновление этого поля.
Таблица, в которой происходит обновление поля, становится известна только при запуске кода. Как это провернуть с использованием Common? Query использовать нехочется, на крайний случай map.

То есть вот чего хочу:
X++:
    TableName tableName;
    Common  common;
    ;

    ttsbegin;

    while select forupdate common
    {
        common.(fieldname2id(tablename2id(tableName), "TMN_ImportStatus")) = 100;
        common.doUpdate();
    }

    ttscommit;
как указать, какая таблица будет в common?

Последний раз редактировалось Eldar9x; 13.03.2009 в 12:52.
Старый 13.03.2009, 12:56   #2  
oip is offline
oip
Axapta
Лучший по профессии 2014
 
2,564 / 1416 (53) ++++++++
Регистрация: 28.11.2005
Записей в блоге: 1
X++:
static void Job279(Args _args)
{
    common c;
    FieldId fieldId;
;
    c = new DictTable(tableNum(InventTable)).makeRecord();
    fieldId = fieldName2Id(tableNum(InventTable), 'ItemId');
    while select c
    {
       info (c.(fieldId));
    }
}
Только всякие проверки еще надо бы добавить, естественно. На тип поля, на то, что оно вообще существует и.т.д.
За это сообщение автора поблагодарили: Eldar9x (4).
Старый 13.03.2009, 14:44   #3  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от Eldar9x Посмотреть сообщение
То есть вот чего хочу:
X++:
    TableName tableName;
    Common  common;
    ;
    ttsbegin;
    while select forupdate common
    {
        common.(fieldname2id(tablename2id(tableName), "TMN_ImportStatus")) = 100;
        common.doUpdate();
    }
    ttscommit;
как указать, какая таблица будет в common?
Хотя технически это достижимо, но тут в угоду некой универсальности и простоте реализации приносится в жертву смысл выполняемых действий, реализуемая бизнес-логика (то, что mazzy называет "программистский подход"). Во-первых, обвновление по doUpdate() смотрится странно, потому что обход триггера обновления на таблице имеет смысл, если вы абсолютно точно знаете, что делаете, а если даже неизвестно, какая именно таблица будет обновляться, то, очевидно, это условие в общем случае не выполняется. Подумайте о том, что реализуемый функционал и, соотв., список используемых таблиц будет расширяться - появятся таблицы, о которых вы сейчас и не подозреваете, а разработчики, расширяющие функционал, весьма вероятно, не будут подозревать о наличии такого "каверзного" кода. Весьма вероятно, изменение TMN_ImportStatus на той или иной таблице должно будет сопровождаться дополнительными действиями, которые нельзя предвидеть заранее.
Мне кажется, было бы корректнее реализовать некую иерархию классов-обработчиков этого изменения, каждый из которых мог бы создаваться под свою конкретную таблицу (в любом случае изначально на все существующие таблицы может быть один-единственный класс), и в любом случае жестко зашить весь список таблиц, о которых вы сейчас знаете:
X++:
static TMN_ImportStatusUpdater_Base construct(TableId _tableId)
{
    TMN_ImportStatusUpdater_Base    ret;
    ;
    switch(_tableId)
    {
        case tablenum(TMN_Table1) :
        case tablenum(TMN_Table2) :
        case tablenum(TMN_Table3) :
            ret = new TMN_ImportStatusUpdater_Base();
            break;
        default :
            throw error(error::wrongUseOfFunction(funcname()));
    }
    ret.parmTableId( _tableId );
    return ret;
}

// ...
tableId     = dfTableId.value();
newStatus   = dfStatus.value();
TMN_ImportStatusUpdater_Base::construct( tableId ).updateImportStatus( newStatus );

Последний раз редактировалось gl00mie; 13.03.2009 в 15:14. Причина: исправление кода примера
За это сообщение автора поблагодарили: mazzy (2), oip (1).
Старый 13.03.2009, 15:14   #4  
oip is offline
oip
Axapta
Лучший по профессии 2014
 
2,564 / 1416 (53) ++++++++
Регистрация: 28.11.2005
Записей в блоге: 1
Цитата:
Сообщение от gl00mie Посмотреть сообщение
...
В общем случае - согласен. Но в каком-то конкретном, такое решение через common может и иметь смысл, надо на постановку задачи смотреть. Если это функция, типа "очистить все" в каком-нибудь функционале, расположенном сбоку, то why not?

Там в "поблагодарить..." текст левый случайно попал, рука дрогнула. Не обращайте внимание.
Старый 13.03.2009, 15:01   #5  
Eldar9x is offline
Eldar9x
MCTS
Аватар для Eldar9x
Oracle
MCBMSS
 
1,064 / 166 (8) ++++++
Регистрация: 29.09.2006
Адрес: Казань
Цитата:
Хотя технически это достижимо, но тут в угоду некой универсальности и простоте реализации приносится в жертву смысл выполняемых действий, реализуемая бизнес-логика (то, что mazzy называет "программистский подход").
никоим образом.
Цитата:
Во-первых, обвновление по doUpdate() смотрится странно, потому что обход триггера обновления на таблице имеет смысл, если вы абсолютно точно знаете, что делаете
именно поэтому - doUpdate

смысл реализуемого процесса: установить содержимое таблицы, в стартовое состояние до начала импорта.
В момент импорта (в котором, кстати, и реализован тот паттерн, который вы описали ниже), происходит переустановка значений этого поля в зависимости от того, что происходит со строкой, изменяется, создается, пропускается или вообще, вручную, создается пользователем.
Зачем? Просто для того, чтобы сравнить содержимое таблицы до и после импорта. Плюс текстовый лог изменений. Программерская паранойя, что тут скажешь...
Старый 13.03.2009, 15:30   #6  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от Eldar9x Посмотреть сообщение
смысл реализуемого процесса: установить содержимое таблицы, в стартовое состояние до начала импорта.
В момент импорта (в котором, кстати, и реализован тот паттерн, который вы описали ниже), происходит переустановка значений этого поля в зависимости от того, что происходит со строкой.
Не знаю, по каким причинам у вас в таблицах могут быть "пустые" записи, созданные до иморта, но по-хорошему вашу хотелку надо реализовать в методе initValue() соотв. таблиц(ы), ну и не забывать дергать этот метод при импорте. Еще не забудьте про такой функционал, как шаблоны записей. В initValue() шаблон подпихивается при вызове super(), так что это следует учесть при реализации вашего кода (т.е. вызывать ли super() в initValue() до или после вашего кода).
Старый 13.03.2009, 15:25   #7  
Eldar9x is offline
Eldar9x
MCTS
Аватар для Eldar9x
Oracle
MCBMSS
 
1,064 / 166 (8) ++++++
Регистрация: 29.09.2006
Адрес: Казань
Цитата:
надо на постановку задачи смотреть.
нет ее , сейчас я ставлю себе задачи сам.
Цитата:
Если это функция, типа "очистить все", то why not?
оно и есть.
Старый 13.03.2009, 15:32   #8  
Eldar9x is offline
Eldar9x
MCTS
Аватар для Eldar9x
Oracle
MCBMSS
 
1,064 / 166 (8) ++++++
Регистрация: 29.09.2006
Адрес: Казань
в initValue() как раз и записывается значение "Создано пользователем". При создании строки импортом, оно переписывается значением "Создано".
Теги
шаблон

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Пропавшие поля в таблице Андре DAX: Программирование 10 03.03.2016 10:32
Вопрос по перегрузке лукапа поля прям на таблице HorrR DAX: Программирование 3 03.06.2008 18:02
Поля CreatedTransactionID, BondBatch в таблице LedgerTrans tolstjak DAX: Программирование 21 04.04.2007 08:03
После перекрытия JumpRef поля на DataSource в контекстном меню так и не появился переход к основной таблице. Кирилл DAX: Программирование 7 01.02.2007 11:42
Basics: обновление отдельного поля в гриде Dymm DAX: Программирование 19 10.08.2005 15:37

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

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

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