3

ループして別の一時テーブルに追加する必要があるピボット クエリがあります。ピボット クエリは、見つかったさまざまなステータスの合計です。ステータスはEarlyLate、およびOn-Timeです。ユーザーの選択内容によっては、すべてのステータスが表示されるわけではありません。したがって、次を実行すると:

Set rs1 = CurrentDb.OpenRecordset("MyReceivingOnTimeDeliverySummary", dbOpenDynaset)
Set rs = CurrentDb.OpenRecordset("TRANSFORM Sum(recvqty) AS SumOfrecvqty " & _
                                 "SELECT supname, Sum(recvqty) AS TotalReceivedQty " & _
                                 "FROM MyReceivingOnTimeDeliveryDetail " & _
                                 "GROUP BY supname " & _
                                 "PIVOT Status", dbOpenDynaset)
If (rs.RecordCount <> 0) Then
   rs.MoveFirst
   Do While rs.EOF <> True
      rs1.AddNew
      rs1.Fields("[supname]").value = rs.Fields("[supname]").value
      rs1.Fields("[TotalReceivedQty]").value = rs.Fields("[TotalReceivedQty]").value
      rs1.Fields("[Early]").value = rs.Fields("[Early]").value
      rs1.Fields("[Late]").value = rs.Fields("[Late]").value
      rs1.Fields("[OnTime]").value = rs.Fields("[On-Time]").value
      rs1.Update
      rs.MoveNext
   Loop
End If

MyReceivingOnTimeDeliverySummaryステータスの 1 つがクエリの結果にない場合、その値をテーブルに追加するときにエラーが発生します。

各ステータスをテストして、ステータスがない場合は 0 として追加するにはどうすればよいですか?

4

2 に答える 2

2

この場合、小さな均一な変更を伴うコピーなどの単純な操作では、レコードセットを避ける必要があります。しかし、朗報です。これにより、すべてが簡単になります。

まず、クエリを作成するために既に持っている SQL ステートメントを使用します。

Dim db As Database
Set db= CurrentDb
db.CreateQueryDef "qry1", "sqltext"

次に、そのクエリから、集計テーブルに SELECT INTO (または INSERT INTO) します。

db.Execute "SELECT * INTO MyReceivingOnTimeDeliverySummary FROM qry1"

フィールドが存在しない場合は、フィールドを追加できます。

On Error Resume Next: db.Execute "ALTER TABLE MyReceivingOnTimeDeliverySummary ADD COLUMN Early NUMBER": Err.Clear: On Error GoTo 0
On Error Resume Next: db.Execute "ALTER TABLE MyReceivingOnTimeDeliverySummary ADD COLUMN Late NUMBER": Err.Clear: On Error GoTo 0
On Error Resume Next: db.Execute "ALTER TABLE MyReceivingOnTimeDeliverySummary ADD COLUMN OnTime NUMBER": Err.Clear: On Error GoTo 0

最後に、ヌルをゼロに修正します。

db.Execute "UPDATE [MyReceivingOnTimeDeliverySummary] SET [Early] = Nz([Early],0)"
db.Execute "UPDATE [MyReceivingOnTimeDeliverySummary] SET [Late] = Nz([Late],0)"
db.Execute "UPDATE [MyReceivingOnTimeDeliverySummary] SET [OnTime] = Nz([OnTime],0)"

なぜこのようにするのですか?私の経験では、SQL はレコードセットよりもはるかに高速です。

于 2013-09-16T16:28:25.377 に答える
1

MyReceivingOnTimeDeliverySummaryピボット クエリに存在しない可能性のあるフィールドのデフォルト値をゼロに設定します。

次に、ピボット クエリ レコードセット内のフィールドをループし、それらのフィールドの値を他のレコードセット内の一致するフィールドに追加します。

Dim fld As DAO.Field
If Not (rs.BOF And rs.EOF) Then
    rs.MoveFirst
    Do While Not rs.EOF
        rs1.AddNew
        For Each fld In rs.Fields
            rs1.Fields(fld.Name).value = rs.Fields(fld.Name).value
        Next
        rs1.Update
        rs.MoveNext
    Loop
End If

dbAppendOnlyちなみに、次のように置き換えると、コードの動作が速くなる場合もありますdbOpenDynaset

OpenRecordset("MyReceivingOnTimeDeliverySummary", dbOpenDynaset)

この変化がどれほどの影響を与えるかはわかりません。達成しようとしていることのロジックは変わりません。そしておそらく、速度への影響は取るに足らないものになるでしょう。しかし、調べるのにそれほど費用はかかりません。:-)

于 2013-09-16T16:24:15.787 に答える