2017-03-14 13 views
0

シームレスに動作するMS Access DB(旧XPバージョン)を作成しました。MS Access DAOレコードセットの更新が動作しない

テーブルから別のデータを「移動」するルーチンを追加して、これを行う関数を作成しなければなりませんでした。 私が常に使用するメソッドは、ダイナミックレコードセット(またはダイナセット)を使用することでしたが、今回は動作しません。 フローはダイナセットを正しく開き、あるレコードセットのデータを検索して別のレコードセットにコピーしますが、更新が完了すると元のテーブルに何も表示されません。

私はDAO 3.60を使用しています。私はいくつかの提案を持っている

On Error Resume Next 

Dim rstDoc As Recordset 
Dim rstAdd As Recordset 
Dim rstDocEmessi As Recordset 
Dim rstAddDocEmessi As Recordset 
Dim Incassato As Integer 

Set rstDoc = CurrentDb.OpenRecordset("Documenti", dbOpenSnapshot) 
Set rstDocEmessi = CurrentDb.OpenRecordset("TS_DocumentiEmessi", dbOpenDynaset) 
Set rstAdd = CurrentDb.OpenRecordset("Addebiti", dbOpenDynaset) 
Set rstAddDocEmessi = CurrentDb.OpenRecordset("TS_Addebiti_DocumentiEmessi", dbOpenDynaset) 

numDoc = Forms!TS_SceltaStampa!IdDocumento 

    With rstDocEmessi 

      rstDocEmessi.AddNew 

      rstDocEmessi!IdDocOriginale = rstDoc!IdDocumento 
      rstDocEmessi!Data = rstDoc!Data 
      rstDocEmessi![#Fattura] = rstDoc![#Fattura] 
      ... 
      rstDocEmessi!TS_Opposizione = rstDoc!TS_Opposizione 
      rstDocEmessi!TS_DataPagamento = rstDoc!TS_DataPagamento 
      rstDocEmessi!IsIncassato = (IIf(Incassato = vbYes, True, False)) 
      rstDocEmessi!IsImportatoInSospesi = False 

      rstDocEmessi.Update 
      rstDocEmessi.Close 

      ' Copia Addebiti 
      If Not (rstAdd.EOF And rstAdd.BOF) Then 
       rstAdd.MoveFirst 
       Do Until rstAdd.EOF = True 
        If rstAdd!Documento = numDoc Then 

         rstAddDocEmessi.AddNew 

         rstAddDocEmessi!IdAddebito = rstAdd!IdAddebito 
         rstAddDocEmessi!Documento = rstAdd!Documento 
         ... 
         rstAdd!TS_TipoSpesa 
         rstAddDocEmessi!Calcola = rstAdd!Calcola 
         rstAddDocEmessi!Totale = rstAdd!Totale 

         rstAddDocEmessi.Update 
        End If 
        rstAdd.MoveNext 
       Loop 
      End If 
      rstAddDocEmessi.Close 
      rstAdd.Close 
      TS_Registra = True` 
+0

なぜレコードを移動していますか?レコードセットを操作する代わりに、INSERT SELECTのSQLアクション文を使用する可能性があります。 – June7

+0

アプローチ(recordset vs sql)とは別に、構文に何か間違いがありますか?ところで、私はあなたに同意し、私は他の環境(PHP <-> MySQL)でSQLを使用するのに使用されていますが、レコードセット方法を使用してアクセスすると、特にデバッグ状況で何が起こっていたかを詳細に制御できます... – Versatile

+0

Is 1つのレコードにフィルタリングするクエリを文書化しますか?インカサトは宣言されていますが、設定されていません。レコードセットの操作に間違ったことはありません。 – June7

答えて

0

はここ(要約)のコードです。

If Err.Number = ...をテストして、次のコード行で明示的にテストして処理する予定のコード行に特定のエラーが発生することが予想される場合を除き、最初にOn Error Resume Nextを使用しないでください。エラー処理コードブロックがあり、On Error GoTo ERROR_CODE_BLOCKを使用する必要があります。 の場合、ある特定のコマンドのエラーハンドラをオフにする場合は、予期したエラーを処理した後すぐに再度オンにする必要があります。

エラー処理をオフにしているため、制約違反が原因で挿入文が失敗している可能性がありますが、これは表示されないだけです。エラー処理のために、私はあなたのコードを次のように構造化することをお勧めします:

On Error GoTo PROC_ERR 

    Dim rstDoc As Recordset 
    '... 
    'insert the body of your Procedure here 
    '... 

PROC_EXIT: 
    'Add any tidying up code that always needs to run. For example, release all your Object variables 
    Set rstDoc = Nothing 
    Set rstAdd = Nothing 
    Set rstDocEmessi = Nothing 
    Set rstAddDocEmessi = Nothing 
    Exit Sub 

PROC_ERR: 
    MsgBox "Error " & Err.Number & " - " & Err.Description 
    Resume PROC_EXIT 

End Sub 

一般的なコードを提案します。

With rstDocEmessiの構文は、少しタイピングするのに使用されます。あなたのコードのどこかに関連するEnd Withがあるはずですが、私はこれを見ません。次のように私は、コードのこのビットを変更します

With rstDocEmessi 
    .AddNew 
     !IdDocOriginale = rstDoc!IdDocumento 
     !Data = rstDoc!Data 
     ![#Fattura] = rstDoc![#Fattura] 
     ... 
     !TS_Opposizione = rstDoc!TS_Opposizione 
     !TS_DataPagamento = rstDoc!TS_DataPagamento 
     !IsIncassato = (IIf(Incassato = vbYes, True, False)) 
     !IsImportatoInSospesi = False 
    .Update 
    .Close 
End With 

は最後に、rstAddDocEmessiへの挿入は、ビットをクリーンアップすることができます。 rstAddのレコードのテーブル全体を開き、順番に各レコードを確認してrstAddDocEmessiレコードを追加する必要があるかどうかを確認するのではなく、rstAddレコードセットの関連レコードを取得するだけではどうですか。

Set rstAdd = CurrentDb.OpenRecordset("Select * From Addebiti " & _ 
     "Where Documento = " & Forms!TS_SceltaStampa!IdDocumento, dbOpenDynaset) 

'No need to test for (rstAdd.BOF And rstAdd.EOF), and no need for rstAdd.MoveFirst 
'Just go straight into... 
Do Until rstAdd.EOF = True 
    rstAddDocEmessi.AddNew 
     rstAddDocEmessi!IdAddebito = rstAdd!IdAddebito 
     rstAddDocEmessi!Documento = rstAdd!Documento 
     ... 
     rstAddDocEmessi!Calcola = rstAdd!Calcola 
     rstAddDocEmessi!Totale = rstAdd!Totale 
    rstAddDocEmessi.Update 
    rstAdd.MoveNext 
Loop 
関連する問題