Announcement

Collapse
No announcement yet.

Tabellenfeld automatisch füllen

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

  • #16
    Hallo Torsten,

    genauso hab ichs gemacht, deshalb ist das ja so unverständlich, dass ich trotzdem wieder die gleiche Kundennummer erhalte. Hier mal mein Code:

    procedure TKundeStammForm3.BitBtn1Click(Sender: TObject);

    begin

    try

    DataModule1.ADOConnection1.BeginTrans;

    DataModule1.ADODataSet3.Post;

    DataModule1.ADOConnection1.CommitTrans;

    DataModule1.ADODataSet3.Active := false;

    DataModule1.ADODataSet3.Active := true;

    KundeStammForm1.CheckBox1.Checked := false

    except

    DataModule1.ADOConnection1.RollbackTrans;

    DataModule1.ADODataSet3.Active := false;

    DataModule1.ADODataSet3.Active := true;

    KundeStammForm1.CheckBox1.Checked := false

    end;

    und nun der Stored Procedure Aufruf:

    procedure TKundeStammForm1.CheckBox1Click(Sender: TObject);

    var

    id_neu : string;

    ok : boolean;

    begin

    if CheckBox1.Checked = true then

    begin

    repeat

    ok := true;

    Wenn ich die if-Bedingung verwende erhalte ich immer die Fehlermeldung: "Transaktion is not aktive". Ich denke, dass hier auch der Fehler liegt, da die Insert transaktion sonst abgebrochen werden würde, oder nicht ?

    {if DataModule1.ADOConnection1.inTransaction = true then
    DataModule1.ADOConnection1.commitTrans;}

    DataModule1.ADOConnection1.BeginTrans;

    DataModule2.ADOStoredProc_KundenID.execProc;

    id_neu := DataModule2.ADOStoredProc_KundenID.FieldByName('ID _NEU').Value;

    try

    DBEdit12.Field.ASString := id_neu

    except

    {on E: EIBError.SQLCode -803 DO }

    ok := false;

    DataModule1.ADOConnection1.RollbackTrans;

    end;

    until ok;

    if DataModule1.ADOConnection1.InTransaction = true then

    DataModule1.ADOConnection1.commitTrans;

    end;

    end;

    Also, wie siehst Du das ?

    Gruß Elk

    Comment


    • #17
      Hallo Elke,
      <pre><b>
      procedure TKundeStammForm1.CheckBox1Click(Sender: TObject);
      var
      id_neu : string;
      ok : boolean;
      begin
      if CheckBox1.Checked = true then begin
      {if DataModule1.ADOConnection1.inTransaction = true then DataModule1.ADOConnection1.commitTrans;} - es muß eine Eigenschaft geben mit der man testen kann ob eine Transaktion aktiv ist. Ich hatte gedacht das das InTransaction sein könnte.}
      DataModule1.ADOConnection1.BeginTrans;
      repeat
      ok := true;
      try
      DataModule2.ADOStoredProc_KundenID.execProc;
      id_neu := DataModule2.ADOStoredProc_KundenID.FieldByName('ID _NEU').Value;
      DBEdit12.Field.ASString := id_neu;
      except
      {on E: EIBError.SQLCode -803 DO }
      ok := false;
      DataModule1.ADOConnection1.RollbackTrans;
      DataModule1.ADOConnection1.BeginTrans;
      end;
      until ok;
      if DataModule1.ADOConnection1.InTransaction = true then DataModule1.ADOConnection1.commitTrans;
      end;
      </pre></b>

      Das kann aber noch nicht die Lösung des Problems sein!
      Welche ADOConnection ist bei der Komponente ADOStoredProc_KundenID eingestellt? Falls es Default ist würde ich direkt eine Connection vorgeben. Bei dem jetzigen Code DataModule1.AdoConnection1.

      Gibt es bei ADO auch spezielle Transaktionskomponenten?


      Tschüß

      Torste

      Comment


      • #18
        Hallo Torsten,

        1. mit der inTransaction Eigenschaft kann man schon feststellen ob eine Transakion aktiv ist, so stehts jedenfalls in der Onlinehilfe. Der Code wird so auch anstandslos compiliert. Das Problem tritt erst auf, wenn ich die Checkbox ein zweites mal aktiviere ( also true -> false -> true -> Fehlermeldung).

        2. Ich verwende bisher für das ganze Programm nur eine ADOConnection-Komponente, über die alle Tabellen die Verbindung zur Datenbank herstellen.

        z.B. ADODataSet1.Connection := ADOConnection1

        Einen Dafault Wert habe ich nicht gesetzt.

        3. Spezielle Transaktions-Komponenten wie IBTransaction gibt es meines Wissens nicht. Es wird alles über die ADOConnection-Komponente geregelt.

        Ich hoffe Du kannst damit was anfangen

        Gruß Elk

        Comment


        • #19
          Hallo Elke,

          da ich nicht selber testen kann wird's langsam schwierig.

          Wenn Du einen Breakpoint auf die Zeile <b>DataModule1.ADODataSet3.Active := false; </b> setzt und das Programm bis zu dieser Zeile ausführen läßt. Dann startest Du IBConsole und schaust ob dieser Datensatz in der Tabelle eingetragen worden ist.

          Ist der Datensatz dann sichtbar?

          Tschüß

          Torste

          Comment


          • #20
            Hallo Torsten,

            sorry dass es so lange gedauert hat, aber ich hab mich mal noch mit ein paar anderen Problemen beschäftigt.

            Also der Datensatz ist dann schon in de Tabelle sichtbar.

            Gruß Elk

            Comment


            • #21
              Hallo Elke,

              wenn die Daten zu diesem Zeitpunkt sichtbar sind, haben wir schon einmal einen brauchbaren Ausgangspunkt.

              Du könntest jetzt beim Aufruf der StoredProc folgendes machen:

              <b><pre>
              procedure TKundeStammForm1.CheckBox1Click(Sender: TObject);
              var
              id_neu : string;
              ok : boolean;
              begin
              if CheckBox1.Checked = true then begin
              try DataModule1.ADOConnection1.CommitTrans;
              except
              end; {Falls eine Transaktion aktiv ist wird sie beendet, falls nicht sollte die Fehlermeldung durch den Except-Block unterdrückt werden}
              DataModule1.ADOConnection1.BeginTrans;
              repeat
              ok := true;
              try
              DataModule2.ADOStoredProc_KundenID.execProc;
              id_neu := DataModule2.ADOStoredProc_KundenID.FieldByName('ID _NEU').Value;
              DBEdit12.Field.ASString := id_neu;
              except
              {on E: EIBError.SQLCode -803 DO }
              ok := false;
              DataModule1.ADOConnection1.RollbackTrans;
              DataModule1.ADOConnection1.BeginTrans;
              end;
              until ok;
              if DataModule1.ADOConnection1.InTransaction = true then DataModule1.ADOConnection1.commitTrans;
              end;
              </pre><b>

              Ansonsten drängt sich mir der Verdacht auf das der SibProvider noch so seine Macken hat. Als Ersatz könntest Du noch versuchen über den OLE-DB-Provider over ODBC und einem ODBC-Treiber für Interbase auf den Interbase-Server zuzugreifen. Wie stabil das allerdings ist kan ich Dir nicht sagen.

              Tschüß

              Torste

              Comment


              • #22
                Hallo Torsten,

                auf diese Weise erhalte ich immerhin keine Fehlermeldung mehr. Beim Debuggen werden auch alle Schritte korrekt abgearbeitet. Trotzdem erscheint immer noch die alte Kontonummer wenn ich einen neuen Datensatz einfügen will. Allerdings glaube ich eigentlich nicht, dass es an InterBase oder dem Provider liegt, denn wenn ich mir im Programm die Daten in einem DBGrid anzeigen lasse erscheint auch direkt der neue Datensatz. Fällt Dir noch was dazu ein ?

                Gruß Elk

                Comment


                • #23
                  Hallo Elke,

                  mir fällt dazu auch nichts mehr ein. Wenn der OLE-DB-Treiber ordnungsgemäß arbeitet, dann müßte es so funktionieren.

                  Tschüß

                  Torste

                  Comment


                  • #24
                    Hi Torsten,

                    endlich hab ich die lang ersehnte Lösung des Problems gefunden und wie so oft war sie ganz einfach.

                    Scheinbar wurde die StoredProcedure nicht wie gewollt bei jedem aktivieren bzw. Einfügen eines neuen Datensatzes erneut ausgeführt, sondern es wurde einfach das Ergebnis des ersten Aufrufes wieder zurückgegeben. Einen neuen Aufruf der Procedure habe ich dadurch erreicht, dass ich bei jedem Click auf die CheckBox erst einmal StoredProc.active := false und dann wieder auf true gesetzt habe (Wie das refresh bei den Tabellen). Jetzt wird jedesmal die Procedur erneut aufgerufen und ich erhalte die Werte, wie sie sein sollen.

                    Zum Glück liegt es also nicht am Provider. Mit dem scheint bisher alles gut zu funktionieren. Also Danke noch mal für die vielen Anregungen.

                    Gruß Elk

                    Comment

                    Working...
                    X