Добрый день. Мне нужно вывести печать контрагента в отчет, чтобы данные не перекрывались моей картинкой, которую я подтягиваю. Есть ли какое то свойство у PictureObject, позволяющее сделать так?

Нравится

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

Здравствуйте, Антон!

Установите свойство Transparent = true для обьекта PictureObject.

Не нашел такое свойство. Версия TS CRM 3.2.1.46. Подскажите где оно ставится

Тема закрыта в ходе личной переписки

Антон, если возникнут дополнительные вопросы - обращайтесь!

Хорошо!Спасибо Вам

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

Всем доброго времени суток. Имеется печатная форма документа в Exel(см. прикл файлы)
Строю отчет Fast Report. В FR столбцы таблицы реализовываю просто: с помощью компонент Memo, обрамляя их линиями и задавая ширину и высоту. У меня возникла проблема: так как текста, который я вывожу в колонке "Прийняті рішення" оказывается больше, чем в других колонках, то не весь текст виден в этом столбце.Что мне делать? Мне нужно, чтобы высота остальных колонок - "№","Розглянуті питання","Відповід. за виконання" и "Дата виконання" увеличивалась (была равной)высоте колонки "Прийняті рішення". Можно ли это сделать без написания кода в FR? С отчетами только знакомлюсь. Помогите, пож-ста! Думаю такая проблема уже встречалась и не раз.

Нравится

4 комментария

Здравствуйте Антон,
Предлагаю Вам для всех Memo установить свойство Stretch to Max Height
1
что выровняет все Memo по высоте к наибольшему

Попробовал как Вы сказали, Алексей, не получается. Наслаивается одно на другое.

Антон, дополнительно необходимо в MasterData установить свойство Stretched = true
1
Пример отчета:
2
Данный вопрос был рассмотрен на форуме FastReport

Сервисы примера в прикрепленных файлах

Большое спасибо! Помогло!

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

Здравствуйте, не понятно почему, но при экспорте из отчета FastReport в Excel появляются дублирующиеся строки. При выполнении запроса дубли не появляются. Вот запрос

SELECT
        [tbl_Contract].[ContractNumber] AS [ContractNumber],
        [tbl_Contract].[CentrIncomeID] AS [CentrIncomeID],
        (SELECT TOP 1
                [tbl_AccountCommunication].[Number] AS [Number]
        FROM
                [dbo].[tbl_AccountCommunication] AS [tbl_AccountCommunication]
        WHERE([tbl_AccountCommunication].[CommunicationTypeID] IN ('C224AC38-E26F-4460-900C-3FE12F61CF21') AND
                [tbl_AccountCommunication].[AccountID] = [tbl_Contract].[CustomerID])) AS [MailNumber],
        [tbl_Contract].[DetalisationSend] AS [DetalisationSend],
        [tbl_Contract].[ContractTypeID] AS [ContractTypeID],
        [tbl_Contract].[SubAgentID] AS [SubAgentID]
FROM
        [dbo].[tbl_Invoice] AS [tbl_Invoice]
LEFT OUTER JOIN
        [dbo].[tbl_Contract] AS [tbl_Contract] ON [tbl_Contract].[ID] = [tbl_Invoice].[ContractID]
WHERE([tbl_Contract].[ContractTypeID] = 'ED7FD7B2-46A7-4583-8FB4-37356272EB8A' AND
         ((MONTH(InvoiceDate) = MONTH(DATEADD(MONTH, -1, GETDATE())) AND YEAR(InvoiceDate) = YEAR(DATEADD(MONTH, -1, GETDATE()))) OR
(MONTH(InvoiceDate) = MONTH(GETDATE()) AND YEAR(InvoiceDate) = YEAR(GETDATE()))))
ORDER BY ContractNumber

Нравится

2 комментария

Да, есть такой глюк. У меня есть подозрения что это происходит при подкачке данных. Т.е. по умолчанию данные выгружаются партиями по 20 шт. поэтому, когда грузится следующая партия происходит дублирование данных. Я это решил следующим образом. В sq_ и у датасета в ФастРепорте FetchRecordsCount ставлю 99999, больше ФастРепорт не позволяет.

Евгений, спасибо!) Получилось!)

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

Добрый день!

Есть следующая задача:
Распечатать стикеры, на которых будет ФИО, название компании, телефон и адрес контактов, входящих в определенную группу.

По ней у меня есть два вопроса:
1) Как сделать так, чтобы отчет формировался только по данным из определенной группы?
2) Для моего случая неплохо подходит стандартный отчет fastreport "Стикеры для контактов (Украина, СНГ)", однако мне необходимо изменить в нем кое-что. Главное - добавить номер телефона. Также хорошо бы убрать часть адреса (страну, город, индекс), т.к. в данном случае она не нужна. Я попытался сделать это в дизайнере отчетов, однако не понял, как это делается. Не могли бы вы подскзаать?

Буду очень благодарен за быстрый ответ, особенно на первый вопрос!

Нравится

1 комментарий

