![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Создание таблицы DBASE IV. Что посоветуете использовать? [D6]
SergP © (2004-11-13 00:56:00)Такая проблема:
Пишу некий софт, в котором использую БД Access (из-за удобства доступа через ADO), к тому же там не требуется "серьезных" СУБД.
теперь мне нужно сделать возможность экспорта данных в таблицу dbase 4 (foxpro 2.6)
Таблица должна быть заранее определенной структуры. Программа должна создать ее, поместить туда данные и записать полученный файл на диск (например на дискету). Ввиду того что работа с таблицей идет только на запись, и чтобы уменьшить кол-во проблем, использовать BDE я не буду (это себя не оправдывает).
На данный момент у меня есть только одна мысль: вручную создать файл чтобы он соответствовал таблице dbase 4 нужной структуры.
Но на всякий случай хочу спросить: может кто-нить сталкивался с подобной ситуацией? Что можете посоветовать? Может есть какие-нить не тяжелые библиотеки позволяющие создать нужную таблицу, и записать туда данные? А то не очень хочется искать описание формата dbf файлов и создавать вручную файл по его "образу и подобию".
SergP (2004-11-16 22:03:00) [1]
>
> [23] Slym (16.11.04 12:56)
> Есть DBF компоненты! Например TDBF (www.tdbf.net или tdbf.sf.net)
> Понимают любую кодировку и тип.
> 1. Создай пустые таблицы, затем их в ресурс. При выгрузке
> сохраняешь ресурсы куда надо, цепляешся к ним и построчно
> перегоняешь инфу.
> 2. Design тайме забей в DBF структуру таблицы и CreateTable.
Да задолбался возиться с этими мелкими проблемами, уже решил не играться со всем этим а клепать все вручную: Создаю заголовок таблицы, только меняю те четыре байта где кол-во записей указано. А затем добавляю значения всех полей в порядке очередности... Кодировку меняю так же вручную.
Slym (2004-11-16 12:56:00) [2]Есть DBF компоненты! Например TDBF (www.tdbf.net или tdbf.sf.net)
Понимают любую кодировку и тип.
1. Создай пустые таблицы, затем их в ресурс. При выгрузке сохраняешь ресурсы куда надо, цепляешся к ним и построчно перегоняешь инфу.
2. Design тайме забей в DBF структуру таблицы и CreateTable.
sniknik (2004-11-15 21:29:00) [3]2
попробуй, ключ реестра
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Xbase\DataCodePage
всего да "понимаемых" значения OEM и ANSI, поменяй одно на другое, не поможет значит нельзя.
1
тутже переподключайся к созданной таблице через ODBC Visual FoxPro Driver и делай UPDATE mytable SET Rownum = RecNo(), он понимает номер строк.
SergP (2004-11-15 20:59:00) [4]Вобщем пробовал делать таким образом:
Создаю dbf файл с нужной структурой, но без записей,
затем запросом
INSERT INTO mytable IN "C:\" "dBase IV;" select .... from ...where...
заполняю его нужными данными. Все работает, но остались две проблемы:
1. В таблице имеется поле Rownum нужно заполнить его номерами полученных записей. Как это сделать?
2. при выполнении запроса в текстовых полях неправильно происходит перекодировка из виндовской кодировки в досовскую 1251->866, т.е. портятся "украинские" буквы. Например вместо 'і' получается символ с кодом $3F. Можно ли как-нить от этого избавиться?
Fay (2004-11-15 08:58:00) [5]А ваще, если не лениво, можно лепить dbf-файл "руками". Я иногда так и делаю.
SergP (2004-11-15 08:47:00) [6]
> [16] sniknik © (15.11.04 00:54)
Я имел ввиду не операции приведения типов, а возможность непосредственного задания типов полей результирующей таблицы.
Нашел правда почитал сегодня в JETSQL40.CHM:
Инструкция SELECT...INTO
...
При создании таблицы поля в новой таблице наследуют типы данных и размеры базовых полей; никакие другие свойства таблиц и полей не передаются.
и понял что такого нет.
Ну да ладно. буду значит через INSERT делать. А создание пустой таблиці уже сделал тупо на основе создания файла с заранее определекнной последовательностью байт. Т.е. не через SQL
Fay (2004-11-15 08:46:00) [7]VkDbf
Galim (2004-11-15 07:07:00) [8]А ты пробавал через ADO паковать DBF-файлы.
Может кто-подскажет?
sniknik (2004-11-15 00:54:00) [9]> Или в select такого указывать нельзя?
можно но ограничено, и только типа формат ты вряд ли измениш, приведения типа какие позволительны то и возможно, так строку к числу привести пожалуйста а вот точность ему задать... нет. и если вычисления со строками будеш использовать то поле в котором оно используется получит тип char(254), вродебы, и т.д. (сам проверь).
для точной структуры ее нужно иметь, говорил уже.
SergP (2004-11-14 23:49:00) [10]
> [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-14 20:10:00) [11]> Плиз, приведи пример использования задания формата поля в самом запросе?
зачем? все одно не получится.
ну если так хочется, проверь
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 18:07:00) [12]
> [12] sniknik © (14.11.04 17:53)
> > т.е. проблема только с decimal(6,2) или со всеми остальными?
> со всеми числовыми, точность не задается, по умолчанию или
> 20,5 или 19,5 получается. но какието вариации срабатывают
> (12,2 вроде бы получалось), в общем нестабильно, не стоит
> использовать.
Плиз, приведи пример использования задания формата поля в самом запросе?
sniknik (2004-11-14 17:53:00) [13]> т.е. проблема только с decimal(6,2) или со всеми остальными?
со всеми числовыми, точность не задается, по умолчанию или 20,5 или 19,5 получается. но какието вариации срабатывают (12,2 вроде бы получалось), в общем нестабильно, не стоит использовать.
SergP (2004-11-14 17:23:00) [14]Ладно. С этим понятно... Если что, то попробую еще вариант с уже имеющейся готовой таблицей (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 юзать - это значительно увеличивать размер программы из-за такой мелочи как мне нужна. Т.е это как стрелять по воробьям из пушки.
Мне уже проще будет "вручную" создавать файл нужной структуры. Пример нужного файла у меня есть. Возьму заголовок и описание полей оттуда, (в заголовке только придется поменять байты, в которых записано кол-во записей.) Потом добавлю данные и запишу результат в файл.
Anatoly Podgoretsky (2004-11-14 10:09:00) [15]Посмотри библиотеки 16ричным редактором и все станет ясно.
KSergey (2004-11-14 09:59:00) [16]> [8] Anatoly Podgoretsky © (14.11.04 09:50)
Понял, отстал
Ну я эта.. не в курсе был. Не пригласили меня :(
Anatoly Podgoretsky (2004-11-14 09:50:00) [17]А какая буква непонятна?
Микрософт лицензировал у Борланда мини БДЕ для своего движка JET для доступа к dBase таблицам
KSergey (2004-11-14 08:18:00) [18]> [3] sniknik © (13.11.04 01:39)
> jet имеет урезанный встроенный в себя кусок (dll) того же BDE
не понял??!!
sniknik (2004-11-13 11:25:00) [19]а вот выгрузку в уже готовую таблицу все одно лучше запросом, быстрее. структура при insert-е остается прежней.
sniknik (2004-11-13 11:23:00) [20]> нужно N 20,4
> еще некоторые текстовые поля нужно "урезать" по кол-ву символов.
проще будет наверное каким нибудь движком компонентным воспользоваься (Halcyon например), потому как с размерами полей при создании таблиц у джета проблема. (поле decimal(6,2) к примеру им сделать проблемно (если вообще возможно), не знаю как)