Einzelnen Beitrag anzeigen

Ferber

Registriert seit: 9. Mär 2005
Ort: Wien Umgebung
155 Beiträge
 
Delphi 2006 Architect
 
#6

Re: Und gleich nochmal MAX(), diesmal mit MSSQL.

  Alt 16. Jan 2006, 23:08
Hi !
Zitat von alzaimar:
Unabhängig davon ist es blasphemisch, die nächste Rechnungsnummer so zu erzeugen (finde ich). Denn der Server wird überflüssigerweise mit Arbeit zugeballert ...
Find' ich eigentlich nicht, denn das ist eine zentrale Angelegenheit, die den Client nichts angehen soll,
ausserdem sind's nur ~2000 Nummern pro Jahr.

Zitat von alzaimar:
nochwas:
select @Nummer = max (Nummer) from Nummern where Datum is null So würde ich das machen.
Das ist eine klare Formulierung.

Zwischenzeitlich folgendes:
SQL-Code:
Alter Procedure "NewAN" (@NewOnr int Output)
As
  IF EXISTS (Select MAX(Nummer) FROM dbo.AN where Datum is null)
    begin
       DECLARE @Datum DateTime
       select @Datum = cast(GetDate() as int)
       select @NewOnr = max (Nummer) from dbo.AN where Datum is null
       UPDATE dbo.AN SET Datum = @Datum where Nummer = @NewOnr
    end
SELECT * FROM dbo.AN where Nummer = @NewOnr
Fehlermeldung: Prozedur gibt keine Datensätz zurück.
Das Datum wird aber geändert.
Kommentiere ich die Zeile mit dem Update aus, werden Datensätze zurückgegeben.
Dann wird das Datum natürlich nicht geändert, soll aber.
Was mach ich nun schon wieder falsch!?

Letztstand:
SQL-Code:
Alter Procedure NewAN (@NewOnr int Output)
As
  declare @Datum DateTime
  declare @MaxDt DateTime

  select @Datum = cast(GetDate() as int) /* nur das Datum extrahieren, Uhrzeit killen */
  select @MaxDt = max(Datum) from dbo.AN /* grösstes Datum suchen */

  IF Year(@Datum)<>Year(@MaxDt) /* Jahressprung ? */
     begin
        SET @NewOnr=Year(@Datum)*10000+1 /* Erste Nummer des Jahres generieren, Format yy0001 */
        INSERT dbo.AN ("Nummer", "Datum") VALUES (@NewOnr, @Datum)
     end
  ELSE
    IF EXISTS (Select min(Nummer) FROM dbo.AN where Datum is null) /* Lücke vorhanden ? */
        begin
           select @NewOnr = min (Nummer) from dbo.AN where Datum is null /* Lücke auffüllen */
           UPDATE dbo.AN SET Datum = @Datum where Nummer = @NewOnr
        end
    else
       begin
          select @NewOnr = max (Nummer) from dbo.AN /* letzte Nummer */
          SET @NewOnr = @NewOnr + 1 /* incrementieren */
          INSERT dbo.AN ("Nummer", "Datum") VALUES (@NewOnr, @Datum)
       end

SELECT * FROM dbo.AN where Nummer = @NewOnr
Das UPDATE funktioniert, das INSERT nicht.
Gibt, nach wie vor, keine Datensätze zurück - is ja auch noch nix verändert worden.
Otto
  Mit Zitat antworten Zitat