2016-12-05 4 views
0

Позвольте мне объяснить требования клиента к Вейрдест, мы царапины головы для:Найти которые образуют точки поля, в которой поля базы данных в MS Access

У нас есть приложение MS Access VBA с тысячами форм форм в сотнях форм.

Несколько полей в этих формах заполняют данные из нескольких таблиц/запросов.

Несколько других полей в формах вставляют данные в несколько таблиц через запросы/прямой код.

Обратите внимание, что эти таблицы являются связанными таблицами с таблицами SQL Server.

Есть ли способ найти, какое поле формы относится к столбцу таблицы?

Следовательно, для этого нам нужен инструмент/макрос.

Как найти, какое поле формы указывает на какие поля базы данных в MS Access?

Основано на @ClintB's answer, мы подготовили следующий код. Значения в ctl.ControlSource не кажется, ссылаясь на фактические объекты базы данных:

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

Это будет почти невозможно, так как поля могут быть использованы в наборах записей и DLookup и функциях, которые снова могут быть использованы в запросах, которые могут быть привязаны в другие запросы и используются в выражениях, прежде чем получить контроль в качестве ControlSource. – Gustav

+0

Для стандартной формы, связанной с таблицей или простым запросом, ControlSources будут именами полей, поэтому некоторые из них могут быть найдены таким образом. Трудная часть - поймать все вхождения. Единственный метод, который я нашел, - это тяжелая работа - и грубая сила, переименовав запрос и посмотрев, что происходит. Не хорошо. Вы можете использовать функцию _SaveAsText_ для сохранения объектов в текстовые файлы, которые могут облегчить поиск. – Gustav

ответ

0

Я бы сделать что-то вроде этого. (Не фактический код)

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: ControlSource, не RowSource

+0

Есть ли способ получить имена таблиц? – xameeramir

0

код, вы придумали отличный! Это даст вам:

  • форма Имя
  • управления Название
  • Источник управления

Единственное, что вам нужно, это имя таблицы, в которой столбец приходит. Поскольку таблицы представляют собой таблицы, связанные с SQL-сервером, вы можете find all the tables with all their columns.

Это даст вам:

  • Имя таблицы
  • Имя столбца

Держите обе эти данные в два первенствует листов.

Сделайте V-Lookup на имя столбца, чтобы найти имя таблицы