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.