« powrót

T-SQL skrypt firma [SQL]

Opublikowano: 2009-07-29 , wyświetlono: 7161

Skrypt T-SQLa tworzący obiekty w bazie danych i wykonujący kilka operacji testowych.


/*
baza: Firma
*/

CREATE DATABASE firma
GO
USE firma
GO

/*
tworzenie tabeli towar
*/
CREATE TABLE towar (
  id    int IDENTITY (1, 1) NOT NULL PRIMARY KEY,
  kod   varchar(20),
  nazwa varchar(50),
  cena  money
)

/*
tworzenie tabeli kontrahent
*/
CREATE TABLE kontrahent (
  id    int IDENTITY (1, 1) NOT NULL PRIMARY KEY,
  kod   varchar(20),
  nazwa varchar(50)
)

/*
tworzenie tabeli dokument
*/
CREATE TABLE dokument (
  id    int IDENTITY (1, 1) NOT NULL PRIMARY KEY,
  typ   char(2),
  numer int,
  data_wystawienia datetime DEFAULT getdate(),
  identyfikator varchar(20),
  id_firma  int,
  wartosc   money
)

/*
tworzenie tabeli dokument_pozycja
*/
CREATE TABLE dokument_pozycja (
  id    int IDENTITY (1, 1) NOT NULL PRIMARY KEY,
  id_dokument int,
  id_towar  int,
  ilosc   float,
  cena    money,
  wartosc money
)

/*
  tworzenie tabeli numer
*/
CREATE TABLE numer (
  typ char(2),
  numer int
)
GO

/*
  procedura dodajaca nowy towar
*/
CREATE PROCEDURE dodaj_towar
  @kod varchar(20),
  @nazwa varchar(50),
  @cena money
AS
BEGIN
  INSERT INTO towar
    (kod , nazwa , cena  )
    VALUES (@kod , @nazwa , @cena  )

  IF ((@@ERROR = 0) AND ( @@ROWCOUNT > 0))
  BEGIN
    RETURN (@@IDENTITY)
  END
  ELSE
  BEGIN
    RETURN(0)
  END
END
GO

/*
  procedura dodajaca nowego kontrahenta
*/
CREATE PROCEDURE dodaj_kontrahent
  @kod varchar(20),
  @nazwa varchar(50)
AS
BEGIN
  INSERT INTO kontrahent
    (kod , nazwa)
    VALUES (@kod , @nazwa)

  IF ((@@ERROR = 0) AND ( @@ROWCOUNT > 0))
  BEGIN
    RETURN (@@IDENTITY)
  END
  ELSE
  BEGIN
    RETURN(0)
  END
END

GO

/*
  procedura dodajaca naglowek dokumentu
*/
CREATE PROCEDURE dodaj_dokument
  @typ char(2),
  @kod_kt varchar(20)
AS
BEGIN

  DECLARE @id_kt int
  DECLARE @numer int
  
  /* pobranie biezacego numeru */
  SELECT @numer = numer FROM numer WHERE typ = @typ

  /* aktualizacja numeracji */
  UPDATE numer SET numer = numer + 1 WHERE typ = @typ

  /* pobranie id firmy */
  SELECT @id_kt = id FROM kontrahent WHERE kod = @kod_kt

  INSERT INTO dokument (typ, numer, data_wystawienia, identyfikator, id_firma, wartosc)
    VALUES (@typ, @numer, getdate(), dbo.utworz_identyfikator(@typ), @id_kt, 0.0)
    
  IF ((@@ERROR = 0) AND ( @@ROWCOUNT > 0))
  BEGIN
    RETURN (@@IDENTITY)
  END
  ELSE
  BEGIN
    RETURN(0)
  END    
END

GO

/*
  procedura dodajaca nowego pozycje dokumentu
*/
CREATE PROCEDURE dodaj_dokument_pozycja
  @id_dokument int,
  @kod int,
  @ilosc float
AS
BEGIN

  DECLARE @cena money
  DECLARE @wartosc money
  DECLARE @id_towar int
  
  /* pobranie ceny i id towaru*/
  SELECT @cena = cena FROM towar WHERE kod = @kod
  SELECT @id_towar = id FROM towar WHERE kod = @kod
  
  SET @wartosc = @ilosc * @cena

  INSERT INTO dokument_pozycja (id_dokument, id_towar, ilosc, cena, wartosc)
    VALUES (@id_dokument, @id_towar, @ilosc, @cena, @wartosc)
END

GO

