如何在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。
我在 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。