Web サイト (アプリとデータ) にリバース エンジニアリングする必要がある Access データベースがあります。
Outlook 2013 で開こうとしましたが、データベースのレプリケーションが有効になっており、以前のバージョンの Access で作成されたというエラーが表示されます (そのような影響があります)。
問題はレプリケーションだけだと思います。Access 2013 で複製できるように複製を削除する方法はありますか?
Web サイト (アプリとデータ) にリバース エンジニアリングする必要がある Access データベースがあります。
Outlook 2013 で開こうとしましたが、データベースのレプリケーションが有効になっており、以前のバージョンの Access で作成されたというエラーが表示されます (そのような影響があります)。
問題はレプリケーションだけだと思います。Access 2013 で複製できるように複製を削除する方法はありますか?
したがって、データベースの複製を解除するのは簡単なことではありません。
最初に、テーブルを新しいデータベースにコピーする WV Mitchell の VBA スクリプトを見つけました: http://www.wvmitchell.com/tips/Removing%20Access%20Replication.htm
それは主キーや関係をコピーしないので、それを助けるために簡単で汚い VBA スクリプトをいくつか書きました。
ステップ 1:MakeOneTable
上記のスクリプトの関数で、これを追加しました (db.Close 行の上):
Dim td As TableDef
Dim idxLoop As Index
Set td = db.TableDefs(TableName)
For Each idxLoop In td.Indexes
If idxLoop.Primary = True Then
Dim colnames As String
colnames = idxLoop.Fields
colnames = Replace(colnames, ";+", "],[")
colnames = Replace(colnames, "+", "[")
colnames = colnames & "]"
Debug.Print "DoCmd.RunSQL ""CREATE INDEX [PrimaryKey] ON [" & TableName & "] (" & colnames & ") With Primary;"""
Exit For
End If
Next idxLoop
これにより、主キーを作成するための VBA コードがデバッグ (イミディエイト) ウィンドウに出力されます (新しいデータベースを作成し、そこにデータをエクスポートする - MV Mitchell のコード)。その VBA コードをコピーし、新しいデータベースのモジュール/マクロに入れて実行すると、主キーが作成されます。
ステップ 2: 古い (レプリケートされた) データベースで、次の VBA コードを実行します。これにより、リレーションシップを作成するための VBA コードがさらに生成されます。
Sub GenerateRelationshipCode()
Dim db As DAO.Database
Set db = CurrentDb()
Dim rs As DAO.Recordset
Set rs = db.OpenRecordset("SELECT DISTINCT szRelationship,szObject,szReferencedObject FROM MSysRelationships ORDER BY szObject,szReferencedObject")
rs.MoveFirst
Do While Not rs.EOF
Dim rsFields As DAO.Recordset
Set rsFields = db.OpenRecordset("SELECT * FROM MSysRelationships WHERE szRelationship = '" & Replace(rs.Fields(0), "'", "''") & "'")
Dim PKFields As String, PKTable As String, FKFields As String, FKTable As String
PKFields = "": PKTable = "": FKFields = "": FKTable = ""
Do While Not rsFields.EOF
PKFields = PKFields & rsFields("szReferencedColumn") & ","
PKTable = rsFields("szReferencedObject")
FKFields = FKFields & rsFields("szColumn") & ","
FKTable = rsFields("szObject")
rsFields.MoveNext
Loop
PKFields = Left(PKFields, Len(PKFields) - 1)
FKFields = Left(FKFields, Len(FKFields) - 1)
Debug.Print "Call AddRelationship(""" & rs.Fields(0) & """, """ & FKTable & """, """ & FKFields & """, """ & PKTable & """, """ & PKFields & """)"
rs.MoveNext
Loop
Set db = Nothing
End Sub
上記の出力を新しいデータベースに対して実行する必要がありますが、次の関数も必要になります。
Public Sub AddRelationship(Name As String, FKTable As String, FKFields As String, PKTable As String, PKFields As String)
Dim strSQL As String
Dim db As DAO.Database
Set db = CurrentDb()
Name = "FK_" & Replace(FKTable, " ", "") & "_" & Replace(PKTable, " ", "") 'only enable this line if there aren't multiple relationships between same 2 tables
strSQL = "ALTER TABLE [" & FKTable & "] " & _
" add constraint " & Name & " foreign key (" & FKFields & ") " & _
" references [" & PKTable & "](" & PKFields & ") "
db.Execute strSQL, dbFailOnError
Set db = Nothing
End Sub
上記の関数を含むモジュールで生成された VBA コードを実行すると、新しいデータベースでリレーションシップが再構築されます。
このコードは簡単で汚いため、データベース/データのバグ修正が必要になる場合があることに注意してください。