powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / dBase IV или III
18 сообщений из 18, страница 1 из 1
dBase IV или III
    #33087608
Фотография nibbles
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В приложении Microsoft Access ADP готовится на основании ХП файл DBF, после чего запускается программа, которая этот файл использует. Файл создается, но запускаемое приложение утверждает, что его формат не dBase IV. Сам файл отлично смотрится с помощью VFP6.0.

Вопросов два:
1. Как определить тип dBase с помощью VFP?
2. Как изменить (и возможно ли) тип dBase без использования VFP?

Вот код создания dbf на VBA, используется ADO 2.5.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
    ' Открыть соединение с указанным каталогом
    With cnnDBF
        .Provider = "Microsoft.Jet.OLEDB.4.0"
        .Properties("Extended Properties") = "dBase IV"
        .Properties("Data Source") = "C:\tempdir\"
        .Open
    End With
    ' ============= Список изделий =============
    ' Создать файл базы данных DBF
    strFile = "ProdM"
    If FSys.FileExists(strDir & strFile & ".dbf") Then FSys.DeleteFile strDir & strFile & ".dbf"
    strSQL = "CREATE TABLE " & strFile & " (PrId LONG, PrName TEXT(50), Article TEXT(50), " _
                                & " ShelfCnt SHORT, DepthR SHORT, DepthL SHORT, " _
                                & " WidthB SHORT, WidthF SHORT, Height SHORT, " _
                                & " Radius SHORT, PrFoots SHORT)"
    ' Открыть таблицу DBF
    cnnDBF.Execute strSQL
    ... Дальше идет заполнение таблицы - думаю, это не важно
    cnnDBF.Close



Значение ключа (если это важно): HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Xbase\DataCodePage=OEM
...
Рейтинг: 0 / 0
dBase IV или III
    #33087855
Crispy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А ты попробуй сохрани что-нибудь из 2-3 строк сначала, как DBFIII, потом как DBFIV, и посмотри в HEX-редакторе (хотя бы нажав F3, потом F4, в том же Far-е).
Скорее всего - не увидишь никакой разницы.
Возможно, сообщение связано с тем, что DBF - содержит memo-поле? Тгда первый байт файла будет не 03, а - другой.
Первые байты у старых dbf-ок такие:
FoxBASE+/dBASE III +, без memo - 03
FoxBASE+/dBASE III +, с memo - 83
FoxPro/dBASE IV, без memo - 03
FoxPro с memo - F5
dBASE IV с memo - 8B
...
Рейтинг: 0 / 0
dBase IV или III
    #33088206
Фотография nibbles
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CrispyА ты попробуй сохрани что-нибудь из 2-3 строк сначала, как DBFIII, потом как DBFIV, и посмотри в HEX-редакторе (хотя бы нажав F3, потом F4, в том же Far-е).
Скорее всего - не увидишь никакой разницы.
Возможно, сообщение связано с тем, что DBF - содержит memo-поле? Тгда первый байт файла будет не 03, а - другой.
Первые байты у старых dbf-ок такие:
FoxBASE+/dBASE III +, без memo - 03
FoxBASE+/dBASE III +, с memo - 83
FoxPro/dBASE IV, без memo - 03
FoxPro с memo - F5
dBASE IV с memo - 8B
Оставил в DBF только одно поле типа LONG, но это не помогло - мое приложение (то, которое запускается после создания dbf и должно читать его) может использовать этот dbf только после того, как я с помощью VFP сделаю экспорт в формат dBase IV.
...
Рейтинг: 0 / 0
dBase IV или III
    #33089986
Crispy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Оба вопроса, заданных в начале, может быть, и можно решить, посмотрев сперва, ЧЕМУ равен первый байт у получающегося файла DBF? (из-за чего он и не признается программой как DBIV)
...
Рейтинг: 0 / 0
dBase IV или III
    #33090024
golsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В dBase IV не было полей типов LONG, SHORT, TEXT(n) - эти типы появились позднее уже в VFP, зато были NUMERIC(n,m) и CHARACTER (n). Может из-за этого тип (см. 1-ый байт DBFки по F3 в FAR, например) формируется не правильно.
...
Рейтинг: 0 / 0
dBase IV или III
    #33090258