Для формирования отчёта есть два режима: отчёт формируется либо для всех записей, либо для выбранных. Если Вам необходимо, чтобы отчёт формировался только для определённой группы, установите ему тип фильтрации "Для выбранных записей". Затем в нужном разделе выберите группу, выделите в ней все записи и сформируйте по ним отчёт. Если записей в группе больше 40, необходимо перейти на следующую страницу и повторить процедуру повторно. Либо изменить настройки системы таким образом, чтобы на странице отображалось не 40 записей, а сколько необходимо.

Для того, чтобы добавить в отчёт номер телефона, нужно сначала вынести соответствующую колонку в запрос и датасет отчёта (в Вашем случае - sq_ContactSticker и ds_ContactSticker). Только после этого её можно будет использовать в компонентах отчёта. Для удаления ненужных полей из отчёта откройте его в дизайнере, выберите поле, в котором отображаются данные, откройте его двойным кликом мыши, и в появившемся окне текстового редактора удалите ненужные строки. После этого сохраните изменения. Чтобы в запросах по прежнему не выбирались удалённые из отчёта поля, можно их удалить из датасета и запроса. Но перед этим необходимо проверить, не используются ли эти поля в других отчётах.

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

Вопрос такой: нужно автоматически выполнить экспорт после открытия формы отчета в FastReport. У меня не получается отловить событие по которому я могу это сделать, пробовал на событии OnShow базового окна отчета, но не получилось. Пока получился только вариант на OnClose, но это не красиво, т.к. пользователю надо нажимать кнопку закрытия окна отчета.
Как быть ?

Нравится

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

Отчет по выделенным записям или с использованием окна фильтрации?

По выделенной записи.

Решение "в лоб"
находим function ShowSelectedRecordsReport(...) в скрипте scr_ReportUtils
модифицируем ее примерно так

ReportPreviewer.Build(); // из оригинальной фунции
var frpMain = ReportPreviewer.ComponentsByName('frpMain');
frpMain.Report = Report;
if (frpMain.Report.Caption == 'Заголовок нужного отчета'){  // любой идентификатор нужного отчета
    frpMain.PrepareReport();
    frpMain.IsVisible = false;
    ReportPreviewerComponent.DatasetByUSI(FilteredDatasetCode) = ReportDataset;
    frpMain.PreviewReport();
    var TempFileName = System.CreateObject('TSObjectLibrary.Value');
    var FileNames = System.CreateObject('TSObjectLibrary.StringsList');
    if ((System.PromptForFileNames(FileNames, '*.rtf', '', "Выберите файл", ''))) {
	TempFileName.Value = ExtractFileNameWithoutExtension(FileNames.Text.substr(0, FileNames.Text.length-2)) + '.rtf';
	try {
    	   frpMain.Export(retRTF, TempFileName, false);
	} catch (e){
	} 	
     }	
     return;	
} else {
   ReportPreviewer.Prepare(); // из оригинальной функции
}

Без претензии на "красоту", основное - идея:smile: Творческая переработка и оптимизация рекомендуются.
Производится экспорт в rtf без показа отчета, в какой файл - выбираем в диалоговом окне.

Александр, спасибо. Идея как раз то что надо.
Я немного переработал ее для своих нужд, сделал в гриде документов отдельную кнопку для этой обработки, кроме того мне не нужно выбирать файл, надо просто сохранить во временный и после этого автоматически открыть его в MS Word, получилось так:

function btnRTFletterOnClick(Control) {
	//по кнопке сформировать файл формата RTF в соответствии с шаблоном FastReport
	var ReportCode = 'fr_ReportLetterPrintForm';
	var FilteredDatasetCode = 'ds_ReportLetterPrintForm';
	var Report = Services.GetNewItemByUSI(ReportCode);
	var ReportPreviewer = Services.GetNewItemByUSI('wnd_BaseFastReportPreview');
	var ReportPreviewerComponent = ReportPreviewer.Attributes('ReportPreviewer');
	var ReportDataset = Services.GetNewItemByUSI(FilteredDatasetCode);	
	SetAttribute(ReportPreviewer, 'Report', Report);
	ApplyDatasetFilter(ReportDataset, 'ID', dlData.Dataset.Values('ID'), true);		
	ReportPreviewer.Build();
 
	var frpMain = ReportPreviewer.ComponentsByName('frpMain');
	frpMain.Report = Report;
    frpMain.PrepareReport();
    frpMain.IsVisible = false;
    ReportPreviewerComponent.DatasetByUSI(FilteredDatasetCode) = ReportDataset;
    frpMain.PreviewReport();
 
    ScriptUtils.BeginProcessing(); //задержка для стабильного формирования RTF файла
	ScriptUtils.Sleep(100);	
	ScriptUtils.EndProcessing();
 
    var TempFileName = System.CreateObject('TSObjectLibrary.Value');
		try {
           	var FileNameStr = 'letter';
			var Extension = '.rtf';
			TempFileName.Value = GetTemporaryFileName(FileNameStr + Extension);
			frpMain.Export(retRTF, TempFileName, false);
			var WShell = System.CreateObject('WScript.Shell');
			var File = TempFileName.Value;
			WShell.Run('winword.exe ' + File, 1);
        	} 
			catch (e){
        			}      
}

В ходе отладки выявился один странный момент если непосредственно перед формированием временного файла вызывать отладчик, то все отлично, а если без него, то файл формируется пустым. Помогло введение в код небольшой задержки.

