powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Импорт dbf без использования драйвера
11 сообщений из 11, страница 1 из 1
Импорт dbf без использования драйвера
    #39472747
GVOV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Задача получить данные из dbf файла без использования драйверов ISAM. Воспользовавшись распространённым материалом по данному вопросу получилось считать данные с файла напрямую в рекордсет а уже потом из него заполнить подготовленную таблицу. Но возникла проблема с большими файлами. Во время выполнения функции в какой-то момент происходит переполнение и данные перестают считываться.

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

Подскажите, знающие, как обойти ошибку.
...
Рейтинг: 0 / 0
Импорт dbf без использования драйвера
    #39472753
guest_rusimport
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
GVOV,
вот этот кусочек кода так должен выглядеть
Код: vbnet
1.
2.
3.
4.
Dim hf%, i&, j&, rl&, rc&, hl&, fc%, v
Dim afn() As String, afs() As Integer, ad() As Byte, sd$, sf$
Dim rs As Object    'ADODB.Recordset
'On Error Resume Next
...
Рейтинг: 0 / 0
Импорт dbf без использования драйвера
    #39472931
GVOV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
guest_rusimport,

Спасибо!!!
...
Рейтинг: 0 / 0
Импорт dbf без использования драйвера
    #39473718
GVOV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Решил несколько усложнить задачу.
1. Если в dbf файле поля идут в другой последовательности чем в таблице получающей данные (получаем данные из полей имена которых соответствуют таковым в принимающей таблице).
2. Если в dbf файле отсутствует одно из полей получающей таблицы (выводим ошибку и импорт отменяем).

Решение сделал путём перебора названий полей запроса во время импорта каждой записи и всё работает, но кажется что можно оптимизировать ведь получая данные в конкретное поле принимающей таблицы знаем имя её поля:
Код: vbnet
1.
rs1(i).Name


Но вот как обратится к такому же полю запроса rs, не могу додуматься. Что-то типа такого но чтобы работало:
Код: vbnet
1.
rs1(i).Value = rs!(rs1(i).Name).Value


А при отсутствии нужного поля обработать сообщение об ошибке с соответствующим сообщением.

Можно ли так реализовать или оставить то что есть? (прилагаю пример)
...
Рейтинг: 0 / 0
Импорт dbf без использования драйвера
    #39473743
guest_rusimport
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
GVOV,
примерно так
Код: vbnet
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.
Public Sub import_DBF(strFile As String, strTable As String)
On Error GoTo 1
DoCmd.SetWarnings False
DoCmd.RunSQL ("DELETE * FROM " & strTable & "")
DoCmd.SetWarnings True

Set rs = ReadDBFtoRS(strFile)
Set db = CurrentDb()
Set rs1 = db.OpenRecordset("" & strTable & "")
If rs Is Nothing Then Exit Sub
 
While Not rs.EOF
   rs1.AddNew
   For i = 0 To rs1.Fields.Count - 1
        rs1(i).Value = rs(rs1(i).Name).Value
   Next i
   rs1.Update
   rs.MoveNext
Wend
rs.Close
rs1.Close

DoCmd.OpenTable (strTable)
Exit Sub
1:
If Err.Number = 3265 Then MsgBox "В таблице " & strFile & " отсутствует поле """ & rs1(i).Name & """"
End Sub
...
Рейтинг: 0 / 0
Импорт dbf без использования драйвера
    #39473771
GVOV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
guest_rusimport,

Действительно работает. Я такое же делал но безуспешно, потому что у меня был лишний восклицательный знак. А теперь всё ОК Спасибо!
...
Рейтинг: 0 / 0
Импорт dbf без использования драйвера
    #39562511
VFP вручную
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.
Возникла необходимость затянуть данные из dbf в MS Access 2016 без установки на ПК (в основном - Win10 x64) каких-либо драйверов доступа к данным. Нашел статью Алексея и код, выполняющий разбор dbf "вручную" (функция ReadDBFtoRS), но она не умеет импортировать dbf FoxPro (в коде даже есть явное сообщение MsgBox "Файлы VFP не читаются.")

Может у кого-то есть ссылки на аналогичный код ручного разбора dbf VFP или мысли, как по быстрому (и можно ли) подогнать код Алексея?
...
Рейтинг: 0 / 0
Импорт dbf без использования драйвера
    #39562565
VFP вручнуюМожет у кого-то есть ссылки на аналогичный код ручного разбора dbf VFP или мысли, как по быстрому (и можно ли) подогнать код Алексея? Вообще-то меня зовут Анатолий. Приятно, что моя статья - "распространённый материал"
Дело в том, что VFP файлы по структуре сильно отличаются от dBase/FoxBase/FoxPro 2.0
Там много полей, хранящих данные в двоичном виде, иначе организован заголовок файла и т.д.
У меня есть примочка, умеющая читать/создавать в т.ч. и VFP файлы, но в вашем случае будет проще использовать VFP провайдер. В статье есть раздел, посвященный этой теме.

Читайте... Пробуйте...
...
Рейтинг: 0 / 0
Импорт dbf без использования драйвера
    #39562596
VFP вручную
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Анатолий, приветствую. Да, ошибся с именем, извините..

В моём случае есть проблема с установкой дополнительного софта на машины пользователей (основная проблема - админские права для установки чего-либо).. к тому же, на сколько я понял, VFP-провайдер есть только 32-битный и в 64-х битных Офисах его использование невозможно (возможности попробовать еще не было, правда).

Но как я понял, альтернатива VFP-провайдеру - это самостоятельно разобраться в формате dbf FoxPro файлов и написать статью (процедуру), аналогичную вашей :) Это явно выходит за скоп задачи и моих интересов)

Спасибо за статью и ответ)
...
Рейтинг: 0 / 0
Импорт dbf без использования драйвера
    #39562636
VFP вручную, в прицепе модуль класса. Импортируйте его в Базу и тренируйтесь.
Вам понадобится метод OpenFile и Import. Метод Import создает таблицу или заполняет существующую. Если вам просто нужен подобие Recordset-а, то в теле этой процедуры есть
цикл по записям файла - изучите в качестве примера.
Удачи!
...
Рейтинг: 0 / 0
Импорт dbf без использования драйвера
    #39562772
Вручную
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Анатолий, всё получилось, спасибо!

Код споткнулся при попытке сохранить в таблицу NULL-значение из пустого MEMO-поля DBFки, пришлось закомментить строку "If fVFP And (DBFFields(i).flags And 2) = 0 Then strSQL = strSQL & " NOT NULL" ", разрешив NULL-значения в созданной таблице. Если в уже подготовленную таблицу импортить, то вообще проблем не было бы.

Спасибо!!

P.S. Не хотите дополнить свою статью? Новые офисы, 32/64 бита, этот классный класс хотя бы "As Is"? Понимаю, что это уже мало кому интересно сейчас, но вдруг кому-то как и мне поможет.. Еще раз спасибо!
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Импорт dbf без использования драйвера
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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