私のコードの問題を説明する前に、背景の話から始めましょう。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 の関係を持つテーブルに基づくクエリに基づいています。