Announcement

Collapse
No announcement yet.

View

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

  • View

    Hallo,

    Ich habe einen Join den ich mittels View in einem Grid anzeige, um dem Anwender statt einer ID für die Anrede den tatsächlichen String anzuzeigen. Nun möchte ich dem Anwender in diesem Grid erlauben, einen neuen Datensatz zu erzeugen. Fällt wohl aus, oder ??

  • #2
    Hallo,

    nein, der InterBase kann diese Aufgabe in eigener Regie übernehmen. Angenommen, im SQL-Explorer wird das folgende Script ausgeführt, das neben den Testtabellen und dem View auch noch Trigger für den View anlegt:
    <pre>
    /* SQL-Explorer-Script */
    /* Anw.-Begrenzer: ^ */
    /* Beispiel aus InterBase Data Definition Guide */

    CREATE TABLE Table1(
    ColA INTEGER NOT NULL,
    ColB VARCHAR(20),
    CONSTRAINT PK_Table1 PRIMARY KEY(ColA)
    )
    ^

    CREATE TABLE Table2(
    ColA INTEGER NOT NULL,
    ColC VARCHAR(20),
    CONSTRAINT PK_Table2 PRIMARY KEY(ColA)
    )
    ^

    /* Read-Only-View */
    CREATE VIEW TableView AS
    SELECT Table1.ColA, Table1.ColB, Table2.ColC
    FROM Table1, Table2
    WHERE Table1.ColA = Table2.ColA
    ^

    CREATE TRIGGER TableView_Delete FOR TableView BEFORE DELETE AS
    BEGIN
    DELETE FROM Table1 WHERE ColA = OLD.ColA;
    DELETE FROM Table2 WHERE ColA = OLD.ColA;
    END
    ^

    CREATE TRIGGER TableView_Update FOR TableView BEFORE UPDATE AS
    BEGIN
    UPDATE Table1 SET ColA = NEW.ColA;
    UPDATE Table2 SET ColC = NEW.ColC WHERE ColA = OLD.ColA;
    END
    ^

    CREATE TRIGGER TableView_Insert FOR TableView BEFORE INSERT AS
    BEGIN
    INSERT INTO Table1 VALUES (NEW.ColA,NEW.ColB);
    INSERT INTO Table2 VALUES (NEW.ColA,NEW.ColC);
    END
    ^
    </pre>
    In diesem Fall kann man im Delphi-Programm neue Datensätze einfügen bzw. bestehende Datensätze ändern, wie das folgende Beispiel zeigt:
    <pre>
    procedure TForm1.RadioGroup1Click(Sender: TObject);
    resourcestring
    // einzelne Tabelle
    c1 = 'SELECT * FROM single';
    // View ohne Trigger (Join mit 2 Tabellen)
    c2 = 'SELECT * FROM ViewOhneTrigger';
    // View mit Trigger (Join mit 2 Tabellen)
    c3 = 'SELECT * FROM TableView';
    // Join mit 2 Tabellen
    c4 = 'SELECT Table1.ColA, Table1.ColB, Table2.ColC ' +
    'FROM Table1, Table2 ' +
    'WHERE Table1.ColA = Table2.ColA';
    begin
    case RadioGroup1.ItemIndex of
    0 : Query1.Active := False;
    1 : ChangeSQL(c1);
    2 : ChangeSQL(c2);
    3 : ChangeSQL(c3);
    4 : ChangeSQL(c4);
    end;
    end;

    procedure TForm1.Query1AfterOpen(DataSet: TDataSet);
    resourcestring
    cMsg = 'SELECT-Abfrage ist ';
    var
    sMsg : String;
    begin
    if Query1.CanModify then
    sMsg := Format('%s %s', [cMsg, 'editierbar'])
    else
    sMsg := Format('%s %s', [cMsg, 'Read-Only!']);
    StatusBar1.SimpleText := sMsg;
    end;

    {----------------------------------------------------}
    { Private Methoden }
    {----------------------------------------------------}

    procedure TForm1.ChangeSQL(sSQL: String);
    begin
    with Query1 do
    begin
    Active := False;
    SQL.Clear;
    SQL.Add(sSQL);
    RequestLive := True;
    try
    Active := True;
    except
    // vermutlich Read-Only -> neu öffnen
    RequestLive := False;
    try
    Active := True;
    except
    raise
    end;
    end;
    end;
    end;

    end.
    </pre>
    Das vollständige Beispielprojekt ist in meinem Buch <i>Client/Server Datenbankentwicklung mit Delphi</i> zu finden

    Comment


    • #3
      Hallo,

      Erstmal danke, werden es probieren. Das Buch habe ich vorliegen und gefällt auch ganz gut. Hätte es auch einen vernünftigen Index, würde der Gebrauchswert noch um viele Prozentpunkte steigen. ;-)

      Gesine

      (P.S. Anregung für die nächse Auflage

      Comment


      • #4
        ;-

        Comment

        Working...
        X