2016-11-09 7 views
0

現在、表Bの中に存在しない表Aのすべてのレコードをプルするワークシートがあり、次にそれらの値を表Bに挿入するマクロがあります。データベースの挿入前後のデータベース接続の更新

しかし、マクロが挿入される前にクエリがリフレッシュされないと、重複が生成されることに気づきました。

現在のマクロでは、挿入前後にどのようにリフレッシュを挿入できますか?

Sub Insert_New_Bills() 

    Dim conn As New ADODB.Connection 
    Dim iRowNo As Integer 
    Dim sBILL_NUM, sROCKTENN_DOC, sACTION, sNOTE1, sNOTE2 As String 

    With Sheets("NEW BILLS") 

     'Open a connection to SQL Server 
     conn.Open "Driver={IBM DB2 ODBC DRIVER};Database=BROWN;Hostname=192.168.100.44;Port=50000;Protocol=TCPIP;Uid=" & "User" & ";Pwd=" & "Maddox2009" & ";CurrentSchema=LYNX;" 

     'Skip the header row 
     iRowNo = 2 

     'Loop until empty cell in COLUMN1 
     Do Until .Cells(iRowNo, 2) = "" 
      sBILL_NUM = .Cells(iRowNo, 2) 
      sROCKTENN_DOC = .Cells(iRowNo, 3) 
      sACTION = .Cells(iRowNo, 4) 
      sNOTE1 = .Cells(iRowNo, 5) 
      sNOTE2 = .Cells(iRowNo, 6) 

      'Generate and execute sql statement to import the excel rows to SQL Server table 
      conn.Execute "INSERT INTO OH_CU_WR_TEMPLATE (BILL_NUMBER, ROCKTENN_DOC, ACTION, NOTE1, NOTE2) values ('" & sBILL_NUM & "','" & sROCKTENN_DOC & "', '" & sACTION & "', '" & sNOTE1 & "', '" & sNOTE2 & "')" 


      iRowNo = iRowNo + 1 
     Loop 

     MsgBox "RECORD UPDATED" 

     conn.Close 
     Set conn = Nothing 

     Selection.ListObject.QueryTable.Refresh BackgroundQuery:=False 

    End With 

End Sub 
+0

私はわかりません'db2'の構文についてです。しかし、私はむしろこれに似たソリューションを使用したいと思います:http://stackoverflow.com/questions/9911659/can-i-use-if-not-exists-to-insert-a-row-if-therow -is-not-present-in-ss特に、同じExcelファイルの複数のインスタンスを許可すると、どのレコードがすでにDBに挿入されており、どのレコードがまだ保留中であるかを制御することはできません。それ以外は、ワークシート・イベントを実装して、アップロードされたイベントとまだアップロードされていないイベントを追跡します。しかし、このソリューションは私が提案した最初のものと同じくらい綺麗ではありません。 – Ralph

答えて

0

前または後のリフレッシュに関係なく、SQL文は重複を回避しません。挿入されたセルの値のいずれかに重複する値が使用されることを制限する主キーまたは複合インデックスがある場合は、エラー/例外処理が現在設定されていないため、エラーが発生し、コードが破損する可能性があります。

定期的に消去される一時テーブル(最終テーブルの正確な構造レプリカ)を作成することを検討してください。次に、固有の値を挿入するために古典的なLEFT JOIN ... NULL/NOT EXISTS/NOT IN追加クエリを実行します。また、私はありません励み、以下ADO parameterizationを使用して怠慢なように:

SQL(1回実行)

CREATE TABLE OH_CU_WR_TEMPLATE_TEMP AS (
    SELECT * FROM OH_CU_WR_TEMPLATE 
) WITH NO DATA 

VBA

Dim cmd As ADODB.Command 
    Dim strSQL As String 
    ... 

    ' CLEAN OUT TEMP TABLE 
    conn.Execute "DELETE FROM OH_CU_WR_TEMPLATE_TEMP" 

    ' PREPARE STATEMENT (INSERTS INTO TEMP TABLE) 
    strSQL = "INSERT INTO OH_CU_WR_TEMPLATE_TEMP (BILL_NUMBER, ROCKTENN_DOC, " _ 
         & " ACTION, NOTE1, NOTE2)" _ 
         & " VALUES (?, ?, ?, ?, ?)" 

    ' ITERATE ROWS 
    Do Until .Cells(iRowNo, 2) = "" 
     ' ASSIGN VALUES 
     sBILL_NUM = .Cells(iRowNo, 2) 
     sROCKTENN_DOC = .Cells(iRowNo, 3) 
     sACTION = .Cells(iRowNo, 4) 
     sNOTE1 = .Cells(iRowNo, 5) 
     sNOTE2 = .Cells(iRowNo, 6) 

     ' UPDATE CMD OBJECT 
     Set cmd = New ADODB.Command 

     With cmd 
      .ActiveConnection = conn 
      .CommandText = strSQL 
      .CommandType = adCmdText 
      .CommandTimeout = 15 
     End With 

     ' BIND PARAMETERS 
     cmd.Parameters.Append cmd.CreateParameter("param1", adVarChar, adParamInput, 255, sBILL_NUM) 
     cmd.Parameters.Append cmd.CreateParameter("param2", adVarChar, adParamInput, 255, sROCKTENN_DOC) 
     cmd.Parameters.Append cmd.CreateParameter("param3", adVarChar, adParamInput, 255, sAction) 
     cmd.Parameters.Append cmd.CreateParameter("param4", adVarChar, adParamInput, 255, sNOTE1) 
     cmd.Parameters.Append cmd.CreateParameter("param5", adVarChar, adParamInput, 255, sNOTE2) 

     ' EXECUTE SQL 
     cmd.Execute 
     iRowNo = iRowNo + 1 
    Loop 

    ' NON-DUPLICATE APPEND QUERY (USE APPROPRIATE JOIN IDs) 
    conn.Execute "INSERT INTO OH_CU_WR_TEMPLATE" _ 
        & " SELECT * FROM OH_CU_WR_TEMPLATE_TEMP temp" _ 
        & " LEFT JOIN OH_CU_WR_TEMPLATE main" _ 
        & " ON temp.ID = main.ID" _ 
        & " WHERE main.ID IS NULL;" 
関連する問題