Цитата:
Сообщение от
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 );