wtorek, 21 czerwca 2011

Automatyczne numerowanie dokumentów.

Podczas pracy nad aplikacją stanąłem przed koniecznością wykonania numerowania dokumentów dodawanych do bazy.

Założeniem było, aby nr dokumentu był w takiej postaci DOK/2011/1.

W tym celu stworzyłem funkcję (uproszczona wersja):
 
CREATE FUNCTION Numerowanie(@id INT)
RETURNS VARCHAR(15)
AS
BEGIN

DECLARE @rok VARCHAR(8)
SET @rok = YEAR(GETDATE())

RETURN 'Dok' + @rok + '/' + CONVERT(VARCHAR(6), @id)
END
  
W tej wersji funkcja nie jest skomplikowana. Rok pobieramy z funkcji GETDATE() i dołączamy do tekstu 'DOK'. Do całości dołączamy numer kolejnego dokumentu, który uzyskujemy z pola IDENTITY. Dzięki użyciu pola IDENTITY mamy pewność że nie zostaną utworzone dwa dokumenty o tym samym numerze.

Funkcja zostaje wywołana w wyzwalaczu, który zostaje wykonany w momencie dodania nowego rekordu do tabeli Dokumenty.

CREATE TRIGGER Dokument_insert ON Dokumenty
AFTER INSERT AS
UPDATE
Dokumenty
SET
Dokumenty.NrDokumentu = dbo.Numerowanie(IdDokumentu)
FROM
Dokumenty
INNER JOIN
Inserted ON Dokumenty.IdDokumentu = inserted.IdDokumentu