1

列の古いレコードに番号を付けてデータシート サブフォームのアイテムを注文するコードを実行しましたが、それに依存するメイン フォームを開いたときに在庫トランザクション テーブルの列を更新した後です。クエリを実行して顧客の残高を決定し、そのクエリを実行するのに2〜3分以上かかりますが、データの古いコピーに戻すと正常に実行され、1つの列のレコードの番号を変更するだけでしたそのうちの 1 には、レコードの番号を付け直すコードが含まれていました。

Dim rst As DAO.Recordset
Dim i As Long
Dim OID As Long
Dim stringSQL as String
i = 1
stringSQL = "SELECT * FROM [Inventory Transactions] " _
          & "WHERE [OrderID] >  0 Order By [OrderID],[TransactionID]"
Set rst = CurrentDb.OpenRecordset(stringSQL, dbOpenDynaset)
With rst
OID = rst!OrderID
    Do Until .EOF
        If OID = rst!OrderID Then
        .Edit
            !OrderLineNumber = i
        .Update
        .MoveNext
        i = i + 1
        Else
        OID = rst!OrderID
        i = 1
        End If
    Loop
    .Close
End With
Set rst = Nothing

編集1:

今日もこれで遊んでいましたが、変更した在庫トランザクション テーブルを実際に参照する第 2 レベルのサブクエリを壊しているクエリは正常に実行されますが、サブクエリ 2 と支払いクエリの合計を参照するサブクエリ 1 にレベルが上がり、チョークしますが、合計の支払いは支払いテーブルのみを参照します。

編集2:

今日、さらにテストを行いました。サブクエリ 2 と合計支払クエリは、どちらもストップウォッチで時間を計るよりも速く実行されますが、組み合わせると約 1:45 かかります。最初の 4 つは合計で、最後はグループ化され、次に支払合計からの 1 つがグループ化されます

サブクエリ 2:

SELECT 
  CLng((nz([UnitsSold])*nz([UnitPrice]))*(1-nz([Discount]))*100)/100 AS [Line Total], 
  CLng([Line Total]*(1+nz([SalesTaxRate]))*100)/100 AS [Line Total With Tax], 
  [Line Total With Tax]-[Line Total] AS [Line Tax], 
  [Inventory Transactions].* 
  FROM [Inventory Transactions] 
  WHERE ((([Inventory Transactions].OrderID) Is Not Null));

支払合計クエリ:

SELECT DISTINCTROW Payments.OrderID, 
  Sum(Payments.PaymentAmount) AS [Total Payments]
FROM Payments 
GROUP BY Payments.OrderID;

サブクエリ 1:

SELECT 
  [Balance Due By Customers Subquery2].OrderID, 
  Sum([Balance Due By Customers Subquery2].[Line Total]) AS [SumOfLine Total], 
  Sum([Balance Due By Customers Subquery2].[Line Tax]) AS [SumOfLine Tax], 
  Sum([Balance Due By Customers Subquery2].[Line Total With Tax]) AS [SumOfLine Total With Tax], 
  [Sum Of Payments Query].[Total Payments]
FROM [Balance Due By Customers Subquery2] 
  LEFT JOIN [Sum Of Payments Query] 
  ON [Balance Due By Customers Subquery2].OrderID = [Sum Of Payments Query].OrderID
GROUP BY [Balance Due By Customers Subquery2].OrderID, 
  [Sum Of Payments Query].[Total Payments];
4

1 に答える 1

1
  1. 組み込み関数はnz()クエリを遅くします。また、SQL が読みにくくなります。テーブルを改善してくださいnz()。必要ありません。たとえば、テーブルをデザイン ビューで開き、各数値フィールドに既定値の 0 を設定します。
  2. DISTINCTROWキーワードなしで各クエリをテストします。クエリはより高速に実行されるはずです。各クエリの句IDにレコードがあることに気付いたので、何もしていないと思います。SELECT(同じ数のレコードが返されるかどうかを確認してください。そうです、何もしていません。)
  3. OrderIDによってもグループ化するクエリ結果でグループ化しているようですOrderID。上層部GROUP BYは何もしていません。つまり、関数の一部がSUM()何もしていないことを意味します...遅いことを除いて。
  4. Subquery 2めちゃくちゃです(率直でごめんなさい)。これらすべてのフィールドが必要ですか? もしそうなら、少なくとも構文を短くして私たちを憐れんでください: [Inventory Transactions].PriceChangedとして表すことができますPriceChanged。そして (少なくとも将来的には) テーブル名とクエリ名にスペースを入れないようにしてください
  5. のような計算[Line Total]は、予備クエリでうまく機能する可能性があります。私の意見では、少なくともよりクリーンなプログラミングになるでしょう。
  6. 各文の終わりにピリオドを使用します。あなたの投稿を理解するのに役立ちます。

悪い設計はもろい: 不思議な理由で壊れてしまう. 優れた設計はクエリの機能を容易にします。この場合、トラブルシューティングに必要です。多くの場合、クエリを修正するには

  1. 問題がなくなるまで削減と簡素化
  2. 必要な結果に戻ります。(詳細はこちら

Edit 2に基づいて、でこのアプローチを使用する必要がありますSubquery 2他の 2 つのクエリを組み合わせた最も単純なクエリから始めます。 集計関数 ( SUM(), GROUP BY) は省略してください。どういうわけか、それらは物事を台無しにしています。

データの結果を変更する方法で単純化する前に、構文を改善するだけでこれらのクエリを単純化できます。たとえばSubquery 1、ネストされたクエリのエイリアス名を次に示します。読みやすくなっています。

SELECT 
  BalanceDue.OrderID, 
  Sum(BalanceDue.[Line Total]) AS [SumOfLine Total], 
  Sum(BalanceDue.[Line Tax]) AS [SumOfLine Tax], 
  Sum(BalanceDue.[Line Total With Tax]) AS [SumOfLine Total With Tax], 
  SumPmts.[Total Payments]
FROM [Balance Due By Customers Subquery2] AS BalanceDue
  LEFT JOIN [Sum Of Payments Query] AS SumPmts
  ON BalanceDue.OrderID = SumPmts.OrderID
GROUP BY BalanceDue.OrderID, 
  SumPmts.[Total Payments];
于 2013-08-02T03:19:45.320 に答える