Неправильное сохранение числа в DBF

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Неправильное сохранение числа в DBF

Сообщение VVitafresh » 07.03.2006 (Вт) 16:26

У меня рекордсет сохраняется в dbf с заранее известной структурой, который извлекается из ресурсов. Проблема возникает при сохранении числа с десятичной точкой. Если число больше 1, сохраняет все правильно, но если целая часть меньше 1, то вместо 0.11 сохраняет 0.10, вместо 0.01 -> 1.00. Причем у меня на компьютере всегда сохраняется правильно, на двух других -- нет. Даже не знаю в чем может быть причина.

Код: Выделить всё
Public Function FromRsToUniDbf(r As ADODB.Recordset, DbfFolder As String, ByVal DbfName As String) As Integer
    Dim cn As New ADODB.Connection, rr As New ADODB.Recordset
    Dim i As Integer, ii As Integer, iRes As Long, sDbfFile As String
   
    On Error GoTo ErrorHandler
    sDbfFile = DbfFolder & DbfName & ".dbf"
    iRes = CreateEtalonDbf(sDbfFile)    'Извлечение эталонной *.dbf из ресурсов
   
    cn.Open "Driver={Microsoft dBASE Driver (*.dbf)};DriverID=277;Dbq=" & DbfFolder & ";"
    rr.Open "SELECT J_CS, J_CR, J_S, J_N, J_SNAME, J_RNAME1, J_WHATF1, J_WHATF2, J_WHATF3, J_SIM, J_TYPE, J_VAL FROM " & _
        DbfName, cn, adOpenStatic, adLockOptimistic
   
    ii = r.Fields.Count - 1
    r.MoveFirst
    Do Until r.EOF
        rr.AddNew
        For i = 0 To ii
            rr(i) = r(i)
        Next i
        rr.Update
        r.MoveNext
    Loop
    cn.Close
    Set cn = Nothing
    FromRsToUniDbf = 0
Exit Function
ErrorHandler:
    FromRsToUniDbf = Err.Number
End Function
Никакую проблему невозможно решить на том же уровне, на каком она возникла. Нужно стать выше этой проблемы, поднявшись на следующий уровень.

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Сообщение VVitafresh » 09.03.2006 (Чт) 12:10

Ув. гуру, нужна Ваша помощь! Не могу сам ничего понять :oops:
Во вложении даю свой проект (постарался удалить по возможности все лишнее, не относящееся к вопросу).
При нажатии "Сохр. в DBF" происходит экспорт записей из рекордсета (выборка из таблицы Access) в файл prov.dbf в подкаталоге \DBF\.
В этом же каталоге два файла good.dbf -- так сохраняет у меня и bad.dbf -- так сохраняет на рабочем компе операциониста (обратите внимания на числа < 1.00).
А как сохраняет у Вас?
У вас нет доступа для просмотра вложений в этом сообщении.
Никакую проблему невозможно решить на том же уровне, на каком она возникла. Нужно стать выше этой проблемы, поднявшись на следующий уровень.

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 09.03.2006 (Чт) 12:41

[Microsoft][ODBC dBase Driver] Unexpected error from external database driver (8458).

вот на эту строчку из функции FromRsToUniDbf:

Код: Выделить всё
    rr.Open "SELECT J_CS, J_CR, J_S, J_N, J_SNAME, J_RNAME1, J_WHATF1, J_WHATF2, J_WHATF3, J_SIM, J_TYPE, J_VAL FROM " & _
        DbfName, cn, adOpenStatic, adLockOptimistic
[/b]

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 09.03.2006 (Чт) 12:43

кстати, а чем отличаются у тебя good от bad? у меня они одинаковые!

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Сообщение VVitafresh » 09.03.2006 (Чт) 13:25

Konst_One писал(а):[Microsoft][ODBC dBase Driver] Unexpected error from external database driver (8458).
вот на эту строчку из функции FromRsToUniDbf:
Код: Выделить всё
    rr.Open "SELECT J_CS, J_CR, J_S, J_N, J_SNAME, J_RNAME1, J_WHATF1, J_WHATF2, J_WHATF3, J_SIM, J_TYPE, J_VAL FROM " & _
        DbfName, cn, adOpenStatic, adLockOptimistic

А, sorry, adOpenKeyset там должно быть. Хотя под XP + SP1 работает и adOpenStatic (сам не знаю почему.)
кстати, а чем отличаются у тебя good от bad? у меня они одинаковые!

