Показать сообщение отдельно
Старый 13.03.2009, 14:44   #3  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5803 (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).