1

Web サイト (アプリとデータ) にリバース エンジニアリングする必要がある Access データベースがあります。

Outlook 2013 で開こうとしましたが、データベースのレプリケーションが有効になっており、以前のバージョンの Access で作成されたというエラーが表示されます (そのような影響があります)。

問題はレプリケーションだけだと思います。Access 2013 で複製できるように複製を削除する方法はありますか?

4

1 に答える 1

3

したがって、データベースの複製を解除するのは簡単なことではありません。

最初に、テーブルを新しいデータベースにコピーする 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 コードを実行すると、新しいデータベースでリレーションシップが再構築されます。

このコードは簡単で汚いため、データベース/データのバグ修正が必要になる場合があることに注意してください。

于 2013-11-14T07:30:14.073 に答える