Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2003.08.28;
Скачать: [xml.tar.bz2];

Вниз

конвертация баз FoxPro в dBASE IV   Найти похожие ветки 

 
SCORPION ZP   (2003-07-30 19:20) [0]

Кто нибудь подскажет есть ли способ переконвертировать базы
FoxPro в dBASE(включая memo-и индексные-файлы)? Баз несколько тыс., поэтому способ импорта в Excel, а затем сохранить как
dBASE, не подходит. Желательно чтобы это могло работать в цикле.


 
Anatoly Podgoretsky   (2003-07-30 21:25) [1]

А сколько в каждой базе таблиц?
Могут возникнуть проблемы если кодировка 1251 (dBase) не поддерживает, кроме того индексы могут не позволить преобразование.


 
SCORPION ZP   (2003-07-31 09:53) [2]

Anatoly Podgoretsky
1.Одна.Скажем так по 3000 dbf,cdx и fpt. FoxPro под DOS(866).
Но кодировка пока на втором плане - главное перевести на dBASE, Delphi нет полной поддержки фокса.
2.
> Могут возникнуть проблемы...


> ...могут не позволить преобразование...

Как это сделать или с пом. чего? А я проверю "могут" или нет.


 
SCORPION ZP   (2003-07-31 20:20) [3]

Ребятя очень нужно! Кому не лень дать хоть ссылку по сабжу!


 
Dred2k   (2003-07-31 21:44) [4]

Ну что ж, задача у тебя довольно сложная.
Могу посоветовать динамическое создание таблиц.

1. Для каждой исходной таблицы всех твоиз баз (в цикле):
1-1. Создаешь экземпляр TTable (TableType := ttDBase).
1-2. Открываешь исходную, делаешь ей FieldDefs.Update, IndexDefs.Update.
1-3. Для созданного экземпляра делаешь FieldDefs.Assign(исходная.FieldDefs), IndexDefs.Assign(исходная.IndexDefs).
1-4. Для экземляра выставляешь полный путь (DatabaseName), TableName (имя файла, расширение не нужно, можно присвоить от исходной, если все обрабатываемые файлы, читай - таблицы, имеют разные имена или каталоги) и TableLevel (0 - берется из настроек BDE для DBase, для DBaseIV не знаю, т.к. юзаю Paradox).
1-5. Создаешь экземпляр как физ. таблицу по CreateTable.
1-6. Заливаешь данные из исходной в экземпляр любым способом (на уровне TTable, о файле не заботься - он на месте).
1-7. Если есть еще исходные, возврат на 1-1.
2. Проверяешь органолептическими средствами все таблицы всех экземпряров (должны совпасть с исходными). ;))

При всем при этом могут возникнуть многие проблемы, как то: кодировки ( > Anatoly Podgoretsky © (30.07.03 21:25)
тебя об этом уже предупреждал, битые исходные таблицы, и т.д. и т.п. - особенности движка DBase-Foxpro в BDE мне не ведомы, почему - сказал выше ;) )

Делай все аккуратно и не скупись на тесты. Больше тестов - ближе победа! Успехов.


 
SCORPION ZP   (2003-08-01 09:53) [5]

Dred2k
Спасибо за советы. Буду ломать эту проблему и если ничего не
выйдет или что будет не так обращусь к вам за помощью.


 
KSergey   (2003-08-01 10:19) [6]

А могет взять сторонний компонент для доступа к DBF будет проще?
Например, Halcyon работают с фоксовскими индексами и мемо-полями вполне успешно...
Тем более, что есть подозрение, что и с поддержкой DBase-файлов со стороны BDE (о нем речь?) могут возникнуть трудности...


 
Anatoly Podgoretsky   (2003-08-01 15:51) [7]

Dred2k © (31.07.03 21:44)
Проблемы с кодировкой не будет, он все таки указал, надеюсь, что он это указал про Table Language, а не про конкретные буковки в табличках. Индексы особая вещь, тут можно получить по самые помидоры. Но с другой стороны в новых таблицах не обязательно точно такие же индексы, а отключить индексы от исходной таблицы не проблема.
Но то решение, о котором ты говоришь, это копирование данных, до нехого каждый пацак догадается. А вот конвертация средствами БДЕ это проблематично, средствами FoxPro в одном направлении, просто от отключает индексы и мемо поля и создает их копию и им не к чему было делать это в пользу конкурентов (в тот момент dBase IV они и так отставали).

KSergey © (01.08.03 10:19)
с поддержкой DBase-файлов со стороны BDE просто нет проблем, он заточен, а вот поддержкой FoxPro одназно есть.


 
SCORPION ZP   (2003-08-01 16:37) [8]

Поэтому и стремлюсь к dBASE(из-за его полной поддержки в Delphi)
Думаю, что проблема рештся через Microsoft.Jet.OLEDB.4.0,ADOConnection и ADOCommand.


 
Dred2k   (2003-08-01 16:57) [9]

> Anatoly Podgoretsky © (01.08.03 15:51)

Чем, на твой взгляд, отличается конвертация от копирования?
Использованием dbiDoRestructure и манипуляциями с TblDesc, IdxDesc и т.п. вместо TTable? Происходить при этом будет фактически то же самое, только через более низкий уровень вызовов. То, что это решение будет принципиально лучше - сомневаюсь. На уровне TTable обеспечена достаточная поддержка всех необходимых фич, опять же средствами BDE. Да и потом - чем проще, тем надежнее (критерии простоты, конечно, разные бывают).
Вот насчет сохранения индексов (заметь - в вопросе он об этом говорит), типов данных - проблемы, наверное, могут быть. Во всем копаться надо и проверять, по-любому.


 
Anatoly Podgoretsky   (2003-08-01 17:05) [10]

В первом случае копия не создается, а преобразовывается структура, если необходимо.
Во втором создается просто другая таблица должного формата и данные пересылаются в нее. Это работает даже для абсолютно разных форматах (в рамках совместимости типов,а не только в таких родственных).
Второй вариант дает более лучшие результаты, также возможно и автоматическое преобразования данных, достаточно написать один раз программу преобразования, но иногда надо ручками затачивать.


 
Dred2k   (2003-08-01 17:06) [11]

> SCORPION ZP © (01.08.03 16:37)

Ну, коли так, то почему не парадокс? Он в BDE тоже хорошо поддержан, кроме того, есть положительные различия с dbaseIV...


 
Dred2k   (2003-08-01 17:13) [12]

> Anatoly Podgoretsky © (01.08.03 17:05)

> В первом случае копия не создается, а преобразовывается
> структура, если необходимо.

Если первый случай подразумевает dbiDoRestructure, то манипуляции производятся через временную таблицу (по дефорту - resttemp.*). Возможно, есть ситуации, когда никакой перекачки не происходит. Но при изменении драйвера этого избежать просто невозможно.

> но иногда надо ручками затачивать

Абсолютно согласен. Но по существу вопроса предлагаю для начала проверить - требуется такая заточка или можно обойтись без нее.


 
Anatoly Podgoretsky   (2003-08-02 12:24) [13]

Dred2k © (01.08.03 17:13)
Нет использование временных, файлов, переменных и прочего это совсем другое, это дело конкретной программы, но в случае конвертирования например в FoxPro таблицы просто происходит создания новых индексных и мемо файлов, сама таблица даже не затрагивается. Копирование таблиц в моем толковании, это когда я сам создам новую таблицу, перекопирую в нее данные и построю индексы, это путь самый гибкий, хоть и более сложный. Процесс можно автоиматизировать, что бы его можно было выполнять на неизвестных заранее таблицах, вплоть до воссоздания структуры баз, если они посторены в иерархию.

А что можно сказать насчет потребуется заточка или нет, если автор предпочитает играть в молчанку, не выдавая никакой конкретной информации, да просто он и ответов конкретных не получит, только точно также вокруг и около, ну это его проблемы, видимо оно ему нужно :-)

