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

Вниз

считывание данных из таблицы (.dbf)   Найти похожие ветки 

 
Rel_   (2003-06-18 16:39) [0]

Народ, может кто знает, как самым быстрым образом загнать данные из локальной таблицы в массив (допустим массив уже есть и он точно копирует таблицу).

Мне приходится бежать по DataSet (работая через BDE) и считывать каждое поле. Представьте, что полей 100 и записей 1000000 - это реальные значения (не выдумка). Всё энто я заливаю на ORACLE с помощью компонент прямого доступа (заливая предварительно в буфер). Вставка из буфера на ORACLE проходит мгновенно, а заливка в буфер (тот самый массив в памяти) - ну ужасно медленно 3000-4000 зап. в минуту!!!

Отсоветуйте. Может можно анализировать структуру BDF-файла минуя BDE (как текстовик)???


 
SaS13   (2003-06-18 16:52) [1]

Можно использовать альтернативные способы (минуя BDE) связи с DBF-таблами (например Apollo).
Также есть утилиты, сливающие Dbf-ки в текстовый файл.


 
Serginio   (2003-06-18 16:55) [2]

Вот процедурка прохода по всем записям.

procedure PoiskLine(Str,FileName: String;ClientDataSet1:TClientDataSet; Var Data:OleVariant);
Var TovArr: array[0..SizeArray-1] of TTovaryrec;
TovStream:TfileStream;
Count,i:Integer;
RecordCount:Integer;
DbfHead:TDbfHead;
Tik:Cardinal;
PoiskArr:TCharArray;
Code:Integer;
FlFind:Boolean;
RegCena:TRegCeny;
RegOst:TRegOstatki;
IndCeny:TindexCeny;
IndOst:TIndexOstatki;
begin
FlFind:=False;
ClientDataSet1.EmptyDataSet;
If Length(Str)>0 Then
Begin
ClientDataSet1.EmptyDataSet;
TovStream:=TfileStream.Create(FileName,fmOpenRead or fmShareDenyNone);
TovStream.Seek(4,soFromBeginning);
TovStream.ReadBuffer(DbfHead,SizeOf(TDbfHead));
TovStream.Seek(DbfHead.HeaderSize,soFromBeginning);
RecordCount:=DbfHead.NumRecord;

FillArray(PoiskArr,Str);
While RecordCount>0 Do
Begin
If RecordCount<SizeArray Then
Begin
TovStream.ReadBuffer(TovArr,RecordCount*SizeOf(TTovaryrec));
Count:=RecordCount;
End Else
Begin
TovStream.ReadBuffer(TovArr,SizeOf(TovArr));
Count:=SizeArray;
end;
For i:=0 To Count-1 Do
If tovArr[i].IsFolder="2" Then
if BMFinde(str,@tovArr[i].Descr,PoiskArr,Length(str),SizeOf(tovArr[i].Descr))>0 Then
// IF Pos("abro",tovArr[i].Descr)>0 Then
Begin
ClientDataSet1.Insert;
ClientDataSet1.Fields[0].Asstring:=tovArr[i].SpId;
ClientDataSet1.Fields[1].Asstring:=tovArr[i].Artikul;
ClientDataSet1.Fields[2].Asstring:=tovArr[i].Descr;
If Not FlFind Then
Begin
RegCena:=TRegCeny.Create;
RegOst:=TRegOstatki.Create;
IndCeny.Period:=GetPeriodTA;
IndOst.Period:=IndCeny.Period;
indCeny.Izm.Magazin:=MagazinID;
IndOst.Izm.Magazin:=MagazinID;
FlFind:=true;
end;
indCeny.Izm.Tovar:=tovArr[i].SpId;
IndOst.Izm.Tovar:=tovArr[i].SpId;
If RegCena.GetOstatki(IndCeny) Then
ClientDataSet1.Fields[3].AsCurrency:=RegCena.CenaOst
else
ClientDataSet1.Fields[3].AsCurrency:=0;

If RegOst.GetOstatki(IndOst) Then
ClientDataSet1.Fields[4].AsInteger:=RegOst.KolichestvoOst
else
ClientDataSet1.Fields[4].AsInteger:=0;

ClientDataSet1.Post;
end;
dec(RecordCount,SizeArray);
end;
If FlFind Then
Begin
RegOst.Free;
RegCena.Free;
end;
TovStream.Free;

end;
Data:=ClientDataSet1.Data;
ClientDataSet1.EmptyDataSet;
end;

Опредили запись такого типа
SpKontragenty=Class; //Контрагенты
TKontragentyrec=record
deleted:char;
SpId: TIDField;//ID
Parent: TIDField;//PARENTID
Code: array[0..4] of char;//CODE
Descr: array[0..31] of char;//DESCR
IsFolder: char;//ISFOLDER
IsMark: char;//ISMARK
VERSTAMP: array[0..5] of char;
VidKontragenta: TIDField;//SP2884
PolnoeNaimenovanie: array[0..49] of char;//SP48
YUridicheskiyAdres: array[0..84] of char;//SP3145
PochtovyyAdres: array[0..84] of char;//SP50
Telefony: array[0..49] of char;//SP49
INN: array[0..11] of char;//SP56
DokumentSeriya: array[0..13] of char;//SP3146
DokumentNomer: array[0..13] of char;//SP3147
DokumentDataVydachi: TDATE1C;//SP3148
DokumentKemVydan: array[0..59] of char;//SP3149
ValyutaVzaimoraschetov: TIDField;//SP906
ValyutaKredita: TIDField;//SP901
ValyutaKreditaPostavtshika: TIDField;//SP937
IspolzovatKredit: TIDField;//SP4063
end;


 
Serginio   (2003-06-18 16:56) [3]

Да единственно проверяй поле Deleted на " " Значит не удалено.


 
Serginio   (2003-06-18 16:58) [4]

Сыылочки по формату Дбф
http://alyunov.narod.ru/files/dBase.htm
http://www.codenet.ru/progr/formt/intro.php
http://www.e-bachmann.dk/docs/xbase.htm


 
Rel_   (2003-06-18 17:01) [5]

супер - попробую обязательно - СПАСИБО!!!


 
Serginio   (2003-06-18 17:10) [6]

Вот тебе процедурка которая возвращает запись описания полей
Procedure GetRecord(StrList:TStrings; recordName,TableName:String);
var pFlds,tmp:PFLDDesc;
arFLDDesc: array of FLDDesc;
i,j:Integer;
CursorProps:CURProps;
hCur:hDBICUR;
begin

check(DbiOpenTable(hdb,Pchar(TableName+".dbf"),Pchar(szFoxPro),nil,nil,0,dbiREADONLY,DBIOPENSHARED,xltNONE,True,nil,hCur));
//check(DbiOpenTable(hdb,Pchar("1sConst.dbf"),Pchar(szFoxPro),nil,nil,0,dbiREADONLY,DBIOPENSHARED,xltNONE,True,nil,hCur));
Check(dbiGetCursorProps(hCur,CursorProps));
setlength(arFLDDesc,CursorProps.iFields);
Check(DbiGetFieldDescs(hCur, @arFLDDesc[0]));
StrList.add(RecordName+"=record");
StrList.add("deleted:char;");
for i:=0 to CursorProps.iFields-1 do
begin
tmp:=Pointer(Cardinal(pFlds)+i*sizeof(FLDDesc));
// with tmp^ do
with arFldDesc[i] do
If iLen>1 Then
StrList.add(Format("%s: array[0..%d] of char;",[szName,ilen-1]))
else
StrList.add(Format("%s: char;",[szName]));
// memo1.lines.add(Format("%s: len=%d,offset=%d;",[szName,ilen-1,iOffset]));
end;
StrList.add("end;");
DbiCloseCursor(HCur);
end;



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

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

Наверх





Память: 0.47 MB
Время: 0.011 c
1-31325
hex_for_delphi
2003-06-26 17:20
2003.07.10
как сделать цикл шагами


14-31466
.nuke
2003-06-24 02:50
2003.07.10
Разыскивается литература...


14-31447
anbezr
2003-06-23 18:43
2003.07.10
Определить, уничтожен ли объект


1-31307
SkyRanger
2003-06-25 04:30
2003.07.10
Бинарное дерево


14-31397
RIMMER
2003-06-23 00:58
2003.07.10
Куда уходят ветки?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский