2012-01-10 12 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 

開始から次のように、2点の重みを有するであろう:

表は、以下の情報が含まれ

  1. 実際の総重量(GW - 総重量)
  2. 計算重量ボリューム(VW)

    GW> VWの場合。 計算に基づく高い値(GW)他 計算はより高い値(VW)に基づいている

例: VW = 405キログラムとGW = 222 KGSは次に高い値

FSCを使用しもしあれば、SSCが価格に追加されます。 (GW) 例: 航空貨物=ユーロ0.25/kgs(x 405 kgs VW) 燃料+安全=ユーロ() ここでは重量(VW)と計算された場合のScGw = (x220 kgs GW) ScGw =いいえ次に普通のVWを計算する 例: 航空貨物=ユーロ0.25/kgs(x 405 kgs VW) 燃料+セキュリティ=ユーロ1.1/kgs(x 405 kgs VW )

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:重量に基づいて価格を、標準価格、燃料およびセキュリティ

次は正しいと思われますか?

  • あなたは私が知っている疑いがあるものの、3061エラーを与える声明言っていない:余分な質問

    に応じて

    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 
    

    新しいセクションは、私は2つの問題を抱えています。

  • 私は数年間アクセスを使用していません。

以下は、エラーの原因を特定するのに役立つ一般的なアドバイスです。

問題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

:私はこれとして入力しているのでしょうか?最高の価格を選んだらAGENTまたはA/CODEが必要になります。 IDIATAAIRLINEが必要ない場合は、その理由を選択してください。 3

問題は、あなたが使用していないフィールドの通貨を持っています。これは正しいです?

問題4

Set da = CurrentDb 

私はそれが宣言された、またはこのサブルーチン内で設定されていないので、CurrentDbがグローバル変数であると仮定します。

問題5

Set rec = da.OpenRecordset(strSQL) 

私は、「アクセスエラー3061」をGoogleで検索していると、このエラーに関する質問と回答の多くを受けています。おそらく1つはあなたを助けるでしょう。

私が正しく理解している場合、Prices_Listはテーブルではなく、パラメータを含むクエリであり、パラメータは含まれていません。

問題5

MsgBox TotalPrice 

あなたはあなたのプログラムの作業を取得しようとしているが、Debug.PrintMsgBoxよりも有用です。

このルーチンの初期の文の1つをクリックすると、カーソルがその中に入ります。 F9をクリックします。ステートメントは、ブレークポイントであることを示すために茶色になります。

通常の方法でプログラムを実行します。それが茶色のステートメントに達すると、モジュールを停止して表示します。茶色のステートメントは、茶色と黄色の両方になります。ブラウンはブレークポイントですから。黄色は実行しようとしている声明であるためです。 F8をクリックします。 1つのステートメントが実行され、次のステートメントは黄色のステートメントになります。

何が起きているかを確認するステートメントによって、プログラムステートメントをステップ実行できます。変数にカーソルを置くと、現在の値が表示されます。文でエラーが発生した場合は、文を変更して再試行できます。

好きなだけ多くのブレークポイントを設定できます。 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ではプログラムが停止し、値を書き留める必要があります。イミディエイトウィンドウには2〜300行の制限があり、上下にスクロールしたり、メモ帳にコピーすることができます。私は上記のことができます願ってい

概要

。運が良かった。

+0

0を望ん投票ダウン \t を受け入れる非常にトニーをありがとうございます! 現時点でエラーが発生しました。 実行時エラー '3061': パラメータが少なすぎます。予想される2 問題が何であるか分かりません。 –

+0

@ Catalin Anton。私は私の答えに私が助けてくれることを願って余分なセクションを追加しました。 –

+0

トニーありがとう!私はあなたから受け取ったアドバイスを使用しようとします。今のところ私はたくさんの情報を追加したので、私はその情報を使うことができます。 **とにかく私にスタートを与えました!** –

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年から、私はもはや覚えていない多くのものを。他人を教えるために個人的な時間を使う人のおかげで! –

関連する問題