Announcement

Collapse
No announcement yet.

Returns einer IbStored Procedures

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

  • Returns einer IbStored Procedures

    Laut der Hilfedatei von Delphi 6 (Thema Datenmengen vom Typ Stored Procedures) soll es möglich sein die Returns der IBSP über eine TDatasource mit Datensteurungskomponenten zuverbinden.

    So "sieht" meine IBSp aus. Nicht wundern das sie sich selbst referenziert. Aber eine andere Lösung ist mir nicht eingefallen um ein Tree mit mir einer unbekannten Anzahl von Level´s zu speichern.
    <pre>
    CREATE PROCEDURE SelectFromSubkat (IntInputLevel INTEGER, IntInputRefSubkatid INTEGER)
    RETURNS (RET_SUBKATEGORIE INTEGER, RET_SUBKATEGORIE_REF_KATEGORI INTEGER, RET_SUBKATEGORIE_REF_SUBKATE INTEGER,
    RET_SUBKATEGORIE_LEVEL INTEGER, RET_SUBKATEGORIE_NAME VARCHAR(50)) AS
    BEGIN
    FOR SELECT IBDF_SUBKATEGORIE,
    IBDF_SUBKATEGORIE_REF_KATEGORI,
    IBDF_SUBKATEGORIE_REF_SUBKATE,
    IBDF_SUBKATEGORIE_LEVEL,
    IBDF_SUBKATEGORIE_NAME
    FROM IBT_SUBKATEGORIE
    WHERE IBDF_SUBKATEGORIE_REF_SUBKATE=:IntInputRefSubkatid
    AND IBDF_SUBKATEGORIE_LEVEL=:IntInputLevel
    INTO :RET_SUBKATEGORIE,
    :RET_SUBKATEGORIE_REF_KATEGORI,
    :RET_SUBKATEGORIE_REF_SUBKATE,
    :RET_SUBKATEGORIE_LEVEL,
    :RET_SUBKATEGORIE_NAME
    DO
    SUSPEND;
    END
    ^
    </pre>
    in Delphi:

    Einer TDatasource habe ich als Dataset die IBSp angegeben. 5 DBEdit Feldern die Datasource und als Fieldname kann ich RET_XXXXXXXX wählen. Also hat Delphi das soweit schonmal begriffen.

    Der Aufruf in Delphi
    <pre>
    with DM.IBSPSubkatRefSubkat do begin
    ParamByName('INTINPUTREFSUBKATID').AsInteger := 1;
    ParamByName('INTINPUTLEVEL').AsInteger := 1;
    Prepare;
    ExecProc;
    end;
    </pre>
    Als Parameter habe ich "dummyhalber" die 1 übergeben. Diese Datensätze sind in der Tabelle auch vorhanden.

    Doch es wird nichts angezeigt. Ein ShowMessage(IntToStr(DM.IBSPSubkatRefSubkat.Record Count)); gibt eine 0 aus.

    In dem Buch C/S Datenbankentwicklung mit Delphi von Herrn Kosch steht das eine Select Stored Procedures bei dem Einsatz von Delphi in einer TQuery (seit ibx wohl TibQuery Oder TIbSql) Komponenten gut aufgehoben sei.

    Muß dieser Weg eingeschlagen werden die Returns zu erhalten? WEnn ja wie übergebe ich in einem TibQuery der IBSp die benötigten Parameter?

  • #2
    Hallo,

    in dem Beispielprojekt <i>RedSys2.dpr</i> aus meinem Buch <i>InterBase Datenbankentwicklung mit Delphi</i> verwende ich u.a. die folgende Stored Procedure:
    <pre>
    /* ++++++++++++++++++++++++++++++++++++++++++++++ */
    /* Ausgaben einer Publikation zurückliefern */
    /* iShowAll = 1 : Alle Ausgaben */
    /* iShowAll <> 1: Nur die unerledigten Ausgaben */
    /* ++++++++++++++++++++++++++++++++++++++++++++++ */

    CREATE PROCEDURE GetBeitragAusgabe (iPublikationID INTEGER, iShowAll INTEGER)
    RETURNS (AUSGABEID INTEGER, JAHRHEFT VARCHAR(20)) AS
    BEGIN
    IF (iShowAll = 1) THEN
    BEGIN
    FOR SELECT AUSGABEID, 'Jahr: ' || JAHR || ', Heft: ' || HEFTNR As JahrHeft
    FROM AUSGABE
    WHERE PublikationID = :iPublikationID
    INTO :AUSGABEID, :JAHRHEFT
    DO
    SUSPEND;
    END
    ELSE
    BEGIN
    FOR SELECT AUSGABEID, 'Jahr: ' || JAHR || ', Heft: ' || HEFTNR As JahrHeft
    FROM AUSGABE
    WHERE PublikationID = :iPublikationID AND ADatum IS NULL
    INTO :AUSGABEID, :JAHRHEFT
    DO
    SUSPEND;
    END
    END
    ^
    </pre>
    Da diese Stored Procedure eine Ergebnismenge zurückliefert, greife ich über <b>TIBDataSet</b> darauf zu, wobei der Stored Procedure beim Aufruf 2 Parameter übergeben werden:
    <pre>
    object IBDSSPBeitragAusgabe: TIBDataSet
    Database = IBDatabaseMain
    Transaction = IBTransactionMain
    BeforeClose = IBDSSPBeitragAusgabeBeforeClose
    BufferChunks = 1000
    CachedUpdates = False
    SelectSQL.Strings = (
    'SELECT * FROM GETBEITRAGAUSGABE(:PUBLIKATIONID,:ShowAll)')
    DataSource = DSBeitragPublikation
    Left = 296
    Top = 112
    object IBDSSPBeitragAusgabeAUSGABEID: TIntegerField
    FieldName = 'AUSGABEID'
    end
    object IBDSSPBeitragAusgabeJAHRHEFT: TIBStringField
    FieldName = 'JAHRHEFT'
    end
    end
    </pre>
    Da <i>DataSource = DSBeitragPublikation</i> verwendet wird, holt sich diese TIBDataSet-Instanz die Parameter-Daten automatisch bei der zugeordneten Datenmenge ab. Dies ist jedoch keine Bedingung, die Parameter können ganz normal wie bei einer parametisierten SELECT-Abfrage "von Hand" übergeben werden.

    P.S: Das vollständige Beispielprojekt kann auch aus dem Unterordner <i>RedSys</i> heruntergeladen werden, falls die CDROM zum Buch im Moment gerade nicht zur Hand ist :-)
    &#10

    Comment


    • #3
      Zunächst mal vielen Dank Herr Kosch.

      Also bleibt mir wohl nur der Weg über eine TDataset. Obwohl mir dann nicht so ganz klar ist warum ich einer IBSP eine Datasource zuweisen kann und wenn dann Datensteuerunskomponenten mit dieser Datasource verbunden werden bei DataField die in der IBSP definierten Returns angegeben werden können.

      PS: Die CD kann nur zur Hand sein, wenn man auch entsprechende Buch gekauft hat. Meine Bemerkung bezog sich auf das Buch C/S Datenbankentwicklung mit Delphi nicht Interbasedatenbankentwicklung mit Delphi. :-

      Comment

      Working...
      X