Announcement

Collapse
No announcement yet.

Wie kann ich eine festgelegte Anzahl Datensätze in einer Query bereitstellen?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Wie kann ich eine festgelegte Anzahl Datensätze in einer Query bereitstellen?

    Hallo,

    Ich benötige eine Query, mit der ich durch einen Datenbestand "blättern" kann und mir jeweils nur eine zuvor festgelegte Anzahl der Datensätze zurückliefert. Wie muss ich dabei vorgehen??

    Wäre schön, wenn mir jemand einen Tipp geben könnte.

    Gruß, Heike

  • #2
    Hallo,

    leider fehlt jede Angabe, um welche Datenbank es sicht handelt. Bei einer SQL-Datenbank (InterBase etc.) würde ich eine Stored Procedure als SELECT-Prozedur verwenden, die nur die als Parameter übergebene Anzahl von Datensätzen zurückliefert. Beispiele dafür habe ich hier im Forum bereits beschrieben.

    Für Desktop-Datenbanken muss man die BDE um Mithilfe bemühen. Über die BDE-Verwaltung kann die Treiber-Eigenschaft <b>MAX ROWS</b> für einen Alias fest zugewiesen werden - die BDE liefert damit nur noch die hier vermerkte Anzahl von Datensätzen in einer Abfrage zurück. Der Vorgabewert von -1 schaltet diese Begrenzung ab. Immer dann, wenn damit zu rechnen ist, daß nur eine bestimmte SQL-Abfrage via TQuery sehr große Datenmengen ergeben kann, kann eine Begrenzung der maximal zurückgelieferten Datensätze nur für diese eine Abfrage sinnvoll sein. Über einen geringfügig modifzierten TQuery-Nachfolger kann das Programm zur Laufzeit die Anzahl der maximal zum Client übertragenen Datensätze begrenzen.

    In der neuen VCL-Klasse <b>TRestrictedQuery</b> wird zum einen die von TQuery geerbte Methode <b>PrepareCursor</b> überschrieben und zum anderen die Eigenschaft <b>MaxRowCount</B> neu eingerichtet. Da diese Klasse vom Programm erst zur Laufzeit erzeugt wird, ist es nicht notwendig, eine Komponente zu erzeugen und zu registrieren:
    <pre>
    unit MaxRowQuery;

    interface

    uses
    Windows, Messages, SysUtils, Classes, DB, DBTables;

    type
    TRestrictedQuery = class(TQuery)
    private
    FMaxRowCount: Longint;
    protected
    procedure PrepareCursor; override;
    published
    property MaxRowCount: Longint read FMaxRowCount write FMaxRowCount;
    end;

    implementation

    uses BDE;

    procedure TRestrictedQuery.PrepareCursor;
    begin
    inherited PrepareCursor;
    if FMaxRowCount > 0 then
    begin
    Check(DbiValidateProp(hDBIObj(Handle), curMAXROWS, True));
    Check(DbiSetProp(hDBIObj(Handle), curMAXROWS, FMaxRowCount));
    end;
    end;

    end.
    </pre>
    Der Aufruf könnte dann so aussehen:
    <pre>
    FQuery2 := TRestrictedQuery.Create(self);
    with FQuery2 do
    begin
    SQL.Add(cSQL);
    DatabaseName := 'IB_Test';
    MaxRowCount := 4;
    end;
    </pre>
    Wenn man sich den letzten Primärschlüsselwert merkt, kann bei der zweiten Abfrage die WHERE-Einschränkung nur alle nachfolgenden Datensätze abholen

    Comment


    • #3
      Danke,

      ich dachte, des geht noch einfacher..

      Comment


      • #4
        Hallo,

        falls der <i>Microsoft SQL Server</i> verwendet wird, geht es auch einfacher: <b>SELECT TOP 10</b> liefert zum Beispiel nur die ersten 10 Datensätze zurück :-

        Comment


        • #5
          Schade,

          ich arbeite NUR mit Interbase... ;-

          Comment


          • #6
            Hallo,

            in diesem Fall würde ich auf die Stored Procedure zurückgreifen, das folgende Beispiel demonstriert das Prinzip:
            <pre>
            CREATE PROCEDURE GetFirstXKunden (rows INTEGER)
            RETURNS (kundenid INTEGER, vorname CHAR(35), nachname CHAR(35)) AS
            BEGIN
            IF (rows <1) THEN EXIT;
            FOR SELECT kundenid, vorname, nachname
            FROM kundenimp
            INTO :kundenid, :vorname, :nachname
            DO
            BEGIN
            SUSPEND;
            rows = rows -1;
            IF (rows <1) THEN EXIT;
            END
            END
            ^
            </pre>
            Die im Beispiel gezeigte Stored Procedure liefert nur die ersten X Datensätze zurück, wobei die Anzahl der zurückzuliefernden Datesätze als Parameter übergeben wird:
            <pre>
            SELECT * FROM GetFirstXKunden(10)
            </pre>

            &#10

            Comment

            Working...
            X