Announcement

Collapse
No announcement yet.

TIBDataSet Berechnete Felder

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

  • TIBDataSet Berechnete Felder

    Moin,

    ich arbeite mit Delphi 5 (Pro) und den entsprechenden Standard-IBX-Komponenten.

    Ich möchte Tabellenfelder einer Interbase-Tabelle, deren Inhalte 0 (Null) und 1 sein können, in einem DBGrid als 'N' für 0 und 'J' für 1 darstellen.
    Ich möchte allerdings nicht auf Formular-Ebene berechnete Felder in die DFM-Datei einbauen.

    Folgendes habe ich in einem TIBDatset-Nachfolger versucht:

    <PRE>
    type
    TIBDataSetBewegungen = class(TIBDataSet)
    private
    protected
    FcalcKzSollHaben : TStringField;
    public
    constructor create(AOwner: TComponent); override;
    destructor destroy; override;
    procedure loaded; override;

    procedure SelectBewegungenFuerKundenNr(const aKdNr : TKundenNr);
    published

    end;

    implementation
    ...

    procedure TIBDataSetBewegungen.SelectBewegungenFuerKundenNr( const aKdNr : TKundenNr);
    begin
    Active := false;

    SelectSQL.Clear;
    SelectSQL.Add('SELECT ' +
    ' KundenNr, BewegungsNr, BuchungsDatum, BuchungsArt ' );
    SelectSQL.Add( ' FROM ' + TableName +
    ' WHERE KundenNr=' +IntToStr(aKdNr) +
    ' ORDER BY KundenNr, BewegungsNr ASC');

    RefreshSQL.Clear;
    RefreshSQL := SelectSQL;

    // Berechnetes Feld anlegen
    FcalcKzSollHaben := TStringField.Create(Self);
    FcalcKzSollHaben.Size := 1;
    FcalcKzSollHaben.Name := TableName + 'calcKZSollHaben';
    FcalcKzSollHaben.FieldName := 'calcKZSollHaben';
    FcalcKzSollHaben.Dataset := self;
    FcalcKzSollHaben.Calculated:= true;

    Self.Active := true;

    end;

    </PRE>

    Nach dem Öffnen wird allerdings nur noch das berechnete Feld akzeptiert.
    Bei Zugriff auf die anderen Felder, z.B. BewegungsNr, kommt die Exception "Feld BewegungsNr nicht vorhanden..."

    Wie kann ich dieses Problem lösen ?

  • #2
    Hi,

    Nachdem Du nun keine 'festverdrahteten' Felder in einer DFM-Datei möchtest, gehe doch einen ( richtigen ) Schritt weiter und lasse Dir die gewünschten Werte direkt von der SQL-DB liefern. Genau dazu ist sie nämlich da.

    z.B.

    Select Wert1, Wert2, Wert1*Wert2 as Summe from SQLTABELLE

    Gruß
    Gesin

    Comment


    • #3
      Moin Gesine,

      danke für den Tipp. Da ich SQL- und Interbase-Technisch noch Anfänger bin, kam ich damit allerdings - auch vorher - nicht weiter...
      Hast du vielleicht für das Beispiel unten eine praktische Lösung ?

      Beispiel:
      Feld2 hat die möglichen Inhalte 0 und 1.
      Dargestellt werden soll aber 'b' für 0 und 'g' für 1.

      Danke. Und guten Rutsch..

      Comment


      • #4
        Hi,

        Nehmen wir an Du verfügst über zwei Tabellen:

        Tabelle 1 (DATEN):
        <pre>
        CREATE TABLE "DATEN"
        (
        "ID" "PRIMARYID",
        "JANEINSPALTE" INTEGER,
        CONSTRAINT "DATEN" PRIMARY KEY ("ID")
        );
        </pre>
        Diese enthält fünf Datensätze:

        <pre>
        ID JANEINSPALTE
        -- ------------
        1 0
        2 1
        3 0
        4 0
        5 1

        </pre>

        Tabelle 2 (JANEINANZEIGE):

        <pre>
        CREATE TABLE "JANEINANZEIGE"
        (
        "ID" "PRIMARYID",
        "TEXT" VARCHAR(4),
        CONSTRAINT "JANEINANZEIGE" PRIMARY KEY ("ID")
        );
        </pre>

        Diese enthält zwei Datensätze:
        <pre>
        ID TEXT
        -- ----
        0 NEIN
        1 JA
        </pre>
        Diese lassen wir von der Datenbank wie folgt verknüpfen:

        <pre>
        select * from Daten D join janeinanzeige jn on d.janeinspalte=jn.id
        </pre>

        Die gelieferte Ausgabe sieht dann ungefähr so aus:

        <pre>
        ID JANEINSPALTE ID1 TEXT
        -- ------------ --- ----
        1 0 0 NEIN
        2 1 1 JA
        3 0 0 NEIN
        4 0 0 NEIN
        5 1 1 JA
        </pre>

        Möchtest Du nicht alle Spalten sehen, dann lautet die entsprechende Abfrage z.B.:

        <pre>
        select D.ID, JN.TEXT from Daten D join janeinanzeige jn on d.janeinspalte=jn.id
        </pre>

        Die gelieferte Ausgabe sieht dann ungefähr so aus:

        <pre>
        ID TEXT
        -- ----
        1 NEIN
        2 JA
        3 NEIN
        4 NEIN
        5 JA
        </pre>

        Gruß
        Gesin

        Comment


        • #5
          Moin Gesine,

          das funkt ja grossartig. Danke fuer deine Tipps.
          So schnell waere ich auf zusaetzliche DB-Tabellen
          nicht gekommen. Wieder etwas gelernt...

          Danke und Gruss

          joer

          Comment

          Working...
          X