Да как же одинаковые, некоторые числа отличаются (а не должны). См. аттач.
У вас нет доступа для просмотра вложений в этом сообщении.
Никакую проблему невозможно решить на том же уровне, на каком она возникла. Нужно стать выше этой проблемы, поднявшись на следующий уровень.

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 09.03.2006 (Чт) 13:30

так я и спрашиваю, какие конкретно цифры у тебя отличаются. Потому что у меня они все одинаковые.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 09.03.2006 (Чт) 13:36

А в исходном Recordset-е числа случаем не в строковых полях хранятся?
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Сообщение VVitafresh » 09.03.2006 (Чт) 13:44

Konst_One писал(а):так я и спрашиваю, какие конкретно цифры у тебя отличаются. Потому что у меня они все одинаковые.
:shock: Неужели полностью одинаковые? Не может быть! Глянь еще раз на суммы, выделенные во вложении.

Andrey Fedorov писал(а):А в исходном Recordset-е числа случаем не в строковых полях хранятся?
Рекордсет создается обычным селектом из таблицы Access, поле сумма там "Одинарное с плавающей точкой, число десятичных знаков - 2"
Никакую проблему невозможно решить на том же уровне, на каком она возникла. Нужно стать выше этой проблемы, поднявшись на следующий уровень.

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 09.03.2006 (Чт) 14:25

Глянь еще раз на суммы, выделенные во вложении.


У меня ничего не выделено :!: Скажи конкретные строчки, которые у тебя отличаются.

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Сообщение VVitafresh » 09.03.2006 (Чт) 15:12

Я имел в виду выделенно в этом вложении (смотрю с помощью bdbf.exe): http://bbs.vbstreets.ru/download.php?id=3898.
А конкретно поле J_S отличается так:
Код: Выделить всё
stoka |good  | bad
9     | 0.06 | 0.05
23    | 0.11 | 0.10
24    | 0.12 | 0.11
25    | 0.03 | 0.02

Исходная таблица vpl, из которой формируется рекордсет (база Access prov.mdb), находится в первом вложении -- testdbf.zip.
Никакую проблему невозможно решить на том же уровне, на каком она возникла. Нужно стать выше этой проблемы, поднявшись на следующий уровень.

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 09.03.2006 (Чт) 15:49

действительно отличаются, но у меня все равно таже ошибка , что я писал ранее (adOpenKeyset не помог).

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 09.03.2006 (Чт) 15:56

Мне вот это дело в твоей строке подключения не нравится: DriverID=277

Попробуй примерно так:

Код: Выделить всё
    Const sDbfCn = "Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=dBASE IV;Data Source=""|"""

    Set cn = New ADODB.Connection
    cn.CursorLocation = adUseClient
    cn.Open Replace(sDbfCn, "|", m_sDbfFolder)
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Сообщение VVitafresh » 09.03.2006 (Чт) 16:50

Andrey Fedorov писал(а):Мне вот это дело в твоей строке подключения не нравится: DriverID=277
Попробуй примерно так:
Код: Выделить всё
    Const sDbfCn = "Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=dBASE IV;Data Source=""|"""
    Set cn = New ADODB.Connection
    cn.CursorLocation = adUseClient
    cn.Open Replace(sDbfCn, "|", m_sDbfFolder)

Строку подключения взял с http://www.connectionstrings.com. Ошибку [Microsoft][ODBC dBase Driver] у меня выбивало на Win98, фиксится установкой jet40sp8_9xnt.exe.
Через "Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=dBASE IV;Data Source=""|""" тоже попробовал. Сохраряет нормально (правда раз в 5 медленнее), но проблема с числами остается та же.
Никакую проблему невозможно решить на том же уровне, на каком она возникла. Нужно стать выше этой проблемы, поднявшись на следующий уровень.

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Сообщение VVitafresh » 09.03.2006 (Чт) 17:34

Все! Похоже, нашел причину :idea:
Кому интересно, поменяйте в таблице vpl тип поля J_S на "Двойное с плавающей точкой, число десятичных знаков -- Авто" и все поймете.

P.S. Хотя странно все это :roll:
P.P.S. Konst_One, Andrey Fedorov спасибо за помощь в решении проблемы.
Никакую проблему невозможно решить на том же уровне, на каком она возникла. Нужно стать выше этой проблемы, поднявшись на следующий уровень.


Вернуться в Базы данных

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

    TopList