/*
utworzenie widoku do przegladania dokumentow
*/
CREATE VIEW lista_dokument
AS  
    SELECT
      dokument.data_wystawienia,
      dokument.identyfikator,
      kontrahent.nazwa,
      dokument.wartosc
    FROM
      dokument, kontrahent
    WHERE dokument.id_firma = kontrahent.id
     
GO

/*
utworzenie widoku do przegladania pozycji
*/
CREATE VIEW lista_pozycja
AS  
    SELECT
      towar.nazwa,
      dokument_pozycja.cena,
      dokument_pozycja.ilosc,
      dokument_pozycja.wartosc
    FROM
      dokument_pozycja, towar
    WHERE dokument_pozycja.id_towar = towar.id
     
GO
/*
utworzenie widoku z biezaca data, by mozna bylo uzyc go w funkcji tworzenia identyfikatora
getdate() nie mozna
*/
CREATE VIEW biezaca_data
AS  
    SELECT bdata = GETDATE() 
GO

/* dodanie danych do tabel */

EXEC dodaj_towar '0001', 'napoj gazowany 1l.', 2.50
EXEC dodaj_towar '0002', 'czekolada mleczna', 4.50
EXEC dodaj_towar '0003', 'sok pomaranczowy', 3.90
GO

EXEC dodaj_kontrahent '0001', 'Firma Handlowa ALA'
EXEC dodaj_kontrahent '0002', 'Firma Handlowa OLA'
GO

INSERT INTO numer VALUES ('FV', 1)
INSERT INTO numer VALUES ('PA', 1)
INSERT INTO numer VALUES ('FZ', 1)
GO

/*
funkcja zwracajaca biezacy numer dokumentu jako znakowy identyfikator
w formacie numer/rok
*/
CREATE FUNCTION utworz_identyfikator (@typ char(2))
RETURNS varchar(20)
AS
BEGIN
  DECLARE @numer int
  DECLARE @identyfikator varchar(20)
  DECLARE @rok as int
  DECLARE @data_biezaca datetime
  
  SELECT @data_biezaca = bdata FROM biezaca_data
  SET @rok = DATEPART(year, @data_biezaca)
  
  SELECT @numer = numer FROM numer WHERE typ = @typ
  
  /* utworzeniu identyfikatora */
  SET @identyfikator = CAST(@numer AS varchar(15)) + '/' + CAST(@rok AS char(4))

  -- SELECT @pelny_nr
  RETURN (@identyfikator)  
END
GO

/*
  trigger przy usuwaniu dokumentu usuwa rowniez nalezace do niego pozycje
*/

CREATE TRIGGER usun_pozycje
ON dokument
FOR DELETE
AS
  DELETE FROM dokument_pozycja WHERE id_dokument = (SELECT id FROM Deleted)
GO

/*
  dodanie dokumentu FV jako transakcja
*/

  BEGIN TRANSACTION

  DECLARE @numer int
  DECLARE @id int
  DECLARE @wart_dok money
  
  EXEC @id = dodaj_dokument 'FV', '0001'

  IF (( @@ERROR > 0 ) AND ( @@ROWCOUNT = 0))
  BEGIN
    GOTO on_error
  END
  
  /* dodanie pozycji */
  EXEC dodaj_dokument_pozycja @id, 1, 5
  IF (( @@ERROR > 0 ) AND ( @@ROWCOUNT = 0))
  BEGIN
    GOTO on_error
  END
  /* dodanie pozycji */
  EXEC dodaj_dokument_pozycja @id, 2, 3
  IF (( @@ERROR > 0 ) AND ( @@ROWCOUNT = 0))
  BEGIN
    GOTO on_error
  END
  /* dodanie pozycji */
  EXEC dodaj_dokument_pozycja @id, 3, 12
  IF (( @@ERROR > 0 ) AND ( @@ROWCOUNT = 0))
  BEGIN
    GOTO on_error
  END

  /* aktualizacja wartosci dokumentu */
  SELECT @wart_dok = SUM(wartosc) FROM dokument_pozycja WHERE id_dokument = @id
  IF (( @@ERROR > 0 ) AND ( @@ROWCOUNT = 0))
  BEGIN
    GOTO on_error
  END

  UPDATE dokument SET wartosc = @wart_dok WHERE id = @id
  IF (( @@ERROR > 0 ) AND ( @@ROWCOUNT = 0))
  BEGIN
    GOTO on_error
  END
  
  COMMIT TRANSACTION
  GOTO on_fine

on_error:

  ROLLBACK TRANSACTION

on_fine:

  PRINT 'dokument dodany'
  
  


Komentarze: