Announcement

Collapse
No announcement yet.

IBClientDataset - Änderungen speichern

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

  • IBClientDataset - Änderungen speichern

    Hallo Spezialisten!<BR>
    habe in die Anzeige von Daten über IBClientDataset und einen CommandText 'SELECT * FROM tabelle' realisiert. Kann die Daten auch ändern, scrollen etc. Aber wie kriege ich die Änderungen in den Interbase? ApplyUpdate+Transaktion wird anstandslos durchlaufen, aber in der DB ändert sich nichts.<BR>
    ACHTUNG: Herr Kosch!<BR>
    In Ihrem Buch INTERBASE S.453 steht so schön, das die Möglichkeit besteht, die daten auf Wunsch zurückzuschreiben. Aber WIE?<BR>
    <BR>
    Was habe ich übersehen? Danke für Hilfe oder Beispiele.<BR>
    Gruß Gunnar

  • #2
    Hallo,

    &gt;Was habe ich übersehen?

    das folgende Beispiel kann problemlos neue Datensätze anlegen bzw. vorhandene Datensätze ändern:

    a) Vorbereitung in der InterBase 6-Datenbank
    <pre>
    CREATE TABLE GUNNAR (
    ID INTEGER NOT NULL PRIMARY KEY,
    Wert VARCHAR(10) NOT NULL)

    INSERT INTO GUNNAR (ID,WERT) VALUES (1,'Test 1')
    </pre>

    b) Beispiel (PAS-Datei)
    <pre>
    unit Unit1;

    interface

    uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, Provider, StdCtrls, ExtCtrls, DBCtrls, DB, Grids, DBGrids,
    IBDatabase, DBClient, DBLocal, DBLocalI;

    type
    TForm1 = class(TForm)
    IBDatabase1: TIBDatabase;
    IBClientDataSet1: TIBClientDataSet;
    IBTransaction1: TIBTransaction;
    DBGrid1: TDBGrid;
    DataSource1: TDataSource;
    DBNavigator1: TDBNavigator;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    private
    { Private-Deklarationen }
    public
    { Public-Deklarationen }
    end;

    var
    Form1: TForm1;

    implementation

    {$R *.dfm}

    procedure TForm1.Button1Click(Sender: TObject);
    begin
    IBClientDataSet1.ApplyUpdates(0);
    end;

    end.
    </pre>

    c) Beispiel (DFM-Datei):
    <pre>
    object Form1: TForm1
    Left = 192
    Top = 114
    Width = 870
    Height = 640
    Caption = 'Form1'
    Color = clBtnFace
    Font.Charset = DEFAULT_CHARSET
    Font.Color = clWindowText
    Font.Height = -11
    Font.Name = 'MS Sans Serif'
    Font.Style = []
    OldCreateOrder = False
    PixelsPerInch = 96
    TextHeight = 13
    object DBGrid1: TDBGrid
    Left = 72
    Top = 112
    Width = 577
    Height = 169
    DataSource = DataSource1
    TabOrder = 0
    TitleFont.Charset = DEFAULT_CHARSET
    TitleFont.Color = clWindowText
    TitleFont.Height = -11
    TitleFont.Name = 'MS Sans Serif'
    TitleFont.Style = []
    end
    object DBNavigator1: TDBNavigator
    Left = 112
    Top = 88
    Width = 240
    Height = 25
    DataSource = DataSource1
    TabOrder = 1
    end
    object Button1: TButton
    Left = 184
    Top = 32
    Width = 75
    Height = 25
    Caption = 'Button1'
    TabOrder = 2
    OnClick = Button1Click
    end
    object IBDatabase1: TIBDatabase
    Connected = True
    DatabaseName = 'C:\Database\TEST6D3.GDB'
    Params.Strings = (
    'user_name=sysdba'
    'password=masterkey'
    'lc_ctype=ISO8859_1')
    LoginPrompt = False
    DefaultTransaction = IBTransaction1
    IdleTimer = 0
    SQLDialect = 3
    TraceFlags = []
    Left = 72
    Top = 32
    end
    object IBClientDataSet1: TIBClientDataSet
    Active = True
    CommandText = 'select ID, WERT from GUNNAR'
    Aggregates = <>
    Options = [poAllowCommandText]
    Params = <>
    DBConnection = IBDatabase1
    DBTransaction = IBTransaction1
    Left = 112
    Top = 32
    end
    object IBTransaction1: TIBTransaction
    Active = True
    DefaultDatabase = IBDatabase1
    AutoStopAction = saNone
    Left = 72
    Top = 64
    end
    object DataSource1: TDataSource
    DataSet = IBClientDataSet1
    Left = 144
    Top = 32
    end
    end
    </pre&gt

    Comment


    • #3
      Hallo Herr Kosch,<BR>
      besten Dank für die Hilfe. Das Beispielprogramm funktioniert bestens. Die Ursache für das Fehlverhalten war, das im CommandString eine StoredProcedure eingebunden war 'SELECT * FROM SP_SELECT'. Nach Änderung auf 'SELECT * FROM TABELLE' funktioniert auch das Rückschreiben über ApplyUpdates.<BR>
      Bleibt noch die Frage offen, ob im CommandString keine SP enthalten sein dürfen, oder was dann ggf. verändert werden müßte?<BR>
      Beste Grüße<BR>
      Gunna

      Comment


      • #4
        Hallo,

        &gt;..ob im CommandString keine SP enthalten sein dürfen...

        Delphi kann nicht zaubern, sondern muss allein über die Syntax der SELECT-Abfrage in der Lage sein, die UPDATE-, INSERT- oder DELETE-Anweisungen vom Provider automatisch generieren zu lassen. Wenn man ein SELECT auf eine Stored Procedure loslässt, steht diese automatische Übersetzung nicht zur Verfügung (denn dazu müsste der Provider die interne Struktur der SP untersuchen können, was er allerdings nicht kann). Sobald eine Stored Procedure im Spiel ist, müssen wir als Entwickler von Hand eingreifen

        Comment


        • #5
          Hallo Herr Kosch,<BR>
          Prinzip erkannt. Wenn ich die Sache nun selber in die Hand nehme, fehlt mir im IbClientDataSet das aus den IbDataSet bekannt Ereignis ONUPDATERECORD. IbClientDataSet bringt auch viele schöne Ereignisse, aber wo wäre ein Rückschreiben optimal zu koppeln?<BR>
          Danke für Infos!<BR>
          Gunna

          Comment

          Working...
          X