Форум: "Базы";
Текущий архив: 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.007 c