如何在FastReport中不显示零值并移动它

How to not display zero value and shift it in FastReport

我在 FastReport 中有一个问题。我需要制作一份报告,其中我只看到非零值。例如,我有 masterdata 填充来自 sql 查询的数据。在 masterdata 上,我放置了 3 个描述和值字段。它看起来像这样:

[DATA."DESC1"] DESCRIPTION1 [DATA."VALUE1"] 100
[DATA."DESC2"] DESCRIPTION2 [DATA."VALUE2"] 0
[DATA."DESC3"] DESCRIPTION3 [DATA."VALUE3"] 50

我想在报告中看到

DESCRIPTION1 100
DESCRIPTION3 50

但现在我看到这样的景色

DESCRIPTION1 100

DESCRIPTION3 50

我不想看到空白位置,我需要将第三个位置移到第二个位置,因为第二个值为空。当然,在我的 SQL 查询中,有更多的字段具有价值。我试图找到一些解决我的问题的循环,但我没有找到。我尝试使用属性 Visible 或 ShiftMode 但这无济于事。也许有人知道如何在 FastReport 中解决这个问题。请帮我。

在 MasterData band 的属性中,确保将 Stretchable 设置为 True,将 Stretch Mode 设置为 Actual Size。

作为附加选项,您可以始终使用 OnBeforePrint 事件(在本例中为 MasterData 波段)并组织您的逻辑:

例如,当 DATA."VALUE2" 为 0 时:

procedure MasterData1OnBeforePrint(Sender: TfrxComponent);
var
   top: Extended;                                     
begin
   top := 0;                           
   // TfrxMemoView 1                                                    
   Memo1.SetBounds(Memo1.Left, top, Memo1.Width, Memo1.Height);
   top := top + Memo1.Height;
   // TfrxMemoView 2                                                       
   if (<DATA."VALUE2"> = 0) then begin                                      
      Memo2.Visible := False;                                                      
      end
   else begin
      Memo2.Visible := True;                                                      
      Memo2.SetBounds(Memo2.Left, top, Memo2.Width, Memo2.Height);
      top := top + Memo2.Height;
   end;
   // TfrxMemoView 3                                                       
   Memo3.SetBounds(Memo3.Left, top, Memo3.Width, Memo3.Height);
   top := top + Memo3.Height;
end;

例如,当 DATA."VALUE1" 为 0 时:

procedure MasterData1OnBeforePrint(Sender: TfrxComponent);
var
   top: Extended;                                     
begin
   top := 0;                           
   // TfrxMemoView 1                                                    
   if (<DATA."VALUE1"> = 0) then begin                                      
      Memo1.Visible := False;                                                      
      end
   else begin
      Memo1.Visible := True;                                                      
      Memo1.SetBounds(Memo1.Left, top, Memo1.Width, Memo1.Height);
      top := top + Memo1.Height;
   end;
   // TfrxMemoView 2                                                       
   Memo2.SetBounds(Memo2.Left, top, Memo2.Width, Memo2.Height);
   top := top + Memo2.Height;
   // TfrxMemoView 3                                                       
   Memo3.SetBounds(Memo3.Left, top, Memo3.Width, Memo3.Height);
   top := top + Memo3.Height;
end;

如果您的查询 returns 这些值是多行而不是多列,那将是微不足道的。

您当前的查询必须类似于:

select 'Name' as Desc1, Name as Value1, 'Surname' as Desc2, Surname as Value2, 'Address' as Desc3, Address as Value3, ....
from MyTable
where Id = X

您可以将其更改为:

select 'Name' as Desc, Name as Value
from MyTable
where Id = X
union
select 'Surname' as Desc, Surname as Value
from MyTable
where Id = X
union
select 'Address' as Desc, Address as Value
from MyTable
where Id = X
...

所以现在在 FastReports 上隐藏空值就像在执行报表之前在数据集上过滤它们一样简单。

您还可以放置 3 个不同的 MasterData 带(或更多),它们都链接到 DATA。因此,您可以将每个 Memo 插入到它们自己的 MasterData 中,并在其特定内容为空时使用 OnBeforePrint 隐藏该 MasterData。