Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.12.12;
Скачать: CL | DM;

Вниз

Создание таблицы DBASE IV. Что посоветуете использовать?   Найти похожие ветки 

 
SergP ©   (2004-11-13 00:56) [0]

Такая проблема:
Пишу некий софт, в котором использую БД Access (из-за удобства доступа через ADO), к тому же там не требуется "серьезных" СУБД.
теперь мне нужно сделать возможность экспорта данных в таблицу dbase 4 (foxpro 2.6)
Таблица должна быть заранее определенной структуры. Программа должна создать ее, поместить туда данные и записать полученный файл на диск (например на дискету). Ввиду того что работа с таблицей идет только на запись, и чтобы уменьшить кол-во проблем, использовать BDE я не буду (это себя не оправдывает).
На данный момент у меня есть только одна мысль: вручную создать файл чтобы он соответствовал таблице dbase 4 нужной структуры.
Но на всякий случай хочу спросить: может кто-нить сталкивался с подобной ситуацией? Что можете посоветовать? Может есть какие-нить не тяжелые библиотеки позволяющие создать нужную таблицу, и записать туда данные? А то не очень хочется искать описание формата dbf файлов и создавать вручную файл по его "образу и подобию".


 
sniknik ©   (2004-11-13 01:19) [1]

> в котором использую БД Access (из-за удобства доступа через ADO)
вот его и используй
попробуй запрос из подключения к аксесу
SELECT * INTO Table1 IN "D:\" "dBase IV;" FROM Table1


 
SergP ©   (2004-11-13 01:26) [2]


>  [1] sniknik ©   (13.11.04 01:19)
> > в котором использую БД Access (из-за удобства доступа
> через ADO)
> вот его и используй
> попробуй запрос из подключения к аксесу
> SELECT * INTO Table1 IN "D:\" "dBase IV;" FROM Table1


Хм... Спасибо...Довольно просто оказывается... Хотя я пока еще не пробовал. А без BDE работать будет? А то где-то вроде бы на форуме читал что если на запись то BDE нужно.


 
sniknik ©   (2004-11-13 01:39) [3]

для парадокса да нужно, для dBase ... ну попробуеш скажеш ;о)), всегда хотел проверить да лень было.

если так логически, писатся должно и без BDE, но какаянибудь хрень (в виде неподдержки индексов например, вылезти может)

на самом деле без BDE оно не обходится, просто jet имеет урезанный встроенный в себя кусок (dll) того же BDE который и использует при отсутствии, а в случае установленности нормального использует его (получается нет глюков от 2х одновременно работающих копий, какие обычно бывают у некоторых любителей кипирования dll ;о))


 
SergP ©   (2004-11-13 01:40) [4]

Попробовал только-что. Работает.
Только вот структуру таблицы как задать? Например у меня в акцессе поле денежное, а в dbase 4 нужно N 20,4, а в результате запроса получается N 20,5, еще некоторые текстовые поля нужно "урезать" по кол-ву символов.
Как это сделать?

также остается вопрос: Нужно ли для этого BDE, или программа будет работать и без него? Сейчас не могу проверить так как у меня нет компа чтобы без установленной BDE был.


 
sniknik ©   (2004-11-13 11:23) [5]

> нужно N 20,4
> еще некоторые текстовые поля нужно "урезать" по кол-ву символов.  
проще будет наверное каким нибудь движком компонентным воспользоваься (Halcyon например), потому как с размерами полей при создании таблиц у джета проблема. (поле decimal(6,2) к примеру им сделать проблемно (если вообще возможно), не знаю как)


 
sniknik ©   (2004-11-13 11:25) [6]

а вот выгрузку в уже готовую таблицу все одно лучше запросом, быстрее. структура при insert-е остается прежней.


 
KSergey ©   (2004-11-14 08:18) [7]

> [3] sniknik ©   (13.11.04 01:39)
> jet имеет урезанный встроенный в себя кусок (dll) того же BDE

не понял??!!


 
Anatoly Podgoretsky ©   (2004-11-14 09:50) [8]

А какая буква непонятна?
Микрософт лицензировал у Борланда мини БДЕ для своего движка JET для доступа к dBase таблицам


 
KSergey ©   (2004-11-14 09:59) [9]

> [8] Anatoly Podgoretsky ©   (14.11.04 09:50)

