我有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项费用。 如果你可以得到很好的帮助,就像花了几天谷歌搜索这个但是没有接近。感谢
答案 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>
所以不需要循环。