добавил в стандартный отчет - Счет с НДС(Россия) сумму прописью при помощи вычилсяемого поля.
Ниже привожу оброботчик вычисляемого поля (обработчик брал с форума)

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 (списком товаров) на каком-нибудь бенде.

Нравится

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

Посмотрите свойство 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.

Олег, а вариант глобальной переменной не для футера, а для мастер бенда детали пройдет?У меня не проходит. Нужно в мастер датасете посчитать сумму по детальке

Антон, уточните, пожалуйста, что именно у вас "не проходит" - значение из глобальной переменной не подставляется/не отображается или ошибку выдает?

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