Wie kiar das beschrieben hat, so geht es im Prinzip. Wenn schon, dann aber direkt eine stored Procedure verwenden. Ja, man lernt eben nie aus.
Das von mir anfangs eingeführte Lager-Beispiel habe ich so realisiert (Menge soll vom Bestand abgezogen werden) :
Delphi :
Delphi-Quellcode:
procedure SchreibeLager (menge : integer);
begin
with EingDM do begin // EingDM : DataModule
LagSP.ParamByName('ID_ART').AsInteger := ArtDS.FieldByName ('ID').AsInteger;
...
LagSP.ParamByName('MENGE').AsInteger := menge;
LagSP.ExecProc;
end;
end;
Voraussetzumg ist natürlich, daß diese SP in der
DB definiert ist.
DB:
SQL-Code:
SET TERM ^ ;
CREATE PROCEDURE LAGSP (
ID_ART INTEGER,
MENGE INTEGER)
AS
DECLARE VARIABLE AENDERN INTEGER;
begin
AENDERN = -1;
SELECT ID FROM LAGER WHERE ID_ART= :ID_ART INTO :AENDERN;
IF (AENDERN < 0) THEN BEGIN
INSERT INTO LAGER8 (ID_ART,MENGE) VALUES (:ID_ART,-1*:MENGE);
END
ELSE BEGIN
UPDATE LAGER SET MENGE = MENGE - :MENGE
WHERE ID_ART = :ID_ART;
END
suspend;
end
^
SET TERM ; ^
Das ist jetzt allerdings noch stark verkürzt. Nicht relevante Felder und Statements habe ich weggelassen.
Außerdem ist ein guter Trick integriert : nämlich die
DB entscheiden zu lassen, ob ein INSERT oder ein UPDATE ausgeführt werden muß. Würde ich auf keinen Fall vernachlässigen
Es muß also im Programm nur "SchreibeLager" ausgeführt werden, egal ob der Lagerbestand schon existiert oder nicht !!