首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >水晶报表11将组中的所有数据与特定值进行比较

水晶报表11将组中的所有数据与特定值进行比较
EN

Stack Overflow用户
提问于 2015-04-17 15:34:19
回答 1查看 1.8K关注 0票数 0

我有一个水晶报告,我需要修改,以省略重复行的“名称”。因此,在区段专家中,我在“抑制”中输入了一个公式,我不知道如何将当前的名称字段添加到组中的所有先前的名称中。我试图使用Filter()函数,但是对于字符串数组参数,我不知道要输入什么,这将是之前添加到组中的所有其他名称。我需要比较正在添加的当前名称,看看它是否已经在组中,这样我就可以比较另一个名为" date“的字段,如果要添加的字段的日期是最近的,那么重复名称的日期将覆盖该行,并且只显示该行和最近的日期。

基本上,问题是如何创建一个数组,其中包含组中的所有当前字段(或者已经存在一个字段),以便我可以使用Filter()函数来查看添加的当前名称是否已经存在于添加的名称数组中?

EN

回答 1

Stack Overflow用户

发布于 2015-04-27 13:22:42

嗯,我想出来了,所以对于任何遇到这个问题的人来说,这是我的解决方案。

首先,我在“公式字段”部分中创建了一个公式,在从数据库读取数据时创建两个数组,并且在记录中只保留每个id和日期的一个副本。然后,对于具有相同id的任何其他记录,它将将该记录的日期与具有相同名称的数组中的记录进行比较,如果日期更大(稍后),则它将用当前读取的日期替换其中的一个。我把这个公式字段命名为idArray。

代码语言:javascript
复制
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位于第一个数组中,它将确定其位置并使用该位置从第二个数组检索日期,如果当前记录的日期小于我们现在知道的最大日期,那么它将禁止记录。

代码语言:javascript
复制
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

沿途的一些经验教训..。

  1. 水晶报告以一种奇怪的方式处理全局变量。我花了几个小时才弄清楚,你基本上可以在报告中的任何地方使用它们,只要你用全局变型"name“语法在每一节中声明它们。即使你是重新声明它,每次水晶没有删除它的价值,或重置它或任何东西。
  2. 这个运算符":=“不同于"=”。":=“运算符用于为变量设置值,而"=”似乎只用于比较。
  3. 水晶报告的设计真的很奇怪。如果您确实希望您的公式字段返回特定变量或其他内容,则只需在该变量名称后面键入该变量名,而不使用";“。任何没有";“之后的东西都被认为是公式的终结。所以,如果你得到这个愚蠢的“哦,这段代码看起来不是公式的一部分”错误,那是因为你没有放一个";“之后,和水晶假设你的函数结束在这个位置。但是,如果您没有将变量放在没有";“之后,则默认情况下,您的公式只返回"false”。因此,在我的公式中,我有//idTest //Ubound(idArray) //expDateTest,我所要做的就是取消注释我想要返回的变量,并且公式会这样做。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29703559

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档