访问2010 VBA或查询表并计算结果

时间:2012-01-10 13:20:04

标签: ms-access 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 = 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>那么大众...... 计算基于更高的值(GW) 其他 计算基于较高的值(VW)

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

    如果有的话,FSC和SSC会加到价格中。 在哪里计算重量(VW)和如果ScGw =是那么重量是不同的帐户并使用(GW)计算 例: 空运=欧元0.25 /公斤(x 405公斤大众) 燃油+安全性=欧元1.1 /公斤(x 222公斤GW) 如果ScGw =否则计算正常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
    

2 个答案:

答案 0 :(得分:0)

我试图将规则重新排列为执行顺序。

我添加了以下变量:

  • 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。该陈述将变为褐色,表明它是一个断点。

以正常方式运行程序。当它到达棕色语句时,它将停止并显示模块。棕色声明将是棕色和黄色。布朗,因为它是一个断点;黄色,因为它是即将执行的声明。点击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,程序停止,您必须记下该值。立即窗口限制为两三百行,您可以向上或向下滚动或复制到NotePad。

<强>摘要

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

答案 1 :(得分:0)

strSQL = strSQL&amp; “哪里(((价格_。[POL / C])= PolCboV)和((价格_。[POD / C])= PodCboV));”

应该阅读

strSQL = strSQL&amp; “WHERE(((价格_。[POL / C])='”&amp; PolCboV&amp;“')和((Price_List。[POD / C])='”&amp; PodCboV&amp;“'));”< / p>

因为PolCbov&amp; PodCbov是代码中的变量,您希望它们在SQL中的值不是它们的名称