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.