Показать сообщение отдельно
Старый 13.08.2015, 11:05   #1  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
fieldnum и map custVendTrans - как получить идентификатор поля таблицы по мапу?
Дурной вопрос. Понял, что я не знаю красивого ответа. Может подскажете?

Есть:
= код, в котором объявлена переменная типа map CustVendTrans
= запрос, который содержит либо custTrans, либо vendTrans в зависимости от внешних
= метод, который устанавливает range в этом запросе
= для range нужно получить fieldnum

вопрос:
а как проще и красивше получить fieldnum?

X++:
    CustVendTrans           custVendTrans           = custVendTransStatic.custVendTrans();
    Query                   q;
    QueryBuildDataSource    qbds;
;
    switch( _journalTable.JournalModule)
    {
        case ModuleCustVend::Cust:
            q = new Query(querystr(myCustQuery));
            break;
        case ModuleCustVend::Vend:
            q = new Query(querystr(myVendQuery));
            break;
        default:
            throw Error::unsupportedEnumValue(_journalTable.JournalModule);
    }

    qbds = q.dataSourceTable(custVendTrans.TableId);

    // здесь возвращает fieldid из мапа = 39, а нужно для CustTrans = 41, а для VendTrans = 78
    SysQuery::findOrCreateRange(qbds, fieldnum(custVendTrans, ExchRate)       ).value(myValue);

    // есть еще много критериев. как бы красиво оформить?
    SysQuery::findOrCreateRange(qbds, fieldnum(custVendTrans, ....
    SysQuery::findOrCreateRange(qbds, fieldnum(custVendTrans, ....
    SysQuery::findOrCreateRange(qbds, fieldnum(custVendTrans, ....
    SysQuery::findOrCreateRange(qbds, fieldnum(custVendTrans, ....
понятно, что можно вставить в switch. но тогда код будет дублироваться. некрасиво. хотя везде в стандартной аксапте именно так и делается

понятно, что можно через DictField, но получается слишком длинный код, когда критериев (range) достаточно много.

есть еще какой-нибудь способ?

Последний раз редактировалось mazzy; 13.08.2015 в 11:07.