Понял, отстал
Ну я эта.. не в курсе был. Не пригласили меня :(


 
Anatoly Podgoretsky ©   (2004-11-14 10:09) [10]

Посмотри библиотеки 16ричным редактором и все станет ясно.


 
SergP ©   (2004-11-14 17:23) [11]

Ладно. С этим понятно... Если что, то попробую еще вариант с уже имеющейся готовой таблицей (dbf) с уже нужной структурой. А потом добавить в нее записи запросом... Будет ли при этом нужна BDE?

И еще: в выходной таблице должно быть поле с номером строки. Насчет того зачем оно нужно и нужно ли вообще - не спрашивайте. Просто мне нужно сделать чтобы моя программа формировала dbf файл нужной структуры (а структуру не я придумывал).

Вобщем в FOXPRO можно сделать такой запрос:
select recno() as row,* from table1 into dbf table2

А можно ли сделать что-то подобное юзая JET?


>  [5] sniknik ©   (13.11.04 11:23)
> проще будет наверное каким нибудь движком компонентным воспользоваься
> (Halcyon например), потому как с размерами полей при создании
> таблиц у джета проблема. (поле decimal(6,2) к примеру им
> сделать проблемно (если вообще возможно), не знаю как)


т.е. проблема только с decimal(6,2) или со всеми остальными?
если хоть некоторые типы полей результата в запросе можно задавать, то подскажите как это делать в запросе или приведите примерчик пожалуйста.

А Halcyon юзать - это значительно увеличивать размер программы из-за такой мелочи как мне нужна. Т.е это как стрелять по воробьям из пушки.
Мне уже проще будет "вручную" создавать файл нужной структуры. Пример нужного файла у меня есть. Возьму заголовок и описание полей оттуда, (в заголовке только придется поменять байты, в которых записано кол-во записей.) Потом добавлю данные и запишу результат в файл.


 
sniknik ©   (2004-11-14 17:53) [12]

> т.е. проблема только с decimal(6,2) или со всеми остальными?
со всеми числовыми, точность не задается, по умолчанию или 20,5 или 19,5 получается. но какието вариации срабатывают (12,2 вроде бы получалось), в общем нестабильно, не стоит использовать.


 
SergP ©   (2004-11-14 18:07) [13]


>  [12] sniknik ©   (14.11.04 17:53)
> > т.е. проблема только с decimal(6,2) или со всеми остальными?
> со всеми числовыми, точность не задается, по умолчанию или
> 20,5 или 19,5 получается. но какието вариации срабатывают
> (12,2 вроде бы получалось), в общем нестабильно, не стоит
> использовать.


Плиз, приведи пример использования задания формата поля в самом запросе?


 
sniknik ©   (2004-11-14 20:10) [14]

> Плиз, приведи пример использования задания формата поля в самом запросе?
зачем? все одно не получится.

ну если так хочется, проверь
CREATE TABLE Table1 (ID INT, ID1 decimal(6, 2), ID2 decimal(16, 2), ID2 decimal(12, 2))
при подключении через jet к dBase IV будет весде 20,5.
после замени на numeric, и т.д.


 
SergP ©   (2004-11-14 23:49) [15]


> [3] sniknik ©   (13.11.04 01:39)
> для парадокса да нужно, для dBase ... ну попробуеш скажеш
> ;о)), всегда хотел проверить да лень было.


Попробовал у товарища дома, где BDE нет. Работает. Так что BDE оказівается не нужна.


>  [14] sniknik ©   (14.11.04 20:10)
> > Плиз, приведи пример использования задания формата поля
> в самом запросе?
> зачем? все одно не получится.
>
> ну если так хочется, проверь
> CREATE TABLE Table1 (ID INT, ID1 decimal(6, 2), ID2 decimal(16,
> 2), ID2 decimal(12, 2))
> при подключении через jet к dBase IV будет весде 20,5.
> после замени на numeric, и т.д.


Я имел ввиду запрос не Create , а Select ... into Table IN "..." "dBase IV... Как в таком случае поменять формат поля? Например в базе access одного типа и формата, а в результате чтобы в dbf оно біло уже другого формата ? Или в select такого указывать нельзя?


 
sniknik ©   (2004-11-15 00:54) [16]

> Или в select такого указывать нельзя?
можно но ограничено, и только типа формат ты вряд ли измениш, приведения типа какие позволительны то и возможно, так строку к числу привести пожалуйста а вот точность ему задать... нет. и если вычисления со строками будеш использовать то поле в котором оно используется получит тип char(254), вродебы, и т.д. (сам проверь).

для точной структуры ее нужно иметь, говорил уже.


 
Galim   (2004-11-15 07:07) [17]

А ты пробавал через ADO паковать DBF-файлы.
Может кто-подскажет?


 
Fay ©   (2004-11-15 08:46) [18]

VkDbf


 
SergP ©   (2004-11-15 08:47) [19]


> [16] sniknik ©   (15.11.04 00:54)


Я имел ввиду не операции приведения типов, а возможность непосредственного задания типов полей результирующей таблицы.

Нашел правда почитал сегодня в JETSQL40.CHM:


Инструкция SELECT...INTO
...
При создании таблицы поля в новой таблице наследуют типы данных и размеры базовых полей; никакие другие свойства таблиц и полей не передаются.


и понял что такого нет.

Ну да ладно. буду значит через INSERT делать. А создание пустой таблиці уже сделал тупо на основе создания файла с заранее определекнной последовательностью байт. Т.е. не через SQL


 
Fay ©   (2004-11-15 08:58) [20]

А ваще, если не лениво, можно лепить dbf-файл "руками". Я иногда так и делаю.


 
SergP ©   (2004-11-15 20:59) [21]

Вобщем пробовал делать таким образом:
Создаю dbf файл с нужной структурой, но без записей,
затем запросом
INSERT INTO mytable IN "C:\" "dBase IV;" select .... from ...where...

заполняю его нужными данными. Все работает, но остались две проблемы:

1. В таблице имеется поле Rownum нужно заполнить его номерами полученных записей. Как это сделать?

2. при выполнении запроса в текстовых полях неправильно происходит перекодировка из виндовской кодировки в досовскую 1251->866, т.е. портятся "украинские" буквы. Например вместо "і" получается символ с кодом $3F. Можно ли как-нить от этого избавиться?


 
sniknik ©   (2004-11-15 21:29) [22]

2
попробуй, ключ реестра
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Xbase\DataCodePage
всего да "понимаемых" значения OEM и ANSI, поменяй одно на другое, не поможет значит нельзя.

1
тутже переподключайся к созданной таблице через ODBC Visual FoxPro Driver и делай UPDATE mytable SET Rownum = RecNo(), он понимает номер строк.


 
Slym   (2004-11-16 12:56) [23]

Есть DBF компоненты! Например TDBF (www.tdbf.net или tdbf.sf.net)
Понимают любую кодировку и тип.
1. Создай пустые таблицы, затем их в ресурс. При выгрузке сохраняешь ресурсы куда надо, цепляешся к ним и построчно перегоняешь инфу.
2. Design тайме забей в DBF структуру таблицы и CreateTable.


 
SergP ©   (2004-11-16 22:03) [24]


>
>  [23] Slym   (16.11.04 12:56)
> Есть DBF компоненты! Например TDBF (www.tdbf.net или tdbf.sf.net)
> Понимают любую кодировку и тип.
> 1. Создай пустые таблицы, затем их в ресурс. При выгрузке
> сохраняешь ресурсы куда надо, цепляешся к ним и построчно
> перегоняешь инфу.
> 2. Design тайме забей в DBF структуру таблицы и CreateTable.


Да задолбался возиться с этими мелкими проблемами, уже решил не играться со всем этим а клепать все вручную: Создаю заголовок таблицы, только меняю те четыре байта где кол-во записей указано. А затем добавляю значения всех полей в порядке очередности... Кодировку меняю так же вручную.



Страницы: 1 вся ветка

Текущий архив: 2004.12.12;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.025 c
14-1101106133
Ozone
2004-11-22 09:48
2004.12.12
Простой растровый редактор


1-1101816916
jiran
2004-11-30 15:15
2004.12.12
Есть описание фукции на С++, как правильно описать на Delphi ?


1-1101900521
genies
2004-12-01 14:28
2004.12.12
SOS, Help.


1-1101545019
alo
2004-11-27 11:43
2004.12.12
можно получить элемент set а по строке?


4-1099228196
aha
2004-10-31 16:09
2004.12.12
вопрос по использовагнию компортов -