访问 - 使用open recordset where子句设置变量

时间:2018-01-26 11:47:50

标签: loops ms-access access-vba

我有2个输入记录集,其中一个包含操作数据,另一个包含与操作数据相关的成本。我需要为每个运营POL返回单个成本费用类型,在此示例中有5种类型及其成本。

运营数据

Public Class TestObjekt
    Public Property Ean() As Int32
    Public Property Size() As Int32
    Public Property Amount() As Int32
End Class

Sub Main()
    Dim objekts As New List(Of TestObjekt)
    objekts.Add(New TestObjekt() With {.Amount = 10, .Ean = 1, .Size = 2})
    objekts.Add(New TestObjekt() With {.Amount = 100, .Ean = 1, .Size = 2})

    Dim query = objekts.GroupBy(
        Function(g) New With
        {
            .Ean = g.Ean,
            .Size = g.Size
        },
        Function(key, group) New TestObjekt() With
        {
            .Ean = key.Ean,
            .Size = key.Size,
            .Amount = group.Sum(Function(s) s.Amount)
        }).ToList()

    'We still got two objects here.

    For Each q As TestObjekt In query
        Console.WriteLine("Ean: {0}, Size: {1}, Amount: {2}", q.Ean, q.Size, q.Amount)
    Next

    query = objekts.GroupBy(
        Function(g) g.Ean.ToString() + "@" + g.Size.ToString(),
        Function(key, group) New TestObjekt() With
                       {
                       .Ean = group.First().Ean,
                       .Size = group.First().Size,
                       .Amount = group.Sum(Function(s) s.Amount)
                       }).ToList()

    'This is working. We Only have one object.

    For Each q As TestObjekt In query
        Console.WriteLine("Ean: {0}, Size: {1}, Amount: {2}", q.Ean, q.Size, q.Amount)
    Next

End Sub

成本数据(香港成本是更大表的一部分)

Consol
Week    POL        Container Type   Shipment Mode   Container Count     Volume
40      Hong Kong       40HC           CFSCY             1               66.00

以下代码循环运行操作数据(例如,通常会减少多个记录),然后查找每个成本信息并返回适用于与运营POL匹配的Origin的成本。

Origin Port Currency  Charge Type                      Unit Of Measure  Charge
Hong Kong   HKD       Bill of Lading Issuance Charge   By Container     450
Hong Kong   HKD       Container Seal Charge            By Container     50
Hong Kong   HKD       CY Administration Charge         By Container     300
Hong Kong   HKD       Port Security Charge             By Container     450
Hong Kong   HKD       THC                              By Container     1945    

虽然香港有正确的成本,但是有效但返回香港的5条输出线,但第一次收费类型“提单收费”重复了5次。我认为这是由于使用返​​回第一行的Dlookup函数。

然后我创建了下面的代码,不使用dlookup,希望只从rstCost记录集中获取变量,但它返回一个在集合中找不到的错误项。

'从费用表中获取参数

Sub CYCost1()
Dim db As DAO.Database
Dim rstCost As DAO.Recordset
Dim rst As DAO.Recordset
Dim rstOutput As DAO.Recordset
Dim rstXchange As DAO.Recordset
Dim ContCount As Integer

DoCmd.SetWarnings False
Set db = CurrentDb
Set rst = db.OpenRecordset("5 - Scenarios 2 - Optimisation - 2 Op Options")

Do Until rst.EOF

TotalCost = 0

'Feed in variables from "5 - Scenarios 2 - Optimisation - 2 Op Options" table
ConsolPOL = rst!POL
ContType = rst![Container Type]
ShipMode = rst![Shipment Mode]
ConsolWeek = rst![Consol Week]
ContCount = rst![Container Count]

If ShipMode = "CFSCY" Then
Set rstCost = db.OpenRecordset("SELECT [Origin Port] FROM [2 - Rates 1 Origin - 1 Factory Loads - Tariff] WHERE [Origin Port] = '" & ConsolPOL & "';")

Do Until rstCost.EOF

'Get parameter from Cost Tables
CostCurrency = DLookup("[Currency]", "2 - Rates 1 Origin - 1 Factory Loads - Tariff", "[Origin Port] = '" & ConsolPOL & "'")
CostType = DLookup("[Charge Type]", "2 - Rates 1 Origin - 1 Factory Loads - Tariff", "[Origin Port] = '" & ConsolPOL & "'")
CostUOM = DLookup("[Unit Of Measure]", "2 - Rates 1 Origin - 1 Factory Loads - Tariff", "[Origin Port] = '" & ConsolPOL & "'")
CostCharge = DLookup("[Charge]", "2 - Rates 1 Origin - 1 Factory Loads - Tariff", "[Origin Port] = '" & ConsolPOL & "'")

'Get parameter from Exchange Rate Tables
Set rstXchange = db.OpenRecordset("2 - Rates 5 Exchange - Report")
xConversion = DLookup("[Conversion]", "2 - Rates 5 Exchange - Report", "[From] = '" & CostCurrency & "'")

'Calculate Costs
CostX = ContCount * CostCharge
USDCost = CostX * xConversion

Set rstOutput = db.OpenRecordset("5 - Scenarios 2 - Optimisation - 3 Cost 1 Origin CY")
rstOutput.AddNew
rstOutput![Consol Week] = ConsolWeek
rstOutput![POL] = ConsolPOL
rstOutput![Container Type] = ContType
rstOutput![Shipment Mode] = ShipMode
rstOutput![Container Count] = ContCount
rstOutput![Charge Type] = CostType
rstOutput![Unit Of Measure] = CostUOM
rstOutput![CostLocal] = CostX
rstOutput![Cost USD] = USDCost
rstOutput.Update
rstCost.MoveNext
Loop
rstCost.Close
End If
rst.MoveNext
'
Loop
rst.Close
Set rs = Nothing
Set rsCost = Nothing
Set db = Nothing
End Sub

但是如果我将rstCost语句中的where子句删除到

CostCurrency = rstCost!Currency
CostType = rstCost![Charge Type]
CostUOM = rstCost![Unit Of Measure]
CostCharge = rstCost!Charge

上述成本参数已被识别,但它从成本表中返回202条记录,而不是表中仅为香港的5条记录。因此,目前我无法循环利率表,只能找到香港特有的5项费用。 如果你可以得到很好的帮助,就像花了几天谷歌搜索这个但是没有接近。感谢

1 个答案:

答案 0 :(得分:0)

您只需拉动一个字段,而无需查找即可将其全部拉出来:

Set rstCost = db.OpenRecordset("SELECT [Origin Port],[Currency],[Charge Type],[Unit Of Measure],[Charge] FROM [2 - Rates 1 Origin - 1 Factory Loads - Tariff] WHERE [Origin Port] = '" & ConsolPOL & "';")

'Get parameter from Cost Tables
CostCurrency = rstCost![Currency].Value
CostType = rstCost![Charge Type].Value
CostUOM = rstCost![Unit Of Measure].Value
CostCharge = rstCost![Charge].Value

' <snip>

所以不需要循环。