Dred2k © (01.08.03 17:06)
Положительных отличий чрезвычайно мало, отричательных гораздо больше, но правда почему бы и нет, хотя полная конвертация почти невозможно, например из за отсутствия подлинных BCD полей, индексов по выражению и много другого. Я даже не смогу с первого раза сказать, чем таким особым он отличается от dBase, естественно последних версий.


 
SCORPION ZP   (2003-08-02 15:10) [14]

ADOConnection1.Connected=False
ADOConnection1.ConnectionStrng="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\_TEST\;Extended Properties=dBase IV;Persist Security Info=False"
ADOConnection1.LoginPrompt=False
ADOConnection1.Provider="Microsoft.Jet.OLEDB.4.0"

ADOCommand1.CommandText="SELECT * INTO Test FROM 31842468"
ADOCommand1.Connection=ADOConnection1
ADOCommand1.ConnectionStrng=
ADOCommand1.Parameters= по Default

TForm1.Button1Click= ADOCommand1.Execute;

И база Foxa превращается в dBASE


 
sniknik   (2003-08-02 15:35) [15]

SCORPION ZP © (02.08.03 15:10)
ну не всегда. нет универсальных решений. (уже говорил)

здесь срабатывает только потому что первые версии Jet-а поддерживали, а значит и продолжают (обратная совместимость), foxpro до 3.0. а что будет если встретится более старшая версия? или с расширенным мемо? (у фокса в мемо всегда было больше возможностей) сможет перевести в ограниченный формат мемо dBase? и т.д.
думаю ответы очевидны.


 
SCORPION ZP   (2003-08-02 17:31) [16]

sniknik
Согласен, что с FPT могут быть проблемы...
Проверю все базы на предмет перевода в dBase и лично тебе напишу
все ли перешли или нет. Сейчас аврал на работе и пока я занят.
Кстати, а как программно изменить размер поля в уже существующей таблице dBASE III?
гончий отзовись! Как там "DbChk" это сделать??????


 
Dred2k   (2003-08-03 18:34) [17]

> Anatoly Podgoretsky © (02.08.03 12:24)

> Нет использование временных, файлов, переменных и прочего это совсем другое, это дело конкретной программы

Использование временных файлов осуществляет самое нативное средство конвертации в BDE - dbiDoRestructure.

> но в случае конвертирования например в FoxPro таблицы просто происходит создания новых индексных и мемо файлов, сама таблица даже не затрагивается

Вполне возможно. Я с ними не работал, особенностей не знаю. В условиях BDE предположу, что схема будет одинаковой для всех драйверов.

> Копирование таблиц в моем толковании, это когда я сам создам новую таблицу, перекопирую в нее данные и построю индексы, это путь самый гибкий, хоть и более сложный.

Логично. При подобных задачах это самый прозрачный и довольно надежный способ для любых исходных и конечных платформ, т.к. на каждом этапе можно ручками заточить (как ты уже и упоминал) любую особенность. Путь этот самый простой и очевидный. Я это и предлагал ;)

> если они посторены в иерархию

Все как всегда зависит от скрупулезности реализации и тестирования. Перед импортом таблиц сложной схемы связей ничто не мешает ее (схему) проанализировать любыми средствами и построить алгоритм преобразования соответственно.

> видимо оно ему нужно :-)

Он сказал, что сильно занят ( > SCORPION ZP © (02.08.03 17:31)). Решение, судя по всему, уже выбрал. ;)

> Положительных отличий чрезвычайно мало, отричательных гораздо больше

Ну, я бы так не сказал. Из всех отрицательных отличий мне видится только проблема с поддержкой, выраженная в падении индексов и т.п. Но это решается на этапе реализации, простыми и довольно тривиальными способами. Разумеется, это не снимает ответственности с разработчиков движка... ;)

По-моему, автор вопроса ищет дешивизны реализации. Что, собственно, в определенной степени не плохо.
Вот расскажет ли он о своем решении? Это еще вопрос... ;)


 
Anatoly Podgoretsky   (2003-08-03 19:26) [18]

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


 
Dred2k   (2003-08-03 19:55) [19]

> Anatoly Podgoretsky © (03.08.03 19:26)

Если у Fox-Dbase такие проблемы при преобразовании, тогда я "ой". Но сомневаюсь, что в BDE это многозначность. Допускаю, что ты имеешь в виду и сторонние методы.

Но я говорю именно про BDE, которая имеет совершенно конкретный взгляд на все особенности. Нужно лишь поробовать и это выяснить. Вот будет ли это делать автор? Он на ADO давно смотрит (может, и с самого начала - жаль, что на форуме все воросы зачастую не блещут исчерпывающей конкретностью)...
;)


 
Dred2k   (2003-08-03 19:57) [20]

> Anatoly Podgoretsky © (03.08.03 19:26)

Возможно, при ответе я не совсем четко понял тему твоего поста.
;)
Ты про Paradox?


 
Anatoly Podgoretsky   (2003-08-03 20:47) [21]

Да про него, про его достоинства, в смысле типов


 
Dred2k   (2003-08-03 21:16) [22]

Тогда в чем конкретно ты видишь его (парадокса) недостатки?
Дело в том, что судить о деталях dBase платформы мне сложно без предварительного изучения. Когда я говорил о плюсах парадокса, имел в виду достаточно завершенный набор типов и опять же вполне достаточную концепцию ключей и индексов.


 
Anatoly Podgoretsky   (2003-08-03 21:51) [23]

Набор типов близок, но не в пользу Парадокс, отсутствуют подлинные BCD типы


 
Dred2k   (2003-08-03 22:01) [24]

> Anatoly Podgoretsky © (03.08.03 21:51)

Снова вынужден сказать "BCD не юзал".
Разумеется, на этом аргументированый спор в соответствующем направлении завершается. ;)
Мне вполне хватает Number, хотя
Note: Although BCD fields can handle larger numbers, you can only enter a number with 15 significant digits or less into a BCD field.
вводит некоторые недвусмысленные ограничения. В Dbase (...) этого нет?


 
sniknik   (2003-08-04 01:16) [25]

> Снова вынужден сказать "BCD не юзал".
> Разумеется, на этом аргументированый спор в соответствующем направлении завершается. ;)
нехватает аргументов сходи на сайт к Anatoly Podgoretsky там инфы море по этому вопросу.

> ...15 significant digits or less into a BCD field.
> вводит некоторые недвусмысленные ограничения. В Dbase (...) этого нет?
у dBase есть BCD поля (чего еще?), не путай формат/базу с представлением/реализацией в дельфях (тем более их может быть не одно).
и дочитывай хелп до конца раз уж начал.
The IDE uses two different field types for representing BCD fields: TBCDField and TFMTBCDField. TBCDField uses the Currency (Delphi) or System::Currency (C++) type to manipulate BCD values. This is faster than storing and manipulating the value using a true BCD type, but limits the precision of the BCD values it can support to 4 decimal places and 20 significant digits. (20 знаков - 4 после точки - 1 сама точка, вот твои 15)

TBCDField converts the data from a BCD value to a Currency value when it fetches the data from the database table, and converts it from a Currency value to a binary-coded decimal value when it posts the data. If the underlying database table contains a value that requires greater precision, TBCDField raises an exception. If your application requires BCD values with more than 4 decimal places or 20 significant digits, you should use TFMTBCDField instead. TFMTBCDField is a true BCD, with the precision of the binary-coded decimal type (TBCD) but with somewhat slower performance. (а вот тебе истинное, хотя и более медленное, используй, не хочу)


 
Dred2k   (2003-08-04 10:06) [26]

> sniknik © (04.08.03 01:16)

Ты аккуратен и старателен.
Большое спасибо за науку и цитаты.
Только вот ни аргументы, ни инфа по BCD мне не нужна. Я сразу об этом сказал. А принципом хелп-на-хелп балуюсь редко. Вот сейчас - нет, к примеру.
;)


 
Anatoly Podgoretsky   (2003-08-04 13:41) [27]

Dred2k © (03.08.03 22:01)
Это не страшно, мало кто работал с двумя форматами и тем более разбирался, как оно устроено.
В любом случае у нас огорчение, хоть в dBase и есть подлинные BCD поля, но зато в самой Дельфи отсутствует их нормальнаял поддержеа, насколько TFMTBCDField is a true BCD, это соответсвует истине сказать трудно, поскольку это начинается с Д6, в Д5 нет, но смущает следующее TBCDField converts the data from a BCD value to a Currency value, этим как бы сразу накладывается ограничение 20.4
Но мы рассматривали не реализацию в Дельфи, а поля в базе, вот Парадокс за исключением Currency/BCD ни чего другого не имеет, что очень огорчительно. dBase же наряду с остальными типами Парадокса изначально поддерживает и true BCD, например можно указать тип поля N10.7, а не N10 в Парадоксе и оно будет храниться в таблице именно как 10.7.
Вообще с true BCD полный бардак, реально они были полностью реализованы только в dBase IV, а после передода его на BDE это было потеряно, их стали просто эмулировать на основе других типов, тоже касается и FoxPro в них никогда не было полной поддержки.


 
Dred2k   (2003-08-05 09:59) [28]

> Anatoly Podgoretsky © (04.08.03 13:41)

Да уж, с BCD ситуация нехорошая получается. До сих пор обхожусь number-ом. Кроме того, в парадокс7 есть целочисленный 32-битный тип, который очень полезен для суррогатных ключей и вообще хранения целых (есть еще short). Вот то, что _специализированных_ целых нет в dBaseIV - это минус, на мой взгляд. Т.к. предполагаю, что любые операции со специализированном типом быстрее, чем с универсальным, определяющимся параметрами. Ну, еще не хватает Time (хотя можно хранить и в number, но менее удобно). Про autoincrement в данном контексте говорить не буду - вещь может и неплохая, но реализована в BDE кривовато, я этот тип не использую.


 
Anatoly Podgoretsky   (2003-08-05 10:22) [29]

Ну ты посмотри Парадокс версии 3, или уж тогда смотри dBase версии не ниже 7. Там есть то что ты хочешь, то есть тип LONG, Integer и другие, включая autoincrement и несколько типов индесксов, простые, уникальные, сжатые, по выражениям.
Тип Time всегда можно хранить в timestamp или character 8.


 
Dred2k   (2003-08-05 11:33) [30]

Смотрел с помощью DBD все предлагаемые версии, long-а не увидел. Хотя в хелпе о нем для dbase говорится (трансляция логических типов для разных дров). Microsoft dBase driver поразил богатством odbc-шных типов ;)



 
Anatoly Podgoretsky   (2003-08-05 12:57) [31]

Dred2k © (05.08.03 11:33)
DBD не пригоден, поскольку последняя его версия 1997 года, тогда dBase VII не было. Они поставили на DBD крест, что бы не создавать конкуренции для Парадокс. А потом и Парадокс продали и после и dBase, хотели и Интербейс прикрыть.



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

Форум: "Базы";
Текущий архив: 2003.08.28;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.55 MB
Время: 0.008 c
6-92145
ЮРИЙ_К
2003-06-20 11:55
2003.08.28
Пример чата без серверной части на MailSlot


3-92000
Юстос
2003-08-06 05:02
2003.08.28
Как подключить базу данных Ms Access


6-92139
Димыч
2003-06-19 22:12
2003.08.28
Сетевые пакеты


4-92310
Fel
2003-06-20 18:43
2003.08.28
Сообщения


3-92047
nokk9
2003-08-03 14:58
2003.08.28
суммы в DBGrid





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский