(Gast)
n/a Beiträge
|
Re: INSERT INTO sonst UPDATE!
14. Apr 2005, 20:45
Am Besten über eine Stored Procedure ...
SQL-Code:
CREATE PROCEDURE SET_Artikel
@SaveOK BIT =0 OUTPUT, -- Ausgabeparameter, mit dem Delphi den Erfolg der SP abfragen kann ...
@ArtNr VARCHAR(10) = NULL,
@Bezeichnung VARCHAR(50) = NULL,
@Preis REAL = 0
AS
BEGIN
-- Parameter prüfen
IF @ArtNr IS NULL OR @Bezeichnung IS NULL
BEGIN
SELECT @SaveOK=0
RAISERROR(' Artielbezeichnung und Artikelnummer dürfen nicht NULL sein ! Vorgang abgebrochen ! ',16,1,' SQL')
END
ELSE BEGIN
-- alle Artikel mit der Artikelnummer "@Artnr" aktualisieren
UPDATE Artikel SET Bezeichnung = @Bezeichnung,
Preis = @Preis
WHERE Artnr = @ArtNr
IF @@ ROWCOUNT = 0 -- (also kein Datensatz aktualisiert wurde (RowsAffected =0) )
BEGIN
INSERT INTO Artikel (
ArtNr,
Bezeichnung,
Preis
)
VALUES (
@ArtNr,
@Bezeichnung,
@Preis
)
END
SELECT @SaveOK=1
END
END
[Zusatz]
In Delphi würde ich die SP so benutzen:
Delphi-Quellcode:
Procedure TForm1.Button1Click(Sender:TObject);
begin
if SaveArtikel = False then showmessage('Der Datensatz wurde nicht gespeichert');
end;
function SaveArtikel:Boolean;
var SP:TAdoStoredPoc;
begin
Result:=False;
SP:=TAdoStoredProc.create(nil);
try
SP.Connection:=Datamodule1.AdoConn; // hier gehören noch ein paar Prüfungen hin
SP.Procedurename='SET_Artikel'; // z.B. ist AdoConn.Connected=true ?
SP.Parameters.refresh; // enthält edit_Artnr.text einen String, der in
SP.Parameters[2].value:=Form1.edit_Artnr.text; // einen Float konvertierbar ist usw ...
SP.Parameters[3].value:=Form1.edit_ArtBez.text;
SP.Parameters[4].value:=StrToFloat(Form1.edit_ArtPreis.text);
SP.ExecProc;
Result:=(SP.Parameters[1].value = true); // <<-- das ist SaveOK aus der SP ...
finally
FreeAndNil(SP);
end;
end;
[/Zusatz]
Schöne Grüße,
Jens
|
|
Zitat
|