Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ms access Access 2010 VBA或查询表格并计算结果_Ms Access_Vba - Fatal编程技术网

Ms access Access 2010 VBA或查询表格并计算结果

Ms access Access 2010 VBA或查询表格并计算结果,ms-access,vba,Ms Access,Vba,我有一张表格,里面有几家代理商和几家航空公司的价格,他们按重量收费分成几组 根据出发机场(POL/C)和到达机场(POD/C),我检查所有价格,我必须使用最好的价格。但要展示价格选择 每一家航空公司都有自己的计算方法,因此我必须检查一下 表包含以下信息: ID = AutoNumber, Long Integer A/CODE = Number, Long Integer AGENT = Text, POL/C = Text, POL = Text, POD/C = Text, POD = Te

我有一张表格,里面有几家代理商和几家航空公司的价格,他们按重量收费分成几组

根据出发机场(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
从一开始,它将有两个权重,如下所示:

  • 实际总重(GW-总重)
  • 按体积计算的重量(VW)

    如果GW>VW,则。。 计算基于较高的值(GW) 其他的 计算基于较高的值(VW)

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

    如果有,则将FSC和SSC添加到价格中。 式中,根据重量(VW)计算,如果ScGw=是,则重量为不同科目,并使用(GW)计算 例子: 空运费=0.25欧元/千克(x 405千克大众) 燃料+安全=1.1欧元/千克(x222千克千兆瓦) 如果ScGw=否,则计算正常VW 例子: 空运费=0.25欧元/千克(x 405千克大众) 燃油+安全=1.1欧元/千克(x 405千克大众)

    我们已经以另一种形式计算了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
    

    我试着把你们的规则重新排列成执行顺序

    我添加了以下变量:

    • 计算重量:计算中使用的重量
    • 计算价格:计算中使用的价格
    • 总价:基于重量、标准价格、燃料和安全性的价格
    以下内容看起来正确吗

    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]"
    
    第二期

    你需要所有这些字段吗?选择了最佳价格后,您将需要
    代理
    A/code
    。如果您不需要
    ID
    IATA
    AIRLINE
    ,为什么选择它们

    第三期

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

    第4期

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

    第5期

    Set rec = da.OpenRecordset(strSQL)
    
    MsgBox TotalPrice
    
    我在谷歌上搜索了“访问错误3061”,收到了很多关于这个错误的问题和答案。也许有人会帮你

    如果我理解正确,
    Prices\u List
    不是一个表,而是一个带有参数的查询,您没有包含参数

    第5期

    Set rec = da.OpenRecordset(strSQL)
    
    MsgBox TotalPrice
    
    当您试图让程序运行时,
    Debug.Print
    MsgBox
    更有用

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

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

    您可以一步一步地检查程序语句,检查正在发生的事情。如果将鼠标悬停在变量上,将显示其当前值。如果语句出现错误,您可以更改它并重试

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

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

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

    Debug.Print rec!AGENT & " " & TotalPrice
    
    将输出
    Acme Inc 543.21
    到即时窗口并继续。使用MsgBox,程序停止,您必须记下该值。即时窗口限制为两到三百行,您可以上下滚动或复制到记事本

    摘要

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

    strSQL=strSQL&“其中((价格清单[POL/C])=PolCboV)和((价格清单[POD/C])=PodCboV));”

    应该读

    strSQL=strSQL&“其中((价格清单[POL/C])=”&PolCboV&“')和((价格清单[POD/C])=”&PodCboV&“);”


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

    0向下投票接受非常感谢Tony!我现在遇到了一个错误:运行时错误“3061”:参数太少。我不知道问题出在哪里…@Catalin Anton。我在我的答案中增加了一个额外的部分,希望能对你有所帮助。非常感谢托尼!我会尽量使用