我有一个水晶报告,我需要修改以通过" name"省略重复的行。所以在Section Expert中我在Suppress中输入一个公式,我无法弄清楚如何比较当前名称字段被添加到已经在组中的所有先前名称。我试图使用Filter()函数,但是对于String数组参数,我不知道输入什么,这将是之前添加到组中的所有其他名称。我需要比较当前添加的名称,看看它是否已经在组中,这样我就可以比较另一个名为" date"如果要添加的字段的日期更新,那么重复名称的日期将覆盖该行,并且仅显示具有最新日期的行。
基本上问题是如何创建一个包含组中已有的所有当前字段的数组(或者已经存在一个),以便我可以使用Filter()函数来查看当前添加的名称是否已经存在添加了哪个名字?
答案 0 :(得分:0)
嗯,我想通了,所以对于遇到这个的人来说,这是我的解决方案。
首先我在“公式字段”部分制作了一个公式,该公式在从数据库中读取数据时创建了两个数组,并且只保留了记录中每个id和日期的一个副本。然后对于具有相同id的任何其他记录,它将比较该记录的日期与具有相同名称的数组中的记录,如果日期更大(稍后),则它将用当前读取的日期替换为1。我将此公式字段命名为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
沿途学到了一些经验教训......
Crystal Reports以奇怪的方式完成全局变量。我花了几个小时的时间和他们一起弄清楚,只要你在使用Global [vartype]“name”语法输入的每个部分中声明它们,你就可以在报告的任何地方使用它们。即使你每次重新声明它都没有删除它的值或重置它或任何东西。
此运算符“:=”与“=”不同。 “:=”运算符用于设置变量的值,而“=”似乎仅用于比较。
Crystal的设计非常奇怪。如果你确实希望你的公式字段返回一个特定的变量,你只需键入该变量名称,而不是“;”在它之后。什么都没有“;”在它被认为是公式的结束之后。所以,如果你这个愚蠢的“哦,这段代码看起来不是公式的一部分”错误那么这是因为你没有把“;”在事情之后,Crystal假设你的功能在该位置结束。但是,如果你没有放一个没有“;”的变量在你的公式之后,默认情况下只返回“false”。所以在我的公式中我有// idTest // UBOUND(idArray) // expDateTest 我所要做的就是取消注释我想要返回的变量,公式将会这样做。