Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / dBase IV или III / 18 сообщений из 18, страница 1 из 1
27.05.2005, 14:22:14
    #33087608
nibbles
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dBase IV или III
В приложении 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
27.05.2005, 15:38:19
    #33087855
Crispy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dBase IV или III
А ты попробуй сохрани что-нибудь из 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
27.05.2005, 17:22:54
    #33088206
nibbles
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dBase IV или III
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
30.05.2005, 10:03:23
    #33089986
Crispy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dBase IV или III
Оба вопроса, заданных в начале, может быть, и можно решить, посмотрев сперва, ЧЕМУ равен первый байт у получающегося файла DBF? (из-за чего он и не признается программой как DBIV)
...
Рейтинг: 0 / 0
30.05.2005, 10:21:36
    #33090024
golsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dBase IV или III
В dBase IV не было полей типов LONG, SHORT, TEXT(n) - эти типы появились позднее уже в VFP, зато были NUMERIC(n,m) и CHARACTER (n). Может из-за этого тип (см. 1-ый байт DBFки по F3 в FAR, например) формируется не правильно.
...
Рейтинг: 0 / 0
30.05.2005, 11:37:52
    #33090258
nibbles
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dBase IV или III
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
30.05.2005, 11:44:25
    #33090280
nibbles
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dBase IV или III
А вот тот же файл после экспорта через VFP (этот файл уже распознается программой)
...
Рейтинг: 0 / 0
30.05.2005, 11:56:15
    #33090314
Crispy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dBase IV или III
Еще может быть дело в кодовой странице. Попробуй программой CPZERO установить кодовую страницу 866 (для DBIV).
...
Рейтинг: 0 / 0
30.05.2005, 12:00:12
    #33090331
Crispy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dBase IV или III
И, кстати, размер файла после VFP - на 2 байта становится больше! Может - еще и "хвоста" не хватает для полного счастья?
...
Рейтинг: 0 / 0
30.05.2005, 12:02:50
    #33090338
Crispy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dBase IV или III
Извиняюсь, конечно же "кило" :)) - число записей, наверно, другое... :)
...
Рейтинг: 0 / 0
30.05.2005, 12:22:28
    #33090407
nibbles
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dBase IV или III
Кодовая страница, мне кажется, не при чем: эта гадина (исходников этой заразы у меня нет - а лезть туда моими шаловливыми рученками - себе дороже) может открывать 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
30.05.2005, 12:37:33
    #33090451
Crispy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dBase IV или III
Так Foxplus, вроде как - все равно ж только 866...?...
А открыть как - сделай exe-шник из проги, вписав туда:
use my_dbf
copy to...
quit
в каталог к нему положи все, что надо :) - в смысле нужные библиотеки. И пускай его там себе на выполнение.
...
Рейтинг: 0 / 0
30.05.2005, 13:55:18
    #33090656
golsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dBase IV или III
По приведенным фрагментам видно, что не формируется относительное положение поля внутри записи - эта величина излишняя (вычисляется через длины полей) - но для формата dBaseIV необходимая. Напиши небольшую программку для repair заголовка. Еще сильно подозрительно увеличение длины на 2К - скорее всего недописывается хвост DBF. Посмотри по данным в конце файла темже 16-чным вьюером. Наверно последние записи 16-ричными нулями забиты.
...
Рейтинг: 0 / 0
30.05.2005, 14:07:48
    #33090699
nibbles
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dBase IV или III
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
30.05.2005, 14:17:34
    #33090725
Crispy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dBase IV или III
Дак на самом верху указываешь все через SET-ы:
SET SAFETY OFF
SET TALK OFF && ну последний - это так - в общем случае пишут, чтоб сообщения о ходе процесса не выводились, здесь в принципе почти и не важно как бы, но не помешает :).
...
Рейтинг: 0 / 0
30.05.2005, 14:43:39
    #33090785
Crispy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dBase IV или III
Если у тебя окно 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
30.05.2005, 17:06:59
    #33091215
nibbles
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dBase IV или III
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
30.05.2005, 23:33:35
    #33091563
Igor Korolyov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dBase IV или III
Hi golsa!

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

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


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