Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Загрузка данных из Visual FoxPro DBF в Excel 2010 через VBA / 6 сообщений из 6, страница 1 из 1
08.12.2013, 09:27
    #38493130
Serg Kutuzov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загрузка данных из Visual FoxPro DBF в Excel 2010 через VBA
Надо загрузить таблицу DBF в формате Visual FoxPro (первый байт DBF 0x30) в Excel 2010. Использую провайдер VFPOLEDB. Всё читается замечательно, кроме того, что поля, имеющие значение Null, возвращаются как 0, в случае с Numeric, строка пробелов в случае Character или "00.01.1900 0:00:00' в случае Date. Т.е. не возвращается значение Null. Перепробовал кучу других провайдеров, всё тоже самое. Вот код загрузки данных:

Код: 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.
28.
29.
30.
31.
Public Sub LoadDBFToListObject(path As String)
    Dim newSheet As Worksheet
    Set newSheet = ThisWorkBook.WorkSheets.AddSheet
    
    Dim dbConn As ADODB.Connection
    Set Conn = CreateObject("ADODB.Connection")
    'Conn.ConnectionString = "DRIVER=Microsoft FoxPro VFP Driver (*.dbf);SourceDB=" & path & ";SourceType=DBF;NULL=YES;DELETED=YES;BACKGROUNDFETCH=YES;EXCLUSIVE=YES"
    Conn.ConnectionString = "Provider=vfpoledb.1;Data Source=" & path & ";Collating Sequence=machine;"
    Conn.CursorLocation = adUseClient
    Conn.Mode = adModeRead
    Conn.Open
    
    Dim i As Long
    Dim j As Long

    Dim rs As ADODB.Recordset
    Set rs = dbConn.Execute("select * from most")
                
    Dim fld As ADODB.Field
    i = 2
    Do While Not rs.EOF
        j = 1
        For Each fld In rs.Fields
            newSheet.Cells(i, j).value = fld.value
            j = j + 1
        Next fld
        i = i + 1
        rs.MoveNext
    Loop
    dbConn.Close    
End Sub



Сторонние программы, различные DBF-просмотрщики, показывают NULL значения нормально. Ка быть? Чем можно прочитать данные из DBF с поддержкой Null значений?
...
Рейтинг: 0 / 0
08.12.2013, 12:58
    #38493206
The_Prist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загрузка данных из Visual FoxPro DBF в Excel 2010 через VBA
А не поможет просто проверку воткнуть?
Код: vbnet
1.
2.
3.
4.
5.
If IsNull(fld.value) then 'или If len(trim(fld.value)) = 0 then
newSheet.Cells(i, j).value = NULL 'Или Empty, тогда ячейка будет пустой
Else
newSheet.Cells(i, j).value = fld.value
End if


Сам не проверял.
Вы в пошаговом режиме не смотрели - это именно fld хранит уже не NULL?
...
Рейтинг: 0 / 0
09.12.2013, 20:26
    #38494622
Игорь Горбонос
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загрузка данных из Visual FoxPro DBF в Excel 2010 через VBA
Serg Kutuzov,

Вообще в этом dbf структура такова, что в её полях не разрешены значения NULL
Поэтому они заполнены какими то значениями.
...
Рейтинг: 0 / 0
10.12.2013, 02:24
    #38494855
Serg Kutuzov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загрузка данных из Visual FoxPro DBF в Excel 2010 через VBA
The_PristА не поможет просто проверку воткнуть?
Код: vbnet
1.
2.
3.
4.
5.
If IsNull(fld.value) then 'или If len(trim(fld.value)) = 0 then
newSheet.Cells(i, j).value = NULL 'Или Empty, тогда ячейка будет пустой
Else
newSheet.Cells(i, j).value = fld.value
End if


Сам не проверял.
Вы в пошаговом режиме не смотрели - это именно fld хранит уже не NULL?

Да, уже хранит не NULL :(
...
Рейтинг: 0 / 0
10.12.2013, 02:38
    #38494860
Serg Kutuzov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загрузка данных из Visual FoxPro DBF в Excel 2010 через VBA
Игорь ГорбоносSerg Kutuzov,

Вообще в этом dbf структура такова, что в её полях не разрешены значения NULL
Поэтому они заполнены какими то значениями.

Ну вообще-то да, нашёл какой то просмотрщик, который показывает флаг NULL для полей файлов DBF. Они там не разрешены. Но программа АБДД "Дорога" РосдорНИИ (это один из файлов её базы данных) показывает эти поля именно как NULL, причём написана сама вроде как на Visual FoxPro. И куча других просмотрщиков показывает их как NULL.

Вообщем сделал сейчас вот такой костыль, читаю через строку подключения:
Код: vbnet
1.
2.
3.
Dim Conn As ADODB.Connection
Set Conn = CreateObject("ADODB.Connection")
Conn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & path & ";Extended Properties=dBase 5.0;" 


Правда работает только если установлен BDE :) .
Поля с пустыми значениями возвращает как Null, заполненные возвращает как есть. Но не корректно выдирает схему через метод:
Код: vbnet
1.
2.
Dim ColumnsSchema As ADODB.Recordset
Set ColumnsSchema = "Conn.OpenSchema(adSchemaColumns, Array(Empty, Empty, tableName, Empty))" . 


Поэтому шапку заполняю используя строку подключения:
Код: vbnet
1.
2.
3.
Dim Conn As ADODB.Connection
Set Conn = CreateObject("ADODB.Connection")
Conn.ConnectionString = "Provider=vfpoledb.1;Data Source=" & path & ";Collating Sequence=machine;"



Вообщем дурдом какой-то, хоть свой парсер VPF DBF пиши - времени только нет как обычно. :(
...
Рейтинг: 0 / 0
10.12.2013, 07:32
    #38494912
Serg Kutuzov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загрузка данных из Visual FoxPro DBF в Excel 2010 через VBA
Всё разобрался, затупил конкретно. Программа отрабатывает логику таким образом - в базе лежит 0, " ", 0.00, или CDate(0) - значит поле пустое. Тему можно закрывать.
...
Рейтинг: 0 / 0
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Загрузка данных из Visual FoxPro DBF в Excel 2010 через VBA / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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