【问题标题】:crystal reports group name formula using a record from a different line in table水晶报告组名公式使用表中不同行的记录
【发布时间】:2013-12-10 23:21:57
【问题描述】:

我正在尝试使用表中与该组中包含的记录所链接到的行不同的行中的记录来创建组名公式。

首先,我的数据中有 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 的行。

我希望我的组树看起来像这样:

    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})

这就是我的组树现在的样子:

    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(),但它给出了以下错误:无法使用此函数,因为它必须稍后进行评估。

编辑:我也只是尝试再次添加同一个表并将其链接到 group 和一次链接到 section 并且它适用于组名称,但现在我有 190 万条记录,确实是重复的。所以除非我能弄清楚如何修复多条记录,否则这是行不通的。

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

感谢您的帮助!


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

对不起,我是 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"

您是否有机会使用此信息来修改您的命令表,以便像我这样的假人可以跟随它?看起来您将其中一个字段添加了两次,但我没有关注所有内容。

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

非常感谢任何帮助。

【问题讨论】:

    标签: crystal-reports crystal-reports-2008


    【解决方案1】:

    如果您在命令表中使用 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,所以我忽略了其他部分。您可以使用不同的查询来查看发生了什么,但它会将必要的派生字段传递给 Crystal,以便在 Crystal 中进行分组。您仍需要在 Crystal 中的新字段 GroupName 上进行分组。

    对于其他表,您可以像对待任何其他表一样对待命令表。如果您的模型中不存在,请确保将键/链接字段添加到命令中。

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

    为了防止那里的 cmets 太混乱而无法查看代码,这里将我的注释去掉:

    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
    

    【讨论】:

    • 我无法将此处的代码正确放入 cmets,因此我编辑了我的问题以包括我在命令表中的进展情况。请参阅我的问题的底部。谢谢你的帮助。你可以把我写成新手,我就是。
    • 最后找了熟悉数据的软件公司帮我建报表。他们使用了一个命令表,所以我会说这是正确的答案。我不能确切地说它与这个有多相似。
    【解决方案2】:

    这是相当少数!正如您在开始时指出的那样,您的问题似乎出在数据库中。 如果您按{GroupSection.Group} 分组并将{GroupSection.Description} 放在它旁边的组标题中,您应该得到3. MISC PRECAST CONCRETE。然后你把{GroupSection.Section}放在细节部分,{GroupSection.Description}在它旁边,你应该得到50 MISC PRECAST CONCRETE。所以此时我不会使用公式进行分组,而是使用字段。所以只有一组({GroupSection.Group}),其余的在详细信息部分。请尝试该建议并让我知道它是如何工作的。

    编辑:

    我认为它不会起作用。因为所有东西都在同一个表中,所以你总是会得到错误的描述,除非第二组中的第一个项目恰好与第一组中的那个相同。为了解决这个问题,我想到了两件事:

    1. 创建一个新表并拆分描述。
    2. 再次将表格添加到您的报告中,并为主要组使用一个别名,为第二组使用第二个别名。

    CR 会提示您已在报告中包含该表格,但您可以忽略它。我会试一试#2,看看它是如何工作的。这绝对比创建一个全新的表要少。

    【讨论】:

    • 我已经在使用字段进行分组,而不是公式。我试图用公式做的是更改组的名称,以便它在组树中具有描述。组树位于报告的左侧。它以书签的形式导出为 pdf,以帮助浏览大型文档。
    • 我按 {GroupSection.Group} 分组,然后嵌套在我按 {GroupSection.Section} 分组的下面。这会在组树中完美显示数字,当我尝试添加 {GroupSection.Description} 时,我遇到了问题。
    • 因为您在同一个表中拥有所有内容的描述。它会始终向您显示第一项的描述。请参阅我修改后的答案并尝试将同一个表两次添加到报告中,然后对第 1 组使用一个别名,对第 2 组使用第二个别名。
    • 是的,这就是我昨天尝试的。请参阅我编辑的问题:编辑:我也只是尝试再次添加同一个表并将其链接一次到组,一次链接到部分,它适用于组名,但现在我有 190 万条记录,确实是重复的.所以除非我能弄清楚如何修复多条记录,否则这是行不通的。
    • 该问题可能是由于您链接两个表的方式。对我来说,听起来您将不得不创建第二个表才能拆分描述。现在听起来可能需要做很多工作,但它可能会为您节省大量时间并在以后减少麻烦。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-23
    • 2015-09-29
    相关资源
    最近更新 更多