Crystal 报告 - 如何有条件地求和一个值
Crystal Reports - How to conditionally sum a value
首先我会说我对 Crystal 报告几乎一无所知。我可以查看布局和视图公式,但除此之外我几乎一无所知。
我们有一个现有的 Crystal 报告,其中显示了一组项目编号(产品)的可用数量总和。这意味着数据库 table(称为 F41021)中的单个数据记录将具有可用数量,但我们感兴趣的是每个项目编号的可用数量总和。因此,可能有数十条单独的记录构成了项目 XYZ 的可用数量总和。
每个单独的信息记录也有一个分支位置,其中生产了一定数量的项目 XYZ。在大多数情况下,我们不关心给定数量的项目 XYZ 是哪个分支生产的,但也有我们关心的例外情况。在这些情况下,我们只想对特定分支中产生的数量求和,而不包括在其他分支中产生的数量。
这种将可用数量隔离到特定分支的需求仅适用于某些“系列”的货品编号。具有这种特殊情况的项目是项目编号包含以下模式的任何项目:PK、PJ 或 TP。 不 符合此条件的任何其他项目可以计算可用数量作为 ANY 分店可用数量的总和。
公式
报告中给出可用数量的相关公式如下:
AVAILABLE =
if {F41021.LILOTS}<>" " then 0
else if {HOMEDEPOT_SKUS_.HOMEDEPOT#COM SKU} like "*72H*" then ((({F41021.LIPQOH}-{F41021.LIPCOM}-{F41021.LIHCOM})*1.5))/100
else (({F41021.LIPQOH}-{F41021.LIPCOM}-{F41021.LIHCOM}))/100
您可以看到可用数量计算为(({F41021.LIPQOH}-{F41021.LIPCOM}-{F41021.LIHCOM}))/100
(除以100是将数据表示的值缩放为实际值)。 if-then-else逻辑是为了处理特殊情况。
CONDITIONAL_AVAIL =
if {@PROD_FAMILY} in {?PRODUCT FAMILY(IES) for ALWAYS AVAIL (500)} then 500
else if {HOMEDEPOT_SKUS_.CURRENT FOSS INV SKU} like "*72HF" then 1000
else if Sum ({@AVAILABLE}, {F4102.IBLITM})<={?NO AVAIL QTY THRESHOLD} then 0
else if Sum ({@AVAILABLE}, {F4102.IBLITM})>={?MAX AVAIL QTY to DISPLAY} then {?MAX AVAIL QTY to DISPLAY}
else round(Sum ({@AVAILABLE}, {F4102.IBLITM}),0)
这个公式的结果就是报表上显示的结果。该报告定义了一些参数,以允许用户在执行之前调整一些关键数据。出于本次讨论的目的,这些可能会被忽略。如您所见,AVAILABLE
公式针对每个项目编号分组 (F4102.IBLITM) 求和。
数据
以下是来自 F41021 table 的一个数据样本,用于在多个分支机构中有库存的项目编号:
Branch Qty On Qty Hard Qty Soft
Hand Committed Committed
(LIMCU) (LIPQOH) (LIHCOM) (LIPCOM)
B50 2321 0 2
B50 1 0 0
B50 602 0 0
B70 5 0 0
在此示例中,所需的可用数量应为 (2321 - 2) + 1 + 602 = 2922。
先试试
我尝试更新 AVAILABLE
公式如下:
AVAILABLE =
if {F41021.LILOTS}<>" " then 0
else if {HOMEDEPOT_SKUS_.HOMEDEPOT#COM SKU} like "*72H*" then ((({F41021.LIPQOH}-{F41021.LIPCOM}-{F41021.LIHCOM})*1.5))/100
else if (({HOMEDEPOT_SKUS_.HOMEDEPOT#COM SKU} like "*PK*") or
({HOMEDEPOT_SKUS_.HOMEDEPOT#COM SKU} like "*PJ*") or
({HOMEDEPOT_SKUS_.HOMEDEPOT#COM SKU} like "*TP*")) then
(
if {F41021.LIMCU} = "B50" then (({F41021.LIPQOH}-{F41021.LIPCOM}-{F41021.LIHCOM}))/100
else 0
)
else (({F41021.LIPQOH}-{F41021.LIPCOM}-{F41021.LIHCOM}))/100
包含 PK、PJ 或 TP 的项目编号是我们只想为特定分支 (B50) 求和的项目。 F41021.LIMCU 是报表正在操作的每个 F41021 记录的分支。当我运行报告时,可用数量(样品)的最终结果是0,绝对不是需要或期望的。
第二次尝试
对公式稍作修改:
AVAILABLE =
if {F41021.LILOTS}<>" " then 0
else if {HOMEDEPOT_SKUS_.HOMEDEPOT#COM SKU} like "*72H*" then ((({F41021.LIPQOH}-{F41021.LIPCOM}-{F41021.LIHCOM})*1.5))/100
else if (({HOMEDEPOT_SKUS_.HOMEDEPOT#COM SKU} like "*PK*") or
({HOMEDEPOT_SKUS_.HOMEDEPOT#COM SKU} like "*PJ*") or
({HOMEDEPOT_SKUS_.HOMEDEPOT#COM SKU} like "*TP*")) then
(
if {HOMEDEPOT_SKUS_.F5} = "B50" then (({F41021.LIPQOH}-{F41021.LIPCOM}-{F41021.LIHCOM}))/100
else 0
)
else (({F41021.LIPQOH}-{F41021.LIPCOM}-{F41021.LIHCOM}))/100
请注意,F41021.LIMCU
已替换为 HOMEDEPOT_SKUS_.F5
,这是报告正在使用的另一个 table 中的一列。 table 中的每个 SKU 项目(相当于项目编号)的此列设置为“B50”,仅需要对 B50 进行合计,其余留空。在这种情况下,当我运行报告时,可用数量的最终结果是2927。显然已经从B70添加了5个库存量(LIPQOH)。
我不明白为什么我会得到我所看到的结果,也不明白如何得到我需要的结果。
第 1 步:创建一个行级(非汇总)公式,如果记录属于目标分支,则简单地 returns 数量,否则为零。
第 2 步:对该公式求和。
总是小事。我对修改后的 AVAILABLE
公式的第一次尝试是在正确的轨道上。不同之处在于我的 {F41021.LIMCU} = "B50"
需要 {F41021.LIMCU} like "*B50"
。为什么?因为出于某种我不知道的原因,LIMCU 列的值在左侧填充了一些空白。 SMH.
首先我会说我对 Crystal 报告几乎一无所知。我可以查看布局和视图公式,但除此之外我几乎一无所知。
我们有一个现有的 Crystal 报告,其中显示了一组项目编号(产品)的可用数量总和。这意味着数据库 table(称为 F41021)中的单个数据记录将具有可用数量,但我们感兴趣的是每个项目编号的可用数量总和。因此,可能有数十条单独的记录构成了项目 XYZ 的可用数量总和。
每个单独的信息记录也有一个分支位置,其中生产了一定数量的项目 XYZ。在大多数情况下,我们不关心给定数量的项目 XYZ 是哪个分支生产的,但也有我们关心的例外情况。在这些情况下,我们只想对特定分支中产生的数量求和,而不包括在其他分支中产生的数量。
这种将可用数量隔离到特定分支的需求仅适用于某些“系列”的货品编号。具有这种特殊情况的项目是项目编号包含以下模式的任何项目:PK、PJ 或 TP。 不 符合此条件的任何其他项目可以计算可用数量作为 ANY 分店可用数量的总和。
公式
报告中给出可用数量的相关公式如下:
AVAILABLE =
if {F41021.LILOTS}<>" " then 0
else if {HOMEDEPOT_SKUS_.HOMEDEPOT#COM SKU} like "*72H*" then ((({F41021.LIPQOH}-{F41021.LIPCOM}-{F41021.LIHCOM})*1.5))/100
else (({F41021.LIPQOH}-{F41021.LIPCOM}-{F41021.LIHCOM}))/100
您可以看到可用数量计算为(({F41021.LIPQOH}-{F41021.LIPCOM}-{F41021.LIHCOM}))/100
(除以100是将数据表示的值缩放为实际值)。 if-then-else逻辑是为了处理特殊情况。
CONDITIONAL_AVAIL =
if {@PROD_FAMILY} in {?PRODUCT FAMILY(IES) for ALWAYS AVAIL (500)} then 500
else if {HOMEDEPOT_SKUS_.CURRENT FOSS INV SKU} like "*72HF" then 1000
else if Sum ({@AVAILABLE}, {F4102.IBLITM})<={?NO AVAIL QTY THRESHOLD} then 0
else if Sum ({@AVAILABLE}, {F4102.IBLITM})>={?MAX AVAIL QTY to DISPLAY} then {?MAX AVAIL QTY to DISPLAY}
else round(Sum ({@AVAILABLE}, {F4102.IBLITM}),0)
这个公式的结果就是报表上显示的结果。该报告定义了一些参数,以允许用户在执行之前调整一些关键数据。出于本次讨论的目的,这些可能会被忽略。如您所见,AVAILABLE
公式针对每个项目编号分组 (F4102.IBLITM) 求和。
数据
以下是来自 F41021 table 的一个数据样本,用于在多个分支机构中有库存的项目编号:
Branch Qty On Qty Hard Qty Soft
Hand Committed Committed
(LIMCU) (LIPQOH) (LIHCOM) (LIPCOM)
B50 2321 0 2
B50 1 0 0
B50 602 0 0
B70 5 0 0
在此示例中,所需的可用数量应为 (2321 - 2) + 1 + 602 = 2922。
先试试
我尝试更新 AVAILABLE
公式如下:
AVAILABLE =
if {F41021.LILOTS}<>" " then 0
else if {HOMEDEPOT_SKUS_.HOMEDEPOT#COM SKU} like "*72H*" then ((({F41021.LIPQOH}-{F41021.LIPCOM}-{F41021.LIHCOM})*1.5))/100
else if (({HOMEDEPOT_SKUS_.HOMEDEPOT#COM SKU} like "*PK*") or
({HOMEDEPOT_SKUS_.HOMEDEPOT#COM SKU} like "*PJ*") or
({HOMEDEPOT_SKUS_.HOMEDEPOT#COM SKU} like "*TP*")) then
(
if {F41021.LIMCU} = "B50" then (({F41021.LIPQOH}-{F41021.LIPCOM}-{F41021.LIHCOM}))/100
else 0
)
else (({F41021.LIPQOH}-{F41021.LIPCOM}-{F41021.LIHCOM}))/100
包含 PK、PJ 或 TP 的项目编号是我们只想为特定分支 (B50) 求和的项目。 F41021.LIMCU 是报表正在操作的每个 F41021 记录的分支。当我运行报告时,可用数量(样品)的最终结果是0,绝对不是需要或期望的。
第二次尝试
对公式稍作修改:
AVAILABLE =
if {F41021.LILOTS}<>" " then 0
else if {HOMEDEPOT_SKUS_.HOMEDEPOT#COM SKU} like "*72H*" then ((({F41021.LIPQOH}-{F41021.LIPCOM}-{F41021.LIHCOM})*1.5))/100
else if (({HOMEDEPOT_SKUS_.HOMEDEPOT#COM SKU} like "*PK*") or
({HOMEDEPOT_SKUS_.HOMEDEPOT#COM SKU} like "*PJ*") or
({HOMEDEPOT_SKUS_.HOMEDEPOT#COM SKU} like "*TP*")) then
(
if {HOMEDEPOT_SKUS_.F5} = "B50" then (({F41021.LIPQOH}-{F41021.LIPCOM}-{F41021.LIHCOM}))/100
else 0
)
else (({F41021.LIPQOH}-{F41021.LIPCOM}-{F41021.LIHCOM}))/100
请注意,F41021.LIMCU
已替换为 HOMEDEPOT_SKUS_.F5
,这是报告正在使用的另一个 table 中的一列。 table 中的每个 SKU 项目(相当于项目编号)的此列设置为“B50”,仅需要对 B50 进行合计,其余留空。在这种情况下,当我运行报告时,可用数量的最终结果是2927。显然已经从B70添加了5个库存量(LIPQOH)。
我不明白为什么我会得到我所看到的结果,也不明白如何得到我需要的结果。
第 1 步:创建一个行级(非汇总)公式,如果记录属于目标分支,则简单地 returns 数量,否则为零。
第 2 步:对该公式求和。
总是小事。我对修改后的 AVAILABLE
公式的第一次尝试是在正确的轨道上。不同之处在于我的 {F41021.LIMCU} = "B50"
需要 {F41021.LIMCU} like "*B50"
。为什么?因为出于某种我不知道的原因,LIMCU 列的值在左侧填充了一些空白。 SMH.