Добрый день

Возникла сложность в переносах строк из поля Notes при печати отчета в FastReport.

так выглядит в приложении

Изображение удалено.

Так выглядит в БД, если делать выбор в текст

Изображение удалено.

Обратываю в FastReport

Cell24.Text = ((String)Report.GetColumnValue("EPMAccountChk.EPMNotes"))
.Replace("<div>","")
.Replace("</div>","")
.Replace("strong","b")
.Replace("em","i");

Сама ячейка имеет значение свойства TextRenderType = HtmlParagraph

Получаю на выходе

Изображение удалено.

В принципе как в БД, не придраться, Но не так как на экране.

Если отключить мои замены и свойство TextRenderType перевести в Default, то вообще получаю полное соответсвие БД

Изображение удалено.

Если свойство TextRenderType оставить равным HtmlParagraph, и не делать замен, то получим:

Изображение удалено.

Если свойство TextRenderType сделать равным HtmlTags, и не делать замен, то получим:

Изображение удалено.

Вопрос. Как сделать отображение как на экране в приложении? Как избавится от лишних переносов?

Нравится

3 комментария
Лучший ответ

Ура! Нашел. Метод, "если не можешь найти что делать - пробуй все подряд" работает))

Начал заменять подряд все комбинации "\n\r", "\r\n", "\n", "\r". Нашел.  Это не \n\r как ожидалось, а просто \n. после первой и второй стоки \n\n, в конце просто \n. В итоге делаю следующее:

Cell24.Text = ((String)Report.GetColumnValue("EPMAccountChk.EPMNotes"))
	.Replace("&lt;div&gt;","")
	.Replace("&lt;/div&gt;","")
	.Replace("strong","b")
	.Replace("em","i")
	.Replace("\n\n","&lt;br&gt;")
	.Replace("\n","");

и свойство TextRenderType = HtmlParagraph

Вам нужно удалить спец символы это перенос строки и каретку, как правило они обозначаются одним из следующих способов:

\n\r - C#

CHAR(10) и CHAR(13) - SQL

#10#13 - делфи если память не изменяет.



Посмотрите, что у вас в fastreport используется и добавить replace спец символа в ваш код 

Литвинко Павел,

Это первое, что пробовал. Забыл написать об этом.

Ура! Нашел. Метод, "если не можешь найти что делать - пробуй все подряд" работает))

Начал заменять подряд все комбинации "\n\r", "\r\n", "\n", "\r". Нашел.  Это не \n\r как ожидалось, а просто \n. после первой и второй стоки \n\n, в конце просто \n. В итоге делаю следующее:

Cell24.Text = ((String)Report.GetColumnValue("EPMAccountChk.EPMNotes"))
	.Replace("&lt;div&gt;","")
	.Replace("&lt;/div&gt;","")
	.Replace("strong","b")
	.Replace("em","i")
	.Replace("\n\n","&lt;br&gt;")
	.Replace("\n","");

и свойство TextRenderType = HtmlParagraph

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

Доброго дня.

Очень нужна помощь в настройке отчета FastReport. Делаю первый раз и пока не очень то получается.

Почему FastReport - потому что надо PDF и расширений покупать не будем. Имеем отчет по одной записи. Т.е. провайдер данных нам всегда будет только 1 строку. Табличных данных нет. Только текст заключение. Надо при установке галочек в Creatio вывести на печать локализируемые строки соответствующие этим галочкам. В запросе настроили и данные и локализируемые строки. Все данные приходят - это видно по отладчику. 

Теперь делаем форму. Вот она. Красным выделено 5 строк которые соответствуют 5ти галочкам. Они называются в отчете Text_Stop0#

Изображение удалено.

в коде отчета в FastReport пишем :

    private void ReportTitle1_BeforePrint(object sender, EventArgs e)
    {
      if (!((Boolean)Report.GetColumnValue("EPMAccountChk.EPMStop_01")))
      {
        Text_Stop01.Visible=false;      
      }
      if (!((Boolean)Report.GetColumnValue("EPMAccountChk.EPMStop_02")))
      {
        Text_Stop02.Visible=false;   
      }
      if (!((Boolean)Report.GetColumnValue("EPMAccountChk.EPMStop_03")))
      {
        Text_Stop03.Visible=false;    
      }
      if (!((Boolean)Report.GetColumnValue("EPMAccountChk.EPMStop_04")))
      {
        Text_Stop04.Visible=false;                    
      }
      if (!((Boolean)Report.GetColumnValue("EPMAccountChk.EPMStop_05")))
      {
        Text_Stop05.Visible=false;    
      }
    }    

Т.е. если галочка не стоит, то скрываем это поле.

Если стоят все галочки, то печатаем все. Это отлично работает

Изображение удалено.

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

Изображение удалено.

 

Как его убрать и поднять все строки, что ниже? Это еще не конец отчета и будет еще строки.

Также пробовал через блэнд Data. Привязывал его и LocalizableStrings и к своей схеме, но почему в этом случае вообще ничего не выводится. 

Нравится

1 комментарий
Лучший ответ

Попробуйте добавить не как отдельные поля, а в таблицу FastReport, и для её строк установите параметр AutoSize=true

Попробуйте добавить не как отдельные поля, а в таблицу FastReport, и для её строк установите параметр AutoSize=true

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

Коллеги, добрый день.

Заказчик разработал рекламное письмо с pdf-ной подложкой и с элементами ссылок в виде кружочков с ссылками на соцсети: VK, Одноклассники, facebook и т.п.

Позволяет  ли fastreport в отчете формата pdf, получить ссылки на соцсети, после вывода отчета в файл?

т.е. можно ли кружочек сделать в виде ссылки и в сформированном отчете, перейти по этой ссылки

Спасибо.

Нравится

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

Марина, в дизайнере отчётов у текста или картинки есть свойство «Hyperlink», там можно настроить ссылку.

 

Но эта функциональность ещё не тестировалась, не во всех случаях может работать. Обычная ссылка-константа у меня добавилась:

Александр, спасибо

 

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

Делаю отчет в FastReport по аналогии со статьей в Академии. 

https://academy.terrasoft.ru/documents/technic-sdk/7-16/primer-nastroyki-otcheta



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

Источники данных.

{
    "ProviderName": "MortgageConclusionDataProvider",
    "Schemas": {
        "MortgageConclusionData": {
            "GroupName": {"DataValueType": 1},
            "Account": {"DataValueType": 1},
            "PreparationDate": {"DataValueType": 7},
            "ConclusionType": {"DataValueType": 1}
        },
        "LevelSecurityData": {
            "MortgageConclusion": {"DataValueType": 0},
            "SublimitTypes": {"DataValueType": 0},
            "NameSublimitTypes": {"DataValueType": 1},
            "Groupe": {"DataValueType": 1},
            "TargetUse": {"DataValueType": 1},
            "AmountLimit": {"DataValueType": 5}
        },
        "LocalizableStrings": {
            "ReportTitle": {"DataValueType": 1},
            ...
        }
    }
}



В сервисе прописываю логику:

 

public Task<ReportDataDictionary> GetData(UserConnection userConnection, IReadOnlyDictionary<string, object> parameters) {
            var filter = ExtractFilterFromParameters(userConnection, _entitySchemaUId, parameters);
            var result = new ReportDataDictionary {
                // Заполнить колонки в отчете.
                ["MortgageConclusionData"] = GetMortgageConclusionData(userConnection, _entitySchemaUId, filter),
                ["LevelSecurityData"] = GetLevelSecurityData(userConnection, _entityLevelSecuritySchemaUId),
                ["LocalizableStrings"] = GetLocalizableStrings(userConnection)
            };
            return Task.FromResult(result);
        }

И при формировании отчета ошибка 

 Error while sending request 

    response status: 500 (Internal Server Error)

    request url: ...FastReportService/CreateReport

    method: POST

    request data: {"reportTemplateId":"a1c1f160-a7c2-56a0-edcb-1101dde5a74e","reportCaption":"Заключение","reportSchemaName":"MortgageConclusion","report...

Через Profiler запросы сформировались, данные есть.

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

Спасибо!

Нравится

6 комментариев
Лучший ответ

Судя по сообщению из логов, второе исключение происходит в схеме FastReportService, в функции:

[Obsolete("7.15.3")]
[OperationContract]
[WebGet(UriTemplate = "GetReportFile/{key}")]
public Stream GetReportFile(string key) {
	var data = PopFromSessionData(key);
	string contentDisposition = "attachment; filename*=UTF-8''" + data.Key;
	var reportStream = new MemoryStream(data.Value);
	WebResponseProcessor.AssignFileResponseContent(HttpContextAccessor.GetInstance(), "application/pdf; charset=UTF-8", reportStream.Length, contentDisposition);
	return reportStream;
}
 
private KeyValuePair&lt;string, byte[]&gt; PopFromSessionData(string sessionKey) {
	var data = (KeyValuePair&lt;string, byte[]&gt;)UserConnection.SessionData[sessionKey];
	UserConnection.SessionData.Remove(sessionKey);
	return data;
}

То есть падает не внутри Вашего кода отчёта, а при попытке скачать с сервера файл отчёта, вместо него пусто. Отчёт перед этим уже должен был создаться в CreateReport, а в ней происходит первое исключение. Но в этой функции любые ошибки обрабатывает общий блок try:

[Obsolete("7.15.3")]
[OperationContract]
[WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped)]
public string CreateReport(Guid reportTemplateId, string reportCaption, string reportSchemaName, string reportFilters) {
	try {
		var reportParameters = new Dictionary&lt;string, object&gt; {
			["EsqFilters"] = new Dictionary&lt;string, Filters&gt; {
				[reportSchemaName] = JsonConvert.DeserializeObject&lt;Filters&gt;(reportFilters)
			}
		};
		var reportBytes = InternalCreateReport(reportTemplateId, reportParameters);
		return PushToSessionData(new KeyValuePair&lt;string, byte[]&gt;($"{HttpUtility.UrlPathEncode(reportCaption)}.pdf", reportBytes));
	} catch (Exception exception) {
		throw new WebFaultException&lt;FastReportGenerationException&gt;(
			new FastReportGenerationException(exception),
			HttpStatusCode.InternalServerError);
	}
}

Получается, чтобы увидеть, где именно упало при генерации отчёта, нужно для теста убрать этот try, чтобы видеть дальнейший стек вызовов и настоящую ошибку.

 

А у Вас response status: 500 только на конкретном отчёте, который разрабатываете, на остальных нормально?

 

По поводу примеров, кроме описанного в академии, в системе есть ещё стандартные «Знаменательные события контакта» и «Полнота наполнения данными». В первом — несколько источников и схема ContactAnniversariesReportDataProvider, в ней интересующая Вас функция:

public Task&lt;ReportDataDictionary&gt; GetData(UserConnection userConnection,
    IReadOnlyDictionary&lt;string, object&gt; parameters) {
    var contactFilter = ExtractFilterFromParameters(userConnection, _contactEntitySchemaUId, parameters);
    var result = new ReportDataDictionary {
        ["Contact"] = GetContactData(userConnection, _contactEntitySchemaUId, contactFilter),
        ["ContactAnniversary"] = GetContactAnniversaryData(userConnection, _contactAnniversaryEntitySchemaUId,
            contactFilter),
        ["LocalizableStrings"] = GetLocalizableStrings(userConnection)
    };
    return Task.FromResult(result);
}

 Но обратите внимание, выше в коде есть сами функции GetContactData и GetContactAnniversaryData, получающие из базы коллекцию данных с указанным фильтром.

Елена, ошибка 500 происходит на сервере, то есть в логах должна быть более подробная информация, где именно в коде она возникает.

Зверев Александр,

2020-08-05 18:06:11,849 [192] ERROR  Terrasoft.Web.Common.ServiceModel.ErrorHandler ProvideFault - Internal Server Error
System.ServiceModel.Web.WebFaultException`1[Terrasoft.Configuration.Reporting.FastReport.FastReportGenerationException]: Internal Server Error (Дополнительные сведения об ошибке — Terrasoft.Configuration.Reporting.FastReport.FastReportGenerationException: Error during report generation).
2020-08-05 18:06:11,864 [192] ERROR  Terrasoft.WebApp.FileWebEventProvider RaiseInternal - Date: 05.08.2020 18:06:11
Date (UTC): 05.08.2020 15:06:11
 
Exception Message: Internal Server Error
Exception Type: System.ServiceModel.Web.WebFaultException`1[Terrasoft.Configuration.Reporting.FastReport.FastReportGenerationException]
Exception Source: Terrasoft.Configuration
 
Exception Stack Trace:
   в Terrasoft.Configuration.Reporting.FastReport.FastReportService.CreateReport(Guid reportTemplateId, String reportCaption, String reportSchemaName, String reportFilters)
   в SyncInvokeCreateReport(Object , Object[] , Object[] )
   в System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance, Object[] inputs, Object[]&amp; outputs)
   в System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc&amp; rpc)
   в System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc&amp; rpc)
   в System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage11(MessageRpc&amp; rpc)
   в System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)
 
SessionID: xxiqbf2pqlqi4uvge2vbjffb
Request URL: /0/rest/FastReportService/CreateReport
Request Path: /0/rest/FastReportService/CreateReport
Request UrlReferrer: http://192.168.222.228:82/0/Nui/ViewModule.aspx
Request Type: POST
User Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36
User Host Address: 192.168.10.131
User: Supervisor
Is Authenticated: True
Authentication Type: Forms
Is Secure Connection: False
 
Application Version: 7.16.0.4449
 
Application Virtual Path: /0
Application Trust Level: Full
 
Is Local: False
 
Process ID: 3988
Process Name: w3wp.exe
OS Version: Microsoft Windows NT 10.0.14393.0
Net Framework Version: 4.0.30319.42000
DBExecutor Type: MSSqlExecutor
 
&lt;--&gt;
 
2020-08-05 18:06:11,880 [192] ERROR  Terrasoft.Web.Common.ServiceModel.ErrorHandler HandleError - Internal Server Error
System.ServiceModel.Web.WebFaultException`1[Terrasoft.Configuration.Reporting.FastReport.FastReportGenerationException]: Internal Server Error (Дополнительные сведения об ошибке — Terrasoft.Configuration.Reporting.FastReport.FastReportGenerationException: Error during report generation).
2020-08-05 18:06:11,974 [192] ERROR  Terrasoft.Web.Common.ServiceModel.ErrorHandler ProvideFault - Ссылка на объект не указывает на экземпляр объекта.
System.NullReferenceException: Ссылка на объект не указывает на экземпляр объекта.
   в Terrasoft.Configuration.Reporting.FastReport.FastReportService.PopFromSessionData(String sessionKey)
   в Terrasoft.Configuration.Reporting.FastReport.FastReportService.GetReportFile(String key)
   в SyncInvokeGetReportFile(Object , Object[] , Object[] )
   в System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance, Object[] inputs, Object[]&amp; outputs)
   в System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc&amp; rpc)
   в System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc&amp; rpc)
   в System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage11(MessageRpc&amp; rpc)
   в System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)
2020-08-05 18:06:11,974 [192] ERROR  Terrasoft.WebApp.FileWebEventProvider RaiseInternal - Date: 05.08.2020 18:06:11
Date (UTC): 05.08.2020 15:06:11
 
Exception Message: Ссылка на объект не указывает на экземпляр объекта.
Exception Type: System.ServiceModel.FaultException`1[System.NullReferenceException]
Exception Source: 
 
Exception Stack Trace:
 
 
SessionID: xxiqbf2pqlqi4uvge2vbjffb
Request URL: /0/rest/FastReportService/GetReportFile/undefined
Request Path: /0/rest/FastReportService/GetReportFile/undefined
Request Type: GET
User Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36
User Host Address: 192.168.10.131
User: Supervisor
Is Authenticated: True
Authentication Type: Forms
Is Secure Connection: False
 
Application Version: 7.16.0.4449
Application Virtual Path: /0
Application Trust Level: Full
Is Local: False
 
Process ID: 3988
Process Name: w3wp.exe
OS Version: Microsoft Windows NT 10.0.14393.0
Net Framework Version: 4.0.30319.42000
DBExecutor Type: MSSqlExecutor
 
&lt;--&gt;
 
2020-08-05 18:06:11,989 [192] ERROR Terrasoft.Web.Common.ServiceModel.ErrorHandler HandleError - Ссылка на объект не указывает на экземпляр объекта.
System.NullReferenceException: Ссылка на объект не указывает на экземпляр объекта.
   в Terrasoft.Configuration.Reporting.FastReport.FastReportService.PopFromSessionData(String sessionKey)
   в Terrasoft.Configuration.Reporting.FastReport.FastReportService.GetReportFile(String key)
   в SyncInvokeGetReportFile(Object , Object[] , Object[] )
   в System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance, Object[] inputs, Object[]&amp; outputs)
   в System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc&amp; rpc)
   в System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc&amp; rpc)
   в System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage11(MessageRpc&amp; rpc)
   в System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)

 

Зверев Александр,

Куда смотреть, что проверять?)

 

Судя по сообщению из логов, второе исключение происходит в схеме FastReportService, в функции:

[Obsolete("7.15.3")]
[OperationContract]
[WebGet(UriTemplate = "GetReportFile/{key}")]
public Stream GetReportFile(string key) {
	var data = PopFromSessionData(key);
	string contentDisposition = "attachment; filename*=UTF-8''" + data.Key;
	var reportStream = new MemoryStream(data.Value);
	WebResponseProcessor.AssignFileResponseContent(HttpContextAccessor.GetInstance(), "application/pdf; charset=UTF-8", reportStream.Length, contentDisposition);
	return reportStream;
}
 
private KeyValuePair&lt;string, byte[]&gt; PopFromSessionData(string sessionKey) {
	var data = (KeyValuePair&lt;string, byte[]&gt;)UserConnection.SessionData[sessionKey];
	UserConnection.SessionData.Remove(sessionKey);
	return data;
}

То есть падает не внутри Вашего кода отчёта, а при попытке скачать с сервера файл отчёта, вместо него пусто. Отчёт перед этим уже должен был создаться в CreateReport, а в ней происходит первое исключение. Но в этой функции любые ошибки обрабатывает общий блок try:

[Obsolete("7.15.3")]
[OperationContract]
[WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped)]
public string CreateReport(Guid reportTemplateId, string reportCaption, string reportSchemaName, string reportFilters) {
	try {
		var reportParameters = new Dictionary&lt;string, object&gt; {
			["EsqFilters"] = new Dictionary&lt;string, Filters&gt; {
				[reportSchemaName] = JsonConvert.DeserializeObject&lt;Filters&gt;(reportFilters)
			}
		};
		var reportBytes = InternalCreateReport(reportTemplateId, reportParameters);
		return PushToSessionData(new KeyValuePair&lt;string, byte[]&gt;($"{HttpUtility.UrlPathEncode(reportCaption)}.pdf", reportBytes));
	} catch (Exception exception) {
		throw new WebFaultException&lt;FastReportGenerationException&gt;(
			new FastReportGenerationException(exception),
			HttpStatusCode.InternalServerError);
	}
}

Получается, чтобы увидеть, где именно упало при генерации отчёта, нужно для теста убрать этот try, чтобы видеть дальнейший стек вызовов и настоящую ошибку.

 

А у Вас response status: 500 только на конкретном отчёте, который разрабатываете, на остальных нормально?

 

По поводу примеров, кроме описанного в академии, в системе есть ещё стандартные «Знаменательные события контакта» и «Полнота наполнения данными». В первом — несколько источников и схема ContactAnniversariesReportDataProvider, в ней интересующая Вас функция:

public Task&lt;ReportDataDictionary&gt; GetData(UserConnection userConnection,
    IReadOnlyDictionary&lt;string, object&gt; parameters) {
    var contactFilter = ExtractFilterFromParameters(userConnection, _contactEntitySchemaUId, parameters);
    var result = new ReportDataDictionary {
        ["Contact"] = GetContactData(userConnection, _contactEntitySchemaUId, contactFilter),
        ["ContactAnniversary"] = GetContactAnniversaryData(userConnection, _contactAnniversaryEntitySchemaUId,
            contactFilter),
        ["LocalizableStrings"] = GetLocalizableStrings(userConnection)
    };
    return Task.FromResult(result);
}

 Но обратите внимание, выше в коде есть сами функции GetContactData и GetContactAnniversaryData, получающие из базы коллекцию данных с указанным фильтром.

Зверев Александр,

Спасибо за помощь, 

«Знаменательные события контакта» нашла, сделала полностью по аналогии. Та же ошибка.

Ошибка исчезает, как только убираю второй источник данных(

Может быть дело в версии, отчет на 16.1 - наша 16.0...

Если дело в версии, зарегистрируйте тестовый сайт и проверьте такое же там.

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

Добрый день!

Помогите с выводам суммы в fastreport 

Ест тег [Goods1."SumDiscounted"]  выводит сумму формате 9 500,00

Как убрать из этого вывода ,00 

Формат %g не помог

 

 

Нравится

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

Судя по стандартному отчёту «Полнота наполнения данными (пример)», там в схеме ContactDataEntryComplianceDataSourceDataProvider просто сделали все числовые колонки типа int, при необходимости выполняя округление. Если дробная часть не важна, можно поступить аналогично.

  private IEnumerable&lt;IReadOnlyDictionary&lt;string, object&gt;&gt; GetCompletnessData(
    UserConnection userConnection,
    Guid entitySchemaUId,
    IEntitySchemaQueryFilterItem filter) {
   var entitySchema = userConnection.EntitySchemaManager.GetInstanceByUId(entitySchemaUId);
   var recordCount = GetRecordCount(userConnection, entitySchemaUId, filter);
   return entitySchema.Columns
    .Where(column =&gt; !CanSkipColumn(column))
    .Select(entitySchemaColumn =&gt; {
     var filledColumnRowCount = GetFilledColumnRowCount(userConnection, entitySchema, entitySchemaColumn, filter);
     return new Dictionary&lt;string, object&gt; {
      ["ColumnName"] = entitySchemaColumn.Caption.ToString(),
      ["PercentageFilledIn"] =
       (int)Math.Round((double)filledColumnRowCount / (recordCount == 0 ? 1 : recordCount) * 100, 0),
      ["FilledIn"] = filledColumnRowCount,
      ["NotFilledIn"] = recordCount - filledColumnRowCount
     };
    })
    .OrderByDescending(x =&gt; x["PercentageFilledIn"])
    .ThenBy(x =&gt; x["ColumnName"]);
  }

 

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

Добрый день! Не могу разобраться почему не работает созданный мною отчет через FastReport. Отчет создавал по примеру из академии, создал схему типа "исходный код" с именем "CHShipmentDataSourceCode". После сохранения указал источник данных, и после смог скачать файл типа *.frx, где в настройках были доступны все созданные ранее поля. Но после того как я выбираю любую погрузку, и нажимаю кнопку "Печать", выбивает ошибка типа "Ошибка:Неполадка сервера". При этом в системе есть ещё 2 отчета, они загружаются без ошибки сервера

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

Прикрепленные файлы

Нравится

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

Илья, а что пишется в самом pdf-файле, который сгенерировался?

Также, если есть доступ к серверу, посмотрите в журнале ошибок, что пишет в момент формирования отчёта.

 

Зверев Александр,

файл открыть нельзя, он не выгружается вообще, в консоли выбивает ошибку поля "ReportTitle", скрин прикрепляю

Судя по сообщению, что-то не то с локализируемыми строками. Вы их указали в настройках источника данных отчёта? Они реально добавлены в схеме с кодом?

Зверев Александр,

В локализированых строках эта строка заголовка есть, в коде тоже

А в источнике данных?

Зверев Александр,

тоже там указано поле

Возможно, Вы используете значение параметра ReportTitle в логике внутри отчёта, а там нельзя передавать параметр типа «локализируемая строка» таим образом? Сравните, как с ним работают в стандартном отчёте, могут быть отличия.

Зверев Александр,

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

Если ReportTitle убрали отовсюду, то падать должно на чём-то другом.

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

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

Добрый день, вопрос очевидно к DevLabs, по приложению

Advanced excel reports for Creatio. Платформа разумеется on-site.

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

С чем это может быть связано?

Нравится

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

Руслан, добрый день!

 

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

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

Ирина Лазоренко, попробовал повторить данную операцию непосредственно с рабочего места - выдаёт такую же ошибку, при том, если указывать путь на локальный диск - ошибку о формировании не выдаёт, но в конечной папке файл отчёта не появляется. Это может быть связано с версией Creatio (7.13?)

Ирина Лазоренко, не знаю, к Вам ли вопрос, ещё при попытке задать период для фильтрации данных в отчёт, если подтянуть  последний параметр на скриншоте (до сегодня >= 7:30), то отчёт формируется пустой

Шарифуллин Руслан,

 

по доступу еще уточняю. По фильтрам выполните следующую проверку: укажите такие же фильтры в разделе и проверьте результаты. Это скорее все базовая логика работы фильтров.

Ирина Лазоренко,

 Вы правы, такие параметры фильтрации не срабатывают и в разделе

Руслан, статья о фильтрах по датам есть тут. Мне кажется, указание точного времени работает независимо от указания даты и отсеивает моменты за любую дату до 7:30, промежуток не получится.

 

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

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

Добрый день!

Есть Террасофт 3.3.2

Не понятно как вывести стандартную форму фильтрации для отчета FastReport и как указать в это форме по каким поля фильтровать

Нравится

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

См., как сделано в стандартном отчёте «Взаиморасчеты», используемом в разделах «Контрагенты» и «Операции». Там есть карточка wnd_MutualSettlements, в её скрипте wnd_MutualSettlementsScript при нажатии «ОК» срабатывает код, где налагаются фильтры и запускается отчёт:

function btnOkOnClick(Control) {
	if (edtStartDate.IsNull || edtDueDate.IsNull) {
		ShowWarningDialog("Поле \"Дата с\" и \"дата по\" являются обязательным для заполнения");
		return false;
	}
	var StartDate = new Date(edtStartDate.Value);
	var DueDate = new Date(edtDueDate.Value);
	if (StartDate.getTime() &gt; DueDate.getTime()) {
		ShowWarningDialog("Поле \"Дата с\" не может быть дольше поля \"дата по\"");
		return false;
	}
	StartDate.setHours(0, 0, 1);
	DueDate.setHours(23, 59, 59);
	edtMultiSelectOnChange(edtDebtorCreditor);
	var ds_AccountInMutualSettlements = 
		MutualSettlementsScript.ReportPreviewer.DatasetByUSI('ds_AccountInMutualSettlements');
	ds_AccountInMutualSettlements.Close();
	var ds_MutualSettlements = 
		MutualSettlementsScript.ReportPreviewer.DatasetByUSI('ds_MutualSettlements');
	ds_MutualSettlements.Close();
	EnableDatasetFilters(ds_AccountInMutualSettlements, false);
	EnableDatasetFilters(ds_AccountInMutualSettlements, true, 'IsActual');
	EnableDatasetFilters(ds_MutualSettlements, false);
	EnableDatasetFilters(ds_MutualSettlements, true, 'IsActual', 'DebtorCreditorID');
	MutualSettlementsScript.Report.Attributes('StartDate') = DateToStr(StartDate);
	MutualSettlementsScript.Report.Attributes('DueDate') = DateToStr(DueDate);
	ApplyDatasetFilter(ds_AccountInMutualSettlements, 'StartDate', 
		StartDate.getVarDate(), true);
	ApplyDatasetFilter(ds_AccountInMutualSettlements, 'DueDate', 
		DueDate.getVarDate(), true);
	ApplyDatasetFilter(ds_MutualSettlements, 'StartDate', 
		StartDate.getVarDate(), true);
	ApplyDatasetFilter(ds_MutualSettlements, 'DueDate', 
		DueDate.getVarDate(), true);
	if ((!!MutualSettlementsScript.DebtorCreditorIDs) &amp;&amp;
		('length' in MutualSettlementsScript.DebtorCreditorIDs) &amp;&amp;
		(MutualSettlementsScript.DebtorCreditorIDs.length &gt; 0)) {
		ApplyDatasetIncludeFilter(ds_AccountInMutualSettlements, 
			'DebtorCreditorIDs', MutualSettlementsScript.DebtorCreditorIDs, true);
	}
	SendNotify(Self, MSG_OK);
}

Карточка указана в настройках записи в разделе «Отчёты».

На сколько я понял тут описана доработанная форма фильтрации,а имел ввиду стандартная которая формируется кнопкой "Установить фильтр" в окне FastReport. Форма с набором фильтров у меня сейчас формируется, отчет работает, но единственное что не работает это фильтрация записей отчета по выбранным фильтрам. Как передать в отчет параметры фильтрации?

Стандартно в 3.3.2 в окне FastReport нет такой кнопки «Установить фильтр»:

Это может быть доработка, без её анализа сложно сказать, что делаете не так.

Я имел ввиду кнопку "Установить фильтры" в меню редактора FastReport

Кнопка между Обновить и Выберите родительский отчет

 

Вот еще скриншоты и исходники

Посмотрите, как сделана фильтрация для обычных отчётов, вроде «Адресной книги контрагентов». Там в sq, по которой строится ds отчёта, предусмотрены соответствующие фильтры.

Добавил фильтр в запросе не помогло.Не понятно как привязать параметры из формы фильтрации как запросу

есть идеи в чем проблема?

 

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

Я настроил пока то что пытался фильтровать. Зачем настраивать дальше если даже то что настроено не работает?

Посмотрите в профайлере, какой запрос идёт в базу. Может, в sq не добавлено или добавлено не так это поле.

WHERE(NOT (([tbl_Task].[OwnerID] IN (@P1)))

что такое @P1?

проблема в NOT

буду смотреть как она появляется

 

Зверев Александр спасибо за Profiler

@P1 — параметр, там в конце запроса передают через запятую их значения.

не пойму передается NOT хотя в фильтре стоит "="

Возможно, закешировалось, попробуйте изменить туда-сюда и пересохранить схему.

помогло. спасибо

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

Здравствуйте. Как реализовать в форме отчета, поле выбора несколько значений из справочника и корректно передать/обработать выбранные Id в сам отчет?

При поиске наткнулся на примеры с Ответственным, но там выбор только 1 записи.

Нравится

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

Можно сделать как в стандартных отчётах в разделе, которые вызываются из режима итогов, например, «Data entry compliance» в разделе контрагентов. Для построения отчёта в реестре фильтруют или помечают галочками нужные записи, переключаются в итоги, выбирают этот отчёт, а потом строят по выделенным, по отфильтрованным или по всем:

Схема этого отчёта AccountDataCompletenessReport, привязка таких отчётов к разделам задаётся в таблице SysModuleAnalyticsReport. Для выбора вариантов формирования используется страница BaseReportParameterInModulePageFilter.

Зверев Александр,

это должен быть фильтр по lookup, а не самим записям в реестре.

Можно добавить отчёт именно в тот раздел, записи из которого нужно Вам фильтровать.

Зверев Александр,

суть в том что такого раздела не существует это справочник. Ладно давайте конкретнее. У меня есть раздел Складские документы где ведется учет прихода/ухода Продуктов по складам(справочник) и мне нужно что бы в каком-то  отчете раздела Складские документы было окно выбора несколько складов на каких будет проверяться количество конкретного продукта. Это без проблем можно реализовать в тройке (TS 3) через MultiSelectWindow.

Можно и склады завести разделом. Либо смотреть аналогичные карточки свойств отчётов, где могут быть такие поля множественного выбора. В стандартных отчётах Sales встречаются только обычные справочные.

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

Доброго времени суток, коллеги.

Имеется TerrasoftCRM 3.3.2.245. Я правильно понимаю, что компонент FastReportPreviewer предназначен для вывода отчета FastReport в окно? Есть какие-нибудь примеры работы с ним?

Нравится

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

Стандартные FR-отчёты показываются в окне wnd_BaseFastReportPreview, там используется этот компонент. А функции открытия этого окна с загрузкой в него нужного отчёта и выбранных записей раздела можно увидеть в scr_ReportUtils.

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