Фотография nibbles
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
golsaВ dBase IV не было полей типов LONG, SHORT, TEXT(n) - эти типы появились позднее уже в VFP, зато были NUMERIC(n,m) и CHARACTER (n). Может из-за этого тип (см. 1-ый байт DBFки по F3 в FAR, например) формируется не правильно.

При создании файла dbf использую NUMERIC(7,0) и CHARACTER(30). К сожалению, ошибка не исчезла - приложению по-прежнему не нравится формат dbf-файла. Вот заголовок dbf в HEX-редакторе (как видите - 1-байт равен "03"):
...
Рейтинг: 0 / 0
dBase IV или III
    #33090280
Фотография nibbles
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вот тот же файл после экспорта через VFP (этот файл уже распознается программой)
...
Рейтинг: 0 / 0
dBase IV или III
    #33090314
Crispy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Еще может быть дело в кодовой странице. Попробуй программой CPZERO установить кодовую страницу 866 (для DBIV).
...
Рейтинг: 0 / 0
dBase IV или III
    #33090331
Crispy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И, кстати, размер файла после VFP - на 2 байта становится больше! Может - еще и "хвоста" не хватает для полного счастья?
...
Рейтинг: 0 / 0
dBase IV или III
    #33090338
Crispy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Извиняюсь, конечно же "кило" :)) - число записей, наверно, другое... :)
...
Рейтинг: 0 / 0
dBase IV или III
    #33090407
Фотография nibbles
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кодовая страница, мне кажется, не при чем: эта гадина (исходников этой заразы у меня нет - а лезть туда моими шаловливыми рученками - себе дороже) может открывать DBF только после того, как я пользуюсь экспортом через VFP:
Код: plaintext
COPY TO q:\draw\prod\constinf.dbf TYPE FOXPLUS AS  866 
При этом я могу написать как 866, так и 1251 - программа откроет файлы в любом случае.
Ладно, думаю, я - не хочешь СОЗДАВАТЬ нормальные dbf-файлы, так хоть ЗАПОЛНЯЙ их нормально... Создаю шаблоны dbf-файлов и пытаюсь их заполнять. После отработки приведенного кода (за вычетом места, где файл удаляется и создается заново) программа снова перестает распознавать формат dbf.
Так что, боюсь, вопрос теперь стоит по-другому: как из кода моего приложение на VBA открыть dbf с помощью VFP (или какой-нибудь утилитки) и выполнить строку "COPY TO"?
...
Рейтинг: 0 / 0
dBase IV или III
    #33090451
Crispy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Так Foxplus, вроде как - все равно ж только 866...?...
А открыть как - сделай exe-шник из проги, вписав туда:
use my_dbf
copy to...
quit
в каталог к нему положи все, что надо :) - в смысле нужные библиотеки. И пускай его там себе на выполнение.
...
Рейтинг: 0 / 0
dBase IV или III
    #33090656
golsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По приведенным фрагментам видно, что не формируется относительное положение поля внутри записи - эта величина излишняя (вычисляется через длины полей) - но для формата dBaseIV необходимая. Напиши небольшую программку для repair заголовка. Еще сильно подозрительно увеличение длины на 2К - скорее всего недописывается хвост DBF. Посмотри по данным в конце файла темже 16-чным вьюером. Наверно последние записи 16-ричными нулями забиты.
...
Рейтинг: 0 / 0
dBase IV или III
    #33090699
Фотография nibbles
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CrispyТак Foxplus, вроде как - все равно ж только 866...?...
А открыть как - сделай exe-шник из проги, вписав туда:
use my_dbf
copy to...
quit
в каталог к нему положи все, что надо :) - в смысле нужные библиотеки. И пускай его там себе на выполнение. Тогда до кучи еще пара вопросов (как у человека, программирующего на VFP первый день):
как в команде "copy to..." отключить запрос о перезаписи имеющегося файла?
как убрать окно среды VFP после запуска exe?
как в exe-файл работать со значениями из командной строки (типа функции Command$ в VB)?
golsaПо приведенным фрагментам видно, что не формируется относительное положение поля внутри записи - эта величина излишняя (вычисляется через длины полей) - но для формата dBaseIV необходимая. Напиши небольшую программку для repair заголовка. Еще сильно подозрительно увеличение длины на 2К - скорее всего недописывается хвост DBF. Посмотри по данным в конце файла темже 16-чным вьюером. Наверно последние записи 16-ричными нулями забиты. Спасибо. Точно - добиты нулями. Но repair заголовка я писать не буду - зело хлопотно. :))
...
Рейтинг: 0 / 0
dBase IV или III
    #33090725
Crispy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дак на самом верху указываешь все через SET-ы:
SET SAFETY OFF
SET TALK OFF && ну последний - это так - в общем случае пишут, чтоб сообщения о ходе процесса не выводились, здесь в принципе почти и не важно как бы, но не помешает :).
...
Рейтинг: 0 / 0
dBase IV или III
    #33090785
Crispy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если у тебя окно VFP появляется создаешь текстовый файл CONFIG.FPW, пишешь там:
SCREEN = OFF
TALK = OFF
RESOURCE = OFF
можешь его засунуть в проект для удобства.
После выполнения программы, окно, по идее должно само закрываться.

>как в exe-файл работать со значениями из командной строки (типа функции Command$ в VB)?
В смысле - как передать в EXE свои значения (если я правильно понял)?
Чтобы передавать какие-то параметры в свой главный (main) файл PRG, пишешь в нем перед всеми командами:
LParameters p1,p2,...,pn - где p1,p2... - имена твоих параметров, что ты будешь использовать внутри проги.
Тогда подгрузка с параметрами из командной строки будет: my_prog.exe par1 par2 - значения параметров через пробел. Только сейчас не помню точно - кажется они все попадают внутрь в символьном виде, и числа надо будет преобразовывать функцией VAL(), А если надо, скажем передать имя открываемой dbf-ки, тогда будет так:
LPARAMETERS baza
USE &baza
А загрузка: my_prog.exe my_dbf.
Еще, я так понял тебе нужно будет ее переименовать после преобразования назад?
Тогда после COPY TO... вставляешь:
USE
RENAME new_file TO old_file - только оба файла обязательно - с расширениями.
...
Рейтинг: 0 / 0
dBase IV или III
    #33091215
Фотография nibbles
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CrispyЕсли у тебя окно VFP появляется создаешь текстовый файл CONFIG.FPW, пишешь там:
SCREEN = OFF
TALK = OFF
RESOURCE = OFF
можешь его засунуть в проект для удобства.
После выполнения программы, окно, по идее должно само закрываться.

>как в exe-файл работать со значениями из командной строки (типа функции Command$ в VB)?
В смысле - как передать в EXE свои значения (если я правильно понял)?
Чтобы передавать какие-то параметры в свой главный (main) файл PRG, пишешь в нем перед всеми командами:
LParameters p1,p2,...,pn - где p1,p2... - имена твоих параметров, что ты будешь использовать внутри проги.
Тогда подгрузка с параметрами из командной строки будет: my_prog.exe par1 par2 - значения параметров через пробел. Только сейчас не помню точно - кажется они все попадают внутрь в символьном виде, и числа надо будет преобразовывать функцией VAL(), А если надо, скажем передать имя открываемой dbf-ки, тогда будет так:
LPARAMETERS baza
USE &baza
А загрузка: my_prog.exe my_dbf.
Еще, я так понял тебе нужно будет ее переименовать после преобразования назад?
Тогда после COPY TO... вставляешь:
USE
RENAME new_file TO old_file - только оба файла обязательно - с расширениями.
Исчерпывающе. Спасибо
...
Рейтинг: 0 / 0
dBase IV или III
    #33091563
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi golsa!

Кстати говоря, отсутствие этого самого field offset в dbf-ках созданных Clipper (он зануляет эти байты) и старой НЕдоброй утилиткой dbu (эта зараза туда вообще мусор заносит!!!) вызвало давеча проблему с RTFreport-ером он либо "мучительно" показывал всегда только первое поле, либо падал по нарушению защиты памяти (что логично - попробуй сместиться на 0x9876 от начала записи длинной всего 0x0030 байт :) )
В общем вывод один - старьё - в утиль :)

Posted via ActualForum NNTP Server 1.2
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / dBase IV или III
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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