Entwickler-Ecke

Datenbanken - Per Update-Komponente Ergebnismenge einer SP aktualisieren


mexx - Fr 23.02.07 11:02
Titel: Per Update-Komponente Ergebnismenge einer SP aktualisieren
Ich verwende ein Query, welche als SQL-Anweisung eine Stored Procedure einer Firebird hat. Die Query besitzt eine UpDate-Kompontente. Die Ergebnismenge dieser SP wird angezeigt. Nach bearbeiten dieser Daten in den Steuerelementen, aktualisiere ich die Datenmenge. Dabei kommt die UpDate-Komponente ins Spiel. Dort steht aber in der InsertSQL/ModifySQL kein INSERT/UPDATE drin, sonder eine weitere Procedure.

Das ist notwendig, weil die Datenmenge der Query, keine Tabelleneinträge anzeigt, sondern eine Ergebnismenge einer Stored Procedure ist. Um diese Daten zu aktualisieren brauche ich eine Procedure. Leider erhalte ich beim Update die Meldung "Aktualisierung misslungen". Ich vermute, dass meine Vorgehensweise mit einer GET Stored Prodedure in der Query und einer SET Stored Procedure in der UpDate-Komponente nicht geht.

Wie seht Ihr das?


Andreas Schilling - Mo 26.02.07 08:18

Diesen Weg bin ich zwar noch nicht gegangen, aber wenn ich eine SP in der Datenbank aufrufe für ein Update / insert dann mit folgender Syntax

Delphi-Quelltext
1:
EXECUTE PROCEDURE Procedurename 'Stringparameter', Integerparameter, 'Floatparameter';                    


Gruß Andreas


mkinzler - Mo 26.02.07 08:57

Welche FB Version?
Bei der 2er hast du die Möglichkeit dir den PK zurückgeben zu lassen. Dann kannst du die SP mit einem Select-Statement aufrufen


mexx - Mo 26.02.07 09:02

Das Problem lag in der DBTables. Leider eine notwendige Implemantation! Dort wird beim UpDate-Statement der Update-Komponente folgende Procedure aufgerufen.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure TUpdateSQL.ExecSQL(UpdateKind: TUpdateKind);
begin
  with Query[UpdateKind] do
  begin
    Prepare;
    ExecSQL;
    if RowsAffected <> 1 then DatabaseError(SUpdateFailed); //   <----- Problem
  end;
end;


Wenn aber nun in der Update-Komponente eine SP gestartet wird, so erhält RowsAffected keinen Wert und bringt die Meldung der Datenbank.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure TUpdateSQL.ExecSQL(UpdateKind: TUpdateKind);
begin
  with Query[UpdateKind] do
  begin
    Prepare;
    ExecSQL;
    //if RowsAffected <> 1 then DatabaseError(SUpdateFailed);    <----- Lösung
  end;
end;


Ich kann gut auf diese Prüfung verzichten, da die DBTables nur noch sehr selten in der App verwendet wird. Vielen Dank für eure Beteiligung!