Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» [Delphi] Работа с DBF (FoxPro)

Автор: Leshgan
Дата сообщения: 31.01.2003 10:52
Использую Delphi7. Имеется база на фоксе. Мне нужно работать с ней из Delphi. Пытаюсь использовать ADO, но не получается открыть некоторые таблицы. Фокс сам их естественно видит. Желательно обойтись без BDE, но если проще использовать BDE, то готов выслушать все предложения.
Что делаю я.
На форме: ADOConnection, ADOQuery.
ConnectionString в ADOConnection имеет вид:
Provider=MSDASQL.1;Persist Security Info=False;Mode=ReadWrite;Extended
Properties="Driver={Microsoft Visual FoxPro Driver};UID=;SourceDB=c:\Data;SourceType=DBF;Exclusive=No;BackgroundFetch=Yes;Collate=Machine;Null=Yes;Deleted=Yes;"
Меня смущает строка "Microsoft Visual FoxPro Driver". Не на всех компах это работает.

И уже в ADOQuery пишу запрос.
Так вот. работает не со всеми таблицами DBF. Было подозрение на LangDriver, но у всех DBF одинаковый формат, я проверил.
И еще вопрос. После выборки в ADOQuery у меня возникла сложность с отображением данных. Использую просто Grid - слишком тормозит. Если использовать DBGrid, то идет привязка к DataSource -> BDE.
Кто что посоветует?
Спасибо.
Автор: belv
Дата сообщения: 31.01.2003 20:18
Проверь драйвер для DBASE4.
Автор: Tabu13
Дата сообщения: 03.02.2003 12:27
А что с русификацией при подключении к DBF табличке через ADO? У меня кракозябры появляются при открытии таблички DBF в 866 кодовой странице (OEM). Где и как LANGDRIVER в ConnectionString надо указывать?
Автор: Preacher
Дата сообщения: 03.02.2003 14:37
Используй Advantage TDataSet.
Автор: Leshgan
Дата сообщения: 04.02.2003 08:05
Preacher
Поподробнее пожалуйста.
Автор: Preacher
Дата сообщения: 06.02.2003 09:45
Advantage Database Engine представляет собой альтернативу BDE.
Поддерживает стандартные Xbase DBF таблицы, совместимые с таблицами CA-Clipper DBF , Microsoft FoxPro DBF, dBASE III+ DBF tables и т.п.
Один из плюсов на мой взгляд - установка на сторонние компьютеры. Весь engine размещается в виде 5 файлов в каталоге где находится exe программы, либо в системынй каталог Windows.
Набор состоит из след.компонент AdsTable, AdsQuery, AdsConnection, AdsStoreProc, AdsSettings, AdsDictionary.
Работа с компонентами ничем координально не отличается от работы со стандартынми Table, Query. Их свойства немного расширены.
В вашем случае к AdsTable цепляете дельфийский DataSource, и соответ. DBGrid. Все работает быстро, сердито и без BDE.

Не знаю те не те подробности указал. Может что и исче вас интересует.
Компоненты можно поискать либо в Варезнике, либо могу выслать на указанный вами адрес. Размер полного дистрибутива 20 mb. Если интересует только сами компоненты то они весят 9 mb.

Добавлено
У меня ADS версии 6.11. поддерживает токо до Delphi 6. Ищите в Варезнике более свежую.
Автор: Leshgan
Дата сообщения: 06.02.2003 11:12
Preacher
Надо попробовать.
Подскажи пожалуйста где искать такое чудо.
Спасибо.
Автор: Preacher
Дата сообщения: 06.02.2003 12:44
Leshgan
Здесь находится официальная информация по ADS на русском
http://office.hotsoft.ru/esi.htm
Там же есть ссылка на Advantage TDataSet Descendant for Delphi/C++Builder v.6.2. Это есть тот набор компонент о котором шла речь. Он бесплатен.
А вот если нужен будет Advantage Database Server то это надо тут спрашивать
http://forum.ru-board.com/topic.cgi?forum=35&topic=10771#1 (хотя из поставленной задачи вижу что он не пригодица)
У меня как уже писал для 7 дельфы версии нет (за ненадобностью работаю на 5-ой Дельфе и счастлив как червяк в яблоке)



Добавлено
здесь указаны ссылки на Advantage database server
http://forum.ru-board.com/topic.cgi?forum=35&topic=0927#1
Автор: Mamay
Дата сообщения: 07.02.2003 11:22
Leshgan

Цитата:
Если использовать DBGrid, то идет привязка к DataSource -> BDE.


DataSource никакого отношение к BDE неимеет !!!
Автор: Leshgan
Дата сообщения: 08.02.2003 13:17
Preacher
Подскажи пожалуйста какие именно 5 файлов нужны.
Я написал простенькую программку пока (вывод DBF), использую AdsConnection, AdsQuery, DataSource. В принципе на другом компе работает при наличии только двух файлов: ace32.dll и adsloc32.dll Какие еще нужны и в каких случаях?
Спасибо!

Mamay
Согласен! Спасибо.
Автор: Preacher
Дата сообщения: 10.02.2003 08:25
Leshgan

Приложение работает при наличии двух файлов ace32.dll и adsloc32.dll, хотя я забрасываю исче ADSLOCAL.CFG, EXTEND.CHR, ANSI.CHR (так чтобы було).

Все дистрибутивные библиотеки ADS лежат в директории ...\ADS\Redistribute, в том случае если при инсталяции была выставлена галка напротив Copy Files To The Redistribute Directory. Если данная директория отсутствует след поискать в системной директории Windows

Список этих файлов след.

ACE32.DLL Advantage Client Engine DLL.
AXCWS32.DLL Библиотека удаленного доступа к данным при использовании
Advantage Database Server или Advantage Internet Server.
Файл не требуется если используется только Advantage Local Server.
ADSLOC32.DLL Библиотека удаленного доступа к данным при использовании
Advantage Local Server.
Файл не требуется если используется только Advantage Database
Server или Advantage Internet Server.
ADSLOCAL.CFG Файл конфигурации для Advantage Local Server file. Необходим при
использовании настроек отличных от установленных по умолчанию.
Должен находится там же где и ADSLOC32.DLL.
EXTEND.CHR Таблица поддержки OEM для Advantage Local Server. Необходим если
используется таблица non-USA OEM. Должен находится там же где и
ADSLOC32.DLL.
ANSI.CHR Поддержка ANSI для Advantage Local Server.
Автор: Leshgan
Дата сообщения: 11.02.2003 07:44
Preacher
Спасибо большое. Классная штука этот ADS.
Раз уж мы о ней, может подскажешь еще пару вещей?
Меня интересует как можно из него получить копию таблицы DBF? А именно: сделал я выборку из одной таблицы DBF, вывел ее в Grid, ну сделал там с ней операции (отфильтровал и т. п. ) и полученную таблицу нужно сохранить в дргом месте под другим названием. Как это сделать? А точнее как ему сказать в какой кодовой странице сохранять?
Я делаю так:

AdsQuery1.AdsCopyTable('c:\temp\table.dbf');

Всё работает, только table.dbf не имеет кодовой старницы.
Автор: Preacher
Дата сообщения: 11.02.2003 11:55
Leshgan
Если я правильно разобрался ADS игнорирует информацию о кодовой странице.
Могу токо развести руками и посоветовать прочитать след. статью
http://www.delphikingdom.com/helloworld/dbheader.htm

Всевозможные решения по ADS http://solutions.advantagedatabase.com/

Автор: Leshgan
Дата сообщения: 11.02.2003 12:53
Preacher
Спасибо
В принципе кодовую страницу можно прописать самому.
Я это и знал. Хотел по умному
Автор: Nafiganado
Дата сообщения: 08.10.2004 17:42
Возникла проблема при использовании ADO + dbf-файлов!

..................
CommandStr := 'SELECT * FROM Model ORDER BY NAME';
DModule.ADOQuery.Active := false;
DModule.ADOQuery.Close;
DModule.ADOQuery.SQL.Clear;
DModule.ADOQuery.SQL.Add(CommandStr);
try
DModule.ADOQuery.Active := true;
DModule.ADOQuery.Open;
except
..................

На тех компах, где стоит Delphi - все ок.
А где - нет, везде свои проблемы!
На одном при попытке обратиться к ADOQuery (т.е. начиная с попытки установить Active) появляется ошибка "cannot perform this operation on a closed dataset".

На другом - проскакивает этот этап - в таблице отображается результат SELECT-a, но зато потом, при попытке выбрать запись - ошибка.

Может, это звенья одной цепи?

Нет смысла, думаю, приводить дальнейший код - разобраться бы пока с этим...

P.S. Структура каталогов:

<DBF> (внутри - .dbf)
main.exe

строка соединения в ADOConnection:

'Provider=MSDASQL.1;Persist Security Info=False;Data Source=dBASE Files;Initial Catalog=DBF'
Автор: Nafiganado
Дата сообщения: 27.10.2004 13:34
После долгих мучений со всякими сторонними компонентами использовал Firebird-сервер (embed) - одна dll-ка. Базу сконвертил соовтетственно в interbase-формат. Все работает автономно
Автор: olek68
Дата сообщения: 25.07.2010 18:36
А если открыть подбросить несколько dll в каталог с программкой для открытия dbf то устанавливать BDE не будет необходимости...
В чём преимущество ADS?

Добавлено:
dll с С:\Program Files\Common Files\Borland Shared\BDE
Автор: abalex
Дата сообщения: 28.07.2010 18:40
olek68

Цитата:
В чём преимущество ADS?

В том что он до сих пор поддерживается - вон уже 10-я версия вышла недавно и все навороты VFP поддерживает. Да и ADS Аrchitector для чтения DBF файлов у них класс!
BDE умер лет 10 назад если мне память не изменяет!
Пользуюсь ADS для доступа к DBF еще с версии 3.14 и я плевал на эту BDE, даже когда она еще жива была, хотя и была она тогда шустрее надо признать, спецом тесты сравнения скорости доступа гонял (лет 10 назад) на больших базах для BDE, ADS и Halcyon:
1) BDE
2) ADS
3) Halcyon
Но если базы маленькие то удобство Halcyon в том что не нужно никаких внешних dll, но минус в том что в нем не стандартный синтаксис и разработка умерла года три назад.
Автор: Vital283
Дата сообщения: 01.11.2010 16:37
А клиент ADS бесплатный что-ли?
Я правильно понял?
Автор: serg3001
Дата сообщения: 20.11.2010 18:18
Уважаемые программисты, прошу оказать помощь в решении следующей задачи, очень нужна помощь.

Есть три DBF файла:

accounts.dbf
rectranc.dbf
rectranh.dbf

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

Приведу подробный пример с описанием задачи:

из файла accounts.dbf извлекаются следующие данные:

TNUM   INOUT        ENDSUM
Б00043        АВБ         1000.000
Б00313        АВВ         1000.000
Б00354        Б2         3335.220


из файла rectranc.dbf:

CODE        TNUM        NAME             NFACC
127        Б00043        Иванов Иван Иванович     42307810312487525410
046        Б00313        Петров Петр Петрович     42358796510477456321
111        Б00354        Сидоров Сидор Сидорович   42325895448752223655


из файла rectranh.dbf:

CODE     HEAD2
127        0163
046        0105
111        0049


нужно связать данные из этих файлов и составить три txt файла с именами АВБ, АВВ и Б2 соответственно, в виде:
АВБ.txt
0163:42307810312487525410:1000.00:Иванов:Иван:Иванович:

АВВ.txt
0105:42358796510477456321:1000.00:Петров:Петр:Петрович:

Б2.txt
0049:42325895448752223655:3335.22:Сидоров:Сидор:Сидорович:

P.S.В этой теме мне помогли решить данную задачу при помощи BAT, но данных очень много в файле, возникают тормоза при обработке.Посоветовали напрямую работать с dbf файлами через реляционные операции SQL, но я в программировании не силён.
Автор: mcdie
Дата сообщения: 23.11.2010 17:27
serg3001
Чтото типо такого:
[more]


Код:
procedure TForm1.Button1Click(Sender: TObject);
var
f : Textfile;
aFileName:String;
aWriteText:String;
begin
ADOConnection1.Close;
ADOConnection1.LoginPrompt:=false;
ADOConnection1.ConnectionString:='Provider=VFPOLEDB.1;Data Source='+ ExtractFileDir(Application.ExeName)
+';Mode=Share Deny None;Extended Properties="";User ID="";Password="";Mask Password=False;Cache Authentication=False;Encrypt Password=False;Collating Sequence=RUSSIAN;DSN=""';
ADOConnection1.Open;
with ADOQuery1 do
begin
Close;
Connection:=ADOConnection1;
SQL.Clear;
SQL.Add('SELECT rectranh.HEAD2,');
SQL.Add('rectranc.NFACC,');
SQL.Add('accounts.ENDSUM,');
SQL.Add('rectranc.NAME,');
SQL.Add('accounts.INOUT');
SQL.Add('FROM ("rectranc.DBF" rectranc');
SQL.Add('LEFT JOIN "rectranh.DBF" rectranh ON rectranc.CODE = rectranh.CODE)');
SQL.Add('LEFT JOIN "accounts.DBF" accounts ON rectranc.TNUM = accounts.TNUM;');
Open;
while not Eof do
begin
aFileName:= ExtractFileDir(Application.ExeName)+'\'+Trim(FieldByName('INOUT').AsString)+'.txt';
AssignFile(f, aFileName);
try
RecreateFile(f,aFileName);
aWriteText:= Trim(FieldByName('HEAD2').AsString) + ':'
+ Trim(FieldByName('NFACC').AsString) + ':'
+ Trim(FieldByName('ENDSUM').AsString) + ':'
+ Trim(FieldByName('NAME').AsString) + ':';
Writeln(f, aWriteText);
finally
CloseFile(f);
end;
Next;
end;
end;
end;

procedure TForm1.RecreateFile(var F: TextFile;aFileName:string);
begin
if FileExists(aFileName) = False then
Rewrite(f)
else
Append(f);
end;
Автор: serg3001
Дата сообщения: 23.11.2010 18:37
mcdie
спасибо большое, но вот только обнаружил, что в DBF файлах DOS кодировка, видимо ничего не получится с ними провернуть, надо либо конвертить в 1251, либо использовать txt файлы, скорее всего буду работать с txt, подскажите, пожалуйста, что надо будет изменить в коде, если работать с txt форматом?
Автор: mcdie
Дата сообщения: 24.11.2010 08:38
serg3001
Почему не получится, всё получится. Сама вид кодировки (DOS или 1251 или другая) хранится в заголовке DBF файла и если компонент который ты используешь в Delphi или соответствующий драйвер её поддерживает, то никаких проблем тут нет.
В моём примере я использую
Microsoft OLE DB Provider for Visual FoxPro, который в стандартный комплект виндовс не входит и устанавливается отдельно. Однако даёт возможность при установке работать с DBF файлами (c дос кодировкой) через стандатные компоненты Delphi. Есть другие варианты - допустим установка сторонних компонент, кому как проще, но я использовал этот вариант.
Ссылка на Microsoft OLE DB Provider for Visual FoxPro:
http://www.microsoft.com/downloads/en/details.aspx?FamilyId=E1A87D8F-2D58-491F-A0FA-95A3289C5FD4&displaylang=en
Автор: VedunO
Дата сообщения: 24.11.2010 20:11
а меня при работе с DBF спасал такой код:


Код: procedure control29byte;
var
f:file;
buf:byte;
begin
AssignFile(f,ExtractFilePath(ParamStr(0))+'rcukru.dbf');
Reset(f,1);
Seek(f,29);
BlockRead(f,buf,1);
if buf=0 then begin
buf:=101;
Seek(f,29);
BlockWrite(f,buf,1);
CloseFile(f);
end
else CloseFile(f);
end;
Автор: abalex
Дата сообщения: 09.02.2011 11:44
Vital283

Цитата:
А клиент ADS бесплатный что-ли?
Я правильно понял?

Да.

Автор: GeXamin
Дата сообщения: 29.06.2011 10:36

Цитата:
а меня при работе с DBF спасал такой код


За код спасибо - спас..
Автор: YuriyRR
Дата сообщения: 30.06.2011 01:47
Я использую библиотеку Topaz - самая быстрая из опробованных. строит индексы по сложным выражениям содержащим функции. Присутствует приличная библиотека функций.
Автор: GeXamin
Дата сообщения: 04.07.2011 16:44
Ребята, может не туда - направте или подскажите:
На форме лежит Table1:TTable

создаю программно файл:

Код:
Table1.TableType := ttFoxPro;
Table1.TableName := Edit1.Text;//

with Table1.FieldDefs do begin
Clear;
Add('PAN', ftString, 16);
Add('INN', ftString, 10);
Add('AMOUNT', ftFloat);
Add('TARGET', ftString, 62);
end;

Table1.CreateTable;
Автор: leoadm
Дата сообщения: 26.07.2011 23:17
YuriyRR
Согласен. Уже много лет пользуюсь либами от топаза - никаких проблем все шустро и без глюков. Проблем небыло никогда.
Автор: PrWork1
Дата сообщения: 29.07.2011 22:18
leoadm
Также хорошо работает и OLE DB Provider for Visual FoxPro, особых проблем нет.

Страницы: 12

Предыдущая тема: Java2 vs .Net


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.