Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Paradox "Data Block" länge ermitteln? (https://www.delphipraxis.net/63061-paradox-data-block-laenge-ermitteln.html)

Mitchl55 13. Feb 2006 16:09

Datenbank: Paradox • Version: 7 • Zugriff über: BDE

Paradox "Data Block" länge ermitteln?
 
Hallo,

ich bin gerade dabei, in meinem Tool Datensätze (Byteweise) aus einer Paradox Tabelle auszulesen.
Die Einzelnen Tabellenzeilen werden laut:

http://www.byronref.com/rmb/pxspecs.htm


siehe Download *.ZIP file .... PXFORMAT.TXT

Zitat:

Paradox Data Blocks
===================

The data area begins at offset headerSize (usually $0800). It is divided
into blocks of 1024, 2048, 3072 or 4096 bytes -- depending upon the maximum
table size set when the table was created. .....
in Datenblöcke zu je 1024, 2048, 3072 oder 4096 byte abgelegt, das bedeutet, dass
bei einer Datenlänge von 547Byte z.B. 3 Tabellenzeilen in eine Blocklänge von 2048
aufgeteilt wird, der Rest wird mit Leerzeichen gefüllt. Wenn ich jetzt die Blocklänge
auslesen könnte, dann könnte ich die Daten aus der Tabelle genau (Zeilenweise) auslesen.

Weiß jemand wie ich die Blocklänge ermitteln könnte? Geht das irgendwie über die Dateigröße etc.?

Danke & Gruß

Mitchl

PS: Später soll das ganze für ... http://www.delphipraxis.net/internal...171&highlight= dienen.

marabu 13. Feb 2006 20:21

Re: Paradox "Data Block" länge ermitteln?
 
Hallo Mitchl,

das Byte im Header an Offset 5 liefert dir die BlockSize.

Grüße vom marabu

Mitchl55 14. Feb 2006 10:11

Re: Paradox "Data Block" länge ermitteln?
 
Guten Morgen marabu,

Du meinst:

Zitat:

0006....... fileData

Block size varies according to maxTableSize (at 0005):
maxTableSize = 1 (64M): block size = $0400 bytes
maxTableSize = 2 (128M): block size = $0800 bytes
maxTableSize = 3 (192M): block size = $0C00 bytes
maxTableSize = 4 (256M): block size = $1000 bytes
Das könnte ich dann ja mit der Function :

Delphi-Quellcode:
ReadValues(fn: Test.DB; offset: 0005; .....
aus Frage: ReadValues - Paradox Tabelle

auslesen und dann mit einem Showmessage anzeigen lassen oder?? Mit was lese ich den das Byte dann aus? Type: Float; Cardinal: 5; Länge: 1? Der erste Versuch ging natürlich wiederm schief.... :gruebel:

Viele Grüße

Mitchl

marabu 15. Feb 2006 08:01

Re: Paradox "Data Block" länge ermitteln?
 
Hallo Mitchl,

ich denke du solltest etwas mehr Struktur in dein Programm bringen. Ich würde die ersten 6 Byte der Tabelle in einen Record einlesen. Danach kennst du die HeaderSize und kannst den Rest nachlesen. Nur auf die einzelnen Datensätze würde ich über direkte Positionierung zugreifen:

Delphi-Quellcode:
// ungetester Code ...

type
  PHeaderInfo = ^THeaderInfo;
  THeaderInfo = packed record
    RecordSize: SmallInt;
    HeaderSize: SmallInt;
    FileType: Byte;
    MaxTableSize: Byte;
  end;

  PTableHeader = ^TTableHeader;
  TTableHeader = packed record
    NumRecords: LongInt;
    NextBlock: Word;
    // ...
  end;

var
  hi: THeaderInfo;
  th: PTableHeader;
  fs: TFileStream;

begin
  fs := TFileStream.Create(fileName, fmOpenRead);
  fs.Read(hi, SizeOf(hi));
  GetMem(th, hi.HeaderSize);
  fs.Read(th.NumRecords, hi.HeaderSize);
  // ...
  FreeMem(th, hi.HeaderSize);
  fs.Free;
end;
Auf diese Weise kannst du auf die Header-Informationen zugreifen, als ob es normale Variablen wären. Wenn du noch einen dynamischen Puffer für die Datensätze spendierst und die Leseroutine etwas umschreibst, dann bist du schon auf dem Weg ins gelobte Land:

Delphi-Quellcode:
function GetRecord(s: TStream; index: Integer; var buffer: TByteDynArray): Boolean;
var
  offset: Cardinal;
begin
  offset := SizeOf(hi) + hi.HeaderSize + index * hi.RecordSize;
  if offset + Length(buffer) > s.Size then
    Result := false else
  begin
    s.Position := offset;
    s.Read(buffer[0], Length(buffer));
    Result := true;
  end;
end;

var
  buffer: TByteDynArray;

begin
  SetLength(buffer, hi.RecordSize);
  if GetRecord(fs, 0, buffer) then
    ShowMessage('der erste Record wurde gelesen - wie gefällt dir das?')
end;
Grüße vom marabu

Mitchl55 15. Feb 2006 10:23

Re: Paradox "Data Block" länge ermitteln?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

Teil 2.) mit dem Auslesen der Records habe ich schon fast genau so
realisiert wie Du, Deine Version ist vielleicht noch etwas eleganter!!!

Teil l.) ist natürlich der bessere Weg, das ganze detailiert auszulesen!
Denke das ich den Part wohl in dieser Form übernehmen werde....

Hab da mal das bisherige Angehängt....

Das ganze funktioniert im Moment nur wenn die Tabelle das erste mal Ausgelesen wird...
Ist wohl noch eine Variable, um das Kopieren in eine *.bak Tabelle habe ich noch nicht
Programmiert. Ignorierte Zeichen ist für den Header(2048) + 0006 = 2054 Zeichen wo die
Records anfangen! Wie gesagt, da übernehme ich wohl die vorgeschlagenen Teile...

Viele Grüße

Mitchl

Mitchl55 15. Feb 2006 11:05

Re: Paradox "Data Block" länge ermitteln?
 
So... habe das getestet funzt auch wie beschrieben...

habe nur noch das Problem, mir die Maximale Tabellenlänge='Data-Block' ausgeben zu lassen...

Müßte ja irgendwie so gehen...

Delphi-Quellcode:
fs.Read(????, hi.MaxTableSize);
showmessage('MaxTableSize:'+XXX);
Need Help???

Thanx

Mitchl

marabu 15. Feb 2006 11:42

Re: Paradox "Data Block" länge ermitteln?
 
Meinst du so?

Delphi-Quellcode:
ShowMessage(Format('MaxTableSize = %dM', [64 * hi.MaxTableSize]));
marabu

Mitchl55 16. Feb 2006 10:29

Re: Paradox "Data Block" länge ermitteln?
 
Jepp,

genau so ... vielen Dank...

Gruß

Michl


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:44 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz