Отображать объект в отчете Crystal, если одна или несколько записей содержат определенные данные - PullRequest
0 голосов
/ 30 сентября 2019

У меня есть Crystal Report ( CR Developer v11.5.12.1838 ), в котором я хочу отображать только определенные итоги в Нижний колонтитул отчета , если одна или несколько подробных записейсодержит конкретную часть информации. Для этого в отчете я создал три формулы:

  • InitDisplayLIATotals - помещен (и подавлен) в заголовок отчета раздел
Global BooleanVar LIA := False;
  • SetDisplayLIATotals - помещено в (исключено) заголовок группы (единственный заголовок группы в отчете) ПРИМЕЧАНИЕ. Я также пытался поместить его в Detail section
Global BooleanVar LIA;

WhilePrintingRecords;

If LIA = False Then
    If Not IsNull({mydata.liamp}) And Not (Trim({mydata.liamp}) = "") Then
        LIA := True;
  • DisplayLIATotals - помещается в нижний колонтитул отчета и используется в формуле подавления для итогов "label "object.
Global BooleanVar LIA;

LIA;

Предполагается, что формулы должны ONLY возвращать True, если одна или несколько записей в текущем наборе данных имеют ненулевое значениев поле mydata.liamp (независимо от позиции записи). Если все записи в наборе данных имеют значение NULL в этом поле, оно должно вернуть False.

Однако я не могу заставить его работать правильно. Я помещаю формулу как поле для печати в Нижний колонтитул отчета для подтверждения, и она всегда печатает False, даже когда я знаю, что должно возвращаться True. Когда я помещаю формулу в раздел Detail (и делаю ее видимой), я вижу, что она возвращает True в первой записи, но все последующие записи показывают ее как False, в результате чего False значение в нижнем колонтитуле отчета .

Я не освоил искусство написания формул в Crystal Reports, поэтому я уверен, что здесь просто что-то упущено / пропущено, но я 'Я не уверен, что это будет. Может ли кто-нибудь помочь мне понять, почему я не могу надежно заставить его вернуть правильное значение?

1 Ответ

0 голосов
/ 02 октября 2019

Благодаря предложению @heringer в комментариях к вопросу я смог найти решение путем проб и ошибок. Ключ, очевидно, находится в директиве WhilePrintingRecords;, используемой редактором формул Crystal Reports. Чтобы отчет правильно оценивал условие по всему отчету, чтобы он возвращал «правильное» значение для раздела Нижний колонтитул отчета , для всех трех формул требуется этот набор директив.

Я нашел это объяснение на форумах сообщества SAP :

whileReadingRecords

Заставляет программу вычислять формулу во время чтенияданные записи базы данных.

Если вы попытаетесь включить группу в эту формулу, вы получите сообщение об ошибке.

WhilePrintingRecords

Принудительно запускает программуоценить формулу, пока она печатает данные базы данных.

Не очень описательно, но я понимаю, что директива WhilePrintingRecords; заставляет формулу ждать, чтобы оценить каждый элемент данных, покаотчет фактически генерируется (принтер, дисплей, экспорт и т. д.), поэтому все данные были загружены в каждое из полейreport.

Не думаю, что будет плохо, если кто-то, более знакомый с Crystal Reports, сможет предоставить более подробное или более подробное объяснение этих директив и «многопроходного механизма».


РЕДАКТИРОВАТЬ - Я нашел вопрос, который может помочь лучше объяснить использование этих директив:

зачем использовать перед чтением записей/ Во время чтения записей / Во время печати записей в отчетах Crystal?


Конечным результатом является следующее:

  • InitDisplayLIATotals - Помещено (подавлено) в Заголовок отчета раздел
WhilePrintingRecords;
Global BooleanVar LIA := False;
  • SetDisplayLIATotals - размещен (подавлен) в заголовке группы ( или Detail section )
WhilePrintingRecords;
Global BooleanVar LIA;

If LIA = False Then
    If Not IsNull({mydata.liamp}) And Not (Trim({mydata.liamp}) = "") Then
        LIA := True;
  • DisplayLIATotals - помещается в нижний колонтитул отчета и / или используется в формуле подавления.
WhilePrintingRecords;
Global BooleanVar LIA;

LIA;

Я надеюсь, что это полезно для всех, кто может столкнуться с трудностями при использовании этой техники.


SIDE NOTE

На самом деле смог в некоторой степени «обойти» проблему, используя Running Total Field . Я создал COUNT сводку поля mydata.liamp, которая, по-видимому, учитывает только ненулевые значения. Использование этого итогового поля в формуле подавления DID работает из-за данных в моем наборе данных тестирования, но это несовершенное решение.

"Проблема" заключается в том, что поле может содержит пустые строковые значения, которые ( я предполагаю ) будут включены в счет. Для моего сценария использования я хотел быть уверенным, что только значения, отличные от NULL и , не являются пустыми, считая при переключении этого значения. " трюк с тремя формулами " ( a TechRepublic "QuickTip" статья для справки ) позволяет мне проверить обе возможности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...