Announcement

Collapse
No announcement yet.

Ergebnisfeld von TQuery welches laufende Nummer repräsentiert

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

  • Ergebnisfeld von TQuery welches laufende Nummer repräsentiert

    Hallo,

    Kann man in einer Live-TQuery-Abfrage (Interbase 5.6) ein Feld mit einer "laufenden Nummer" im DBGrid ausgeben ? Diese Nummer hat keine Entsprechung in der Datenbank.

    z.B.

    LfdNr Data
    ---------------
    1 Zeile1
    2 Zeile2
    3 Zeile3

    Wer kennt einen entsprechenden SQL-Syntax ?

    Gruss
    Helmut

  • #2
    Sorry

    Die Tabelle formatiert
    <prev>
    LfdNr Data
    ---------------
    1 Zeile1
    2 Zeile2
    3 Zeile3
    </prev&gt

    Comment


    • #3
      Sorry,

      die Tabelle formatiert

      LfdNr Data<br>
      ---------------<br>
      1 Zeile1<br>
      2 Zeile2<br>
      3 Zeile3<br&gt

      Comment


      • #4
        Hallo,

        es gibt für diese Aufgabe verschiedene Lösungsmöglichkeiten: <br>
        a) Server: Eine Stored Procedure (SELECT-Prozedur) verwendet eine Variable, um nach jedem Fetch-Aufruf durch den Client den Wert hochzuzählen und das Ergebnis an den Client zurückzuliefern. <br>
        b) Client: Wenn alle Datensätze ins DBGrid passen (ohne Scrollen) kann ein berechnetes Feld über den Feldeditor angelegt werden <br>
        c) Client: Wenn im DBGrid gescrollt werden muss, kann man alle Daten aus der TQuery-Instanz in eine TClientDataSet-Instanz kopieren und dabei ein Nummerierungsfeld zusätzlich hochzählen

        Comment


        • #5
          Vielen Dank, Herr Kosch!

          Wäre es sehr unverschämt, Sie um ein Beispiel der oben erwähnten StoredProcedure zu bitten ?

          Gruss

          Helmu

          Comment


          • #6
            Hallo,

            das folgende Beispiel demonstriert die Durchnummerierung der Datensätze der SELECT-Abfrage am Beispiel der Tabelle COUNTRY aus der InterBase-Demodatenbank IBLOCAL. Zusätzlich zu den beiden Spalten der Tabelle wird der Rückgabeparameter POS als INTEGER deklariert und vor dem Aufruf von SUSPEND hochgezählt:
            <pre>
            CREATE PROCEDURE GETCOUNTRY RETURNS (
            POS INTEGER,
            COUNTRY VARCHAR(15),
            CURRENCY VARCHAR(10)
            ) AS
            DECLARE VARIABLE iCOUNT INTEGER;
            BEGIN
            iCOUNT = 0;
            FOR SELECT Country, Currency
            FROM COUNTRY
            INTO :Country, :Currency
            DO
            BEGIN
            iCOUNT = iCOUNT + 1;
            Pos = iCOUNT;
            SUSPEND;
            END
            END
            ^
            </pre&gt

            Comment


            • #7
              Hallo Herr Kosch,
              mich wiederum würde die Variante c) mit ClientDataSet interessieren. Diese müßte doch auf dem Befehl "Lokale Daten zuweisen" aufbauen, der zur Entwicklungszeit bei einem CDS zur Verfügung steht?! Ich habe jedoch noch keine Methode gefunden, diese Aktion auch zur Laufzeit durchzuführen.

              Henry Erns

              Comment


              • #8
                Hallo,

                da sowieso die fortlaufende Nummer hochgezählt werden muss, würde ich die Ergebnismenge einer TQuery etc. in einer Schleife in die TClientDataSet-Instanz kopieren. Wenn die TQuery-Eigenschaft <b>UniDirectional</b> auf TRUE gesetzt wird, ist dabei sowohl der Speicher- als auch der Zeitbedarf minimal.

                Das könnte so aussehen:

                <pre>
                procedure TDM.DBRefreshAnrede;
                begin
                with ClientDataSetAnrede do
                begin
                Active := False;
                with ClientDataSetAnrede.FieldDefs do
                begin
                Clear;
                Add('ANR_ID',ftInteger,0,True);
                Add('Anrede',ftString,10,True);
                Add('Hinweis',ftString,50,False);
                end;
                CreateDataSet;
                Active := True;
                end;
                with QueryAnrede do
                begin
                Open;
                try
                while not EOF do
                begin
                with ClientDataSetAnrede do
                begin
                Append;
                ClientDataSetAnredeANR_ID.Value := QueryAnredeANR_ID.Value;
                ClientDataSetAnredeANREDE.Value := QueryAnredeANREDE.Value;
                ClientDataSetAnredeHINWEIS.Value := QueryAnredeHINWEIS.Value;
                Post;
                end;
                Next;
                end;
                finally
                Close;
                end;
                end;
                end;
                </pre&gt

                Comment

                Working...
                X