"Тюрин Юрий" написал:В ходе отладки выявился один странный момент если непосредственно перед формированием временного файла вызывать отладчик, то все отлично, а если без него, то файл формируется пустым. Помогло введение в код небольшой задержки.

а вот это интересный момент:smile:

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

Hello, Dear Terrasoft Community,

I would like to ask about Fast reports. I noticed, that Fast reports, which use rich text, after exporting to Pdf file are big size. For example, 3-4 pages report with rich text, exported to PDF is about 3 MB.
Maybe anybody has used any alternative ways of exporting fast reports to PDF, using not a standart Fast Report exporting to PDF library, but some alternative printing to PDF drivers like Bullzip or etc., and tried integrate it into Terrasoft CRM?
It is very convenient Fast Report function - Send By Mail, exported to PDF. The only problem is big size of exported file :)

Thank You.

P.s. You can answer in Your language. :)

Kind regards,
Aurimas Lacitis

Нравится

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

Уточните, пожалуйста, Вашу версию. Если причина описанной Вами проблемы такая же, как здесь (последний комментарий от 30 ноября 2009), то возможно, проблему решит обновление до версии не ниже 3.3.1.95. Для обновления необходимо выслать письменный запрос на адрес Службы технической поддержки support@tscrm.com .

Олег Лабьяк,
разработчик,
3-я линия Службы поддержки Terrasoft.

Before I got this problem on version 3.3.1.91. Today I tried again on version 3.3.1.100, but I guess that the problem still exists.
I created Fast report with rich text objects only, no pictures. I tried to export to pdf with version 3.3.1.100. Results are:
- with print optimized true: size 9 MB;
- with print optimized false: size 1,5 MB;
Then I exported the same report to rtf and printed it to pdf with PDF995 tool, and the size was 50 KB.

I got information, that this is a problem of Fast Report tool, but maybe You have any information about new versions of Fast Report tool, maybe this exporting to pdf function are going to be repeared in some newer releases?

Thank You :)

Kind regards,
Aurimas

Aurimas Lacitis, добрый день.

К сожалению, мы не располагаем подобной информацией. В качестве обходного варианта попробуйте автоматизировать процесс, который Вы описали: в функции SendByEmail скрипта scr_BaseFastReportPreviewScript при выборе типа PDF сохраните отчёт в файл RTF, а перед отправкой письма попытайтесь с помощью утилиты PDF995, которую Вы используете, перевести файл в нужный формат. Например:

function SendByEmail(ReportExportType) {
	if (!GetCanCreateMessage(true)) {
		return;
	}
	var TempFileName = System.CreateObject('TSObjectLibrary.Value');
	var FileNameStr = frpMain.Report.Caption;
	var Extension = '';
	switch (ReportExportType) {
	case retRTF: Extension = '.rtf';
		break;
	case retXLS: Extension = '.xls';
		break;
	case retPDF: //Extension = '.pdf';
		Extension = '.rtf';
		break;
	case retHTML: Extension = '.html';
		break;
	}
	TempFileName.Value = GetTemporaryFileName(FileNameStr + Extension, true);
	if (ReportExportType == retHTML) {
		var FileSystemObject = GetFileSystemObject();
		var FolderName = TempFileName.Value.
			replace(ExtractFileExtension(TempFileName.Value), 'files');
		if (!FileSystemObject.FolderExists(FolderName)) {
			FileSystemObject.CreateFolder(FolderName);
		}
	}
	if (ReportExportType == retPDF) {
		frpMain.Export(retRTF, TempFileName, true);
		<Выполняем операции по конвертации файла в формат PDF>;
	} else {
		frpMain.Export(ReportExportType, TempFileName, true);	
	}
	SendEmail({Subject: FormatStr("Файл отчета %1", FileNameStr),
		BodyFormat: 2, Attachments: [TempFileName.Value]});
}

Олег Лабьяк,
разработчик,
3-я линия Службы поддержки Terrasoft.

Thank You, Олег,

I will rewrite SendByEmail function.

This probably should be another issue, but maybe You have used and can offer any conversion from .doc to .pdf tools, which can convert to PDF by calling program from command line? Customer will have to install this tool separately from Terrasoft software.
For example, I used PDFCreator, but it has some restrictions - it can convert to PDF only if MS Word application is closed, etc., other tools have other restrictions.

Kind regards,
Aurimas Lacitis

Лично у меня такой задачи никогда не возникало. В Интернете нашёл эту утилиту, судя по описанию - неплохая. Возможно, Вам подойдёт.

Олег Лабьяк,
разработчик,
3-я линия Службы поддержки Terrasoft.

Thank You, Олег,

Kind regards,
Aurimas Lacitis

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

Всем привет.

Собственно, вопрос в заголовке. Поиск показал, что есть решение для отчетов в Word, а вот о Fast Report я не нашел ни слова. Наверняка должно быть решение.

Спасибо.

Нравится

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

Должен помочь поиск по функции ShowSingleRecordReport

Спасибо, Сергей!

