отчет
сумма прописью
функция
Отчёты
Разработка

Еще раз о сумме прописью

При разработке отчета возникла следующая проблемма. В отчет выводится таблица с цифровой и текстовой информацией. Колонка таблицы, где содержатся цифры, суммируется по строкам и эта сумма печатается прописью. Попытка использовать функцию AmountToStr() в датасете не увенчалась успехом, так как итоговая сумма по колонке подсчитывается уже в самом отчете. Подскажите пожалуйста, как решить эту проблему.

Нравится

6 комментариев

Самым быстро реализуемым, но не самым элегантным решением будет подсчет итога в самом наборе данных.

Спасибо.А пример скрипта можно привести.

Подсчет суммы можно выполнить с помощью подзапроса или вычисляемых полей.
В другое вычисляемое поле записать значение функции AmountToStr().
Привожу наброски кода для подсчета суммы.

[javascript]
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();
}
[/javascript]

При использовании указанного кода, поле "Sum" не удается вывести в отчет. Не в DetailData, не в Footer. Либо выдает ошибку "Невозможно изменить значение вычисляемого поля", либо выводит в таблице только одну строчку.

Ну наброски "почти" работающими были :)
Замените
[javascript]
var Dataset = Dataset;
[/javascript]
на
[javascript]
var Dataset = Dataset.SelectQuery.Open();
[/javascript]
Думаю, причина ошибки "Невозможно изменить значение вычисляемого поля" была в состоянии набора данных в событии OnCalcDataFields. Точнее смогут ответить сотрудники поддержки.

Повторюсь метод не претендует на элегантность.
[javascript]
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();
}
[/javascript]

Спасибо за помощь. Все заработало.

Показать все комментарии