2012-01-10 62 views
0

我有一个表包含来自几个代理商和几家航空公司的价格,他们被按重量收费划分成组。访问2010年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> VW那么.. 计算基于较高的值(GW) 其他 计算基于所述更高的值(VW)

例如: VW = 405公斤和GW = 222公斤然后使用更高的值

FSC和如果有的话,SSC被添加到价格中。 (GW) 例如: 空运费用= 0.25欧元/千克(x 405千克大众汽车) 燃料+安全=欧元计算重量(VW)并且如果ScGw =是那么重量是不同的帐户如果ScGw =否则计算正常的VW 示例: 空运费= 0.25欧元/千克(x 405千克VW) 燃料+安全=欧元1.1 /千克(x 405千克VW )

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)已经以另一种形式选择。

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


我卡的那一刻,并与错误:

Run-time error ‘3061’:
Too few parameters. Expected 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 

回答

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。如果你不需要ID,IATA,AIRLINE,为什么选择它们?

3期

你有你不使用字段货币。它是否正确?

第4期

Set da = CurrentDb 

我认为CurrentDb是一个全局变量,因为它不声明或该子程序内。

5期

Set rec = da.OpenRecordset(strSQL) 

我用Google搜索“访问错误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。

摘要

我希望上述帮助。祝你好运。

+0

0票下来接受 \t 非常感谢托尼! 我困在此刻,并与错误: 运行时错误'3061': 太少的参数。预计2 我不知道什么问题是... – 2012-01-11 05:26:36

+0

@ Catalin Anton。我已经为我的答案添加了一个额外的部分,我希望这会有所帮助。 – 2012-01-11 13:26:41

+0

非常感谢Tony!我会尽量使用我收到的建议。现在我增加了很多,所以我可以使用这些信息。 **无论如何,你已经给了我开始!** – 2012-01-13 06:22:35

0

线

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没有他们的名字

+0

谢谢!克里斯帕德加姆 - 现在好了,现在只需要做一件事就可以让我和一张桌子上的结果能够选择哪一种是最好的解决方案。自从我没有完成编程之后的10年,以及许多我不再记得的东西。感谢那些利用个人时间教别人的人! – 2012-01-13 06:17:18