Работа с DBF без ODBC

Программирование на Visual Basic for Applications
MYF
Новичок
Новичок
Аватара пользователя
 
Сообщения: 44
Зарегистрирован: 12.05.2006 (Пт) 6:38
Откуда: Череповец

Работа с DBF без ODBC

Сообщение MYF » 26.10.2006 (Чт) 21:51

Исходные: Windows 2000/XP, MS Office 2000 и программный комплекс со встроенным VBA 6.0 (iFIX - если кто-то знает что это такое).
Надо организовать из этого iFIX посредством встроенного VBA обмен данными с левыми приложениями через .DBF формата dBASE-IV.
В настоящее время работа с .DBF организована через ODBC. Это жутко неудобно. Надо на каждой станции прописывать DSN.
Можно ли организовать это как-то более по-человечески? Например как с .MDB через ADO/DAO?
Почитал тут в форуме. Вроде что-то подобное было, но применить это к своим задачам как-то не получается. Или я чего-то не так понял... Или не те библиотеки цепляю?.. Вот тут-то ещё одно ограничение - очень нежелательно устанавливать дополнительные библиотеки, надо как-то обойтись тем, что перечислено выше.
В справке Office 200/2003 по этому вопросу вообще ни чего не нашол...

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 26.10.2006 (Чт) 22:23

DSN можно создавать/задавать программно.
Можно работать через ODBC используя не DSN, а непосредственно указывая драйвер и путь к данным.
Можно использовать DAO (указывая в строке данных FoxPro или dBase).
Можно использовать ADO, указывая провайдер dBase или FoxPro (рекомендую FoxPro OLEDB провайдер 9 версии, есть на сайте MS).
Можно напрямую работать с файлами, благо формат DBF примитивный и класс для работы написать не сложно.
Все это в Windows XP + Office 2000 уже встроено и дополнительных библиотек не требуется.
Искать по ConnectionString, OpenDatabase, Connection.
Lasciate ogni speranza, voi ch'entrate.

MYF
Новичок
Новичок
Аватара пользователя
 
Сообщения: 44
Зарегистрирован: 12.05.2006 (Пт) 6:38
Откуда: Череповец

Сообщение MYF » 27.10.2006 (Пт) 0:11

Рискую показаться ленивцем, который хочет переложить свою работу на плечи других, но...
Если можно, объясните подробнее. Я уже давно бъюсь над этой проблемой, а воз и ныне там. Надо всего-то сохранить/прочитать 10-20 переменных. И если бы в .MDB - давно бы уже закончил. А тут заклинило :cry:

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 27.10.2006 (Пт) 3:19

Ну покажи, как подключаешься к mdb.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

MYF
Новичок
Новичок
Аватара пользователя
 
Сообщения: 44
Зарегистрирован: 12.05.2006 (Пт) 6:38
Откуда: Череповец

Сообщение MYF » 27.10.2006 (Пт) 20:33

В моём проекте используются две процедуры для записи состояний тэгов перед его закрытием и считывания после запуска. Вот пример как я читаю из готовой .MDB. Чтобы не заморачивать народ спецификой iFIX перегнал его под Excel.
Заказываю в Tools-References Microsoft DAO Object Library.
Код: Выделить всё
Const DBName = "C:\гдетотам\TEST.MDB"
Const TblName = "TEST1"
Sub TestRead()
Dim DB As Database, RS As Recordset
Dim i As Long
Set DB = Workspaces(0).OpenDatabase(DBName)
Set RS = DB.OpenRecordset(TblName)
i = 0
RS.MoveFirst
While Not RS.EOF
  i = i + 1
  Cells(i, 1).Value = RS.Fields("TAG")
  Cells(i, 2).Value = RS.Fields("VALUE")
  RS.MoveNext
  Wend
RS.Close
DB.Close
End Sub
Но эти две процедуры не критичны к форме хранения данных. Можно формат файла хоть самому изобрести.
Другое дело данные, которые я должен сливать в .DBF формате для других пользователей не знамо каких приложений. Тут уж ни куда не денешься, делать надо так как надо. А прописыват DSN не удобно. Надо чтобы по простому указать где файл лежит и сливать данные.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 28.10.2006 (Сб) 5:56

Во-первых, переходи на ADO, и во-вторых, www.connectionstrings.com
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

MYF
Новичок
Новичок
Аватара пользователя
 
Сообщения: 44
Зарегистрирован: 12.05.2006 (Пт) 6:38
Откуда: Череповец

Сообщение MYF » 29.10.2006 (Вс) 19:40

Перейду. Вот только книжку найду, да почитаю...

Так что, ни кто ни чем конкретным так и не поможет?..

Алексей К.
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 419
Зарегистрирован: 12.05.2004 (Ср) 9:41
Откуда: Ульяновск

Сообщение Алексей К. » 30.10.2006 (Пн) 7:34

Если компов в сети для обмена данными не много и если тебе так нравится использование mdb: создай связи в access для нужных тебе таблиц и сливай данные запросами/макросами.

MYF
Новичок
Новичок
Аватара пользователя
 
Сообщения: 44
Зарегистрирован: 12.05.2006 (Пт) 6:38
Откуда: Череповец

Сообщение MYF » 30.10.2006 (Пн) 9:23

Нет, .MDB мне не то чтобы нравится, просто я знаю как с ним работать. И в справке MSOffice примеры есть...
А работать приходится не из Access, а из iFIX. Так что городить лишние вызовы одного приложения из другого - не выход - только систему утяжелять, а она и так тяжело ворочается...
Надо как-то напрямую.
Последний раз редактировалось MYF 30.10.2006 (Пн) 14:33, всего редактировалось 1 раз.

Алексей К.
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 419
Зарегистрирован: 12.05.2004 (Ср) 9:41
Откуда: Ульяновск

Сообщение Алексей К. » 30.10.2006 (Пн) 10:20

Код: Выделить всё
Dim rs As ADODB.Recordset
Dim cn_dbf As ADODB.Connection
Set cn_dbf = New ADODB.Connection
Set rs = New ADODB.Recordset
rs.CursorLocation = adUseClient
rs.CursorType = adOpenStatic
rs.LockType = adLockOptimistic
path_to_dbf="\\pc_name1\shared_folder\"'путь к паке с файлами *.dbf
cn_dbf.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + path_to_dbf + ";Extended Properties=dBase IV"
'======получение данных
запрос = "select * from table1" 'запрос на получение выборки из table1.dbf
rs.Open запрос, cn_dbf
rs.movefirst
....
rs.close
cn_dbf.close
'======добавление данных
запрос="insert into ...."
cn_dbf.execute запрос
cn_dbf.close

Nicky
Постоялец
Постоялец
 
Сообщения: 519
Зарегистрирован: 12.08.2004 (Чт) 12:14

Сообщение Nicky » 30.10.2006 (Пн) 13:10

MYF писал(а):
Код: Выделить всё
Const DBName = "C:\гдетотам\TEST.MDB"
Const TblName = "TEST1"
Sub TestRead()
Dim DB As Database, RS As Recordset
Dim i As Long
Set DB = Workspaces(0).OpenDatabase(DBName)
Set RS = DB.OpenRecordset(TblName)
i = 0
RS.MoveFirst
While Not RS.EOF
  i = i + 1
  Cells(i, 1).Value = RS.Fields("TAG")
  Cells(i, 2).Value = RS.Fields("VALUE")
  RS.MoveNext
  Wend
RS.Close
DB.Close
End Sub

:)
Код: Выделить всё
Const DBName = "C:\гдетотам"
Const TblName = "TEST1" 'TEST1.dbf
Sub TestRead()
Dim DB As Database, RS As Recordset
Dim i As Long
Set DB = Workspaces(0).OpenDatabase(DBName,0,0,"dBase IV")
Set RS = DB.OpenRecordset(TblName)
i = 0
RS.MoveFirst
While Not RS.EOF
  i = i + 1
  Cells(i, 1).Value = RS.Fields("TAG")
  Cells(i, 2).Value = RS.Fields("VALUE")
  RS.MoveNext
  Wend
RS.Close
DB.Close
End Sub


Вернуться в VBA

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 87

    TopList