Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Как присоединить таплицы програмно / 22 сообщений из 22, страница 1 из 1
25.04.2003, 09:48
    #32148492
AlexNiko
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как присоединить таплицы програмно
...
Рейтинг: 0 / 0
25.04.2003, 09:52
    #32148499
Лох Позорный
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как присоединить таплицы програмно
Какой вопрос такой ответ.
Как присоединить таблицы? Програмно!
...
Рейтинг: 0 / 0
25.04.2003, 09:54
    #32148500
AlexNiko
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как присоединить таплицы програмно
Да ладно издеваться, суть вот в чем, при открытии базы надо проверить правитьно ли присоеденены таблицы,если нет то выдать окно диалога для выбора файла с данными.
...
Рейтинг: 0 / 0
25.04.2003, 09:58
    #32148506
Лох Позорный
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как присоединить таплицы програмно
Что ты понимаешь под "присоединены правильно"?
...
Рейтинг: 0 / 0
25.04.2003, 10:14
    #32148531
Senin Viktor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как присоединить таплицы програмно
В момент открытия проги проверяешь одну из присоединеных таблиц на доступ, например к первому полю. \r
Если связь правильная -все будет ОК, если нет - ошибка - которую обрабатываешь и открываешь окно с предложением выбрать базу данных.\r
\r
Далее используешь или АДО или ДАО для изменения свойств таблиц\r
\r
Для примера посмотри топик\r
/topic/28592.
...
Рейтинг: 0 / 0
25.04.2003, 10:24
    #32148549
Лох Позорный
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как присоединить таплицы програмно
Да тут много вариантов может быть.
Проверить доступ к одной таблице, проверить доступ ко всем таблицам, проверить что все они присоединены к одной базе и т.д.
Для проверки того куда присоединена таблица можно использовать TableDef.Connect
Чтобы перелинковать устанавливаешь это св-во и делаешь TableDef.RefreshLink
Чтобы прилинковать новую таблицу - CurrentDB.CreateTableDef и т.д.
...
Рейтинг: 0 / 0
25.04.2003, 10:36
    #32148576
свм
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как присоединить таплицы програмно
В комплекте поставки MS Access имеется база данных "Решения".
В теме "Работа с несколькими базами данных"
пример связывания таблиц при запускею
...
Рейтинг: 0 / 0
25.04.2003, 15:23
    #32149024
AlexNiko
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как присоединить таплицы програмно
А как проверить, открывается ли прилинкованная таблица или для этого достаточно ее перелинковать ?
...
Рейтинг: 0 / 0
25.04.2003, 15:25
    #32149031
Senin Viktor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как присоединить таплицы програмно
У тебя перелинковка не получиться, если имя таблицы или путь к файлу не валидное. Облом-с будет. Поэтому достаточно только перелинковать.
...
Рейтинг: 0 / 0
25.04.2003, 15:29
    #32149037
AlexNiko
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как присоединить таплицы програмно
ТО есть перелинковал или ошибку получил так ? Сам факт перелинкования будет говорить что таблица на месте и все ОК ?
...
Рейтинг: 0 / 0
25.04.2003, 15:29
    #32149038
Лох Позорный
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как присоединить таплицы програмно
Только открыть ее получается гораздо быстрее чем перелинковать
...
Рейтинг: 0 / 0
25.04.2003, 15:38
    #32149050
Senin Viktor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как присоединить таплицы програмно
Уже пошло не понимание.

1. В момент откыртия базы делаем проверку любой таблицы, путем попытки прочитать значение какого-либо поля, например tbl("ТвояТаблица").Fields(0).Value
2. Если ошибки не было, то ничего не делам - все нормально, работаем дальше; если же была ошибка, то открываем форму для ввода пути к базе. Выбрать не правильное имя не получиться, единственное что надо предусмотреть - это валидное имя, но не не та база (то же можно обработать).
3. Все.

Все линки в порядке и при следующем запуске базы, п.1 даст значения поля и мы ничего делать не будем. И так до следующего изменения пути к базе с данными.
...
Рейтинг: 0 / 0
25.04.2003, 15:46
    #32149060
AlexNiko
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как присоединить таплицы програмно
Понятно спасибо огромное, только вот намекни как это в коде сделать
я пытаюсь так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
Dim db As Database
Set db = CurrentDb
Dim td As TableDef
With db
  For Each td In .TableDefs
  ' А ЧТО ВОТ ТУТ ПИСАТЬ НЕ ПОЙМУ
  Next td
End With

...
Рейтинг: 0 / 0
25.04.2003, 16:02
    #32149081
Лох Позорный
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как присоединить таплицы програмно
Код: plaintext
1.
td.Connect =  ";Database=c:\db1" 
td.RefreshLink

Если у тебя 97-й аксес то твой код все равно рабоать не будет :))
...
Рейтинг: 0 / 0
25.04.2003, 16:05
    #32149087
AlexNiko
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как присоединить таплицы програмно
У меня 2002, но говорят что попытка получения значения быстрее чем перелинкование. Что все таки лучше.
...
Рейтинг: 0 / 0
25.04.2003, 16:06
    #32149088
Senin Viktor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как присоединить таплицы програмно
Вот не помню откуда брал, но работает пару лет. На АДО это выглядило бы проще - лень переделывать, что и так работает.

Код: plaintext
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.
Option Compare Database
Option Explicit

'***************** Code Start ***************
'This code was originally written by Dev Ashish.
'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.
'
'Code courtesy of
'Dev Ashish

Function fRefreshLinks(Путь As String) As Boolean
    Dim strMSG As String, collTbls As Collection
    Dim i As Integer, strDBPath As String, strTbl As String
    Dim dbCurr As Database, dbLink As Database
    Dim tdfLocal                   As TableDef
    Dim varRet                     As Variant
    Dim strNewPath                 As String
    Dim N                          As Long
    Const cERR_USERCANCEL = vbObjectError + 1000
    Const cERR_NOREMOTETABLE = vbObjectError + 2000
    Const cERR_NOREMOTETABLE_2 = vbObjectError + 91

    On Local Error GoTo fRefreshLinks_Err

    ' If MsgBox( "Вы действительно хотите переприсоединить таблицы?" , _
      vbQuestion + vbYesNo,  "Подтвердите..." ) = vbNo Then Err.Raise cERR_USERCANCEL

    'First get all linked tables in a collection
    Set collTbls = fGetLinkedTables

    'now link all of them
    Set dbCurr = CurrentDb


    strNewPath = Путь
    N = collTbls.Count
    For i = collTbls.Count To  1  Step - 1 
        strDBPath = fParsePath(collTbls(i))
        strTbl = fParseTable(collTbls(i))
        varRet = SysCmd(acSysCmdSetStatus,  "Обрабатывается таблица '" & strTbl & "'...." )
        If Left$(strDBPath,  4 ) =  "ODBC"  Then
            'ODBC Tables
            'ODBC Tables handled separately
            ' Set tdfLocal = dbCurr.TableDefs(strTbl)
            ' With tdfLocal
            '     .Connect = pcCONNECT
            '     .RefreshLink
            '     collTbls.Remove (strTbl)
            ' End With
        Else
            If strNewPath <> vbNullString Then
                'Try this first
                strDBPath = strNewPath
            Else

            End If

            'backend database exists
            'putting it here since we could have
            'tables from multiple sources
            On Error GoTo fRefreshLinks_Err
            Set dbLink = DBEngine.Workspaces( 0 ).OpenDatabase(strDBPath)

            'check to see if the table is present in dbLink
            strTbl = fParseTable(collTbls(i))
            '            If fIsRemoteTable(dbLink, strTbl) Then
            If True Then
                'everything's ok, reconnect
                Set tdfLocal = dbCurr.TableDefs(strTbl)
                With tdfLocal
                    .Connect =  ";Database="  & strDBPath
                    .RefreshLink
                    collTbls.Remove (.Name)    ' Удаление из меейстава Колекции
                End With
            Else
                err.Raise cERR_NOREMOTETABLE
            End If
        End If
    Next
    fRefreshLinks = True
    varRet = SysCmd(acSysCmdClearStatus)
    MsgBox "Все таблицы успешно переприсоеденены. Обновлено " & N & " связей.", vbInformation + vbOKOnly, "Востановление прошло успешно..."


fRefreshLinks_End:
    Set collTbls = Nothing
    Set tdfLocal = Nothing
    Set dbLink = Nothing
    Set dbCurr = Nothing
    Exit Function
fRefreshLinks_Err:
    fRefreshLinks = False
    If err.Number = 3078 Or err.Number = 3343 Or err.Number = cERR_NOREMOTETABLE_2 Then

        MsgBox "Выбранный файл " & dbLink.Name & " не является базой для хранения Ваших данных." & _
               "Найдите свой файл.", _
               vbCritical + vbOKOnly, _
               "Ошибка обновления присоединений."
        Resume fRefreshLinks_End
    End If
    Select Case err
        Case 3059:

        Case cERR_USERCANCEL
            MsgBox "Таблицы не были переприсоеденены.", _
                   vbCritical + vbOKOnly, _
                   "Ошибка обновления присоединений."
            Resume fRefreshLinks_End
        Case cERR_NOREMOTETABLE
            MsgBox "Выбранный файл " & dbLink.Name & " не является базой для хранения Ваших данных." & _
                   "Найдите свой файл.", _
                   vbCritical + vbOKOnly, _
                   "Ошибка обновления присоединений."
            Resume fRefreshLinks_End
        Case Else:
            strMSG = "Возникла ошибка..." & vbCrLf & vbCrLf
            strMSG = strMSG & "Функции: fRefreshLinks" & vbCrLf
            strMSG = strMSG & "Описание: " & err.Description & vbCrLf
            strMSG = strMSG & "Номер №: " & Format$(err.Number) & vbCrLf
            MsgBox strMSG, vbOKOnly + vbCritical, "Error"
            Resume fRefreshLinks_End
    End Select
