【问题标题】:Access 2010 VBA or query a table and calculate the results访问 2010 VBA 或查询表并计算结果
【发布时间】:2012-02-06 21:38:08
【问题描述】:

我有一个表格,其中包含几个代理和几家航空公司的价格,它们按重量收费分组。

根据出发机场 (POL/C) 和到达机场 (POD/C),我检查了所有价格,我必须使用最好的一个。但要显示价格替代品。

每个航空公司都有自己的计算方法,所以我必须检查一下。

表格包含以下信息:

ID = AutoNumber, Long Integer
A/CODE = Number, Long Integer
AGENT = Text,
POL/C = Text,
POL = Text,
POD/C = Text,
POD = Text,
IATA = Text,
Airline = Text,
UPDATE = Date/Time, Short Date
EXPIRY DATE = Date/Time, Short Date
CURRENCY = Text,
M/M = Number, Double (Minimum weight accepted)
-45 = Number, Double (price for the weight between 1 and 45)
+45 = Number, Double (price for the weight starting from 45 to 100)
+100 = Number, Double (price for the weight starting from 100 to 300)
+300 = Number, Double (price for the weight starting from 300 to 500)
+500 = Number, Double (price for the weight starting from 500 to 1000)
+1000 = Number, Double (price for the weight starting from 1000)
FSC = Number, Double
SSC = Number, Double
ScGw = Yes/No, Yes/No
FREQUENCY = Text,
TT = Number, Long Integer
T/S = Yes/No, Yes/No

从一开始它将有两个权重,如下所示:

  1. 实际总重量(GW-毛重)
  2. 按体积计算的重量 (VW)

    如果 GW > VW 那么.. 计算基于较高值 (GW) 别的 计算基于较高的值(VW)

示例: VW = 405 kgs 和 GW = 222 kgs 然后使用更高的值

FSC 和 SSC 会添加到价格中(如果有)。 其中根据重量 (VW) 计算,如果 ScGw = Yes THEN 重量是不同的帐户,使用 (GW) 计算 例子: 空运 = 0.25 欧元/公斤(x 405 公斤大众) 燃料 + 安全 = 1.1 欧元/公斤(x 222 公斤 GW) 如果 ScGw = No THEN 计算正常 VW 例子: 空运 = 0.25 欧元/公斤(x 405 公斤大众) 燃料 + 安全 = 1.1 欧元/公斤(x 405 公斤大众)

If the calculation is made according to GW, 
then add the FSC and SSC automatically and without having to count, 
if ScGw = Yes / No

GW和VW的值我们已经用另一种形式计算过了,只需要使用即可。 出发机场 (POL/C) 和到达机场 (POD/C) 已经以另一种形式选择。

如果你能帮助我,几天根本找不到任何解决方案。我正在写整页但没有任何好的结果。 感谢所有回复的人。


我现在被困在错误中:

运行时错误‘3061’:
参数太少。预计 2

不知道是什么问题……

Public Sub CalculPret()

Dim da As Database
Dim rec As Recordset
Dim PolCboV As String
Dim PodCboV As String
Dim strSQL As String
Dim GrossWeight As Double
Dim VolumeWeight As Double
Dim CalcWeight As Double
Dim CalcWeightScGw As Double
Dim CalcPrice As Double
Dim TotalPrice As Double

PolCboV = [Forms]![DimensionsQry]![PolCbo]
PodCboV = [Forms]![DimensionsQry]![PodCbo]

strSQL = "SELECT Prices_List.ID, Prices_List.[A/CODE], Prices_List.AGENT, Prices_List.[POL/C], Prices_List.POL, Prices_List.[POD/C], Prices_List.POD, Prices_List.IATA, Prices_List.AIRLINE, Prices_List.UPDATE, Prices_List.[EXPIRY DATE], Prices_List.CURRENCY, Prices_List.[M/M], Prices_List.[-45], Prices_List.[+45], Prices_List.[+100], Prices_List.[+300], Prices_List.[+500], Prices_List.[+1000], Prices_List.FSC, Prices_List.SSC, Prices_List.ScGw, Prices_List.FREQUENCY, Prices_List.TT, Prices_List.[T/S]"
strSQL = strSQL & " FROM Prices_List"
strSQL = strSQL & " WHERE (((Prices_List.[POL/C])=PolCboV) AND ((Prices_List.[POD/C])=PodCboV)); "

Set da = CurrentDb
Set rec = da.OpenRecordset(strSQL)

    If rec.RecordCount = 0 Then
        rec.Close
        Exit Sub
    Else
            GrossWeight = [Forms]![DimensionsQry]![Text34]
            VolumeWeight = [Forms]![DimensionsQry]![Text36]

        If GrossWeight > VolumeWeight Then
            CalcWeight = GrossWeight
        Else
            If ScGw = "Yes" Then
                CalcWeight = GrossWeight
            Else
                CalcWeight = VolumeWeight
            End If
        End If
        rec.MoveFirst
            Do Until rec.EOF
                Select Case CalcWeight
                  Case 1 To 44
                    CalcPrice = rec![-45]
                  Case 45 To 99
                    CalcPrice = rec![+45]
                  Case 100 To 299
                    CalcPrice = rec![+100]
                  Case 300 To 499
                    CalcPrice = rec![+300]
                  Case 500 To 999
                    CalcPrice = rec![+500]
                  Case Is >= 1000
                    CalcPrice = rec![+1000]
                End Select

                If CalcWeight = GrossWeight Then
                    CalcPrice = CalcPrice + rec!FSC + rec!SSC
                    TotalPrice = CalcPrice * CalcWeight
                Else
                    TotalPrice = (CalcPrice * CalcWeight) + ((rec!FSC + rec!SSC) * GrossWeight)
                End If
                MsgBox TotalPrice
            rec.MoveNext
            Loop
    End If
rec.Close

End Sub

【问题讨论】:

    标签: ms-access vba


    【解决方案1】:

    我已尝试将您的规则重新排列为执行顺序。

    我添加了以下变量:

    • CalcWeight:计算中使用的重量
    • CalcPrice:计算中使用的价格
    • TotalPrice:价格基于重量、标准价格、燃料和安全性

    以下内容看起来对吗?

    If GrossWeight > VolumeWeight Then
      CalcWeight = GrossWeight
    Else
      If ScGw = "Yes" Then
        CalcWeight = GrossWeight
      Else
        CalcWeight = VolumeWeight
      End If
    End If
    
    Select Case CalcWeight
      Case 1 To 44
        CalcPrice = Price(-45)
      Case 45 to 99
        CalcPrice = Price(+45)
      Case 100 To 299
        CalcPrice = Price(+100)
      Case 300 To 499
        CalcPrice = Price(+300)
      Case 500 To 999
        CalcPrice = Price(500)
      Case Is >= 1000
        CalcPrice = Price(1000)
    End Select
    
    ' I am unclear about adding FSC and SSC to CalcPrice.
    ' It appears to be based on which weight is used but
    ' it may be more complicated. 
    
    If CalcWeight = GrossWeight Then
      CalcPrice = CalcPrice + FSC + SSC
    End If
    
    TotalPrice = CalcPrice * CalcWeight
    

    针对额外问题的新部分

    我有两个问题:

    • 虽然我怀疑我知道,但你没有说哪个语句给出了 3061 错误。
    • 我已经有几年没有使用 Access了。

    以下所有内容都是一般性建议,可帮助您找出错误原因。

    问题 1

    strSQL = "SELECT Prices_List.ID, Prices_List.[A/CODE], Prices_List.AGENT, Prices_List.[POL/C], Prices_List.POL, Prices_List.[POD/C], Prices_List.POD, Prices_List.IATA, Prices_List.AIRLINE, Prices_List.UPDATE, Prices_List.[EXPIRY DATE], Prices_List.CURRENCY, Prices_List.[M/M], Prices_List.[-45], Prices_List.[+45], Prices_List.[+100], Prices_List.[+300], Prices_List.[+500], Prices_List.[+1000], Prices_List.FSC, Prices_List.SSC, Prices_List.ScGw, Prices_List.FREQUENCY, Prices_List.TT, Prices_List.[T/S]"
    

    我不喜欢页面外的长语句。我会这样输入:

    strSQL = "SELECT Prices_List.ID, Prices_List.[A/CODE], Prices_List.AGENT, " & _
             "Prices_List.[POL/C], Prices_List.POL, Prices_List.[POD/C],  " & _
             "Prices_List.POD, Prices_List.IATA, Prices_List.AIRLINE, " & _
             "Prices_List.UPDATE, Prices_List.[EXPIRY DATE], Prices_List.CURRENCY, " & _
             "Prices_List.[M/M], Prices_List.[-45], Prices_List.[+45], " & _
             "Prices_List.[+100], Prices_List.[+300], Prices_List.[+500],  " & _
             "Prices_List.[+1000], Prices_List.FSC, Prices_List.SSC, " & _
             "Prices_List.ScGw, Prices_List.FREQUENCY, Prices_List.TT, " & _
             "Prices_List.[T/S]"
    

    问题 2

    您需要所有这些字段吗?当您选择了最优惠的价格后,您将需要AGENTA/CODE。如果您不需要IDIATAAIRLINE,为什么要选择它们?

    问题 3

    您有一个不使用的字段 CURRENCY。这是正确的吗?

    问题 4

    Set da = CurrentDb
    

    我假设 CurrentDb 是一个全局变量,因为它没有在这个子例程中声明或设置。

    问题 5

    Set rec = da.OpenRecordset(strSQL)
    

    我搜索了“访问错误 3061”,并收到了很多关于此错误的问题和答案。也许有人会帮助你。

    如果我理解正确,Prices_List 不是表,而是带参数的查询,而您没有包含参数。

    问题 5

    MsgBox TotalPrice
    

    当您尝试让您的程序运行时,Debug.PrintMsgBox 更有用。

    单击此例程中的早期语句之一以将光标置于其中。单击 F9。该语句将变为棕色,表示它是一个断点。

    以正常方式运行您的程序。当它到达 brown 语句时,它将停止并显示该模块。棕色声明将是棕色和黄色。棕色,因为它是一个断点;黄色,因为它是即将执行的语句。点击F8;一条语句将被执行,下一条语句将变为黄色。

    您可以逐个语句检查正在发生的情况来逐步执行您的程序语句。如果将鼠标悬停在变量上,将显示其当前值。如果语句出错,您可以更改它并重试。

    您可以拥有任意数量的断点。单击 F5 会使程序运行到下一个断点。使用 F5 和 F8,您可以控制检查程序的哪些位。

    Debug.Assert rec!AGENT <> "Acme Inc" 如果您的程序的某个部分出现故障,可能会非常有用。如果代理是“Acme Inc”,此调试断言将停止程序。语法为Debug.Assert boolean expression。使用正确的布尔表达式,您可以随时停止您的程序。

    在编辑器屏幕的底部,您应该会看到立即窗口。如果没有,请点击Ctrl+G

    Debug.Print rec!AGENT & " " & TotalPrice
    

    Acme Inc 543.21 输出到即时窗口并继续。使用 MsgBox 程序停止,您必须记下该值。即时窗口有两三百行的限制,您可以上下滚动或复制到记事本。

    总结

    我希望以上内容有所帮助。祝你好运。

    【讨论】:

    • 0 反对票 接受 非常感谢托尼!我现在陷入了错误:运行时错误'3061':参数太少。预期2 不知道是什么问题...
    • @卡塔林安东。我在我的答案中添加了一个额外的部分,希望对您有所帮助。
    • 非常感谢托尼!我将尝试使用我从您那里收到的建议。现在我添加了很多,所以我可以使用这些信息。 不管怎样,你给了我一个开始!
    【解决方案2】:

    线

    strSQL = strSQL & " WHERE (((Prices_List.[POL/C])=PolCboV) AND ((Prices_List.[POD/C])=PodCboV));"

    应该阅读

    strSQL = strSQL & " WHERE (((Prices_List.[POL/C])='" & PolCboV & "') AND ((Prices_List.[POD/C])='" & PodCboV & "')) ;"

    因为 PolCbov 和 PodCbov 是代码中的变量,所以您希望它们在 SQL 中的值而不是它们的名称

    【讨论】:

    • 谢谢! Chris Padgham - 现在一切正常,现在只需要做给我和结果表,以便能够选择哪个是最佳解决方案。自从我10年没有做过编程以来,很多事情我已经不记得了。感谢那些利用个人时间教别人的人!
    猜你喜欢
    • 2011-06-15
    • 2014-08-04
    • 1970-01-01
    • 1970-01-01
    • 2017-08-05
    • 1970-01-01
    • 1970-01-01
    • 2011-04-02
    • 1970-01-01
    相关资源
    最近更新 更多