我正在尝试使用表格中不同行的记录创建一个组名公式,而不是该组中包含的记录链接到的行。
首先,我的数据中包含 group 这个词,所以为了避免混淆,我将它用斜体区分以区别于Crystal Reports中的组。
我从中提取此组名称记录的表格包含:
这是我的表格样本:
{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"
你有没有机会使用这个信息修改你的命令表,这样像我这样的假人可以跟随它?看起来你要两次添加其中一个字段,但我不会遵循所有内容。
然后你如何将命令表加入到包含更详细的更大的表中?我必须使用正确的联接,所以我最终不会重复记录?
非常感谢任何帮助。
答案 0 :(得分:0)
这是相当少数!正如您在开头指出的那样,您的问题似乎存在于数据库中。
如果您按{GroupSection.Group}
分组并将{GroupSection.Description}
放在旁边的群组标题中,则应获得3. MISC PRECAST CONCRETE
。然后,您将{GroupSection.Section}
放在详细信息部分,并在其旁边显示{GroupSection.Description}
,您应该获得50 MISC PRECAST CONCRETE
。所以在这一点上我不会使用公式来分组,而是使用字段。因此,只有一个组({GroupSection.Group}
)和详细信息部分中的其余组。请尝试这个建议,并告诉我如何运作。
编辑:
我不认为它会起作用。因为所有内容都在同一个表中,所以除非第二组中的第一项恰好与第一组中的第一项相同,否则您将始终获得错误的描述。有两件事可以解决这个问题:
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