Не могу понять, что мешает системе включить фильтр по ID:

	var OrderID = dlData.Dataset.Values('ID');
	var Report = Services.GetNewItemByUSI(ReportCode);
	var ReportPreviewer = Services.GetNewItemByUSI('wnd_BaseFastReportPreview');
	var ReportPreviewerComponent = ReportPreviewer.Attributes('ReportPreviewer');
	var ReportDataset = Services.GetNewItemByUSI(FilteredDatasetCode);
	SetAttribute(ReportPreviewer, 'Report', Report);
	ApplyDatasetFilter(ReportDataset, 'ID', OrderID, true);
	ReportPreviewer.Build();
	ReportPreviewer.Prepare();
	ReportPreviewerComponent.DatasetByUSI(FilteredDatasetCode) = ReportDataset;

То есть, получаю отчёт по первой записи в датасете вместо нужной, запрос в профайлере ловлю без условий выборки. ID перед включением фильтра правильный. Отчёт в системе зарегистрирован.

Отчётов у меня несколько типов и, что удивительно, на одном из них вызов отчета из скрипта замечательно работает, включая фильтр. Найти какие-то отличия этого отчета от остальных не удалось.

Версия клиента 3.2.043. Обряд с бубном провожу по инструкции. :D

Сергей, можно уточнить: в основном запросе Вашего отчёта главная таблица - это таблица раздела, или другая? Если второе, попробуйте переписать запрос таким образом, чтобы главной таблицей запроса была таблица раздела. Например, для раздела "Контакты":

select ... 
from tbl_Contact 
  left outer join tbl_ContactAddress...

Олег Лабьяк,
разработчик,
3-я линия Службы поддержки Terrasoft.

Да, главная таблица — таблица раздела, tbl_Opportunity.

Я так понимаю, Вы написали свою функцию для вызова отчёта? Возможно, результат её работы перекрывается базовым функционалом. Для установления причины проблемы необходима дополнительная информация: откуда и каким образом вызывается отчёт. Возможно, понадобятся сервисы отчёта либо удалённый доступ для анализа проблемы, если это возможно.

Олег Лабьяк,
разработчик,
3-я линия Службы поддержки Terrasoft.

Да. На форму wnd_OpportunitiesGridArea добавлена кнопка с таким кодом:

function btnPrintOnClick(Control) {
	var ReportCode = 'fr_buyNaturalPersonOther';
	var FilteredDatasetCode = 'ds_buyNaturalPersonOther';
	var OrderID = dlData.Dataset.Values('ID');
	var Report = Services.GetNewItemByUSI(ReportCode);
	var ReportPreviewer = Services.GetNewItemByUSI('wnd_BaseFastReportPreview');
	var ReportPreviewerComponent = ReportPreviewer.Attributes('ReportPreviewer');
	var ReportDataset = Services.GetNewItemByUSI(FilteredDatasetCode);
	SetAttribute(ReportPreviewer, 'Report', Report);
	ApplyDatasetFilter(ReportDataset, 'ID', OrderID, true);
	ReportPreviewer.Build();
	ReportPreviewer.Prepare();
	ReportPreviewerComponent.DatasetByUSI(FilteredDatasetCode) = ReportDataset;
}

Сервисы отчета в аттаче.

Сергей, не удалось воспроизвести описанную Вами проблему. Пытался воспроизвести на бинарных файлах версии 3.2.0.43 - отчёт всегда строится по нужной записи реестра, независимо от того, вызывается ли он из карточки редактирования или же напрямую из раздела (кстати говоря, если отчёт должен вызываться только из карточки редактирования, нет необходимости регистрировать его в системе). Единственное, что могу сказать, - в предоставленном Вами коде названия сервисов fr_buyNaturalPersonOther и ds_buyNaturalPersonOther, в то же время в предоставленных Вами сервисах те же названия - fr_BuyNaturalPersonOther и ds_BuyNaturalPersonOther. Возможно, в этом проблема?

Олег Лабьяк,
разработчик,
3-я линия Службы поддержки Terrasoft.

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

Кто нибудь знает, почему конструкция IIF не работает???
Делаю [IIF(1=1,'1','0')]

Выдает ошибку...

Нравится

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

В отчете вставил в поле текстовое приведенный текст, выдало при просмотре честную "1"...
Текст ошибки то какой?

Ругается на скобку

а в самом Memo17 кроме ниженаписанного ничего больше нет?

[IIF(1=1,'1','0')]

Попробуйте двойные кавычки поставить, что скажет? Я пробовала поставить двойные, тогда такая же ошибка, а с одинарными нормально.

Только это [IIF(1=1,'1','0')]

С двойными кавычками точно такая же ошибка

может сервис отчета в студию?

"Александр Кудряшов" написал:может сервис отчета в студию?

С радостью бы выгрузил только не знаю как

Правой кнопкой по сервису - Сохранить в файл))
Версия Terrasoft какая кстати?

Вот результат правой кнопкой - НИЧЕГО....
Террасофт 3.3.0.61 Press

сервис в дереве сервисов справа в администраторе:smile:

Вот пожалуйста :)

поставил вместо двойных одинарные кавычки - работает [IIF(1=1,'1','0')]
в отчете стер датасет, естественно, так как нет такого у меня

Аналогично.

Олег Лабьяк,
разработчик,
3-я линия Службы поддержки Terrasoft.

