Ms access Access 2010 VBA或查询表格并计算结果
我有一张表格,里面有几家代理商和几家航空公司的价格,他们按重量收费分成几组 根据出发机场(POL/C)和到达机场(POD/C),我检查所有价格,我必须使用最好的价格。但要展示价格选择 每一家航空公司都有自己的计算方法,因此我必须检查一下 表包含以下信息: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
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
从一开始,它将有两个权重,如下所示:
此时此刻,我被错误所困扰: 运行时错误“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了
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。我在我的答案中增加了一个额外的部分,希望能对你有所帮助。非常感谢托尼!我会尽量使用