добавил в стандартный отчет - Счет с НДС(Россия) сумму прописью при помощи вычилсяемого поля.
Ниже привожу оброботчик вычисляемого поля (обработчик брал с форума)
function ds_ReportOfferingsInInvoiceOnDatasetCalcFields(Dataset) {
//amount to string
var DatasetObject = new Object;
Dataset.DisableEvents();
if (!DatasetObject.IsCalculated) {
var SumDataset = Dataset.SelectQuery.Open();
SumDataset.GotoFirst();
var Sum = 0;
var SumTax = 0;
while (!SumDataset.IsEOF) {
Sum = Sum + SumDataset('BasicAmount');
SumTax = SumTax + SumDataset('BasicTaxAmount')
SumDataset.GotoNext();
}
var StringSum = Sum.toString()
var StringSumTax = SumTax.toString()
DatasetObject.IsCalculated = true;
var Result = AmountToStr(StringSum, 'ru', 'RUR');
var ResultTax = AmountToStr(StringSumTax, 'ru', 'RUR');
Dataset.Values('TotalStr') = Result;
Dataset.Values('TotalStrTax') = ResultTax;
}
Dataset.EnableEvents();
}
все считается правильно, переводится в слова корректно.
У меня проблема вывод полученной строки (суммы прописью) в отчете. Вывожу ее при помощи стандартного Memo.
Напомню, что в отчете два датасета - ds_ReportInvoiceWithNDSForRussia (master) и ds_ReportOfferingInInvoice (detail). Вычисляемое поля для суммы прописью высчитывается в ds_ReportOfferingInInvoice.
Если кладу мемо не на бенд (просто на старницу), или на бенд master-a (или его child), то все работает.
Но если кладу мемо на бенды завязанные на detail или на ReportSummary или на PageFooter, то появляется ошибка Источник данных '%s' не открыт.
1. Как обойти эту ошибку?
2. Глобально задача, отображить это поле где-то под detail (списком товаров) на каком-нибудь бенде.
Нравится
Посмотрите свойство CloseDataSource, датасета Fastreport.
Данное свойство должно находиться в состоянии False.
Спасибо, Николай, за совет. Но CloseDataSource уже проверял - False.
Денис, ошибка не из-за вычисляемого поля происходит. Если отображать любое другое поля из detail-запроса, то ошибка примерно такая же (только источник указывается явно, а не '%s').
Тут вопрос в том, на каких бендах можно отображать поля detail-запроса. По логике казалось, что если у соответствующего Dataset-a CloseDataSource ставить в false, то к полю запроса можно будет обратиться всегда.
Но на практике оказывается, что поля detail запроса можно вывести только на:
1. на child-ах detail-бенда
2. на master-бенде и его footer, child, header (если он находится над detail-бендом)
3. прямо на странице (не на бенде)
4. на самом detail-бенде.
а вот в footer-е, принадлежащему detail-бенду, отобразить поле нельзя - а здесь-то больше всего и хотелось.
!!!вообще очень хотелось бы узнать от знающих людей, когда можно обращаться к полям detail dataset-a. У меня сложилось впечатление, что к ним можно обращаться до тех пор пока detail запрос не отработает, а после датасет закрывается и доступ к полям исчезает.
В целом, свою проблему я решил, но про доступ к полям detail dataset-a хочется узнать.
Поделюсь как я решил свою задачу - может быть кому-то сэкономит время.
Была стандартная задача отобразить в счете сначала список товаров, под списком товаров отобразить количество наименований и сумму счета, а вот под ними отобразить сумму прописью.
Количество наименований и сумму счета отобразил в footer-е detail-бенда (detail бенд завязан на ds_ReportOfferingInInvoice). Количество наименования отобарзил при помощи переменной Line, сумму взял из master dataset (ds_ReportInvoiceWithNDSForRussia).
А вот сумму прописью - вычисляемое поле detail dataset- отобразить не удавалось из-за той самой ошибки.
Отображение суммы прописью обязательно хотелось расположить на каком-то бенде, иначе взаимное расположение отображаемой информации трудно контролировать.
Отобразить смог при помощи добавочного detail-бенде (привязнному к тому же ds_ReportOfferingInInvoice). На этом бенде расположил сумму прописью. Чтобы сумма не повторялась столько раз, сколько товаров в счете, надо в количестве строк (кажется rowcount или как-то так) поставить 1 (по умолчанию стоит 0).
Андрей, добрый день.
По поводу полей detail dataset'а Вы правы: не удавалось получить их значение ниже detail-бенда (да и, честно говоря, насчёт корректного получения значений датасета вне detail-бенда есть сомнения). Скорее всего, это связано с особенностями реализации Fast Report.
Вообще, если есть подобные задачи, их можно решать с помощью переменных в коде отчёта. Например, при обработке события OnBeforePrint detail-бенда записываем нужное значение из датасета в некоторую глобальную переменную, а в footer-бенд добавляем memo, содержащий имя этой переменной в квадратных скобках. В итоге получим необходимый результат.
Сори за оффтоп.
Пробую Ваш скрипт для расчета сумы стоимости продуктов в счете, но у меня отображает только стоимость первого в счете продукта, не суммируя остальных.
Цикл отслеживающий конец таблицы отрабатывает 9 раз при том что записей 3.
Может ли быть это связано с тем что у меня ТС 3.4.0.97
var DatasetObject = new Object; Dataset.DisableEvents(); if (!DatasetObject.IsCalculated) { var SumDataset = Dataset.SelectQuery.Open(); SumDataset.GotoFirst(); var Sum = 0; while (!SumDataset.IsEOF) { Sum = Sum + SumDataset('BasicAmount'); SumDataset.GotoNext(); ShowInformationDialog('DatasetIsCalculated'+Sum.toString()); } var StringSum = Sum.toString() DatasetObject.IsCalculated = true; var Result = AmountToStr(StringSum, 'ua', 'UAH'); Dataset.Values('SumText') = Result; } Dataset.EnableEvents();
Владимир, я рекомендовала бы считать итог средствами отчета Fast Report (если поле, по которому производится суммирование, выводится в датабэнд). Обратите внимание, memo, в котором рассчитывается сумма, должно находиться в футере датабэнда.
Либо же агрегирующей колонкой подзапроса.
В данном конкретном случае для диагностики необходимы Ваши сервисы отчета.
Анна, сума считается правильно. Мне нужна сумма прописью, но использовать функцию AmountToStr в отчете я не могу. В скрипте отчета, ds_ReportOfferingsInInvoiceScript не могу получить сумму :wink:
Владимир, наиболее вероятная проблема - Memo лежит не в футере бэнда.
Пожалуйста, предоставьте сервисы отчета, свзянанных датасетов и запросов для анализа проблемы.
Анна, вопрос уже на рассмотрении в службе поддержки.
Как только все разрешится, выложу результаты.
Пока определились с тем, что создали дополнительное поле в sq, подзапрос с расчетом итогов (суммирование). А потом функцией AmounttoStr, буду выводить результат в виде текста
"Лабьяк Олег Игоревич" написал:Андрей, добрый день.
По поводу полей detail dataset'а Вы правы: не удавалось получить их значение ниже detail-бенда (да и, честно говоря, насчёт корректного получения значений датасета вне detail-бенда есть сомнения). Скорее всего, это связано с особенностями реализации Fast Report.
Вообще, если есть подобные задачи, их можно решать с помощью переменных в коде отчёта. Например, при обработке события OnBeforePrint detail-бенда записываем нужное значение из датасета в некоторую глобальную переменную, а в footer-бенд добавляем memo, содержащий имя этой переменной в квадратных скобках. В итоге получим необходимый результат.
С уважением,
Олег Лабьяк,
инженер-программист,
группа компаний Terrasoft.
Олег, а вариант глобальной переменной не для футера, а для мастер бенда детали пройдет?У меня не проходит. Нужно в мастер датасете посчитать сумму по детальке
Антон, уточните, пожалуйста, что именно у вас "не проходит" - значение из глобальной переменной не подставляется/не отображается или ошибку выдает?