Einzelnen Beitrag anzeigen

jensw_2000
(Gast)

n/a Beiträge
 
#4

Re: INSERT INTO sonst UPDATE!

  Alt 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
  Mit Zitat antworten Zitat