【问题标题】:MS Access - Joining 2 view into a result table with fifo logicMS Access - 使用 fifo 逻辑将 2 个视图加入结果表
【发布时间】:2014-07-24 05:55:48
【问题描述】:

我有 1 个这样的视图(PurchaseOrder 视图)

PONo        Date        ProductId    Price   Amount 
PO 00001    01/07/2014  AS15         4.750   10.000 
PO 00002    02/07/2014  AS15         4.000   100.000 
PO 00003    05/07/2014  AS24         4.500   30.000 
PO 00004    06/07/2014  AS19         4.250   80.000 
PO 00005    08/07/2014  AS19         4.500   25.000 
PO 00006    09/07/2014  AS15         4.750   15.000 
PO 00007    11/07/2014  AS19         4.250   75.000 
PO 00008    12/07/2014  AS24         4.000   95.000 

以及销售视图的汇总(SalesSummary View)

ProductId    AmountSale 
AS15         35.000 
AS19         88.000 
AS24         50.000 

我需要这样的表格/视图

PONo        Date        ProductId    Price   Amount      AmountSale 
PO 00001    01/07/2014  AS15         4.750   10.000      10.000 
PO 00002    02/07/2014  AS15         4.000   100.000     25.000 
PO 00003    05/07/2014  AS24         4.500   30.000      30.000 
PO 00004    06/07/2014  AS19         4.250   80.000      80.000 
PO 00005    08/07/2014  AS19         4.500   25.000      8.000 
PO 00006    09/07/2014  AS15         4.750   15.000      - 
PO 00007    11/07/2014  AS19         4.250   75.000      - 
PO 00008    12/07/2014  AS24         4.000   95.000      20.000 

前 5 个字段与 PurchaseOrderView 相同。
棘手的部分是如何获取 AmountSale。这个字段填充了 FIFO 逻辑 来自销售摘要

【问题讨论】:

  • 您使用的是什么数据库?另外,你应该解释得到最终结果的逻辑。
  • 谢谢戈登,你救了我的命。我使用ms access 2007,逻辑是按日期减去采购订单中相同产品的销售金额。旧的采购订单将首先扣除,然后处理到下一个采购订单。如果结果中的金额小于销售摘要中的金额。我可以说这就像库存的先进先出逻辑
  • 我只是对新表执行 select into 语句并设置 amountale = 0。我需要逻辑以我想要的方式更新该表中的 AmountSale
  • 我最好的建议基本上是放弃并切换到 SQL Server 2012/2014 express。在更好地支持 SQL 功能的数据库中,这种类型的查询要容易得多。
  • 你能帮我解决上述问题的 SQL Server 逻辑吗?

标签: sql ms-access-2007


【解决方案1】:

如果您没有找到 SQL Server 解决方案,您可以在 Access 中执行此操作。将此函数添加到公共模块:

编辑:更改了代码以在 AmountSales 未完全覆盖给定 ProductID 的第一个 PO 时考虑。

编辑 2:注意到逻辑错误并修复它。

Public Function ReturnAmountSale(strPoNo As String, strProductID As String, curAmount As Currency, curAmountSale As Currency) As Variant

    Dim curAmountSaleUpToCurrentPO As Currency
    Dim varAmountSalePriorToCurrentPO As Variant

    'Get the total Amount for the current ProductID up to and including given PO.
    curAmountSaleUpToCurrentPO = DSum("Amount", "PurchaseOrder", "[PoNo] <= '" & strPoNo & "' AND [ProductID] = '" & strProductID & "'")

    'If there is enough in SalesAmount to cover the whole cost, return the whole Amount.
    If curAmountSale - curAmountSaleUpToCurrentPO >= 0 Then
        ReturnAmountSale = Format(curAmount, "0.00")
    Else
        'Get the the total Amount in ProductID prior to current PO.
        varAmountSalePriorToCurrentPO = DSum("Amount", "PurchaseOrder", "[PoNo] < '" & strPoNo & "' AND [ProductID] = '" & strProductID & "'")

        'If current PO is first in ProductID, varAmountSalePriorToCurrentPO will be null;
        'determine covered amount.
        If IsNull(varAmountSalePriorToCurrentPO) = True Then
            If curAmount <= curAmountSale Then
                ReturnAmountSale = Format(curAmount, "0.00")
            Else
                ReturnAmountSale = Format(curAmountSale, "0.00")
            End If
        Else
            'If current PO is not first in ProductID, varAmountSalePriorToCurrentPO
            'will have a value; determine the covered amount.
            varAmountSalePriorToCurrentPO = curAmountSale - varAmountSalePriorToCurrentPO

            If varAmountSalePriorToCurrentPO <= 0 Then
                ReturnAmountSale = Null
            Else
                ReturnAmountSale = Format(varAmountSalePriorToCurrentPO, "0.00")
            End If
        End If
    End If

End Function

然后将此列添加到您的查询中(您不能在查询中的现有表/查询中有一个重复名称的列,因此下划线):

Amount_Sale: ReturnAmountSale([PurchaseOrder].[PoNo],[PurchaseOrder].[ProductID],[PurchaseOrder].[Amount],[SalesSummary].[AmountSale])

注意:这假定采购订单是按照每个 ProductID 的日期顺序连续发出的。

【讨论】:

  • @DanielFersbeanto:您提供的数据集的结果与您在上面发布的结果数据集完全相同。您能否编辑数据集和结果以举例说明出现了什么问题,我会尝试解决?
  • 我已经尝试过了,它工作正常。对不起这是我的错。但我仍然不知道如何将参数从我的记录集传输到函数。所以我必须手动输入参数。但结果还可以
  • 不,没关系。至于参数,请在此处查看我的答案:stackoverflow.com/questions/24807426/…。只是关于如何与 QueryDef 中的参数交互的一般概念。
  • 您有一个如何操作记录集的示例,将其用作上述函数的参数吗???因为我正在使用记录集。谢谢之前
  • 不用担心。检查这个,底部附近的参数示例:msdn.microsoft.com/en-us/library/office/…
猜你喜欢
  • 2015-02-27
  • 1970-01-01
  • 1970-01-01
  • 2016-11-03
  • 1970-01-01
  • 1970-01-01
  • 2014-01-30
  • 1970-01-01
  • 2010-12-29
相关资源
最近更新 更多