189 / 8 / 3
Регистрация: 20.01.2015
Сообщений: 172
1

Как задать относительный путь к файлу БД?

24.01.2015, 21:46. Показов 9589. Ответов 24
Метки нет (Все метки)

Здравствуйте! Ваяю базу данных состоящую из двух частей один файл БД содержит только таблицы второй остальное (запросы, формы, макросы и тд), сделано это для того, что бы вносить изменения, добавления в рабочую базу не привязываясь к данным таблиц постоянно пополняющимся. Связаны они через связанные таблицы.

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

P.S. Я когда то такой трюк проделывал (нашел в инете), но забыл как и найти не могу теперь.
Спасибо
1
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.01.2015, 21:46
Ответы с готовыми решениями:

Как задать относительный путь для связанных таблиц?
Как задать относительный путь для связанных таблиц ? В Access 97 это вроде можно было сделать а в...

Как задать относительный путь к файлу?
Есть некий класс со статическим методом, выполняющим сериализацию объекта данного класса: private...

Как задать относительный путь к файлу?
В проге, когда пользователь создает текстовый файл, автоматом копируются в эту же директорию еще...

Можно ли задать относительный путь exe файлу к dll?
Можно ли задать относительный путь exe файлу к dll? допустим есть exe файл и рядом в папке bin...

24
Эксперт MS Access
26747 / 14426 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
24.01.2015, 23:21 2
Трюка не знаю. В таких случаях делается перелинковка. При загрузке БД проверяются линки, скажем рекордсетом к линкованной таблице, и если ошибка, то запускается процедура перелинковки. Перелинковку можно делать различными средствами. Я предпочитаю ADOX
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Sub tConnect()
    Dim cat As Object, tbl As Object, PathDB, p
    Set cat = CreateObject("ADOX.Catalog")
    Set tbl = CreateObject("ADOX.Table")
    
    cat.ActiveConnection = CurrentProject.Connection
    PathDB = CurrentProject.path               'Текущий путь к БД с формами
    p = "ИмяТабличнойБД.mdb"                   'Имя табличной базы
    For Each tbl In cat.Tables
        If tbl.Type = "LINK" Then
            tbl.Properties("Jet OLEDB:Link Datasource") = PathDB & "\" & p
        End If
    Next
End Sub
5
189 / 8 / 3
Регистрация: 20.01.2015
Сообщений: 172
25.01.2015, 01:17  [ТС] 3
Смутно но понятно, помещать это куда надо??? Я начинаю осваивать VBA поэтому если можно по подробннее с что с этим делать.
0
Эксперт MS Access
26747 / 14426 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
25.01.2015, 10:19 4
Цитата Сообщение от aleks_des Посмотреть сообщение
помещать это куда надо???
Делате загрузочную форму, можно невидимую. В ней на событии открытия делаете запрос к любой линкованной таблице из тех, что обязательно должны быть. На запросе строите рекордсет. В коде устанавливаете проверку ошибок. Если ошибка есть, то подключается процедура tConnect. Пример кода на открытии загрузочной формы
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Private Sub Form_Open(Cancel As Integer)
    Dim s, rst As dao.Recordset, tbl
    Set db = CurrentDb
    tbl = "ИмяТаблицы"       'Имя обязательной линкованной таблицы
    s = "select * from [" & tbl & "]"
    
    On Error GoTo errend
    Set rst = CurrentDb.OpenRecordset(s)
    
errNo:
    Exit Sub                 'Ошибок нет, все линкованные таблицы подключены
errend:
    Select Case err.Number
        Case 3024            'Не удается найти файл
            tConnect         'подключаем процедуру перелинковки
        Case Else
            msgbox "Ошибка: " & Err.Number & " " & Err.Description 'Другие ошибки
    End Select
    Resume errNo
End Sub
2
6 / 6 / 0
Регистрация: 18.03.2017
Сообщений: 63
10.03.2018, 11:47 5
Хорошее решение. Работало, пока я не завёл ещё одну базу. Может кто поделится наработками? Может есть у кого решение для двух, трёх источников таблиц? Желательно без доп библиотек. Иногда с базой приходится запускаться на неизвестных компах.
0
Модератор
Эксперт MS Access
4388 / 2303 / 576
Регистрация: 12.06.2016
Сообщений: 6,001
10.03.2018, 11:59 6
Ну, у меня три источника таблиц подключаются.
Все очень просто.
Разумеется, "без дополнительных библиотек".
Но сейчас некогда рассказывать.
Потом, если никто до тех пор не ответит.
0
6 / 6 / 0
Регистрация: 18.03.2017
Сообщений: 63
10.03.2018, 12:02 7
Цитата Сообщение от Capi Посмотреть сообщение
Потом, если никто до тех пор не ответит.
Если найдется у Вас минутка, будьте добры - поделитесь пожалуйста. Очень надо :-)
0
Модератор
Эксперт MS Access
4388 / 2303 / 576
Регистрация: 12.06.2016
Сообщений: 6,001
10.03.2018, 12:44 8
KirillovAV,

Хорошо, сейчас попробую сделать.
Для случая, когда все файлы с данными лежат в одной папке с файлом интерфейса.
Устроит такой вариант?

Добавлено через 26 минут
Молчание - знак согласия???
Ясно...
Держите:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Function FuncLink()
 Dim Db As DAO.Database, _
     Rst As DAO.Recordset, _
     S As String, _
     SN As String
 Set Db = CurrentDb
 Set Rst = Db.OpenRecordset("SELECT Name,Database FROM MSysObjects WHERE Type=6")
 S = CurrentProject.Path & "\"
 With Rst
  Do Until .EOF
   SN = S & Split(!Database, "\")(UBound(Split(!Database, "\")))
   If Db(!Name).Connect <> SN Then
    Db(!Name).Connect = SN
    Db(!Name).RefreshLink
   End If
   .MoveNext
  Loop
 End With
End Function
2
6 / 6 / 0
Регистрация: 18.03.2017
Сообщений: 63
10.03.2018, 14:22 9
Прошу извинить что сразу не ответил и можно Вас попросить сделать код для случая когда интерфейс и база таблицы в соседних каталогах лежат?

Структура расположения файлов:
...\БД\Кириллов\Интерфейс.accdb
...\БД\Иванова\Интерфейс.accdb
...\БД\Таблицы1.accdb
...\БД\Таблицы2.accdb

Огромное Вам спасибо, за уже неоднократную помощь!
0
Модератор
Эксперт MS Access
4388 / 2303 / 576
Регистрация: 12.06.2016
Сообщений: 6,001
10.03.2018, 15:00 10
KirillovAV,

И к кому что относится?
К Кириллову Таблицы1, а к Ивановой Таблиы2?
Это всегда так будет?

Давайте лучше сделаю, чтобы Вы (или другой пользователь) вводили имя нужной папки,
в которой лежат файлы с данными.
Можно сделать, чтобы не вводить имя, а чтобы был выбор папки, как в проводнике,
но пока не очень хочется, да и нужно ли Вам.

Добавлено через 10 минут
Кажется, сначала поняла неправильно.
Наверное, нужно и из папки Кириллов, и из папки Иванова подключаться к обоим файлам таблиц?
Сейчас сделаю.

Добавлено через 14 минут
Вот. Проверьте, пожалуйста.
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Function FuncLink()
 Dim Db As DAO.Database, _
     Rst As DAO.Recordset, _
     S As String, _
     SN As String
 Set Db = CurrentDb
 Set Rst = Db.OpenRecordset("SELECT Name,Database FROM MSysObjects WHERE Type=6")
 S = Left(CurrentProject.Path, InStrRev(CurrentProject.Path, "\"))
 With Rst
  Do Until .EOF
   SN = S & Split(!Database, "\")(UBound(Split(!Database, "\")))
   If Db(!Name).Connect <> SN Then
    Db(!Name).Connect = SN
    Db(!Name).RefreshLink
   End If
   .MoveNext
  Loop
 End With
End Function
Добавлено через 2 минуты
Разница вот в этой строке:
Visual Basic
1
2
3
4
' было
S = CurrentProject.Path & "\"
' стало
S = Left(CurrentProject.Path, InStrRev(CurrentProject.Path, "\"))
0
6 / 6 / 0
Регистрация: 18.03.2017
Сообщений: 63
10.03.2018, 16:22 11
Ок. Пробую!

Добавлено через 21 минуту
Создал модуль. Вставил код функции. В autoexec на первое место поставил запуск функции. Правильно делаю?
Возвращается ошибка 3170. Невозможно найти устанавливаемый ISAM. Отладчик жалуется на строчку Db(!Name).RefreshLink
0
Модератор
Эксперт MS Access
4388 / 2303 / 576
Регистрация: 12.06.2016
Сообщений: 6,001
10.03.2018, 16:30 12
Цитата Сообщение от KirillovAV Посмотреть сообщение
Отладчик жалуется на строчку Db(!Name).RefreshLink
Что такое "жалуется"?
Текст сообщения есть?

Добавлено через 3 минуты
KirillovAV,

Можете выложить интерфейсную часть (безо всего, только с использованием этой функции)
и файлы с таблицами (пусть даже пустыми) ?
0
6 / 6 / 0
Регистрация: 18.03.2017
Сообщений: 63
10.03.2018, 16:31 13
Жалуется это имелось ввиду, после нажатия Debug - Желтым выделяет.

ошибка: "Run-time error 3170. Невозможно найти устанавливаемый ISAM"
0
Модератор
Эксперт MS Access
4388 / 2303 / 576
Регистрация: 12.06.2016
Сообщений: 6,001
10.03.2018, 16:34 14
Это не отладчик, это сообщение Run-Time, времени выполнения.

Выложить сможете?
0
6 / 6 / 0
Регистрация: 18.03.2017
Сообщений: 63
10.03.2018, 16:37 15
панель immediate На запрос "? !Name" выдает название таблицы. Которая точно существует в базе к которой подключаюсь.

Добавлено через 41 секунду
Цитата Сообщение от Capi Посмотреть сообщение
Выложить сможете?
Базу?

Добавлено через 36 секунд
Сейчас почищу - выложу
0
Модератор
Эксперт MS Access
4388 / 2303 / 576
Регистрация: 12.06.2016
Сообщений: 6,001
10.03.2018, 16:39 16
Было выше:
Цитата Сообщение от Capi Посмотреть сообщение
Можете выложить интерфейсную часть (безо всего, только с использованием этой функции)
и файлы с таблицами (пусть даже пустыми) ?
Добавлено через 1 минуту
Цитата Сообщение от KirillovAV Посмотреть сообщение
Сейчас почищу - выложу
Хорошо.
0
6 / 6 / 0
Регистрация: 18.03.2017
Сообщений: 63
10.03.2018, 16:51 17
Прилагаю БД
Вложения
Тип файла: rar БД.RAR (108.9 Кб, 7 просмотров)
0
6 / 6 / 0
Регистрация: 18.03.2017
Сообщений: 63
10.03.2018, 17:17 18
Упаковывал Тоталом, без сохранения путей, структура папок удалилась. Перевыкладываю с папками как действительно расположено.
0
6 / 6 / 0
Регистрация: 18.03.2017
Сообщений: 63
10.03.2018, 17:18 19
Перевыкладываю с папками как действительно расположено.
Вложения
Тип файла: rar БД.RAR (103.4 Кб, 21 просмотров)
0
Модератор
Эксперт MS Access
4388 / 2303 / 576
Регистрация: 12.06.2016
Сообщений: 6,001
10.03.2018, 17:51 20
1. В файле ОКС_be.accdb всего одна таблица СоотвОбъектВводаРнВ.
Так и должно быть?
По сути, это не важно, просто хочу убедиться, что все пришло как надо.
2. Файлы интерфейсные не открываются в 2007-м.
Мне придется сделать свой. Но на Ваших проверить не смогу.

Добавлено через 20 минут
KirillovAV,

Все, разобралась.
Прошу прощения, мое упущение.
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Function FuncLink()
 Dim Db As DAO.Database, _
     Rst As DAO.Recordset, _
     S As String, _
     SN As String
 Set Db = CurrentDb
 Set Rst = Db.OpenRecordset("SELECT Name,Database FROM MSysObjects WHERE Type=6")
 S = Left(CurrentProject.Path, InStrRev(CurrentProject.Path, "\"))
 With Rst
  Do Until .EOF
   SN = ";DATABASE=" & S & Split(!Database, "\")(UBound(Split(!Database, "\")))
   If Db(!Name).Connect <> SN Then
    Db(!Name).Connect = SN
    Db(!Name).RefreshLink
   End If
   .MoveNext
  Loop
 End With
End Function
Вот здесь пропустила фрагмент:
Visual Basic
1
2
3
4
' было
SN = S & Split(!Database, "\")(UBound(Split(!Database, "\")))
' стало
SN = ";DATABASE=" & S & Split(!Database, "\")(UBound(Split(!Database, "\")))
Проверила - все перелинковывается нормально.
Я, правда, сделала форму с кнопкой, без макросов.
Но это не влияет.

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

Сообщите, как пойдет.
2
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.03.2018, 17:51
Помогаю со студенческими работами здесь

Как указать относительный путь к файлу?
Подскажите пожалуйста как указать относительный путь к файлу в среде visual basic 2010? Зарание...

Как получить относительный путь к файлу?
Сообщение выделено из темы: https://www.cyberforum.ru/cmd-bat/thread844796.html Это самое...

Как прописать относительный путь к файлу
Столкнулся с проблемой, указал путь к картинке (&quot;C:\Users\профиль\Desktop\eN\materials\1.bmp&quot;), но...

Как указать относительный путь к файлу?
Привет всем, у меня возникла проблема, работаю с файлом типа swf и не могу указать путь...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru