четверг, 27 декабря 2007 г.

Доработка оборотно-сальдовой ведомости по подотчетным лицам.

Доработка оборотной сальдовой ведомости по подотчетным лицам.

Поставлена задача – доработка оборотно сальдовой ведомости по подотчетным лицам. У заказчика бизнес построен полностью на вторичной валюте, консолидированный баланс, отчеты о прибылях и убытках, внутрихолдинговые отношения и взаиморасчеты основаны на вторичной валюте. Не очень понятно, что хотел достичь заказчик (логично было бы предположить, что в какой валюте подотчетное лицо имело дело с денежными средствами, в той же и оборотку выводить), но ТЗ согласовано.
Сразу скажу, сначала хотелось немного сплутовать, и вместо действительной оборотной ведомости во вторичной валюте сделать немного другое. При выборе в параметрах вторичной валюты оборотка бы строилась как стандартная оборотка по валюте операции, но валюта операции бы вторичной валютой компании.
В заметке далее я покажу, как можно реализовать короткий вариант кастомизации, и соответственно, как действительно можно доработать оборотку для построения отчета во вторичной валюте.



Собственно, общий план модификации.
· доработка интерфейса;
· изменение логики построения отчета.


Шаг1. Интерфейс.

На форме выбора параметров, уже находятся все необходимые элементы для построения оборотки во вторичной валюте. Речь идет о лист-боксах CurrencyType и CurrencyTypeBrief, соответственно, отвечающие за выбор типа валюты. Напомню, первый содержит 3 элемента (основная, вторичная и валюта операции), а второй – укороченный - 2 элемента (основная и валюта операции). При инициализации формы выбора параметров в методе dialogUpdateDesign класса RLedgerSheetEngine_TurnoverAdvHolder происходит изменение видимости этих элементов на форме.
Изменим видимость этих элементов:
//=====>
// formDesign.ControlName(#CurrencyType).visible(false);
// formDesign.ControlName(#CurrencyTypeBrief).visible(true);
formDesign.ControlName(#CurrencyType).visible(true);
formDesign.ControlName(#CurrencyTypeBrief).visible(false);
//<=====
Теперь нужно передать в форму отображения результатов выбранные нами параметры. Правим метод getFromDialog того же класса
//=====>
/*
switch(currencyTypeBrief)
{
case CurrencyTypeBrief_RU::Standard:
currencyType = CurrencyType_RU::Standard;
amountDictType = new sysDictType(extendedTypeNum(AmountMstLong));
break;
case CurrencyTypeBrief_RU::Currency:
currencyType = CurrencyType_RU::Currency;
amountDictType = new sysDictType(extendedTypeNum(AmountCurLong));
break;
}
*/

switch(currencyType)
{
case CurrencyType_RU::Standard:
currencyType = CurrencyType_RU::Standard;
amountDictType = new sysDictType(extendedTypeNum(AmountMstLong));
break;
case CurrencyType_RU::Secondary:
currencyType = CurrencyType_RU::Secondary;
amountDictType = new sysDictType(extendedTypeNum(AmountMSTSecondary));
break;
case CurrencyType_RU::Currency:
currencyType = CurrencyType_RU::Currency;
amountDictType = new sysDictType(extendedTypeNum(AmountCurLong));
break;
}
//<=====
Шаг 2. Короткая модификация.
Видимость элементов изменили. При запуске оборотки виден нужный список ввода. Теперь нужно перестроить запрос. Правится метод updateQuery класса RLedgerSheetEngine_TurnoverAdvHolder.
//=====>
/*
switch (currencyTypeBrief)
{
case CurrencyTypeBrief_RU::Currency :
qbr.value(queryValue(currencyCode));
qbr.status(RangeStatus::LOCKED);
break;
case CurrencyTypeBrief_RU::Standard :
if (_update)
{
qbr.value(SysQuery::valueUnlimited());
}
qbr.status(RangeStatus::OPEN);
break;
}
*/
switch (currencyType)
{
case CurrencyType_RU::Currency :
qbr.value(queryValue(currencyCode));
qbr.status(RangeStatus::LOCKED);
break;
case CurrencyType_RU::Secondary :
// qbr.value(queryValue(CompanyInfo::find().SecondaryCurrencyCode));if (_update)
{
qbr.value(SysQuery::valueUnlimited());
}
qbr.status(RangeStatus::LOCKED);

break;
case CurrencyType_RU::Standard :
if (_update)
{
qbr.value(SysQuery::valueUnlimited());
}
qbr.status(RangeStatus::OPEN);
break;
}
//<=====
Если при выборе пункта «вторичная валюта» зафиксировать параметр «вторичная валюта» (см. фрагмент кода ниже), то построение данного отчета при выборе вторичной валюты сводится к отчету по валюте операции - вторичной валюте компании.
case CurrencyType_RU::Secondary :
// qbr.value(queryValue(CompanyInfo::find().SecondaryCurrencyCode));
qbr.status(RangeStatus::LOCKED);
break;
Собственно, на этом короткая модификация закончена.
Шаг 3. Длинная модификация.
Оборотно сальдовую ведомость нужно выводить во вторичной валюте тоже. В стандартной Аксапте специального поля в таблице проводок по подотчетному лицу нет. В последнем проекте в таблицу EmplTrans_RU было добавлено специальное поле AmountMSTSecond – сумма во вторичной валюте. В принципе, это поле можно и не добавлять, а вычислять в момент вывода в итоговую форму. Правится метод getTransAmount класса RLedgerSheetEngine_TurnoverAdvHolder.
//=====>
/*
switch(currencyTypeBrief)
{
case CurrencyTypeBrief_RU::Standard :
amount = _trans.AmountMST;
break;
case CurrencyTypeBrief_RU::Currency :
amount = _trans.AmountCur;
break;
}
*/
switch(currencyType)
{
case CurrencyType_RU::Standard :
amount = _trans.AmountMST;
break;
case CurrencyType_RU::Secondary :
// Здесь у нас кастомизировано
// Можно и не добавлять это поле
// amount = _trans.AmountMSTSecond;
amount = Currency::amountMST2MSTSecond(_trans.AmountMST ,_trans.TransDate);
break;
case CurrencyType_RU::Currency :
amount = _trans.AmountCur;
break;
}
//<=====
Если же вы аналогичным образом кастомизировали таблицу проводок по подотчетным лицам, то Вам нужно дополнительно модифицировать запрос – добавить суммирование по дополнительно введенному полю. Это метод loopTrans класса RLedgerSheetServer_TurnoverAdvHolder.
//========>qbds.addSelectionField(dictTable.fieldName2Id(#fieldAmountMSTSecond));
//<========
С клиентской частью оборотной сальдовой ведомости закончено. Теперь нужно описать, какие именно данные мы хотим получать с серверной части оборотки. Немного допиливаем метод getTransAmount класса RLedgerSheetServer_TurnoverAdvHolder:
//=====>
/*
switch(currencyTypeBrief)
{
case CurrencyTypeBrief_RU::Standard :
amount = _trans.AmountMST;
break;
case CurrencyTypeBrief_RU::Currency :
amount = _trans.AmountCur;
break;
}
*/

switch(currencyType)
{
case CurrencyType_RU::Standard :
amount = _trans.AmountMST;
break;
case CurrencyType_RU::Secondary :
// А здесь у нас кастомизировано.
// amount = _trans.AmountMSTSecond
;
amount = Currency::amountMST2MSTSecond(_trans.AmountMST ,_trans.TransDate);
break;
case CurrencyType_RU::Currency :
amount = _trans.AmountCur;
break;
}
//<=====
Если не кастомизировали таблицу проводок по подотчетным лицам, то можно вычислять сумму проводки при возврате данных с серверной части на клиента.

Комментариев нет: