crystal使用表中不同行的记录报告组名称公式

时间:2013-12-10 23:21:58

标签: crystal-reports crystal-reports-2008

我正在尝试使用表格中不同行的记录创建一个组名公式,而不是该组中包含的记录链接到的行。

首先,我的数据中包含 group 这个词,所以为了避免混淆,我将它用斜体区分以区别于Crystal Reports中的组。

我从中提取此组名称记录的表格包含:

  • {GroupSection.Group} 我们的库存数据库中的项目
  • {GroupSection.Section}节(这些类似于嵌套在每个库存中的子组)。
  • {GroupSection.Description}问题从这里开始,因为{GroupSection.Group}和{GroupSection.Section}的描述都存储在这里。

这是我的表格样本:

    {GroupSection.Group}    {GroupSection.Section}     {GroupSection.Description}
    3.00                      0.00                      PRECAST CONCRETE PRODUCT
    3.00                     50.00                      MISC PRECAST CONCRETE PRODUCT
    3.00                     99.00                      *Z* MISC PRECAST CONCRETE PRODUC
    4.00                      0.00                      CEMENT SUPPLIES
    4.00                     50.00                      MISC CEMENT SUPPLIES
    4.00                     99.00                      *Z* MISC CEMENT SUPPLIES

此表中的第一行和第四行是{GroupSection.Group}的描述(它们在{GroupSection.Section}行中有0.00),其余是{GroupSection.Section}的描述。此报告中包含的实际数据位于不同的表中,并且与此表中的前两个字段具有相同的两个字段,但不是第三个字段,因此需要链接并使用此表来对其进行描述。团体名称。另一个表没有链接到0.00的行的记录。

我希望我的Group Tree看起来像这样:

    3.  PRECAST CONCRETE PRODUCT
          50  MISC PRECAST CONCRETE
          99  *Z* MISC PRECAST CONCRETE
    4.  CEMENT SUPPLIES
          50  MISC CEMENT SUPPLIES
          99  *Z* MISC CEMENT SUPPLIES

这是我现在在顶级组的组名公式中使用的有缺陷的公式:

ToText (left(Cstr({GroupSection.Group}),2))+ " " + ToText (If {GroupSection.Section} <> 0 then {GroupSection.Description} Else " ")

这是内嵌套组的组名公式(正常工作):

ToText (left(Cstr({GroupSection.Section}),2))+ " " + ToText ({GroupSection.Description})

这就是我的Group Tree现在的样子:

    3.  MISC PRECAST CONCRETE
          50  MISC PRECAST CONCRETE
          99  *Z* MISC PRECAST CONCRETE
    4.  MISC CEMENT SUPPLIES
          50  MISC CEMENT SUPPLIES
          99  *Z* MISC CEMENT SUPPLIES

正如您所看到的,我需要从表的第一行获取外部组的名称,即使它将组中的记录链接到表中的第二行和第三行。有意义吗?

我尝试在公式中使用previous(),但它会出现以下错误:无法使用此函数,因为必须稍后对其进行评估。

编辑:我还尝试再次添加同一个表并将其链接到,一次连接到部分,它适用于组名,但现在我有190万条记录,其中有些重复。除非我能弄清楚如何修复多个记录,否则这将无效。

“。”在组名描述中是一个无关的问题。这是我能做到最好的3.00显示为3和50.00显示为50。

感谢您的帮助!


2013年12月30日编辑用户@Promethean:

抱歉,我是SQL命令表的新手。我从另一个报告中获取了一个命令表并对其进行了一些更改。这是我得到了多远:

SELECT 
"GroupSection"."Group",
"GroupSection"."Section",
"GroupSection"."Description"

 FROM   ("SpruceDotNet"."dbo"."InventoryCommon" "InventoryCommon" with (nolock)

INNER JOIN 
"SpruceDotNet"."dbo"."GroupSection" "GroupSection" with (nolock)
ON "InventoryCommon"."Group"="GroupSection"."Group")

WHERE
"GroupSection"."Section"=0

