AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Blocks von DB von letztem Datensatz aufwärts einlesen

Blocks von DB von letztem Datensatz aufwärts einlesen

Ein Thema von nikua · begonnen am 19. Okt 2004 · letzter Beitrag vom 19. Okt 2004
 
nikua

Registriert seit: 16. Okt 2003
11 Beiträge
 
Delphi 5 Professional
 
#1

Blocks von DB von letztem Datensatz aufwärts einlesen

  Alt 19. Okt 2004, 13:47
Liebes Forum!

Da mir bei "komplizierteren" Funktionen leider etwas der Durchblick fehlt, stehe ich vor folgendem Problem:

Ich lese große Datenmengen mittels DBIBlockRead ein. Jeden Block gehe ich von vorne nach hinten (bis zum Ende das Blocks) durch. Jetzt muss ich aber mit dem letzten Block beginnen, den von hinten nach vorne durchlesen und dann den nächsten=vorhergehenden Block abarbeiten, also die ganze Sache rückwärts erledigen.

Vom ersten bis zum letzten Datensatz (also beginnend mit erstem, endend mit letztem Block, pro Block vom ersten bis zum letzten Datensatz) gehe ich dabei wie folgt vor:

Hier werd

Delphi-Quellcode:
procedure soundso;
var pRecBuffs, pRecCurrBuff: pBYTE;
     TotalSize: int64;
     Records, RecordsToRead, RecordsProcessed : integer;
     pSFields, pS: pFLDDesc;
     Props: CURProps;
     Blank : longBool;
     BlockSize:int64;

     saveTableName: String
     workTable: TTable;

  procedure prepareMem(myTable: TTable);
  begin
    BlockSize:=BlocksizeParam*1024;
    BlockSize:=BlockSize*1024;
    Check(DbiSetToBegin(myTable.Handle));

    Check(DbiGetCursorProps(myTable.Handle, Props));

    pSFields := AllocMem(myTable.FieldCount * sizeof(FLDDesc));
    Check(DbiGetFieldDescs(myTable.Handle, pSFields));

    // Determine the amount of records that can be move in the block size given...
    Check(DbiGetRecordCount(myTable.Handle, Records));
    TotalSize := int64(Props.iRecBufSize) * int64(Records);
    if TotalSize < BlockSize then
      BlockSize := TotalSize;
    RecordsToRead := BlockSize div Props.iRecBufSize;
    pRecBuffs := AllocMem(BlockSize * sizeof(BYTE));
  end; //prepareMem

begin
  saveTableName:='xxx';
  BlockSizeParam:=2;

  workTable:=TTable.Create(Nil);
  workTable.DatabaseName:='xxx';
  workTable.TableName:=tableName;

  pRecBuffs := nil; pSFields := nil;
  RecordsProcessed := 0;

  try
   prepareMem(workTable);
   while (RecordsToRead > 0) and (not docancel) do
    begin
      Check(DbiReadBlock(workTable.Handle, RecordsToRead, pRecBuffs));

      pRecCurrBuff:=pRecBuffs;
      for i:=0 to recordsToRead-1 do
        begin
          //Daten bearbeiten
          inc(pRecCurrBuff,Props.iRecBufSize * sizeof(BYTE));
        end;

      Inc(RecordsProcessed, RecordsToRead);
      if RecordsToRead > (Records - RecordsProcessed) then
        RecordsToRead := (Records - RecordsProcessed);
    end; //while RecordsToRead > 0 do
except
end;

end; //updateMySQLData
Ich wäre sehr dankbar, wenn mir jemand sagen könnte, wie ich hier die Richtung umdrehe, also sowohl die Blocks von hinten nach vorne, wie auch die Inhalte der Blocks von hinten nach vorne abarbeiten kann.

Lieb-Dank!
  Mit Zitat antworten Zitat
 

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:19 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz