我有一个水晶报告,我需要修改,以省略重复行的“名称”。因此,在区段专家中,我在“抑制”中输入了一个公式,我不知道如何将当前的名称字段添加到组中的所有先前的名称中。我试图使用Filter()函数,但是对于字符串数组参数,我不知道要输入什么,这将是之前添加到组中的所有其他名称。我需要比较正在添加的当前名称,看看它是否已经在组中,这样我就可以比较另一个名为" date“的字段,如果要添加的字段的日期是最近的,那么重复名称的日期将覆盖该行,并且只显示该行和最近的日期。
基本上,问题是如何创建一个数组,其中包含组中的所有当前字段(或者已经存在一个字段),以便我可以使用Filter()函数来查看添加的当前名称是否已经存在于添加的名称数组中?
发布于 2015-04-27 13:22:42
嗯,我想出来了,所以对于任何遇到这个问题的人来说,这是我的解决方案。
首先,我在“公式字段”部分中创建了一个公式,在从数据库读取数据时创建两个数组,并且在记录中只保留每个id和日期的一个副本。然后,对于具有相同id的任何其他记录,它将将该记录的日期与具有相同名称的数组中的记录进行比较,如果日期更大(稍后),则它将用当前读取的日期替换其中的一个。我把这个公式字段命名为idArray。
Global StringVar Array idArray;
Global DateVar Array expArray;
BooleanVar addName;
NumberVar x;
StringVar idTest;
StringVar expDateTest;
whilereadingrecords;
(
addName := true;
for x := 1 to Ubound(idArray) step 1 do
(
if({hrpersnl.p_empno} = idArray[x]) then
(
addName := false;
if(Date({nemphist.enddate}) > expArray[x]) then
expArray[x] := Date({nemphist.enddate});
)
);
if(addName = true) then
(
reDim Preserve idArray[Ubound(idArray) + 1];
reDim Preserve expArray[Ubound(expArray) + 1];
idArray[Ubound(idArray)] := {hrpersnl.p_empno};
expArray[Ubound(expArray)] := Date({nemphist.enddate});
//idTest := idTest + ' ' + {hrpersnl.p_empno};
//expDateTest := expDateTest + ' ' + toText(Date({nemphist.enddate}));
);
//idTest
//Ubound(idArray)
//expDateTest
)注释掉的行是我用来测试数组是如何构建的。我把它们放在那里只是作为如何调试水晶报告的一个例子,因为它没有附带调试器。
下一步是创建记录抑制公式。在“报告”菜单中,我转到“区段专家”,而在小组的“详细信息”部分,我单击了“压制(不钻下)”选项旁边的小x-2按钮。然后,我插入了下面的代码,它查看当前记录的id和日期,如果id位于第一个数组中,它将确定其位置并使用该位置从第二个数组检索日期,如果当前记录的日期小于我们现在知道的最大日期,那么它将禁止记录。
Global StringVar Array idArray;
Global DateVar Array expArray;
NumberVar x;
BooleanVar suppress := false;
for x := 1 to Ubound(idArray) do
(
if({hrpersnl.p_empno} = idArray[x]) then
if(Date({nemphist.enddate}) < expArray[x]) then
suppress := true;
);
if(suppress = true) then
true
else
false沿途的一些经验教训..。
https://stackoverflow.com/questions/29703559
复制相似问题