Я понял в чем тут дело.... Действительно, на чистом отчете это работает. НО. Достаточно в коде отчета написать хотя бы что то вроде

{
float c = 12;
}

тогда уже эта конструкция перестает быть работоспособной.... А код необходим. Как быть????

Евгений, а Вы можете перевести свой код с JScript на PascalScript?

Только что проверил, действительно, не работает с кодом

{
float c = 12;
}

Зато работает с кодом

var c: extended;
 
begin
  c := 12;
end.

Олег Лабьяк,
разработчик,
3-я линия Службы поддержки Terrasoft.

Олег, получается, желательно работать на паскале? Потому что на Си++ не работает, а на паскале заработал, спасибо :)

Насколько я знаю, большинство из наших разработчиков пишут в коде сервиса FastReport именно на PascalScript. Думаю, лучше работать именно так.

Что касается проблемы с кодом на C++ или JScript, это нужно уточнять у разработчиков FastReport. В истории по доработкам версии FastReport Studio 4 упоминается, что "fixed IIF bug" (см. http://www.bestsoftware4download.com/software/k-search-script-t-free-fa…), но в таком случае либо у нас используется версия ниже, либо её исправили только для PascalScript, либо же имеется в виду другая проблема.

Олег Лабьяк,
разработчик,
3-я линия Службы поддержки Terrasoft.

Спасибо, Олег. Буду пользоваться теперь Паскалем :)

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

Здравствуйте. Проблема такая - при работе в фаст репорт добавляю фильтр. Потом решил его удалить, но при удалении (при нажатии ОК) всплывает дебаггер и террасофт выдает ошибку .... вот что выходит

Это ошибка или так должно быть??? Просто опасаешься уже иной раз эту кнопочку нажимать :(

Нравится

2 комментария

Евгений, добрый день.

Для устранения проблемы необходимо внести изменение в функцию SaveFilters скрипта wnd_ReportFiltersScript - вместо null вставить '', как указано ниже:

function SaveFilters(Window) {
	if (ReportFilters.QueryBuilderData) {
		if (fbcMain.DataFieldsList.Count == 0) {
			return;
		}
		ReportFilters.QueryBuilderData.QueryFilterData = GetNewXMLStorage();
		var XMLStorage = ReportFilters.QueryBuilderData.QueryFilterData;
		XMLStorage.InitRootNode(xddnFiltersBuilderControlData);
		fbcMain.DataFieldsList.Serialize(XMLStorage.RootNode);
        return;
	}
 
	if (!Assigned(ReportFilters.FastReport)) {
		return;
	}
	if (fbcMain.DataFieldsList.Count == 0) {
		ReportFilters.FastReport.FiltersXML = '';
		return;
	}
	ReportFilters.FastReport.FiltersXML = 
		RemoveFilterBuilderItems(fbcMain);
}

После сохранения скрипта необходимо перезапустить Администратор Terrasoft.

Олег Лабьяк,
разработчик,
3-я линия Службы поддержки Terrasoft.

Спасибо, заработало

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

Здравствуйте.
Вопрос такой... Создаю отчет в фаст репорт, используя фильтр по 4м параметрам. Получаю нормальный, отфильтрованный датасет, который благополучно выводится в отчет.
Но вот вопрос - каким образом мне бы передать в отчет параметры этого фильтра???
Фильтр идет по поставщику, клиенту и датами начала и конца.
Вот эти 4 параметра мне и нужно видеть в отчете.

Нравится

33 комментария

Добрый день, Евгений!
Проще всего передать в отчет эти параметры через атрибуты отчета, например ReportPreviewer.Report.Attributes('StartDate') = new Date().getVarDate().

А вывести значение StartDate в отчете можно прописав в элементе управления [StartDate]. Уточните, пожалуйста, какую форму фильтрации Вы используете. Настраиваете в сервисе отчета стандартную или вызываете свое окно фильтрации? От этого зависит, как Вы будете получать значение интересующих Вас переменных перед записыванием их в атрибуты.

"Агутин Алексей" написал:ReportPreviewer.Report.Attributes('StartDate') = new Date().getVarDate().

Ну т.е. в скрипте я пишу

function btnOKOnClick(Control) {
var ReportWork = Services.GetNewItemByUSI('fr_CheckingActWork');
var ReportPrevWork = Services.GetNewItemByUSI('wnd_BaseFastReportPreview');

//-----------------------
var ReportPreviewerComponent = ReportPrevWork.Attributes('ReportPreviewer');
SetAttribute(ReportPrevWork, 'Report', ReportWork);
//-----------------------

var ActsDS = Services.GetNewItemByUSI('ds_CheckingActWork');
var Param = ActsDS.SelectQuery.Parameters;
Param.ItemsByName('AccountID').Value = edAccount.Value;
Param.ItemsByName('SupplierID').Value = edSupplier.Value;
Param.ItemsByName('From').Value = edFrom.Value;
Param.ItemsByName('To').Value = edTo.Value;
ActsDS.Open();

ReportWork.Report.Attributes('MyAccount') = edAccount.Value;

ReportPrevWork.Build();
ReportPrevWork.Prepare();
ReportPreviewerComponent.DatasetByComponentName('ds_CheckingActWork') = ActsDS;
}

А потом в самом отчете просто кидаю текстовый объект c надписью [MyAccount] ??????

Так не работает :(

"Раловец Ольга" написал:А вывести значение StartDate в отчете можно прописав в элементе управления [StartDate]. Уточните, пожалуйста, какую форму фильтрации Вы используете. Настраиваете в сервисе отчета стандартную или вызываете свое окно фильтрации? От этого зависит, как Вы будете получать значение интересующих Вас переменных перед записыванием их в атрибуты.

Свое окно фильтрации

Попробуйте ReportPreviewerComponent.Report.Attributes('MyAccount') = edAccount.Value;

Ура!!!! Получилось вот так!!! Спасибо за выбор пути решения

function btnOKOnClick(Control) {
var ReportWork = Services.GetNewItemByUSI('fr_CheckingActWork');
var ReportPrevWork = Services.GetNewItemByUSI('wnd_BaseFastReportPreview');

//-----------------------
var ReportPreviewerComponent = ReportPrevWork.Attributes('ReportPreviewer');
SetAttribute(ReportPrevWork, 'Report', ReportWork);
//-----------------------

var ActsDS = Services.GetNewItemByUSI('ds_CheckingActWork');
var Param = ActsDS.SelectQuery.Parameters;
Param.ItemsByName('AccountID').Value = edAccount.Value;
Param.ItemsByName('SupplierID').Value = edSupplier.Value;
Param.ItemsByName('From').Value = edFrom.Value;
Param.ItemsByName('To').Value = edTo.Value;
ActsDS.Open();

SetAttribute(ReportWork, 'MyAccount', edAccount.Value);

ReportPrevWork.Build();
ReportPrevWork.Prepare();
ReportPreviewerComponent.DatasetByComponentName('ds_CheckingActWork') = ActsDS;
}

Упс.... сейчас другой встал вопрос - в переменной [MyAccount] находится идентификатор... Можно ли по нему получить имя контрагента?

Если это LookupControl, то edtAccount.LookupDatasetLink.Dataset('Name').

Ольга, огромное спасибо :)

Не за что :)

