1

私のコードの問題を説明する前に、背景の話から始めましょう。MS Access 2010 を使用しています。2 つの列を持つデータのテーブルをインポートできました。その後、インポートしたテーブルに適切な値を持つフィールドを追加することで、データを整理することができました。次に、キュレートされたテーブルを取得して、データベースに統合する必要があります。ただし、Microsoft のビルトイン クエリは使用できません。統合によってテーブルが分割されますが、各レコードのデータの関係を保持する必要があります。

この目的のために、私はVBAでいくつかのコードを書いています:

Function IntegrateNIRData(curatedTable, queryRecords)

    On Error GoTo Error_Handler
    Dim db As DAO.Database
    Dim rsCuratedTable, rsDBRecords As DAO.Recordset
    Dim iCount As Integer

    Set db = CurrentDb()
    Set rsCuratedTable = db.OpenRecordset(curatedTable, dbOpenTable) 'open the recordset for use (table, Query, SQL Statement)
    Set rsDBRecords = db.OpenRecordset("NIR_Samples_verify", dbOpenDynaset, dbExecDirect, dbOptimisticValue)

    With rsCuratedTable
        If Not (.BOF And .EOF) Then
            Do While Not .EOF
                ' Rest of your code here.
                rsDBRecords.AddNew
                    'Assign Fields here.
                    rsDBRecords![Product Name] = rsCuratedTable![productName]
                    rsDBRecords![Lot Number] = rsCuratedTable![lotNumber]
                    rsDBRecords!counts = rsCuratedTable![counts]
                    rsDBRecords![subsets] = rsCuratedTable![subsets]
                    rsDBRecords![Date Taken] = rsCuratedTable![dateTaken]
                rsDBRecords.Update
                rsDBRecords.Bookmark = rsDBRecords.LastModified
                .MoveNext
            Loop
        End If
    End With

    rsCuratedTable.Close 'Close the recordset
    rsDBRecords.Close 'Close the recordset

Error_Handler_Exit:
    On Error Resume Next
    'Cleanup after ourselves
    Set rs = Nothing
    Set db = Nothing
    Exit Function

Error_Handler:
    MsgBox "MS Access has generated the following error" & vbCrLf & vbCrLf & "Error Number: " & _
    Err.Number & vbCrLf & "Error Source: IntegrateNIRData" & vbCrLf & "Error Description: " & _
    Err.Description, vbCritical, "An Error has Occured!"
    Resume Error_Handler_Exit

End Function

関数は、2 番目の OpenRecordset であるこの行でハングします。

Set rsDBRecords = db.OpenRecordset("NIR_Samples_verify", dbOpenDynaset, dbExecDirect, dbOptimisticValue)

私の理解では、これはワークスペースと、Jet エンジンが複数のテーブルにまたがる ms クエリを受け入れないことに関係している可能性があります。もちろん、私も途方に暮れる可能性があります。この時点でのアドバイスは非常に高く評価されます。

アップデート:

何人かが同様の質問をしたので、次のことを明確にする必要があると感じました。

1) NIR_Samples_verify は、データベース内のいくつかのテーブルからレコードのテーブルを生成する MS アクセス選択クエリです。

2) OpenRecordset メソッドで RecordsetOptionEnum と LockTypeEnum を設定した内容に応じて、2 つのエラーが発生し続けます。1 つはエラー番号 3027 データベースは読み取り専用です 2 つはエラー番号 3001 無効な引数です

3)私の理解では、コードの残りの部分は問題ないはずです。問題を引き起こしているのは OpenRecordset メソッドだけです。

更新 2:

アクセスが自分のやりたいことができないのではないかと考えています。説明しましょう。主キーを持つ 2 つのテーブルがあり、これらのキーが 2 つのテーブルをリンクする 3 番目のテーブルで参照され、多対多の関係が生じている場合、コードは新しいデータを 2 つのテーブルに追加するだけでなく、また、データ内の関係を維持するために、3 番目のテーブルに適切なレコードを生成します。それ以来になることを願っています。私は助けと経験に感謝します。

更新 3:

ネットを検索していて、以下を見つけました。

この投稿から、クエリは次の場合にのみ更新可能であると書かれています: 1) 単一のテーブルに基づいている。2) 単一のテーブルに基づくクエリに基づいています。3) 1 対 1 の関係を持つテーブルに基づくクエリに基づいています。

4

2 に答える 2

0

結局のところ、私の予感は正しかった。この問題は、更新可能なクエリと更新できないクエリを持つ MS Access に関係していました (質問の編集を参照してください)。主な問題は、Microsoft がこの情報を明らかにしていないだけでなく、Microsoft のサイトにもマスター リストがないことです。助けてくれてありがとう。詳細については、この記事を参照してください。

于 2012-07-27T14:31:58.097 に答える