End Function

Function fIsRemoteTable(dbRemote As Database, strTbl As String) As Boolean
    Dim tdf                        As TableDef
    On Error Resume Next
    Set tdf = dbRemote.TableDefs(strTbl)
    fIsRemoteTable = (err = 0)

    Set tdf = Nothing
End Function



Function fGetLinkedTables() As Collection
'Returns all linked tables
    Dim collTables                 As New Collection
    Dim tdf As TableDef, db        As Database
    Set db = CurrentDb
    db.TableDefs.Refresh
    For Each tdf In db.TableDefs
        With tdf
            If Len(.Connect) >  0  Then
                If Left$(.Connect,  4 ) =  "ODBC"  Then
                    collTables.Add item:=.Name &  ";"  & .Connect, Key:=.Name
                    'ODBC Reconnect handled separately
                Else
                    collTables.Add item:=.Name & .Connect, Key:=.Name
                End If
            End If
        End With
    Next
    Set fGetLinkedTables = collTables
    Set collTables = Nothing
    Set tdf = Nothing
    Set db = Nothing
End Function

Public Function fParsePath(strIN As String) As String
    If Left$(strIN, 4) <> "ODBC" Then
        fParsePath = Right(strIN, Len(strIN) _
                                  - (InStr(1, strIN, "DATABASE=") + 8))
    Else
        fParsePath = strIN
    End If
End Function

Function fParseTable(strIN As String) As String
    fParseTable = Left$(strIN, InStr(1, strIN, ";") - 1)
End Function
'***************** Code End ***************



Вызов функции как
fRefreshLinks(НовыйПуть)
...
Рейтинг: 0 / 0
25.04.2003, 16:06
    #32149089
Лох Позорный
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как присоединить таплицы програмно
Сори, работать-то оно будет. Все равно TableDefs сохрани в переменной, во избежание, а то аксес некорректно ссылки на этот объект держит
...
Рейтинг: 0 / 0
25.04.2003, 16:07
    #32149091
свм
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как присоединить таплицы програмно
Private Function RefreshLinks(strFileName As String) As Boolean
Dim dbs As Database
Dim tdf As TableDef

Set dbs = CurrentDb
For Each tdf In dbs.TableDefs
If Len(tdf.Connect) > 0 Then
tdf.Connect = ";DATABASE=" & strFileName
Err = 0
On Error Resume Next

tdf.RefreshLink
If Err <> 0 Then
RefreshLinks = False
Exit Function
End If
End If
Next tdf

RefreshLinks = True
End Function

Текст из примера MS.

Ссылку я уже приводил выше
...
Рейтинг: 0 / 0
25.04.2003, 16:09
    #32149095
Лох Позорный
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как присоединить таплицы програмно
Блин во накидали постов :)
Открыть - быстрее чем линковать
Если тебе достаточно проверить любую одну таблицу (типа все на одну базу смотрят) - окрываешь любую, если все плохо - начинаешь перелинковывать все.
Если необходимо проверять все (на разные базы смотрят) - тогда открываешь по очереди, если для какой-то все плохо - ее и линкуешь.
...
Рейтинг: 0 / 0
25.04.2003, 16:15
    #32149110
AlexNiko
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как присоединить таплицы програмно
Спасибо всем огромное :) разобрался, заработало :D
...
Рейтинг: 0 / 0
25.04.2003, 16:22
    #32149120
Senin Viktor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как присоединить таплицы програмно
2 Лоху

>Если тебе достаточно проверить любую одну таблицу (типа все на одну базу смотрят) - окрываешь любую, если все плохо - начинаешь перелинковывать все.

Ты че мои идеи за свои выдаешь. ПЛАГИАНТ!!!
...
Рейтинг: 0 / 0
25.04.2003, 17:12
    #32149169
Лох Позорный
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как присоединить таплицы програмно
Я твои идеи не выдаю, я их развиваю.
Сам ты плиагант :)
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Как присоединить таплицы програмно / 22 сообщений из 22, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]