Форум программистов, компьютерный форум, киберфорум
Microsoft Access
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.96/23: Рейтинг темы: голосов - 23, средняя оценка - 4.96
4 / 4 / 0
Регистрация: 08.04.2009
Сообщений: 40

Связанные таблицы

31.07.2009, 23:45. Показов 4386. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую, всех.
Есть связанная таблица, связь с файлом ТХТ. Удобно для обновления данных иметь такую связь. Вопрос: как развязать таблицу с файлом и оставить такуюже функциональность. (можно конечно и оставить, но возникает проблемма при переносе файлов на другой комп или в другую папку, может можно както переносить базу с этим ТХТ файлом). Если не понятно объяснил дайте знать, нарисую вопрос.
За ранее спасибо.

Не по теме:

отдыхал в Китае. Не отдыхайте там. Там плохо. :stop:

0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
31.07.2009, 23:45
Ответы с готовыми решениями:

Не связанные таблицы
Имеются Таблица1 с полями ААА, ВВВ, ССС, DDD и Таблица2 с полем ХХХ. Таблицы не связаны между собой. Как в построителе выражений для...

связанные таблицы
У меня вопрос на засыпку: связанные таблицы являются обновляемыми? Другими словами, если я изменю исходную таблицу, а затем в accesse...

Связанные таблицы
Мне приходят несколько файлов csv/ xlsx. Каждый файл - будущая таблица в бд. В файлах нет первичных ключей. Создаю в access связанные...

5
118 / 118 / 10
Регистрация: 12.05.2010
Сообщений: 1,207
01.08.2009, 00:15
Восстановление связей с линкованными таблицами при перемещении файлов
Описание: Часто вижу вопросы "как восстановить связи с линкованными таблицами при перемещении файлов?" Когда-то я себе писал такую процедурку для mdb, оказалось, что она работает и для таблиц Excel, DBF, а, возможно и для других типов. С таблицами ODBC я не работал, поэтому здесь о них и не думал.

Автор: Георгий Удалов (AKA GEO)

Как с этим работать:
Следующую программу вставляем в новый модуль. При открытии "первой формы", или в макросе autoexec вставляем вызов функции "CheckPlaceBases". Все. Теперь программа будет проверять и по возможности восстанавливать связи с таблицами.

Как это работает:
Программа проверяет все несистемные таблицы на предмет наличия имени первого поля. Если не произошло ошибок, очевидно, что все существующие связи в порядке. Если ошибки были, проходим по таблицам еще раз, но уже с довольно громоздкой процедурой проверки. Первый цикл, вообще говоря, сделан отдельно, чтобы по возможности не сильно тормозить запуск программы в штатной ситуации.
Если найдена таблица с разрушенной связью, смотрю в таблицу известных связей (туда постепенно складываются все известные пути к БД. Удобно при перемещении файла от клиента на работу/домой и назад). Если такой таблицы нет, создаю ее. Если ни по одному известному пути нет файла с такой таблицей, запрашиваю путь к файлу у пользователя. Если файл наконец-то найден, добавляю при необходимости новый путь в таблицу путей и иду к следующей связи.

Что еще:
Работает (проверял) в A97, 2000, 2002, 2003. Для совместимости с А97 взял процедуру диалога открытия файла в исполнении К. Гетца (Ken Getz).

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
Option Explicit
 
Dim tbl As DAO.TableDef
Public retval As Boolean
Type tagOPENFILENAME
   lStructSize As Long
   hwndOwner As Long
   hInstance As Long
   strFilter As String
   strCustomFilter As String
   nMaxCustFilter As Long
   nFilterIndex As Long
   strFile As String
   nMaxFile As Long
   strFileTitle As String
   nMaxFileTitle As Long
   strInitialDir As String
   strTitle As String
   flags As Long
   nFileOffset As Integer
   nFileExtension As Integer
   strDefExt As String
   lCustData As Long
   lpfnHook As Long
   lpTemplateName As String
End Type
Declare Function aht_apiGetOpenFileName Lib "comdlg32.dll" _
    Alias "GetOpenFileNameA" (OFN As tagOPENFILENAME) As Boolean
