При разработке отчета возникла следующая проблемма. В отчет выводится таблица с цифровой и текстовой информацией. Колонка таблицы, где содержатся цифры, суммируется по строкам и эта сумма печатается прописью. Попытка использовать функцию AmountToStr() в датасете не увенчалась успехом, так как итоговая сумма по колонке подсчитывается уже в самом отчете. Подскажите пожалуйста, как решить эту проблему.
Нравится
Самым быстро реализуемым, но не самым элегантным решением будет подсчет итога в самом наборе данных.
Подсчет суммы можно выполнить с помощью подзапроса или вычисляемых полей.
В другое вычисляемое поле записать значение функции AmountToStr().
Привожу наброски кода для подсчета суммы.
var DatasetObject = new Object; function ds_ReportInvoicesByPeriodOnDatasetCalcFields(Dataset) { Dataset.DisableEvents(); if (!DatasetObject.IsCalculated) { var SumDataset = Dataset; SumDataset.GotoFirst(); var Sum = 0; while (!SumDataset.IsEOF) { Sum = Sum + SumDataset('BasicAmount'); SumDataset.GotoNext(); } var StringSum = Sum.toString() DatasetObject.IsCalculated = true; var Result = AmountToStr(StringSum, 'ru', 'UAH'); Dataset.Values('Sum') = Result; } Dataset.EnableEvents(); }
Ну наброски "почти" работающими были :)
Замените
var Dataset = Dataset;
на
var Dataset = Dataset.SelectQuery.Open();
Думаю, причина ошибки "Невозможно изменить значение вычисляемого поля" была в состоянии набора данных в событии OnCalcDataFields. Точнее смогут ответить сотрудники поддержки.
Повторюсь метод не претендует на элегантность.
var DatasetObject = new Object; function ds_ReportInvoicesByPeriodOnDatasetCalcFields(Dataset) { Dataset.DisableEvents(); if (!DatasetObject.IsCalculated) { // SumDataset = Dataset; - неправильное копирование var SumDataset = Dataset.SelectQuery.Open(); SumDataset.GotoFirst(); var Sum = 0; while (!SumDataset.IsEOF) { Sum = Sum + SumDataset('BasicAmount'); SumDataset.GotoNext(); } var StringSum = Sum.toString() DatasetObject.IsCalculated = true; var Result = AmountToStr(StringSum, 'ru', 'UAH'); Dataset.Values('Sum') = Result; } Dataset.EnableEvents(); }