Модераторы: Akina
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как программно поменять связи с таблицами, Есть много связаных таблиц, надо перемес 
:(
    Опции темы
Bes
Дата 1.4.2005, 09:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 806
Регистрация: 8.12.2004

Репутация: нет
Всего: 7



Вообщем проблема такая.
Есть МДБ-шка которую постоянно таскают с места на место, в ней прописана куча связей с таблицами. Таблицы таскают вместе с ней.
Хотелось бы, чтобы связи также меняли свои пути, как это дело автоматизировать.
Т.е. там скажем 40 таблиц и 10 разных путей, надо их корректировать, чтобы отладочная версия не поганиля реальные таблицы.
PM MAIL   Вверх
Akina
Дата 1.4.2005, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 30
Всего: 454



А заменить абсоютные пути на относительные не пробовали?


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Bes
Дата 1.4.2005, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 806
Регистрация: 8.12.2004

Репутация: нет
Всего: 7



Да там через Ж... все сделано. Если уж там три разных мдб-шки с одним именем....
У меня тут возник вариант сделать сетевой диск и к разным папкам его привязывать, но все равно в рабочей версии до кучи всяких разных путей.
А скриптик никакой нельзя наваять для переключалки, мне бы конено удобнее на дельфи но и не ВБ пойдет.
А так файлик переписал, кнопочку нажал и красота....
PM MAIL   Вверх
Akina
Дата 1.4.2005, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 30
Всего: 454



Ну тогда:
1) Поясни, что это за "Таблицы таскают вместе с ней"... куча отдельных MDB или там еще что-то понаворочано?
2) Почему бы не сделать программную настройку - одна большая форма с перечислением требуемых файлов и возможностью задания их имени-пути? с сохранением в системной таблице с привязкой к станции или даже в реестр загонять...
3) Почему не сделать программный Connection на нужные таблицы?
4) Почему не сделать промежуточную, индивидуальную для каждой станции или даже конфигурации, привязывающую БД?

В общем вопросов больше чем ответов...

Да, кстати...

Цитата(MS)
Просмотр, обновление или изменение имени файла и пути для связанных таблиц (MDB)


Просмотр или обновление связей

Следующая процедура используется для просмотра или обновления связей после изменения структуры или расположения связанной таблицы. Диспетчер связанных таблиц выводит список путей к текущим связанным таблицам.

Откройте базу данных, содержащую связи с таблицами.

Выберите в меню Сервис команду Служебные программы и подкоманду Диспетчер связанных таблиц.

Установите флажки для таблиц, связи с которыми требуется обновить.

Нажмите кнопку OK для обновления выбранных связей.

Microsoft Access подтверждает успешное обновление или, если таблица не найдена, выводит на экран диалоговое окно Выбор нового расположения <имя таблицы>, в котором можно указать новое расположение таблицы.

Если в новое указанное расположение были перемещены несколько выбранных таблиц, диспетчер связанных таблиц выполняет поиск всех выбранных таблиц и обновляет все связи сразу.

Изменение пути к набору связанных таблиц

Откройте базу данных, содержащую связи с таблицами.

Выберите в меню Сервис команду Служебные программы и подкоманду Диспетчер связанных таблиц.

Установите флажок Всегда выдавать запрос нового местонахождения.

Установите флажки для таблиц, связи с которыми требуется изменить, а затем нажмите кнопку OK.

В диалоговом окне Выбор нового расположения: <имя таблицы> укажите новое расположение, нажмите кнопку Открыть, а затем кнопку OK.

Примечания

Диспетчер связанных таблиц не перемещает файлы баз данных или таблиц. Для получения дополнительных сведений о перемещении файла базы данных или таблицы в новое расположение воспользуйтесь справочной системе Microsoft Windows. После перемещения базы данных или таблицы можно воспользоваться диспетчером связанных таблиц для обновления связей.

