« powrót

T-SQL skrypt kadry [SQL]

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

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


/*
Kadry
*/
CREATE DATABASE Kadry
GO
USE Kadry
GO

/*
tworzenie tabel
*/
CREATE TABLE Pracownik
(
  id    INT IDENTITY (1, 1) NOT NULL PRIMARY KEY,
  imie  VARCHAR(30),
  nazwisko VARCHAR(30),
  adres VARCHAR(100)
)

CREATE TABLE Dzial
(
  kod VARCHAR(10),
  nazwa VARCHAR(40)
)

CREATE TABLE Umowa
(
  id    INT IDENTITY (1, 1) NOT NULL PRIMARY KEY,
  idPracownik INT,
  stanowisko VARCHAR(40),
  dzialKod VARCHAR(10),
  stawka MONEY DEFAULT 0,
  wymiarUrlopu INT DEFAULT 0 ,
  urlopWykorzystany INT DEFAULT 0
)

CREATE TABLE Wyplata
(
  idUmowa INT,
  rok INT,
  miesiac INT,
  brutto MONEY,
  podatek MONEY,
  netto MONEY
)

CREATE TABLE Urlop
(
  idUmowa INT,
  dataOd DATETIME,
  dataDo DATETIME,
  dni INT
)
GO

/*
Funkcja zwracajaca imie i nazwisko pracownika dla podanego id
*/
CREATE FUNCTION pracownikImieNazwisko(@idPracownik INT)
RETURNS VARCHAR(65)
AS
BEGIN
  DECLARE @imieNazwisko  VARCHAR(65)
  DECLARE @imie  VARCHAR(30)
  DECLARE @nazwisko  VARCHAR(30)

  SELECT @imie = imie, @nazwisko = nazwisko FROM Pracownik WHERE id = @idPracownik
  
  SET @imieNazwisko = @imie + ' ' + @nazwisko
  RETURN (@imieNazwisko)  
END
GO

/*
Funkcja obliczajace podatek wg stawki 19%
*/
CREATE FUNCTION obliczPodatek(@brutto MONEY)
RETURNS MONEY
AS
BEGIN
  DECLARE @podatek  MONEY
  
  SET @podatek = @brutto * 0.19

  RETURN (@podatek)  
END
GO

/*
procedura dodawania nowej umowy o prace
*/
CREATE PROCEDURE umowaDodaj
  @idPracownik INT,
  @stanowisko VARCHAR(40),
  @dzialKod VARCHAR(10),
  @stawka MONEY,
  @wymiarUrlopu INT
AS
BEGIN
  DECLARE @idUmowa INT
  
  INSERT INTO Umowa (idPracownik, stanowisko, dzialKod, stawka, wymiarUrlopu)
    VALUES (@idPracownik, @stanowisko, @dzialKod, @stawka, @wymiarUrlopu)

END
GO

/*
procedura dodania urlopu
*/
CREATE PROCEDURE urlopDodaj
  @idPracownik INT,
  @dataOd DATETIME,
  @dataDo DATETIME
AS
BEGIN

  DECLARE @idUmowa INT
  DECLARE @dni INT
  
  /* obliczenie ilosc dni urlopu */
  SET @dni = DATEDIFF(day, @dataOd, @dataDo) + 1
  
  BEGIN TRANSACTION
  
    /* znalezienie umowy dla danego pracownika */
    SELECT @idUmowa = id FROM Umowa WHERE idPracownik = @idPracownik

    IF ((@@ERROR = 0) AND ( @@ROWCOUNT > 0))
    BEGIN
      INSERT INTO Urlop (idUmowa, dataOd, dataDo, dni)
        VALUES (@idUmowa, @dataOd, @dataDo, @dni)

      IF ((@@ERROR = 0) AND ( @@ROWCOUNT > 0))
      BEGIN
        /* aktualizacja wykorzystanego urlopu */
        UPDATE Umowa SET urlopWykorzystany = urlopWykorzystany + @dni
         WHERE id = @idUmowa

        IF ((@@ERROR = 0) AND ( @@ROWCOUNT > 0))
        BEGIN
          COMMIT TRANSACTION
        END
        ELSE
        BEGIN
          ROLLBACK TRANSACTION
        END
      END
      ELSE
      BEGIN
        ROLLBACK TRANSACTION
      END
    END
END
GO

/*
procedura dodania wyplaty
*/
CREATE PROCEDURE wyplataDodaj
  @idPracownik INT,
  @rok INT,
  @miesiac INT
AS
BEGIN

  DECLARE @idUmowa INT
  DECLARE @brutto MONEY
  DECLARE @podatek MONEY
  DECLARE @netto MONEY
  
  BEGIN TRANSACTION
    /* wyszukanie id umowy dla danego pracownika oraz stawki*/
    SELECT @idUmowa = id, @brutto = stawka FROM Umowa WHERE idPracownik = @idPracownik

    IF ((@@ERROR = 0) AND ( @@ROWCOUNT > 0))
    BEGIN
      /* oblicznie podatku i netto */
      SET @podatek = dbo.obliczPodatek(@brutto)
      SET @netto = @brutto - @podatek
      
      INSERT INTO Wyplata (idUmowa, rok, miesiac, brutto, podatek, netto)
        VALUES (@idUmowa, @rok, @miesiac, @brutto, @podatek, @netto)

      IF ((@@ERROR = 0) AND ( @@ROWCOUNT > 0))
      BEGIN
        COMMIT TRANSACTION
      END
      ELSE
      BEGIN
        ROLLBACK TRANSACTION
      END
    END
END
GO

/*
  trigger kontrolujacy wykorzystanie urlopu
*/
CREATE TRIGGER urlopSprawdz
ON Umowa
AFTER UPDATE
AS
  DECLARE @pracownik VARCHAR(65)
  DECLARE @komunikat VARCHAR(100)
  
  /* czy ilosc urlopu nie przekroczyla wymiaru */
  SELECT @pracownik = dbo.pracownikImieNazwisko(idPracownik) FROM Umowa WHERE (urlopWykorzystany - wymiarUrlopu) > 0
  IF (@@ROWCOUNT > 0)
  BEGIN
    SET @komunikat = 'Przekroczony wymiar urlopu dla: ' + @pracownik
    RAISERROR(@komunikat, 16, 1)
    ROLLBACK TRANSACTION
  END
GO

/*
  widok z lista umow
*/
CREATE VIEW umowaLista
AS  
  SELECT
    dbo.pracownikImieNazwisko(Umowa.idPracownik) AS pracImNaz,
    Umowa.dzialKod,
    Umowa.Stawka,
    Umowa.wymiarUrlopu,
    Umowa.urlopWykorzystany,
    (Umowa.wymiarUrlopu - Umowa.urlopWykorzystany) AS urlopPozostaly
  FROM
    Umowa
GO

/*
  widok z lista wyplat
*/
CREATE VIEW wyplataLista
AS  
  SELECT
    dbo.pracownikImieNazwisko(Umowa.idPracownik) AS pracImNaz,
    Wyplata.rok,
    Wyplata.miesiac,
    Wyplata.brutto,
    Wyplata.podatek,
    Wyplata.netto
  FROM
    Wyplata, Umowa
  WHERE
    Wyplata.idUmowa = Umowa.id
GO

/*
  dodanie dzialow
*/
INSERT INTO Dzial VALUES ('IT', 'Dzial informatyki')
INSERT INTO Dzial VALUES ('HR', 'Dzial kadr')
GO

/*
  pracownikow
*/
INSERT INTO Pracownik (imie, nazwisko, adres) VALUES ('Jerzy', 'Malec', 'Radom')
INSERT INTO Pracownik (imie, nazwisko, adres) VALUES ('Jan', 'Mars', 'Pionki')
GO

/*
  dodanie umow o prace
*/
EXECUTE umowaDodaj 1, 'projektant', 'IT', 5000, 26
EXECUTE umowaDodaj 2, 'specjalista ds kadr', 'HR', 4000, 20
GO

/*
  dodanie urlopow
*/
EXECUTE urlopDodaj 2, '2008-01-05', '2008-01-20'
GO
-- przekorczenie wymiaru urlopu
EXECUTE urlopDodaj 2, '2008-02-10', '2008-02-20'
GO

/*
  dodanie wyplaty
*/

EXECUTE wyplataDodaj 1, 2008, 1
EXECUTE wyplataDodaj 2, 2008, 1
GO

SELECT * FROM umowaLista
SELECT * FROM wyplataLista
GO




Komentarze: