13.03.2009, 12:44 | #1 |
MCTS
|
обновление поля в заданной таблице
В диалоге вводится 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; Последний раз редактировалось Eldar9x; 13.03.2009 в 12:52. |
|
13.03.2009, 12:56 | #2 |
Axapta
|
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 |
Участник
|
Цитата:
Мне кажется, было бы корректнее реализовать некую иерархию классов-обработчиков этого изменения, каждый из которых мог бы создаваться под свою конкретную таблицу (в любом случае изначально на все существующие таблицы может быть один-единственный класс), и в любом случае жестко зашить весь список таблиц, о которых вы сейчас знаете: 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:01 | #4 |
MCTS
|
Цитата:
Хотя технически это достижимо, но тут в угоду некой универсальности и простоте реализации приносится в жертву смысл выполняемых действий, реализуемая бизнес-логика (то, что mazzy называет "программистский подход").
Цитата:
Во-первых, обвновление по doUpdate() смотрится странно, потому что обход триггера обновления на таблице имеет смысл, если вы абсолютно точно знаете, что делаете
смысл реализуемого процесса: установить содержимое таблицы, в стартовое состояние до начала импорта. В момент импорта (в котором, кстати, и реализован тот паттерн, который вы описали ниже), происходит переустановка значений этого поля в зависимости от того, что происходит со строкой, изменяется, создается, пропускается или вообще, вручную, создается пользователем. Зачем? Просто для того, чтобы сравнить содержимое таблицы до и после импорта. Плюс текстовый лог изменений. Программерская паранойя, что тут скажешь... |
|
13.03.2009, 15:14 | #5 |
Axapta
|
В общем случае - согласен. Но в каком-то конкретном, такое решение через common может и иметь смысл, надо на постановку задачи смотреть. Если это функция, типа "очистить все" в каком-нибудь функционале, расположенном сбоку, то why not?
Там в "поблагодарить..." текст левый случайно попал, рука дрогнула. Не обращайте внимание. |
|
13.03.2009, 15:25 | #6 |
MCTS
|
Цитата:
надо на постановку задачи смотреть.
Цитата:
Если это функция, типа "очистить все", то why not?
|
|
13.03.2009, 15:30 | #7 |
Участник
|
Цитата:
Сообщение от Eldar9x
смысл реализуемого процесса: установить содержимое таблицы, в стартовое состояние до начала импорта.
В момент импорта (в котором, кстати, и реализован тот паттерн, который вы описали ниже), происходит переустановка значений этого поля в зависимости от того, что происходит со строкой. |
|
13.03.2009, 15:32 | #8 |
MCTS
|
в initValue() как раз и записывается значение "Создано пользователем". При создании строки импортом, оно переписывается значением "Создано".
|
|
Теги |
шаблон |
|
|