2017-07-09 9 views
0

Excelからテーブルをインポートして、それらのテーブル間の関係を維持しようとしています。データのインポートと追加

私は外部キーでお互いに接続されているいくつかの空のテーブルを持っています。私は基本的にそれらのテーブルにAccessからのデータを埋め込みます。例えば。テーブル「ProductsTests」は、データが追加されるときに、テーブル「Products」の外部キーを継承します。

あなたはそれを行う最良の方法は何だと思いますか?何か助けてくれてありがとう。

答えて

0

Excelファイルを別のテーブルにインポートしてから、SQLクエリを使用して目的のテーブルにデータを追加すると、問題はありません(正しい順序でインポートすると、参照整合性に違反し、1対1の関係はしません)。モジュールに次のコードを追加します。

が関係を持つテーブルを上書きすることは、これは私のプロジェクトの一つである、やや困難である

その後
'This function makes a duplicate of the provided relation 
Public Function DuplicateRelation(SourceRelation As Relation) As Relation 
    Set DuplicateRelation = CurrentDb.CreateRelation(SourceRelation.NAME, SourceRelation.Table, SourceRelation.ForeignTable) 
    DuplicateRelation.Attributes = SourceRelation.Attributes 
    Dim i As Integer 
    Dim fldLoop As Field 
    Do While i < SourceRelation.Fields.Count 
     Set fldLoop = DuplicateRelation.CreateField(SourceRelation.Fields(i).NAME) 
     fldLoop.ForeignName = SourceRelation.Fields(i).ForeignName 
     DuplicateRelation.Fields.Append fldLoop 
     i = i + 1 
    Loop 
End Function 

'This function creates a collection containing duplicates of all relations involving strTablename, and then deletes those relations 
Public Function DeleteRelationshipsCreateBackup(strTablename As String) As Collection 
    Dim ReturnCollection As Collection 
    Set ReturnCollection = New Collection 
    Dim i As Integer 
    Dim o As Integer 
    Do While i <= (CurrentDb.Relations.Count - 1) 
     Select Case strTablename 
      Case Is = CurrentDb.Relations(i).Table 
       ReturnCollection.Add DuplicateRelation(CurrentDb.Relations(i)) 
       o = o + 1 
       CurrentDb.Relations.Delete CurrentDb.Relations(i).NAME 
      Case Is = CurrentDb.Relations(i).ForeignTable 
       ReturnCollection.Add DuplicateRelation(CurrentDb.Relations(i)) 
       o = o + 1 
       CurrentDb.Relations.Delete CurrentDb.Relations(i).NAME 
      Case Else 
       i = i + 1 
     End Select 
    Loop 
    Set DeleteRelationshipsCreateBackup = ReturnCollection 
End Function 

'This function restores the duplicate created by DeleteRelationshipsCreateBackup 
Public Sub RestoreRelationBackup(collRelationBackup As Collection) 
    Dim relBackup As Variant 
    If collRelationBackup.Count = 0 Then Exit Sub 
    For Each relBackup In collRelationBackup 
     CurrentDb.Relations.Append relBackup 
    Next relBackup 
End Sub 

、VBAでテーブルを交換する場合、以下を実行してください

dim collRelationBackup As Collection 
Set collRelationBackup = DeleteRelationsCreateBackup("MyTable") 
'Delete MyTable here 
'Then make sure you create a drop-in replacement with the right field names and field types for the relation to be created 
RestoreRelationBackup collRelation 

ご覧のとおり、テーブルをクリアして追加するのは簡単ですが、これは参照整合性に問題があります(他のテーブルまた、テーブル構造の変更など)が発生する可能性があります。このコードを使用するときは、テーブルが置き換えられた後にすべてのリレーションの必須フィールドがすべて存在することを確認してください。そうしないと、ランタイムエラーが発生し、それらのリレーションシップはなくなります。

参照整合性と複数の関係がある場合は、関連するすべてのテーブルの関係を複製してコレクションに入れてから、テーブルの削除と置換をすべて行い、復元する必要があります。それらのすべて

+0

あなたは、関係の問題を克服するためにVBAでADO.NETを使用することは可能ですか? –

+0

VBAのADO.NETなど、ADOだけはありません。しかし、私はちょうど関係を持つデータセットをインポートする際の通常の問題を克服できるVBAコードを示しました。明らかに、それは行うことができます。いくつかの研究を行い、いくつかのことを試してみて、戻ってきて、問題があるかどうかを尋ねます(何がうまくいかなかったかに関するコード例)。 –

+0

ありがとう、問題は、ADOを使用して解決されました。 –

関連する問題