Delphi 如何在FastReport中不显示零值并将其移位
我在FastReport中有一个问题。我需要做一个报告,其中我只看到非零值。例如,我有masterdata,它填充来自sql查询的数据。在masterdata上,我放置了3个描述和值字段。它看起来像这样:Delphi 如何在FastReport中不显示零值并将其移位,delphi,reporting,fastreport,Delphi,Reporting,Fastreport,我在FastReport中有一个问题。我需要做一个报告,其中我只看到非零值。例如,我有masterdata,它填充来自sql查询的数据。在masterdata上,我放置了3个描述和值字段。它看起来像这样: [DATA."DESC1"] DESCRIPTION1 [DATA."VALUE1"] 100 [DATA."DESC2"] DESCRIPTION2 [DATA."VALUE2"] 0 [DATA."DESC3"] DESCRIPTION3 [DATA."VALUE3"] 50 我想看看报
[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
我不想看到空白位置,我需要在第二个位置上移动第三个位置,因为第二个值为null。当然,在我的SQL查询中,有更多具有值的字段。我试图找到一些循环来解决我的问题,但我没有找到。我尝试使用属性Visible或ShiftMode,但这并没有帮助。也许有人知道如何在FastReport中解决这个问题。请帮帮我 在MasterData频带的属性中,确保将Stretchable设置为True,并将Stretch Mode设置为实际大小 作为一个附加选项,您可以始终使用
OnBeforePrint
事件(在本例中为MasterData
带)并组织您的逻辑:
例如,当数据。“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;
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;
如果您的查询将这些值作为多行而不是多列返回,这将是微不足道的 您当前的查询必须类似于:
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标注栏(或更多),所有标注栏都链接到数据。因此,您可以将每个备忘录插入它们自己的主数据中,并在主数据的特定内容为空时使用OnBeforePrint隐藏该主数据。谢谢您的回答。我知道这可能是一个很好的解决方案,但我必须像处理多列而不是行一样处理这些数据。谢谢你的回答。在我的情况下,我试图推动这个解决方案,但我认为它可能是一个好的解决方案。嗨,你的解决方案应该是好的。当第一条记录为0,我需要将第二条记录移到第一条记录所在的位置时,您能告诉我如何更改此代码吗?