Показать сообщение отдельно
Старый 19.06.2015, 14:35   #6  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,657 / 1158 (42) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Общая логика работы всех оборотно-сальдовых ведомостей в Ax2009 выглядит примерно так

К пункту меню привязана форма RLedgerSheet

В событии init формы RLedgerSheet создается экземпляр класса наследника от RLedgerSheetEngine, который открывает диалог с пользователем для установки ряда настроек и фильтров для последующего расчета.

После установки настроек пользователем, если была нажата кнопка «Ок», то выполняется ряд расчетов в этом же классе. А, кроме того, создается и запускается экземпляр класса наследника от RLedgerSheetServer, который формирует и хранит список записей по документам-источникам и суммовые показатели по этим документам.

X++:
// init формы RLedgerSheet 

// Создается класс-наследник от RLedgerSheetEngine
rLedgerSheetEngine = RLedgerSheetEngine::construct(element.args());

super();

// Диалог с пользователем
if (! rLedgerSheetEngine.prompt())
{
   // Если нажади "Отмена", то закрываем форму
    this.close();
    return;
}

// Передаем в класс ссылку на объект ListView на форме
rLedgerSheetEngine.parmFormListControl(turnoverAmount);

// Собственно выполнение расчета
rLedgerSheetEngine.run();
Метод construct() вызывает метод new(), в котором выполняется

X++:
    this.initFieldsData();
    this.initValuesData();
this.initFieldsData() - это ручное наполнение filedMap – список полей для промежуточных итогов и сортировки. Это набор формируемый из левого списка в диалоге с пользователем

this.initValuesData() – это метод, в котором можно инициализировать переменные. Как правило, не используется. Предполагается, что по умолчанию все переменные пустые, а пользователь их заполняет, если необходимо

Метод run() перекрыт в классе наследнике RLedgerSheetClient. Если убрать «обвязку», то имеем следующее

X++:
this.initAccounts();			// Инициализация

this.createRLedgerSheetServer();		// Создание экземпляра класса RLedgerSheetServer для расчета
this.executeRLedgerSheetServer();	// Собственно расчет

this.getDataFromServer();		// перекачка данных из расчетного класса в текущий

this.initListView();			// Формирование столбцов объекта формы ListView
this.fetchNextRows();			// Заполнение строк объекта формы ListView
this.setItem();				// включение/выключение ряда объектов и установка фокуса
Если объединить методы this.createRLedgerSheetServer() и this.executeRLedgerSheetServer(), то получим примерно такой код

X++:
    rLedgerSheetServer =  RLedgerSheetServer::construct(this.parmRLedgerSheetType());
    rLedgerSheetServer.initParameters(this.queryRun(), this.getParmContainer());
    rLedgerSheetServer.run(this.initRunQuery());
rLedgerSheetType – это Base Enum, значение которого передается через args.parmEnum() в методе
this.queryRun() – настроенный пользователем QueryRun
this.initRunQuery() – если не перекрыт, то queryRun.query()

RLedgerSheetEngine::Construct(args). Определяет, какие именно классы-наследники от RLedgerSheetEngine и RLedgerSheetServer будут созданы.
this.getParmContainer() – контейнер, содержащий список переменных с настройками пользователя

X++:
return [ currencyType,		//Тип валюты, в которой выполнять расчет (основная, вторичная, указанная)
         deleteZero,		//Из диапазона расчета исключить даты, не имеющие ни одной заявки на оплату
         showSumAccount,		//Отображать строки с итоговыми суммами
         dimensionCriteria,	//Финансовые аналитики
         fromDate,		//Начальная дата диапазона
         toDate,			//Конечная дата диапазона
         operationsTax,		//По какому уровню рассчитывать бухгалтерское сальдо (Base Enum)
         currencyCode,		//Код валюты, в которой выполнять расчет, если currencyType = указанная
         selectedFieldsOrder	//Выбранные поля сортировки (поставщик, договор, счет ГК)
         ];
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
За это сообщение автора поблагодарили: Ruff (5).