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

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

Подскажите, знающие, как обойти ошибку.
...
Рейтинг: 0 / 0
16.06.2017, 03:34
    #39472753
guest_rusimport
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Импорт dbf без использования драйвера
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
16.06.2017, 10:40
    #39472931
GVOV
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Импорт dbf без использования драйвера
guest_rusimport,

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

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


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


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

Можно ли так реализовать или оставить то что есть? (прилагаю пример)
...
Рейтинг: 0 / 0
18.06.2017, 09:49
    #39473743
guest_rusimport
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Импорт dbf без использования драйвера
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
18.06.2017, 12:34
    #39473771
GVOV
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Импорт dbf без использования драйвера
guest_rusimport,

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

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

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

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

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

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

Код споткнулся при попытке сохранить в таблицу 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
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Импорт dbf без использования драйвера / 11 сообщений из 11, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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