|
|
|
dBase IV или III
|
|||
|---|---|---|---|
|
#18+
В приложении 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. Значение ключа (если это важно): HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Xbase\DataCodePage=OEM ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.05.2005, 14:22:14 |
|
||
|
dBase IV или III
|
|||
|---|---|---|---|
|
#18+
А ты попробуй сохрани что-нибудь из 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.05.2005, 15:38:19 |
|
||
|
dBase IV или III
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.05.2005, 17:22:54 |
|
||
|
dBase IV или III
|
|||
|---|---|---|---|
|
#18+
Оба вопроса, заданных в начале, может быть, и можно решить, посмотрев сперва, ЧЕМУ равен первый байт у получающегося файла DBF? (из-за чего он и не признается программой как DBIV) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2005, 10:03:23 |
|
||
|
dBase IV или III
|
|||
|---|---|---|---|
|
#18+
В dBase IV не было полей типов LONG, SHORT, TEXT(n) - эти типы появились позднее уже в VFP, зато были NUMERIC(n,m) и CHARACTER (n). Может из-за этого тип (см. 1-ый байт DBFки по F3 в FAR, например) формируется не правильно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2005, 10:21:36 |
|
||
|
dBase IV или III
|
|||
|---|---|---|---|
|
#18+
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"): ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2005, 11:37:52 |
|
||
|
dBase IV или III
|
|||
|---|---|---|---|
|
#18+
А вот тот же файл после экспорта через VFP (этот файл уже распознается программой) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2005, 11:44:25 |
|
||
|
dBase IV или III
|
|||
|---|---|---|---|
|
#18+
Еще может быть дело в кодовой странице. Попробуй программой CPZERO установить кодовую страницу 866 (для DBIV). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2005, 11:56:15 |
|
||
|
dBase IV или III
|
|||
|---|---|---|---|
|
#18+
И, кстати, размер файла после VFP - на 2 байта становится больше! Может - еще и "хвоста" не хватает для полного счастья? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2005, 12:00:12 |
|
||
|
dBase IV или III
|
|||
|---|---|---|---|
|
#18+
Извиняюсь, конечно же "кило" :)) - число записей, наверно, другое... :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2005, 12:02:50 |
|
||
|
dBase IV или III
|
|||
|---|---|---|---|
|
#18+
Кодовая страница, мне кажется, не при чем: эта гадина (исходников этой заразы у меня нет - а лезть туда моими шаловливыми рученками - себе дороже) может открывать DBF только после того, как я пользуюсь экспортом через VFP: Код: plaintext Ладно, думаю, я - не хочешь СОЗДАВАТЬ нормальные dbf-файлы, так хоть ЗАПОЛНЯЙ их нормально... Создаю шаблоны dbf-файлов и пытаюсь их заполнять. После отработки приведенного кода (за вычетом места, где файл удаляется и создается заново) программа снова перестает распознавать формат dbf. Так что, боюсь, вопрос теперь стоит по-другому: как из кода моего приложение на VBA открыть dbf с помощью VFP (или какой-нибудь утилитки) и выполнить строку "COPY TO"? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2005, 12:22:28 |
|
||
|
dBase IV или III
|
|||
|---|---|---|---|
|
#18+
Так Foxplus, вроде как - все равно ж только 866...?... А открыть как - сделай exe-шник из проги, вписав туда: use my_dbf copy to... quit в каталог к нему положи все, что надо :) - в смысле нужные библиотеки. И пускай его там себе на выполнение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2005, 12:37:33 |
|
||
|
dBase IV или III
|
|||
|---|---|---|---|
|
#18+
По приведенным фрагментам видно, что не формируется относительное положение поля внутри записи - эта величина излишняя (вычисляется через длины полей) - но для формата dBaseIV необходимая. Напиши небольшую программку для repair заголовка. Еще сильно подозрительно увеличение длины на 2К - скорее всего недописывается хвост DBF. Посмотри по данным в конце файла темже 16-чным вьюером. Наверно последние записи 16-ричными нулями забиты. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2005, 13:55:18 |
|
||
|
dBase IV или III
|
|||
|---|---|---|---|
|
#18+
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 заголовка я писать не буду - зело хлопотно. :)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2005, 14:07:48 |
|
||
|
dBase IV или III
|
|||
|---|---|---|---|
|
#18+
Дак на самом верху указываешь все через SET-ы: SET SAFETY OFF SET TALK OFF && ну последний - это так - в общем случае пишут, чтоб сообщения о ходе процесса не выводились, здесь в принципе почти и не важно как бы, но не помешает :). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2005, 14:17:34 |
|
||
|
dBase IV или III
|
|||
|---|---|---|---|
|
#18+
Если у тебя окно 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 - только оба файла обязательно - с расширениями. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2005, 14:43:39 |
|
||
|
dBase IV или III
|
|||
|---|---|---|---|
|
#18+
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 - только оба файла обязательно - с расширениями. Исчерпывающе. Спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2005, 17:06:59 |
|
||
|
dBase IV или III
|
|||
|---|---|---|---|
|
#18+
Hi golsa! Кстати говоря, отсутствие этого самого field offset в dbf-ках созданных Clipper (он зануляет эти байты) и старой НЕдоброй утилиткой dbu (эта зараза туда вообще мусор заносит!!!) вызвало давеча проблему с RTFreport-ером он либо "мучительно" показывал всегда только первое поле, либо падал по нарушению защиты памяти (что логично - попробуй сместиться на 0x9876 от начала записи длинной всего 0x0030 байт :) ) В общем вывод один - старьё - в утиль :) Posted via ActualForum NNTP Server 1.2 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2005, 23:33:35 |
|
||
|
|

start [/forum/topic.php?fid=41&msg=33090699&tid=1594140]: |
0ms |
get settings: |
10ms |
get forum list: |
21ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
217ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
73ms |
get tp. blocked users: |
1ms |
| others: | 242ms |
| total: | 586ms |

| 0 / 0 |
