2016-12-05 2 views
0
, auf die Datenbankfelder in MS Access

mir die Client-Anforderung Weirdest Lassen erklären, wir unsere Köpfe zum Scratchen:finden die Feldpunkte bilden

Wir haben eine MS Access VBA-Anwendung mit Tausenden von Formularfeldern in Hunderten von Formen.

Einige Felder in diesen Formularen füllen Daten aus wenigen Tabellen/Abfragen.

Einige andere Felder in Formularen fügen Daten in wenige Tabellen durch Abfragen/direkten Code ein. Beachten Sie, dass diese Tabellen verknüpfte Tabellen mit SQL Server-Tabellen sind.

Gibt es eine Möglichkeit zu finden, welches Formularfeld zu welcher Tabellenspalte gehört?

Daher benötigen wir einige Werkzeug/Makro, um dies zu tun.

Wie finden wir, welches Formularfeld auf welche Datenbankfelder in MS Access zeigt?

Basierend auf @ClintB's answer haben wir den folgenden Code vorbereitet. Die Werte in ctl.ControlSource nicht scheint nicht auf die tatsächlichen Datenbankobjekte mit Bezug zu:

Sub GetFormFieldToDBFieldMapping() 
Dim frm As Object 
Dim LiveForm As Form 
Dim ctl As control 
Dim i As Integer 
Dim fso As Object 
Dim ctlSource As String 
Set fso = CreateObject("Scripting.FileSystemObject") 
Dim oFile As Object 
Set oFile = fso.CreateTextFile("D:\ControlSources.txt") 

    For Each frm In Application.CurrentProject.AllForms 

     'To access form controls, open it 
     DoCmd.OpenForm frm.Name, acViewDesign 
     Set LiveForm = forms(frm.Name) 
     For i = 0 To LiveForm.Controls.Count - 1 
     Set ctl = LiveForm.Controls.Item(i) 
     If ctl.ControlType = 106 Or ctl.ControlType = 111 Or ctl.ControlType = 110 Or ctl.ControlType = 109 Then 
     ctlSource = ctlSource & vbCrLf & "Form Name :" & LiveForm.Name & ": Control Name :" & ctl.Name & ": Control Source :" & ctl.ControlSource 
     End If 
     Next i 
     'Do not forget to close when you are done 
     DoCmd.Close acForm, frm.Name 
    Next 

oFile.WriteLine ctlSource 
oFile.Close 
Set fso = Nothing 
Set oFile = Nothing 

End Sub 
+0

zu finden, die fast unmöglich sein wird, wie Felder in Cord-Sets und DLookup und Funktionen verwendet werden, die wiederum in Abfragen verwendet werden können, die in aliased werden kann andere Abfragen und in Ausdrücken verwendet, bevor ein Control als ControlSource erreicht wird. – Gustav

+0

Für ein Standardformular, das an eine Tabelle oder eine einfache Abfrage gebunden ist, sind ControlSources Feldnamen, so dass einige auf diese Weise gefunden werden können. Der schwierige Teil besteht darin, alle Vorkommnisse zu erfassen. Die einzige Methode, die ich gefunden habe, ist harte Arbeit - und rohe Gewalt, indem ich eine Abfrage umbenenne und sehe, was passiert. Nicht nett. Sie können die Funktion _SaveAsText_ verwenden, um Objekte in Textdateien zu speichern, die die Suche ein wenig erleichtern können. – Gustav

Antwort

0

ich so etwas tun würde. (Nicht unbedingt Code)

For each form in db 
    For each control in form 
     'Write a record to a table stating which formName, controlName and the control.controlSource 
    Next 
Next 

Edit: Control, nicht RowSource

+0

Gibt es eine Möglichkeit, die Tabellennamen auch zu bekommen? – xameeramir

0

Der Code, haben Sie kam mit ist ausgezeichnet! Dies wird Ihnen geben:

  • Form Name
  • Control Name
  • Control Source

Das einzige, was Sie brauchen, ist der Name der Tabelle, auf die die Spalte kommt. Da die Tabellen Tabellen mit SQL Server verbunden sind, können Sie find all the tables with all their columns.

Dies wird Ihnen geben:

  • Tabellenname
  • Spaltenname

Halten Sie beide diese Informationen in zwei Blätter übertreffen.

eine V-Lookup auf Spaltennamen Sie den Tabellennamen