ORDER BY 
"InventoryCommon"."Group"

你有没有机会使用这个信息修改你的命令表,这样像我这样的假人可以跟随它?看起来你要两次添加其中一个字段,但我不会遵循所有内容。

然后你如何将命令表加入到包含更详细的更大的表中?我必须使用正确的联接,所以我最终不会重复记录?

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

这是相当少数!正如您在开头指出的那样,您的问题似乎存在于数据库中。 如果您按{GroupSection.Group}分组并将{GroupSection.Description}放在旁边的群组标题中,则应获得3. MISC PRECAST CONCRETE。然后,您将{GroupSection.Section}放在详细信息部分,并在其旁边显示{GroupSection.Description},您应该获得50 MISC PRECAST CONCRETE。所以在这一点上我不会使用公式来分组,而是使用字段。因此,只有一个组({GroupSection.Group})和详细信息部分中的其余组。请尝试这个建议,并告诉我如何运作。

编辑:

我不认为它会起作用。因为所有内容都在同一个表中,所以除非第二组中的第一项恰好与第一组中的第一项相同,否则您将始终获得错误的描述。有两件事可以解决这个问题:

  1. 创建一个新表并将描述拆分。
  2. 第二次将该表添加到报表中,并为主组使用一个别名,为第二个组使用第二个别名。
  3. CR会向您显示一条消息,表明您已在报告中拥有该表,但您可以忽略它。我会给#2一个镜头,看看它是如何工作的。这绝对不如创造一张全新的桌子。

答案 1 :(得分:0)

如果您在commmand表中使用SQL执行此操作,这可能非常简单:

select a.Group, a.Section, a.Description,
       b.GroupName

from GroupSection a

left outer join
    (
       select concat( format(b.Group, 0), '. ', a.Description) as GroupName, b.Group
       from GroupSection b
       where b.Section = 0
    ) c
on a.Group = b.Group

concat可能会发生变化,具体取决于您的数据库提供商。这反映了MySQL。对反映您的样本数据的表执行此操作将产生以下结果:

{GroupSection.Group}|{GroupSection.Section}|{GroupSection.Description}       |{GroupSection.GroupName}
3.00                |  0.00                | PRECAST CONCRETE PRODUCT        | 3. PRECAST CONCRETE PRODUCT
3.00                | 50.00                | MISC PRECAST CONCRETE PRODUCT   | 3. MISC PRECAST CONCRETE PRODUCT
3.00                | 99.00                | *Z* MISC PRECAST CONCRETE PRODUC| 3. *Z* MISC PRECAST CONCRETE PRODUC
4.00                |  0.00                | CEMENT SUPPLIES                 | 4. CEMENT SUPPLIES
4.00                | 50.00                | MISC CEMENT SUPPLIES            | 4. MISC CEMENT SUPPLIES
4.00                | 99.00                | *Z* MISC CEMENT SUPPLIES        | 4. *Z* MISC CEMENT SUPPLIES

这可以很容易地在Crystal中分组,以产生您想要的结果。

开始编辑:

检查一下。这是一个使用表结构的工作SQLfiddle。只有GroupSection才能完成这部分,所以我忽略了另一部分。您可以使用不同的查询来查看hapens,但是它将传递给Crystal必要的派生字段以在Crystal中进行分组。您还需要在Crystal中的新字段GroupName上进行分组。

对于其他表,您可以像处理任何其他表一样处理命令表。如果模型中没有键/连接字段,请确保添加键/链接字段。

这是小提琴:http://sqlfiddle.com/#!2/aa88d/5/0

以防万一那里的评论使得查看代码太混乱了,这里是我的注释被删除了:

SELECT gs2.GroupName,
       gs.sGroup, gs.Section, gs.Description

FROM GroupSection gs

left outer join
    (
     SELECT concat( format(inn.sGroup, 0), '. ', inn.Description) as GroupName, inn.sGroup

     FROM GroupSection inn

     WHERE inn.Section = 0
    ) gs2
    ON gs.sGroup = gs2.sGroup