Declare Function aht_apiGetSaveFileName Lib "comdlg32.dll" _
    Alias "GetSaveFileNameA" (OFN As tagOPENFILENAME) As Boolean
Declare Function CommDlgExtendedError Lib "comdlg32.dll" () As Long
Global Const ahtOFN_READONLY = &H1
Global Const ahtOFN_OVERWRITEPROMPT = &H2
Global Const ahtOFN_HIDEREADONLY = &H4
Global Const ahtOFN_NOCHANGEDIR = &H8
Global Const ahtOFN_SHOWHELP = &H10
Global Const ahtOFN_NOVALIDATE = &H100
Global Const ahtOFN_ALLOWMULTISELECT = &H200
Global Const ahtOFN_EXTENSIONDIFFERENT = &H400
Global Const ahtOFN_PATHMUSTEXIST = &H800
Global Const ahtOFN_FILEMUSTEXIST = &H1000
Global Const ahtOFN_CREATEPROMPT = &H2000
Global Const ahtOFN_SHAREAWARE = &H4000
Global Const ahtOFN_NOREADONLYRETURN = &H8000
Global Const ahtOFN_NOTESTFILECREATE = &H10000
Global Const ahtOFN_NONETWORKBUTTON = &H20000
Global Const ahtOFN_NOLONGNAMES = &H40000
Global Const ahtOFN_EXPLORER = &H80000
Global Const ahtOFN_NODEREFERENCELINKS = &H100000
Global Const ahtOFN_LONGNAMES = &H200000
 
 
Public Function CheckPlaceBases()
  ' Поиск файлов со связанными таблицами
  Dim sp, sf As String
  Dim rs As DAO.Recordset
  Dim strFullPath As String
  Dim intPos As Integer
 
  ' Проверяю все таблицы. Не знаю способа лучше перебора всех таблиц
  On Error Resume Next
  For Each tbl In CurrentDb.TableDefs
    If Left(tbl.Name, 4) <> "MSys" Then
      If tbl.Fields(0).Name = "" Then
      End If
    End If
    If Err.Number <> 0 Then
      Exit For ' Возможно, таблица не найдена, шагаем дальше
    End If
  Next
  If Err.Number = 0 Then Exit Function ' Все в порядке
 
  strFullPath = CurrentDb.Name
  ' Ищем последний слэш в полном адресе к текущей базе
  intPos = InStrRev(strFullPath, "\")
  If intPos > 0 Then
    strFullPath = Left(strFullPath, intPos)
  End If
  
  ' Спрашиваю, выполнить ли поиск? Если нет, выхожу из программы
  If MsgBox("Не могу восстановить подключение к базе данных." & Chr(10) & _
            "Возможно, файл БД был перемещен." & Chr(10) & _
            "Попробовать найти его?", vbYesNo, "Ошибка подключения к базе") = vbYes Then
    ' Подключаю таблицу известных путей. Если ее нет, создаю
    Err.Clear
    Set rs = CurrentDb.OpenRecordset("сПутиКтаблицам")
    If Err.Number <> 0 Then
      CurrentDb.Execute "create table сПутиКтаблицам (ПутьКтаблице text(250))"
      Set rs = CurrentDb.OpenRecordset("сПутиКтаблицам")
    End If
    
    For Each tbl In CurrentDb.TableDefs
      On Error Resume Next
      If tbl.Fields(0).Name = "" Then
      End If ' Если произойдет ошибка - возможно, таблица не подключена
      If Err.Number <> 0 And Len(tbl.Connect) Then
        ' Проверяю наличие таблицы по последним известным путям.
        rs.MoveFirst ' Здесь м.б. ошибка, если нет текущей записи
        On Error GoTo 0
        Do Until rs.EOF
          ' Если таблица подцепилась, прекращаю перебор файлов и перехожу к следующей
          If TryConnectToTable(rs!ПутьКтаблице) Then Exit Do
          rs.MoveNext
        Loop
        
        If rs.EOF Then ' Если находимся в конце rs, то либо он пуст, _
                       ' либо файлы не найдены, либо ни в одном файле таблицы нет
          ' По последним известным путям таблица найдена не была,
          ' предлагаю найти файл самостоятельно.
          Do
            sp = ""
            If sf = "" Then
                  sf = ahtAddFilterItem(sf, "Файлы Microsoft Access", "*.mdb;*.mde;*.mda")
              sf = ahtAddFilterItem(sf, "Все файлы", "*.*")
              If MsgBox("Не могу восстановить связь с таблицей " & tbl.Name & _
                        " по известным путям." & Chr(10) & _
                        "Попробуете найти файл с таблицей самостоятельно?", _
                            vbYesNo) = vbYes Then
                sp = GetOpenFile(strFullPath, _
                        varTitleForDialog:="Выберите файл, содержащий " & _
                            tbl.Name, strFilter:=sf, lngFlags:=0)
              Else
                Exit Do
              End If
            Else
              If MsgBox("В этом файле таблица " & tbl.Name & _
                        " не найдена." & Chr(10) & _
                        "Хотите выбрать другой файл?", vbYesNo) = vbYes Then
                sp = GetOpenFile(varTitleForDialog:="Выберите файл, содержащий " & _
                            tbl.Name, strFilter:=sf, lngFlags:=0)
              Else
                Exit Do
              End If
            End If
          Loop While (TryConnectToTable(sp) = False)
          
          On Error Resume Next
          If tbl.Fields(0).Name <> "" Then
            ' Произойдет ошибка, если таблица не была подключена
          End If
          If Err.Number <> 0 Then
            ' Если файл не найден пользователем,
            'сообщаю об этом пользователю и продолжаю цикл
            MsgBox "Не все связи восстановлены!" & Chr(10) & _
                   "В работе программы возможны ошибки." & _
                   "Рекомендуется закрыть программу и обратиться к разработчику!"
          Else
            ' Если файл найден пользователем (не в rs), добавляю его в rs
            rs.AddNew
            rs!ПутьКтаблице = sp
            rs.Update
          End If
          On Error GoTo 0
        End If
      End If
      On Error GoTo 0
    Next tbl
    
    Set tbl = Nothing
    On Error Resume Next
    rs.Close
    On Error GoTo 0
    Set rs = Nothing
  Else
    MsgBox "Не все связи восстановлены!" & Chr(10) & _
           "В работе программы возможны ошибки." & _
           "Рекомендуется закрыть программу и обратиться к разработчику!"
  End If
End Function
 
Private Function TryConnectToTable(ByVal strPath As String) As Boolean
  Dim s As String
  
  On Error Resume Next
  If Len(Dir(strPath)) > 0 Then ' Файл есть, пробую подцепить таблицу
    s = tbl.Connect
    tbl.Connect = Left(s, InStr(s, ";DATABASE=") + 9) & strPath
    tbl.RefreshLink ' RefreshLink возвратит ошибку, если таблицы в файле нет
    If Err.Number <> 0 And InStr(strPath, "\") Then
      ' Попробуем, на случай, если это не .mdb файл, указать здесь имя папки без файла
      Err.Clear
      tbl.Connect = Left(tbl.Connect, InStrRev(tbl.Connect, "\"))
      tbl.RefreshLink
    End If
    TryConnectToTable = Not (Err.Number <> 0)
    If Err.Number <> 0 Then tbl.Connect = s
  End If
End Function
 
Public Function InStrRev(StringSource As String, StringTarget As String) As Integer
  Dim t As Long
  
  Do
    t = InStr(t + 1, StringSource, StringTarget)
  Loop While t > 0 And InStr(t + 1, StringSource, StringTarget) > 0
  InStrRev = t
End Function
 
'***************** Code Start **************
'This code was originally written by Ken Getz.
'It is not to be altered or distributed,
'except as part of an application.
'You are free to use it in any application,
'provided the copyright notice is left unchanged.
 
Public Function GetOpenFile(Optional varDirectory As String, _
    Optional varTitleForDialog As String, _
    Optional strFilter As String, _
    Optional lngFlags As Long) As String
Dim varFileName As Variant
    ' Specify that the chosen file must already exist,
    ' don't change directories when you're done
    ' Also, don't bother displaying
    ' the read-only box. It'll only confuse people.
    If lngFlags Then _
   lngFlags = ahtOFN_FILEMUSTEXIST Or _
               ahtOFN_HIDEREADONLY Or ahtOFN_NOCHANGEDIR
    If strFilter = "" Then _
       strFilter = ahtAddFilterItem(strFilter, _
               "All files (*.*)", "*.*")
' Now actually call to get the file name.
   varFileName = ahtCommonFileOpenSave( _
                   OpenFile:=True, _
                   InitialDir:=varDirectory, _
                   Filter:=strFilter, _
                   flags:=lngFlags, _
                   DialogTitle:=varTitleForDialog)
    If Not IsNull(varFileName) Then
       varFileName = TrimNull(varFileName)
    End If
   GetOpenFile = varFileName
End Function
 
Function ahtCommonFileOpenSave( _
            Optional ByRef flags As Variant, _
            Optional ByVal InitialDir As Variant, _
            Optional ByVal Filter As Variant, _
            Optional ByVal FilterIndex As Variant, _
            Optional ByVal DefaultExt As Variant, _
            Optional ByVal FileName As Variant, _
            Optional ByVal DialogTitle As Variant, _
            Optional ByVal hwnd As Variant, _
            Optional ByVal OpenFile As Variant) As Variant
' This is the entry point you'll use to call the common
' file open/save dialog. The parameters are listed
' below, and all are optional.
'
' In:
' Flags: one or more of the ahtOFN_* constants, OR'd together.
' InitialDir: the directory in which to first look
' Filter: a set of file filters, set up by calling
' AddFilterItem. See examples.
' FilterIndex: 1-based integer indicating which filter
' set to use, by default (1 if unspecified)
' DefaultExt: Extension to use if the user doesn't enter one.
' Only useful on file saves.
' FileName: Default value for the file name text box.
' DialogTitle: Title for the dialog.
' hWnd: parent window handle
' OpenFile: Boolean(True=Open File/False=Save As)
' Out:
' Return Value: Either Null or the selected filename
Dim OFN As tagOPENFILENAME
Dim strFilename As String
Dim strFileTitle As String
Dim fResult As Boolean ' Give the dialog a caption title.
    If IsMissing(InitialDir) Then InitialDir = CurDir
    If IsMissing(Filter) Then Filter = ""
    If IsMissing(FilterIndex) Then FilterIndex = 1
    If IsMissing(flags) Then flags = 0&
    If IsMissing(DefaultExt) Then DefaultExt = ""
    If IsMissing(FileName) Then FileName = ""
    If IsMissing(DialogTitle) Then DialogTitle = ""
    If IsMissing(hwnd) Then hwnd = Application.hWndAccessApp
    If IsMissing(OpenFile) Then OpenFile = True
' Allocate string space for the returned strings.
   strFilename = Left(FileName & String(256, 0), 256)
   strFileTitle = String(256, 0)
' Set up the data structure before you call the function
    With OFN
        .lStructSize = Len(OFN)
        .hwndOwner = hwnd
        .strFilter = Filter
        .nFilterIndex = FilterIndex
        .strFile = strFilename
        .nMaxFile = Len(strFilename)
        .strFileTitle = strFileTitle
        .nMaxFileTitle = Len(strFileTitle)
        .strTitle = DialogTitle
        .flags = flags
        .strDefExt = DefaultExt
        .strInitialDir = InitialDir
' Didn't think most people would want to deal with
' these options.
        .hInstance = 0
        .strCustomFilter = ""
        .nMaxCustFilter = 0
        .lpfnHook = 0
'New for NT 4.0
        .strCustomFilter = String(255, 0)
        .nMaxCustFilter = 255
    End With
' This will pass the desired data structure to the
' Windows API, which will in turn it uses to display
' the Open/Save As Dialog.
    If OpenFile Then
       fResult = aht_apiGetOpenFileName(OFN)
    Else
       fResult = aht_apiGetSaveFileName(OFN)
    End If
 
' The function call filled in the strFileTitle member
' of the structure. You'll have to write special code
' to retrieve that if you're interested.
    If fResult Then
' You might care to check the Flags member of the
' structure to get information about the chosen file.
' In this example, if you bothered to pass in a
' value for Flags, we'll fill it in with the outgoing
' Flags value.
        If Not IsMissing(flags) Then flags = OFN.flags
       ahtCommonFileOpenSave = TrimNull(OFN.strFile)
    Else
       ahtCommonFileOpenSave = vbNullString
    End If
End Function
 
Function ahtAddFilterItem(strFilter As String, _
   strDescription As String, Optional varItem As Variant) As String
   ' Tack a new chunk onto the file filter.
   ' That is, take the old value, stick onto it the description,
   ' (like "Databases"), a null character, the skeleton
   ' (like "*.mdb;*.mda") and a final null character.
 
    If IsMissing(varItem) Then varItem = "*.*"
   ahtAddFilterItem = strFilter & _
               strDescription & vbNullChar & _
               varItem & vbNullChar
End Function
 
Private Function TrimNull(ByVal strItem As String) As String
Dim intPos As Integer
   intPos = InStr(strItem, vbNullChar)
    If intPos > 0 Then
       TrimNull = Left(strItem, intPos - 1)
    Else
       TrimNull = strItem
    End If
End Function
'************** Code End *****************

С уважением, Георгий Удалов.


ПРИМЕЧАНИЯ
1. В. Есть одно замечание. Если "первая" форма использует в RecordSource "отсутствующие" присоединенные таблицы, то вставка ф-и CheckPlaceBases в событие Open не спасает. Акцесс успевает "проверить" связь сам. Пришлось использовать макрос AutoExec. Тестировалось на А97рус, Windows2000prof pус.

О. Честно говоря, сам я ее использую по-другому (этот способ я дал для простоты использования):
- во всех процедурах и функциях есть примерно такой код
Visual Basic
1
2
3
4
5
private function ....
on error goto MyErr
MyErr:
if not HaveError(err.number ...) then resume
end function
и есть функция
Visual Basic
1
2
3
4
5
public function HaveError(ErrNum, ...) as boolean
  if errnum=3024 or errnum=3044 then
    haveerror = not CheckPlaceBases
  endif
end function
, а CheckPlaceBases возвращает True, если у него все в порядке и False, если нет.

2. Поправьте, у себя функцию:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Private Function TryConnectToTable(ByVal strPath As String) As Boolean
  Dim s As String
  
  On Error Resume Next
  If Len(Dir(strPath)) > 0 Then ' Файл есть, пробую подцепить таблицу
    s = tbl.Connect
    tbl.Connect = Left(s, InStr(s, ";DATABASE=") + 9) & strPath
    tbl.RefreshLink ' RefreshLink возвратит ошибку, если таблицы в файле нет
    If Err.Number <> 0 And InStr(strPath, "\") Then
      ' Попробуем, на случай, если это не .mdb файл, указать здесь имя папки без файла
      Err.Clear
      tbl.Connect = Left(tbl.Connect, InStrRev(tbl.Connect, "\"))
      tbl.RefreshLink
    End If
    TryConnectToTable = Not (Err.Number <> 0)
    If Err.Number <> 0 Then tbl.Connect = s
  End If
End Function
1
4 / 4 / 0
Регистрация: 08.04.2009
Сообщений: 40
01.08.2009, 04:47  [ТС]
Благодрен. Буду пробовать.
0
4 / 4 / 0
Регистрация: 08.04.2009
Сообщений: 40
29.08.2009, 03:36  [ТС]
Не работает. Не видит вупор. А вот если я этот код делаю через F9 на старте а потом F8 каждую строчку прогоняю, то все находит. Может еще какие мысли на этот счет? может убрать из Макроса автоекзек? и повесить на попозже проверку?
0
118 / 118 / 10
Регистрация: 12.05.2010
Сообщений: 1,207
30.08.2009, 23:47
Покажите, что у Вас получилось...
0
 Аватар для solar_wind
770 / 760 / 59
Регистрация: 06.07.2009
Сообщений: 3,021
31.08.2009, 06:59
Делал так с восстановлением связи с файлом mdb, думаю что с txt можно сделать аналогично:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
Public Sub SetReferences()
On Error GoTo Err_
Renew_:
   Dim rstTemp As Recordset
   Dim rstTemp1 As Recordset
   Dim pName As String
   Dim sSS As String
   Dim i As Integer
 
   Set rstTemp = CurrentDb.OpenRecordset("System-Path")
   Set rstTemp1 = CurrentDb.OpenRecordset("System-tables")
 
   If rstTemp1.RecordCount = 0 Then
         rstTemp1.Close
         rstTemp.Close
         Exit Sub
   End If
 
    
   If rstTemp.RecordCount = 0 Then
      Call ClearTablesRef
      i = GetDbPath(pName)
      rstTemp.AddNew
      rstTemp!pName = pName
      rstTemp.Update
      rstTemp.MoveFirst
   Else
      If IsNull(rstTemp!pName) Then
         Call ClearTablesRef
         i = GetDbPath(pName)
         rstTemp.Edit
         rstTemp!pName = pName
         rstTemp.Update
      Else
         If Len(Dir(rstTemp!pName)) = 0 Then
            Call ClearTablesRef
            i = GetDbPath(pName)
            rstTemp.Edit
            rstTemp!pName = pName
            rstTemp.Update
         Else
            pName = rstTemp!pName
         End If
      End If
   End If
   rstTemp.Close
   i = SetConst("dbase", pName)
   With rstTemp1
      Do While Not .EOF
         Call SetTableRef(!Tname, pName)
         .MoveNext
      Loop
      .Close
   End With
Exit_:
    Exit Sub
Err_:
    If rstTemp.RecordCount <> 0 Then
    rstTemp.Delete
    GoTo Renew_
    Else
    Resume Exit_
    End If
End Sub
 
 
Public Function GetDbPath(pName As String) As Integer
    Dim i As Long
    i = MsgBox("Неправильно задана или не задана ссылка на базу данных с таблицами!" _
    & Chr(13) & "Будете задавать ссылку сейчас?", vbOKCancel + vbExclamation)
    If i <> vbOK Then
      DoCmd.Quit
      Exit Function
    End If
    i = GetDBFileNameDlg(0, pName, "Выберите файл с данными", "*.mdb", ActualPath)
    If i = 0 Then
      GetDbPath = False
      DoCmd.Quit
      Exit Function
    End If
    GetDbPath = True
End Function
 
Public Sub ClearTablesRef()
    Dim dbs As Database, tdf As TableDef
    Dim sSS As Variant, k As Integer
    Set dbs = CurrentDb
mmm:
    For Each tdf In dbs.TableDefs
       sSS = tdf.Connect
        If Len(sSS) > 0 Then
            dbs.TableDefs.Delete (tdf.name)
            GoTo mmm
        End If
    Next tdf
End Sub
Public Sub SetTableRef(Tname As String, DbPath As String)
Dim RSTps As Recordset
Dim DBSps As Database
On Error GoTo Err_
   If IsTable(Tname) <> 1 Then
      DoCmd.TransferDatabase acLink, "Microsoft Access", _
      DbPath, acTable, Tname, Tname, False, False
      Exit Sub
   End If
   Exit Sub
Err_:
    MsgBox Err.Description
    CurrentDb.Execute "DELETE * FROM [System-Path];"
    DoCmd.Quit
End Sub
Public Function IsTable(name As String) As Integer
    Dim dbs As Database, tdf As TableDef
    Set dbs = CurrentDb
    For Each tdf In dbs.TableDefs
        If tdf.name = name Then
            IsTable = 1
            Exit Function
        End If
    Next tdf
    IsTable = 0
End Function
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
31.08.2009, 06:59
Помогаю со студенческими работами здесь

Связанные таблицы в Access
Помогите,пож-ста, как в Access можно посмотреть, с каким внешним файлом связана связанная в Access таблица?

Как определить связанные таблицы
Здравствуйте. Такой вопрос база данных access 2002-2003, .mdb, использую c++ builder 2010, технологию ADO. Каким образом можно определить...

как вывести связанные таблицы
Привет всем! У меня ADP.Вопрос по форме.На форме есть combobox - там у меня справочники. Внизу есть подчиненная форма. Необходимо сделать...

Отобразить таблицы и связанные представления
как отобразить таблицы и связанные представления в этой БД?

Поле со списком и связанные таблицы
Здравствуйте. Две таблицы созданы. Сделал в таблице ТО редукторов поле со списком из таблицы редукторы. Все работает, но почему-то...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru