|
|
|
| Грядет глобальная переделка базы.
Вопрос.
Можно ли как-то автоматизировать поиск всех таблиц,
которые связаны с заданной таблицей по заданному полю? | |
|
| |
|
|
|
| напиши прогу которая анализирует поля и если в свойствах поля есть Select * from tabla - вот и будет тебе имя таблы
есть аксовое (не помню где в сервисе) - запускаешь - идешь куришь, пьешь, гуляешь - через время формирует файл с описанием ВСЕГО че есть в базе (кажись pdf или док) - сидим и смотрим. у меня получилось 3500 стр. | |
|
| |
|
|
|
| Пока сделал так (в предположении, что если есть связи по полю, то оно одинаково обзывается.
Т.е. тупо перебираю все таблицы и ищу где есть заданное поле.
Public Sub AllTableAndFlds(snamefld$)
Dim tbl As TableDef
Dim fld As Field
Debug.Print "----- " & snamefld & " -----"
For Each tbl In CurrentDb.TableDefs
For Each fld In tbl.Fields
If snamefld = fld.name Then
Debug.Print tbl.name ', fld.name
End If
Next
Next
End Sub
Public Sub tst()
AllTableAndFlds "IdPrice"
AllTableAndFlds "IdPricePref"
AllTableAndFlds "IdSChPoz"
AllTableAndFlds "IdPriceGroup"
End Sub
|
Есть опасность что могут быть связи типа Tbl1.IdPrice-tbl2.IdPr1 | |
|
| |
|
|
|
| когда-то создал к связанным таблам их копии с названием имятаблы_TMP
нужно было все связанные поля перестроить на эти новые таблы
вот такое замутил
Function Tabla_TMP_RowSource()
Dim dbs As DAO.Database
Dim tbl As DAO.TableDef
Dim op As DAO.Recordset
Dim po As DAO.Recordset
Set dbs = CurrentDb
For Each tbl In dbs.TableDefs
берем линкованную таблицу
If tbl.Connect <> "" Then
открываем ее _TMP двойник
Set op = dbs.OpenRecordset(tbl.Name & "_TMP")
ищем свойство RowSource - означающее что поле связанное
For i = 0 To op.Fields.Count - 1
For j = 0 To op.Fields(i).Properties.Count - 1
If op.Fields(i).Properties(j).Name = "RowSource" Then
Stroka = Split(op.Fields(i).Properties(j).Value, " ")
dbs.Execute ("delete * from Re_Name_TBL")
Set po = dbs.OpenRecordset("Re_Name_TBL")
раскладываем его sql строку, добавляем в названия таблиц _TMP
загоняем старую строку и новую (в разобраном виде) в таблу
For k = 0 To UBound(Stroka)
With po
.AddNew
!Name_Old = Stroka(k)
!Name_New = Replace(Stroka(k), ".", "_TMP.")
!Vibor = IIf(Stroka(k) = Replace(Stroka(k), ".", "_TMP."), False, True)
.Update
End With
Next
Kod_G = 0
вываливаем форму на основаини этой таблы в ней корректируем действа машины как нужно
DoCmd.OpenForm "Re_Name_TBL", , , , , acDialog
If Kod_G = 0 Then
собираем SQL строку по новой
po.MoveFirst
str_ = ""
Do While po.EOF = False
str_ = str_ & po!Name_New & " "
po.MoveNext
Loop
загоняем ее в свойства поля
op.Fields(i).Properties(j).Value = Trim(str_)
op.Fields(i).Properties.Refresh
End If
j = op.Fields(i).Properties.Count + 100
End If
Next
Next
End If
Next
End Function
|
и так по всей коллекции таблиц. | |
|
| |
|
|
|
| вообще если речь идет о полях подстановки, то можно свойства полей посмотреть
если про связи, то relations вроде | |
|
| |
|
|
|
| Всем спасибо.Через архивариус удобно. Но надо брать серверную часть. | |
|
| |