Диспетчер связанных таблиц не может обновлять связи с таблицами Microsoft Access, имена которых были изменены после связывания. В таких случаях необходимо удалить текущую связь, а затем связать таблицы повторно.

Сведения в данном разделе относятся только к базам данных Microsoft Access (.mdb). Связать таблицу можно только в базе данных Microsoft Access, но не в проекте Microsoft Access.



--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Bes
Дата 5.4.2005, 06:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 806
Регистрация: 8.12.2004

Репутация: нет
Всего: 7



Цитата
Ну тогда:
1) Поясни, что это за "Таблицы таскают вместе с ней"... куча отдельных MDB или там еще что-то понаворочано?


Плохо понял, что значит, что-нибудь еще наворочено. Вроде просто куча отдельных мдбшек.

Цитата
2) Почему бы не сделать программную настройку - одна большая форма с перечислением требуемых файлов и возможностью задания их имени-пути? с сохранением в системной таблице с привязкой к станции или даже в реестр загонять...
3) Почему не сделать программный Connection на нужные таблицы?
4) Почему не сделать промежуточную, индивидуальную для каждой станции или даже конфигурации, привязывающую БД?


Потому что нельзя менять сам продукт, это должно выполняться только программой извне.

Цитата
В общем вопросов больше чем ответов...

Да, кстати...


Цитата
Цитата (MS Access Help)
Просмотр, обновление или изменение имени файла и пути для связанных таблиц (MDB)


Просмотр или обновление связей

Следующая процедура используется для просмотра или обновления связей после изменения структуры или расположения связанной таблицы. Диспетчер связанных таблиц выводит список путей к текущим связанным таблицам.

Откройте базу данных, содержащую связи с таблицами.

Выберите в меню Сервис команду Служебные программы и подкоманду Диспетчер связанных таблиц.

Установите флажки для таблиц, связи с которыми требуется обновить.

Нажмите кнопку OK для обновления выбранных связей.

Microsoft Access подтверждает успешное обновление или, если таблица не найдена, выводит на экран диалоговое окно Выбор нового расположения <имя таблицы>, в котором можно указать новое расположение таблицы.

Если в новое указанное расположение были перемещены несколько выбранных таблиц, диспетчер связанных таблиц выполняет поиск всех выбранных таблиц и обновляет все связи сразу.

Изменение пути к набору связанных таблиц

Откройте базу данных, содержащую связи с таблицами.

Выберите в меню Сервис команду Служебные программы и подкоманду Диспетчер связанных таблиц.

Установите флажок Всегда выдавать запрос нового местонахождения.

Установите флажки для таблиц, связи с которыми требуется изменить, а затем нажмите кнопку OK.

В диалоговом окне Выбор нового расположения: <имя таблицы> укажите новое расположение, нажмите кнопку Открыть, а затем кнопку OK.

Примечания

Диспетчер связанных таблиц не перемещает файлы баз данных или таблиц. Для получения дополнительных сведений о перемещении файла базы данных или таблицы в новое расположение воспользуйтесь справочной системе Microsoft Windows. После перемещения базы данных или таблицы можно воспользоваться диспетчером связанных таблиц для обновления связей.

Диспетчер связанных таблиц не может обновлять связи с таблицами Microsoft Access, имена которых были изменены после связывания. В таких случаях необходимо удалить текущую связь, а затем связать таблицы повторно.

Сведения в данном разделе относятся только к базам данных Microsoft Access (.mdb). Связать таблицу можно только в базе данных Microsoft Access, но не в проекте Microsoft Access.


Это я нашел, я так тоже могу, но только не знаю как можно это использовать из другого приложения (утилиты).
PM MAIL   Вверх
Akina
Дата 5.4.2005, 09:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 30
Всего: 454



Цитата(Bes @ 5.4.2005, 07:55)
нельзя менять сам продукт, это должно выполняться только программой извне

тогда надо как минимум точно знать как именно сделана привязка в продукте, который "нельзя менять"...


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Bes
Дата 5.4.2005, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 806
Регистрация: 8.12.2004

Репутация: нет
Всего: 7



Ну дак точно известно. Обычно таблицы-создать-связь с таблицами.
Не программно, ни через другие таблицы. Все просто.
Вообщем, вроде как я это знаю, если правильно понял вопрос. Чего дальше?
PM MAIL   Вверх
Akina
Дата 5.4.2005, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 30
Всего: 454



Посмотри TableDef.RefreshLink


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Guest
Дата 9.4.2005, 13:11 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Я написал функцию в VB которая при запуске устанавливает связь с таблицей

Код

' Создание связей с внешней базои с предварительной проверкой существования этой связи
' 1 Название таблицы для проверки
' 2,3 Название внешней базы и таблицы
Public Function CreatLink(pNameTabl As String, pBase As String, pOrigTabl) As Integer
    Dim vTabl As TableDef

    On Error Resume Next
    CreatLink = 0

    '- - - - - Проверка существования доступа к таблице
    For Each vTabl In MainBase.TableDefs
        If (vTabl.Name = pNameTabl) Then
            DoCmd.DeleteObject acTable, pNameTabl
            MainBase.TableDefs.Refresh
            Exit For
        End If
    Next vTabl
      
    '- - - - - - Установить связь
    If (IsFile(pBase) = True) Then
        DoCmd.TransferDatabase acLink, "Microsoft Access", pBase, acTable, pOrigTabl, pNameTabl
        MainBase.TableDefs.Refresh
            
        '- - - - - Проверка установления таблицы
        For Each vTabl In MainBase.TableDefs
            If (vTabl.Name = pNameTabl) Then
                 CreatLink = 1
                 Exit Function
            End If
        Next vTabl
    End If
End Function


Это сообщение отредактировал(а) Akina - 12.4.2005, 07:44
  Вверх
Bes
Дата 12.4.2005, 07:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 806
Регистрация: 8.12.2004

Репутация: нет
Всего: 7



Ммм..... скопируй это еще раз на русском шрифте.
PM MAIL   Вверх
Protuberanez
Дата 3.4.2007, 09:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 3.4.2007

Репутация: нет
Всего: нет



Здравствуйте. 
У меня похожая проблема.
Я создал небольшую аля программулину для создания отчетов за различные периоды. закрыл доступ ко всему через параметры запуска кроме кномпки Ф11 про которую у меня на работе мало кто знает. но все было бы хорошо, но вот возникает подобный заданому вопрос.
У меня связаные таблицы работают через ODBC драйвера и при переносе на новую машину возникает проблема с обновлением связанных таблиц. Такая же проблема возникает и даже при заходе другого пользователя на эту же машину. 
Подскажите каким образом можно с помощью кнопки на форме вызвать обновление связанных таблиц?
PM MAIL   Вверх
Akina
Дата 3.4.2007, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 30
Всего: 454



Ответ есть в теме - прочтите ее более внимательно.
Для выбора путей к новым связанным таблицам поместите на форму и используйте CommonDialog.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
bopoha
Дата 3.4.2007, 18:28 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1283
Регистрация: 10.5.2006
Где: Беларусь, Минск

Репутация: 21
Всего: 21



Эххх.... дарю:
Вызови ее с правильным путем при старте....

Код

Public Function VC_LT_AddAllExt(ByVal stPathToBase As String) As Long
' создана: 2004-02-05

' изменена: 2007-04-02
' подлинковывает все таблицы из указанной базы
' проверяет существует ли подлинковываемая таблица в текущей как ссылка, то обновляется строка подключения.
' если же в тек. базе есть таблица с таким именем (не ссылка), то подлинковываемая таблица пропускается
' т.о. перед вызовом этой функции удалять линкованные таблицы не нужно
' вход: stPathToBase - путь и имя базы
' выход: количество не подлинкованных таблиц, в случае ошибки возвращает -1

On Error GoTo Err_
    VC_LT_AddAllExt = 0
    
    Dim tdf As TableDef
    Dim db As Database
    Dim bIsSysOrLink As Boolean
    Dim stNameTbl As String
    Dim lCountNotLinket As Long ' количество не подлинкованных таблиц
    Dim stConnect As String
    Dim dbCur As DAO.Database
    Dim tdfNew As DAO.TableDef
    Dim tdfsCur As DAO.TableDefs
    
    stConnect = ";DATABASE=" & stPathToBase
    Set dbCur = CurrentDb
    Set tdfsCur = dbCur.TableDefs
    
    '-- делаем масив таблиц в текущей базе
    Dim masNameTbl() As String
    Dim i As Long

    tdfsCur.Refresh
    ReDim masNameTbl(tdfsCur.count - 1)
    i = 0
    For Each tdf In tdfsCur
        masNameTbl(i) = tdf.Name
        i = i + 1
    Next tdf
    
    '-- коннектимся к базе
    Set db = OpenDatabase(stPathToBase)
    
    lCountNotLinket = 0
    '-- линкуем
    For Each tdf In db.TableDefs
        bIsSysOrLink = (tdf.Attributes And dbSystemObject) Or _
                    (tdf.Attributes And dbHiddenObject) _
                    Or (tdf.Attributes And dbAttachedTable) ' системная или присеоединенная ли?
                    
        If Not bIsSysOrLink Then  ' если не то что выше, то можно делать линк
            stNameTbl = tdf.Name
            '-- если такая таблица существует в текущей базе
            If SerchStrInMas(masNameTbl, stNameTbl) <> -1 Then
                '-- то проверяем подлинкованая ли? иначе пропусаем эту таблицу и переходим на следующую
                If (tdfsCur(stNameTbl).Attributes And dbAttachedTable) Then
                    '-- обновляем путь к бд
                    tdfsCur(stNameTbl).Connect = stConnect
                Else
                    Debug.Print "VC_LT_AddAllExt(), пропущена таблица:", stNameTbl
                    lCountNotLinket = lCountNotLinket + 1
                End If
            Else
            '-- не существует - то линкуем
                Set tdfNew = dbCur.CreateTableDef(stNameTbl)
                tdfNew.SourceTableName = stNameTbl
                tdfNew.Connect = stConnect
                tdfsCur.Append tdfNew
            End If
        End If
    Next tdf
    
    db.Close
    Set db = Nothing
    
    tdfsCur.Refresh
    Set tdfsCur = Nothing
    Set dbCur = Nothing
    
    VC_LT_AddAllExt = lCountNotLinket
Exit_:
    Exit Function

Err_:
    VC_LT_AddAllExt = -1
    Debug.Print Date, Time, "VC_LT_AddAllExt", Err.Number, Err.Description
    MsgBox "Во время работы возникла ошибка! Обратитесь к разработчику.", vbCritical
    Resume Exit_
    Resume
End Function

Private Function SerchStrInMas(ByRef masStr() As String, ByRef SerchStr As String) As Long
' создана: 2004-02-05
' изменена: 2004-09-29
' Поиск строки в строковом масиве
' вход: masStr - масив строк
'       SerchStr - искомая строка
' выход:
'   номер элемента масива, в котором была найдена подстрока SerchStr, иначе -1 (когде нет совпадений)
'   при ошибке возвращает -1
    
On Error GoTo Err_

    Dim i As Long
    
    SerchStrInMas = -1
    
    For i = LBound(masStr) To UBound(masStr)
        If masStr(i) = SerchStr Then
            SerchStrInMas = i
            Exit For
        End If
    Next i
    
Exit_:
    Exit Function
Err_:
    SerchStrInMas = -1
    Resume Exit_
End Function

PM MAIL WWW ICQ Skype GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "MS Access"
Akina
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • Используйте теги [code=vb][/code] и [code=sql][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Akina.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MS Access | Следующая тема »


 




[ Время генерации скрипта: 0.1360 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.