А как можно передать некое значение в отчет, который вызывается с помощью ShowSingleRecordReport('fr_Report', 'ds_Report', ID) в обработчике напр. btnOkOnClick ?
При создании ds_Report в вычислемого поля в его изменить не удаётся:sad:

Можно отредактировать функцию ShowSingleRecordReport, добавив в неё нужное Вам значение, а потом передать его отчёту через атрибуты:

function ShowSingleRecordReport(ReportCode, FilteredDatasetCode, GridDatasetID, ValueForReport) {
var Report = Services.GetNewItemByUSI(ReportCode);
var ReportPreviewer = Services.GetNewItemByUSI('wnd_BaseFastReportPreview');
var ReportPreviewerComponent = ReportPreviewer.Attributes('ReportPreviewer');
ReportPreviewer.Attributes('ValueForReport') = ValueForReport;

var ReportDataset = Services.GetNewItemByUSI(FilteredDatasetCode);
SetAttribute(ReportPreviewer, 'Report', Report);
ApplyDatasetFilter(ReportDataset, 'ID', GridDatasetID, true);
ReportPreviewer.Build();
ReportPreviewer.Prepare();
ReportPreviewerComponent.DatasetByUSI(FilteredDatasetCode) = ReportDataset;
}

Либо же создать свою функцию по аналогии с ShowSingleRecordReport.

Олег Лабьяк,
разработчик,
3-я линия Службы поддержки Terrasoft.

Заработало, если только вместо

ReportPreviewer.Attributes('ValueForReport') = ValueForReport;
Report.Attributes('ValueForReport') = ValueForReport;

Спасибо!

"Раловец Ольга" написал:Уточните, пожалуйста, какую форму фильтрации Вы используете. Настраиваете в сервисе отчета стандартную или вызываете свое окно фильтрации? От этого зависит, как Вы будете получать значение интересующих Вас переменных перед записыванием их в атрибуты.

А можно пример передачи параметров в отчет при использовании стандартной формы фильтрации?

UPD: Поспешил:razz: Нашел вот здесь [url]http://community.terrasoft.ua/forum/topic/1210[/url]

В случае стандартной формы фильтрации параметры в отчёт можно передавать при обработке событий OnPrepare или OnPreview отчёта.

Если Вы хотите в отчёт передать значения из стандартной формы фильтрации, необходимо в обработчик события btnOKOnClick скрипта wnd_ReportFiltersScript после выполнения fbcMain.ApplyFilter() добавить строчку:

Self.Attributes('NotifyObject').Attributes('ReportPreviewer').FilterWindow = Self;

После этого в обработчике события OnPreview отчёта Вы сможете обратиться к окну фильтрации и его свойству FiltersBuilder так:

var FilterWindow = ReportPreviewer.FilterWindow;
var FiltersBuilder = FilterWindow.ComponentsByName('fbcMain').FiltersBuilder;

Через эти объекты появится возможность получить значения, которые пользователь укажет в окне фильтрации.

Олег Лабьяк,
разработчик,
3-я линия Службы поддержки Terrasoft.

"Лабьяк Олег Игоревич" написал:После этого в обработчике события OnPreview отчёта Вы сможете обратиться к окну фильтрации и его свойству FiltersBuilder

А если нужно использовать данные ещё для некоторых вычислений, т.е. хотелось внести передаваемые параметры в датасет отчёта?

Во время обработки события OnPreview отчёта у Вас уже доступно окно фильтрации вместе с фильтрами и их значениями, указанными пользователем. Также есть возможность получить любой датасет отчёта:

var ReportDataset = ReportPreviewer.DatasetByUSI(ReportDatasetUSI);

Олег Лабьяк,
разработчик,
3-я линия Службы поддержки Terrasoft.

А можно поподробнее описать как в wnd_ReportFiltersScript
передать значение, например "fbcMain.DataFieldsList.Items(0).DisplayValue", и получить его в обработчике OnPreview?
А то уже пальцы стер с вариантами:confused:

Попробуйте ReportPreviewer.FilterWindow.ComponentsByName('fbcMain').DataFieldsList.Items(0).DisplayValue

Должно сработать, если Вы в скрипте wnd_ReportFiltersScript установили свойство FilterWindow для ReportPreviewer, как я рекомендовал в посте за 24 февраля.

Олег Лабьяк,
разработчик,
3-я линия Службы поддержки Terrasoft.

Да, так получилось для дат.
По ходу выполнения появились ещё два вопроса:
1.Для фильтра по полю справочника при DataFieldsList.Items(х).DisplayValue - поле для отображения из датасета(так и должно быть)
а если узнать ID = DataFieldsList.Items(х).Values - пустое поле..
2.Полученные значения нужно внести в вычисляемое поле датасета отчета:

var ReportDataset = ReportPreviewer.DatasetByUSI('ds_MyReport');
ReportDataset.DisableEvents();
try {
ReportDataset.Values('DateFrom') = DateFrom.getVarDate();
ReportDataset.Post();
} finally {
ReportDataset.EnableEvents();
}

Ошибка: Невозможно изменить значение вычисляемого поля.

По первому вопросу - у меня работает так:

ReportPreviewer.FilterWindow.ComponentsByName('fbcMain').DataFieldsList.Items(0).Values.Items(0);

В результате получаем нужное значение ID. Также доступны значения

ReportPreviewer.FilterWindow.ComponentsByName('fbcMain').DataFieldsList.Items(0).Values.CommaText;
ReportPreviewer.FilterWindow.ComponentsByName('fbcMain').DataFieldsList.Items(0).Values.Text;

из которых можно получить ID выбранных значений.

Что касается второго вопроса - может быть, будет лучше передавать значение не в вычисляемое поле, а через параметр отчёта? Насколько я вижу, данные у Вас не зависят от полей датасета, а приходят извне, поэтому вполне можно обойтись параметрами.

Если же параметров отчёта недостаточно, попробуйте так:

ReportDataset.DisableEvents();
try {
ReportDataset.Open();
... <Ваши действия>
ReportDataset.Attributes(AttributeName) = AttributeValue;
ReportDataset.CalcDataFields();
} finally {
ReportDataset.Close();
ReportDataset.EnableEvents();
}

В обработчике события OnDatasetCalcFields заполняем вычисляемые поля:

function ds_AccountsListOnDatasetCalcFields(Dataset) {
	Dataset.Values(CalcFieldName) = Dataset.Attributes(AttributeName);
}

Олег Лабьяк,
разработчик,
3-я линия Службы поддержки Terrasoft.

Всем доброго времени суток!
Подскажите, как передать ID выделенного документа в отчёт???

Нужно отчет зарегистрировать в разделе "Отчеты", указать, что он должен показываться в разделе "Документы" и указать способ вызова "для выделенных записей".

Спасибо:) работает

Прошу прощения, а как передать в отчёт даты из Workspace(dlDatePeriod).
У меня есть счета отфильтрированные за текущую неделю в разделе(еженедельный отчёт).
Как мне в отчёте отобразить за какую неделю этот отчёт, без использования доп окна фильтрации.
тобишь dlDatePeriod.Dataset.Values('From') и dlDatePeriod.Dataset.Values('From').
Заранее благодарен за ответ.

В меню "Отчеты" пункты добавляются динамически и вызывается базовый обработчик нажатия на них. Предлагаю исхитриться и при формировании этого списка (возможно, он формируется при первом обращении к меню) переопределить обработчик нажатия пункта меню, соответствующего Вашему отчету, и описать его в скрипте текущего раздела, то есть вместо стандартного вызвать свой. А в нем вызвать ShowReport(), ShowSingleRecordReport() или ShowSelectedRecordsReport() из scr_ReportUtils, смотря какая больше подойдет, но перед ее вызовом передать Ваши даты аналогичным образом:

ReportPreviewer.Attributes('ValueForReport') = ValueForReport;

Сама такой вариант не пробовала реализовывать, но предполагаю, что должно получиться.

список отчётов формируеться динамически при помощи скритого пукта Action Menu, но никто не мешает рядом добавить свой пункт вручную через редактирование форкспейса в администраторе.
Создал в воркспейсе свой пункт отчёта и прописал на него следуйщее

function amiSTIOnExecute(ActionMenuItem, Sender) {
 var SelItemsID = [ListToArray(Self.ComponentsByName('wndGridData').Window.ComponentsByName('grdData').SelectedIDs)];
 ShowSelectedRecordsSTIReport('fr_ReportSTI', 'ds_ReportAirticketsCard', SelItemsID, dtcFromDate.Value, dtcToDate.Value);	
}

при єтом функция ShowSelectedRecordsSTIReport получает два параметра dtcFromDate.Value, dtcToDate.Value и обрабатывает их следующим образом:

function ShowSelectedRecordsReport(ReportCode, FilteredDatasetCode,
	GridDatasetIDs, FromDate, ToDate) {
	var Report = Services.GetNewItemByUSI(ReportCode);
	var ReportPreviewer = Services.GetNewItemByUSI('wnd_BaseFastReportPreview');
	var ReportPreviewerComponent = ReportPreviewer.Attributes('ReportPreviewer');

ReportPreviewer.Attributes('DateFrom') = FromDate;
ReportPreviewer.Attributes('DateTo') = ToDate;

        var ReportDataset = Services.GetNewItemByUSI(FilteredDatasetCode);
	SetAttribute(ReportPreviewer, 'Report', Report);	
	var Select = GetSelectQueryPrimarySelect(ReportDataset.SelectQuery);
	var Filters = Select.Filters;
	Filter = Filters.ItemsByCode('IDs');
	if (!Assigned(Filter)) {
	    Filter = Filters.CreateIncludeFilter();
	    Filter.Code = 'IDs';
	    Filters.Add(Filter);
		Filter.TestExpression =
			Filter.CreateFieldFilterExpression();
		Filter.TestExpression.TableAlias =
			Select.FromTableAlias;
		Filter.TestExpression.Field =
			Select.FromTable.Fields.ItemsByName('ID');
	}
	var Enabled = (GridDatasetIDs.length > 0);
	ApplyDatasetIncludeFilter(ReportDataset, 'IDs', GridDatasetIDs, Enabled);		
	ReportPreviewer.Build();
	ReportPreviewer.Prepare();
	ReportPreviewerComponent.DatasetByUSI(FilteredDatasetCode) = ReportDataset;
}

Но если я вписываю в отчёте [DateFrom] и [DateTo], - отчёт открывается с ошибкой неизвестного определителя [DateFrom] и [DateTo]

Александр, добрый день.
Вы почти всё сделали правильно, за исключением строк, в которых присваиваете отчёту атрибуты.
Вместо:

ReportPreviewer.Attributes('DateFrom') = FromDate;
ReportPreviewer.Attributes('DateTo') = ToDate;

нужно написать:

Report.Attributes('DateFrom') = FromDate;
Report.Attributes('DateTo') = ToDate;

Пожалуйста, обратите внимание на комментарий Fishi от 15 февраля 2010 - 17:03.
Желаю успехов!

Спасибо Дмитрий, но пробовал делать как написано в комментарии от Fishi, - приводит к ошибке.
К тому же при множественном выборе возникает другая ошибка. Скрин во вложении.

В таком случае вставляйте первой строкой в функции ShowSelectedRecordsReport слово debugger, запускайте систему и отчёт и отлаживайтесь построчно.
Функции ToArray в стандартной версии не нашёл.
Есть предположение, что вместо строки:
var SelItemsID = [ToArray(Self.ComponentsByName('wndGridData').Window.ComponentsByName('grdData').SelectedIDs)];
нужно написать:
var SelectedIDs = wndGridData.Window.ComponentsByName('grdData').SelectedIDs;
var SelItemsID = GetArrayByCollection(SelectedIDs);

Только отладка построчно с просмотром значений в переменных подскажет, где ошибка. Идеологически путь передачи параметров выбран правильный.

"Гамора Дмитрий" написал:Функции ToArray в стандартной версии не нашёл

Сорри, копипаст глюконул :smile:- ListToArray();
Дебаггер подтвердил длинну массива 2 - и два индификатора в обработчике ShowSelectedRecordsReport.
Так же пришлось даты определить как:

 var DateFrom = dlDatePeriod.Dataset.Values('From');
 var DateTo = dlDatePeriod.Dataset.Values('To');

а не

var DateFrom = dtcFromDate.Value
var DateTo = dtcToDate.Value

И в результате вторая ошибка с Передачей параметров в отчёт исчезла(Передавались пустые даты).
Осталась только первая ошибка с множественным выбором.

Может нужно добавить инклуд фильтр IDs, но вроде он должен сам создаваться.Завтра отпишусь.

upd:Первая ошибка исчезла после замены:

"Гамора Дмитрий" написал:Есть предположение, что вместо строки:
var SelItemsID = [ListToArray(Self.ComponentsByName('wndGridData').Window.ComponentsByName('grdData').SelectedIDs)];
нужно написать:
var SelectedIDs = wndGridData.Window.ComponentsByName('grdData').SelectedIDs;
var SelItemsID = GetArrayByCollection(SelectedIDs);

При этом странно то, что в дебаггере после этой замены ни чего не поменялось, по прежнему:
длинна массива 2 - и два индификатора.
Дмитрий и Ольга спасибо за помощь в отладке).

Можно ли считать, что вопрос успешно решён?

Да, вопрос успешно решён.
Ещё раз спасибо.

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