Configurarea Bazei de Date Ms Sql Manager de Locatii

Configurarea bazei de date MS SQL

Manager de locații

Cuprins

Introducere

Capitolul I. Elemente de MS SQL utilizate la elaborarea aplicației

I.1. MS SQL Express LocalDB
I.2. Operații MS SQL
I.2.1.Tabele
I.2.1.1. Crearea unui tabel
I.2.1.2. Modificarea unui tabel
I.2.1.3. Ștergerea unui tabel
I.2.2 Vizualizari
I.2.2.1. Crearea unei vizualizări
I.2.2.2. Modificarea unei vizualizări
I.2.2.3. Ștergerea unei vizualizări
I.2.3 Functii
I.2.2.1. Crearea unei funcții „table-valued
I.2.2.2. Crearea unei funcții „scalar-valued
I.2.4 Proceduri stocate
I.2.4.1. Crearea unei proceduri stocate
I.2.4.2. Modificarea unei proceduri stocate
I.2.4.2. Ștergerea unei proceduri stocate

Capitolul II. Controale DevExpress utilizate la elaborarea aplicației
II.1. Prezentare generala

II 2. Controale Devexpress

Capitolul III. Aplicație interfața grafică
III.1. Descriere aplicație interfața grafică

III 2. Membri
III.2.1. Adăugarea unui membru nou

III.2.2. Modificarea unui membru existent

III.2.2. Ștergerea unui membru

III.3. cărți

III.3.1. Adăugarea unei cărți noi

III.3.1. Modificare datelor unei cărți existente

III.3.1. Ștergerea unei cărți

III.4. Dulapuri

III.4.1. Adăugarea unui dulap nou

III.4.2. Ștergerea unui dulap

Capitolul IV.

Aplicație baza de date

IV.1. Preluarea informațiilor

IV.2. Introducerea de noi informații si modificarea informațiilor existente

Concluzii (eventual propuneri

Bibliografie

Anexe (figuri, tabele, poze, etc

Introducere

Majoritatea bibliotecilor fizice care stochează materiale „media” precum cărți, articole, filme, etc, adera mai mult sau mai puțin unora dintre legile sistemului Dewey Decimal System[1], in folosirea metodelor de etichetare, stocare, identificare si recuperare a materialelor stocate folosind identificatori unici.

Folosirea acestor sisteme au forțat bibliotecarii sa dezvolte un set de sisteme care sa-i ajute atât pe bibliotecari cat si pe cei care folosesc bibliotecile. Bineînțeles, timpurile sau schimbat si sistemele au devenit digitale. Eu am încercat sa pun in practica aceste concepte prin implementărea unui sistem informatic(digital) de gestiune a unei biblioteci.

Programul pe care l-am creat țintește bibliotecile de orice mărime având o scalabilitate foarte flexibila prin modulele separate de creare a spatiilor de stocare (dulapuri) de orice mărime, adăugare de membri, adăugare de cărți si de asocierea cărților cu membri selectați.

Capitolul I.

Elemente de MS SQL utilizate la elaborarea aplicației

Bazele de date sunt programe care înmagazinează datele unei aplicații pentru a fi accesate ori de cate ori aplicația rulează si pot fi formate dintr-un fișier sau mai multe fișiere.

SQL (Structured Query Language) este un limbaj de programare a bazelor de date universal care este utilizat pentru a crea, interoga, actualiza și configura bazele de date relaționale. SQL este simplu si accesibil, dar în același timp poate oferi si facilități deosebit de complexe. Este un limbaj non-procedural, adică se specifică ce informație este solicitată, dar nu modul cum se obține această informație. SQL poate fi utilizat autonom sau prin crearea de comenzi într-un limbaj de programare.

În SQL sunt trei feluri de comenzi:

Comenzi pentru definirea datelor

Comenzi pentru manipularea datelor

Comenzi pentru controlul datelor

Tipuri de date

Principale tipuri de date se regăsesc în următoarele categorii :

date sir ( CHAR , VARCHAR, NVARCHAR, TEXT ),

date numerice (DECIMAL, FLOAT, INT, BIGINT ),

date data/ora ( DATE, DATETIME, TIME )

date binare ( BINARY, VARBINARY ).

Datele de tip șir pot fi limitate la o anumită lungime maximă.

In cazul tipurilor de date sir unde lungimea este nelimitata se folosește tipul TEXT.

Din motive de performanta este recomandat să se folosească tipul care oferă facilitățile cele mai apropiate de cele dorite.

Nu ar fi o alegere buna sa se folosească tipul TEXT pentru a stoca numele unei persoane.

I.1. MS SQL Express LocalDB

Versiunea Microsoft SQL Express LocalDB a fost creata special pentru dezvoltatorii de software pentru a dezvolta soft-uri care nu necesita instalarea, configurarea si întreținerea unui Server SQL. Este foarte ușor de instalat si oferă același limbaj de programare si conectivitate locala ca si un Server SQL express.

LocalDB are următoarele principale proprietăți:

Folosește același proces (sqlserv.exe) ca un Server SQL, deci aplicația care folosește o baza de date SQL poate foarte simplu de la conectarea la un SQL Server la LocalDB doar prin schimbarea string-ului de conectivitate in fișierul de configurare al aplicației.

Se instalează doar odată pe un computer si mai multe aplicații pot începe mai multe procese LocalDB.

Nu creează nici un serviciu care sa ruleze in fundal, iar procesele LocalDB sunt chemate când se pornește aplicația care le folosește si oprite automatic când aplicația este închisa.

La fel ca instanțele unui SQL Server, se poate accesa folosind Microsoft SQL Management Studio de unde se poate crea noi baze de date sau aduce modificări unei baze de date existente.

I.2. Operații MS SQL

I.2.1. Tabele

Orice bază de date conține tabele. De asemenea fiecare tabel este conține mai multe coloane care sunt identificate printr-un nume unic în tabel. Fiecare coloana conține informații in formatul de tip de date specificat când s-a creat coloana. Fiecare tabela are o cheie primara prin care se specifica pentru a se identifica corect informațiile dintr-o tabela. Cheile primare trebuie sa conțină valori unice si nu pot conține valori nule. O tabela nu poate avea mai mult de o cheie primara.
De asemenea, o tabela poate avea una sau mai multe chei externe pentru a indica spre chei primare din alte tabele.

I.2.1.1. Crearea unui tabel

Pentru a crea un tabel, utilizatorul trebuie să aibă acest privilegiu și să dispună de spațiul de memorie în care să creeze obiectul. Când se creează un tabel trebuie specificat numele tabelului, numele coloanelor care vor fi parte din acest tabel, si tipul de date a fiecărei coloane. De asemenea se poate specifica o cheie primara si eventualele chei externe.

Exemplu:

CREATE TABLE [dbo].[TBL_BOOKS](

[BOOK_ID] [bigint] IDENTITY(1,1) NOT NULL,

[CONTACT_ID] [bigint] NOT NULL,

[BOOK_NAME] [nvarchar](50) NULL,

[AUTHOR_CONTACT_ID] [bigint] NULL,

[BOOK_PAGES] [int] NULL,

[BOOK_RELEASE_DATE] [date] NULL,

[BOOK_OBS] [nvarchar](4000) NULL,

[COPIES] [int] NULL,

[INS_DT] [datetime] NULL,

[UP_DT] [datetime] NULL,

[RACK_LOCATION_ID] [bigint] NULL,

CONSTRAINT [PK_TBL_BOOKS] PRIMARY KEY CLUSTERED

( [BOOK_ID] ASC)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]) ON [PRIMARY]

GO

ALTER TABLE [dbo].[TBL_BOOKS] WITH CHECK ADD CONSTRAINT [FK_TBL_BOOKS_TBL_RACK_LOCATIONS] FOREIGN KEY([RACK_LOCATION_ID])

REFERENCES [dbo].[TBL_RACK_LOCATIONS] ([RACK_LOCATION_ID])

GO

ALTER TABLE [dbo].[TBL_BOOKS] CHECK CONSTRAINT [FK_TBL_BOOKS_TBL_RACK_LOCATIONS]

GO

I.2.1.2. Modificarea unui tabel

Comanda folosita care realizează modificări ale structurii tabelului la nivel de coloană sau la nivel de tabel, dar nu modificarea datelor din acest tabel, este ALTER TABLE.

Principalele cazuri in care comanda ALTER TABLE se folosește sunt:

adăugarea de coloane, chei sau constrângeri într-un tabel existent (ADD)

specificarea unei valori implicite la o coloană din tabelul in cauza (DEFAULT)

ștergerea unei coloane existente (DROP)

Exemplu:

ALTER TABLE [dbo].[TBL_BOOKS]

ADD BOOK_NAME NVARCHAR(50)

ALTER COLUMN BOOK_NAME TEXT

DROP COLUMN BOOK_NAME

Observații

Schimbarea unei coloane din NULL în NOT NULL nu se poate face dacă fiecare linie a coloanei respective nu conține o valoare.

I.2.1.3. Ștergerea unui tabel

Ștergerea unui tabel implica:

ștergerea definiției din dicționarul datelor;

ștergerea indecșilor asociați acestuia;

recuperarea spațiului alocat tabelului;

invalidarea vizualizărilor, procedurilor si funcțiilor, care folosesc tabelul in cauza.

Ștergerea unui tabel este o acțiune ireversibilă. Când un tabel este suprimat informațiile nu mai pot fi recuperate daca nu exista o copie de rezerva, nici măcar folosind comanda ROLLBACK.

Exemplu:

DROP TABLE [dbo].[TBL_BOOKS]

I.2.2. Vizualizări

In teoria bazelor de date, o vizualizare este tabel virtual care conține una sau mai multe tabele, sau părți a acestora pe care utilizatori bazei de date o pot folosi pentru interogare la fel cum ar interoga direct acele tabele.

Avantajele folosiri vizualizărilor in comparație cu folosirea directa a tabelelor sunt:

O mai buna securizare a bazei de date

simplificarea interogării mai multor tabele deodată

asigurarea independenței informațiilor

Informațiile pot fi prezentate deja calculate după necesități

restricționarea accesului la baza de date

Ocupa puțin spațiu

I.2.2.1. Crearea unei vizualizări

Exemplu:

CREATE VIEW [dbo].[View_Books]

AS

SELECT BOOK_ID,

CONTACT_ID,

BOOK_NAME,

AUTHOR_CONTACT_ID,

BOOK_PAGES,

BOOK_RELEASE_DATE,

BOOK_OBS,

COPIES,

INS_DT,

UP_DT,

RACK_LOCATION_ID

FROM dbo.TBL_BOOKS

Observații

Numărul coloanelor specificate în definiția vizualizării trebuie să fie egal cu cel din lista comenzii SELECT.

I.2.2.2. Modificarea unei Vizualizări

Exemplu:

ALTER VIEW [dbo].[View_Books]

AS

SELECT BOOK_ID,

CONTACT_ID,

BOOK_NAME,

AUTHOR_CONTACT_ID,

BOOK_PAGES,

BOOK_RELEASE_DATE,

BOOK_OBS,

COPIES,

RACK_LOCATION_ID

FROM dbo.TBL_BOOKS

Modificarea unui vizualizări are următoarele efecte:

definiția vizualizării este actualizată;

nici o tabela nu este afectata

toate restricțiile care existau în vizualizarea originală sunt distruse;

I.2.2.3. Ștergerea unei Vizualizări

Exemplu:

DROP VIEW [dbo].[View_Books]

Observații

Ștergerea vizualizării nu va afecta tabelele din care a fost definită vizualizarea.

Aplicațiile și vizualizările care se folosesc de vizualizarea ștearsa nu vor mai funcționa.

I.2.3. Funcții

SQL Server Express LocalDB suportă două feluri de funcții:

Funcțiile incorporate care nu se pot modifica precum funcțiile agregate

Funcțiile predefinite de utilizator precum funcțiile

„table-valued functions” care returnează o tabelă virtuala care sunt o puternica alternativa a vizualizărilor

„scalar valued functions” care conțin cod pentru a putea fi refolosit si care returnează o variabila.

I.2.3.1 Crearea unei funcții „table-valued”

Exemplu:

CREATE FUNCTION [dbo].[fnt_Get_Books]()

RETURNS

TABLE

As

RETURN

(select b.BOOK_ID,

b.BOOK_NAME,

b.BOOK_OBS,

b.BOOK_PAGES,

b.BOOK_RELEASE_DATE,

b.COPIES,

b.CONTACT_ID,

b.AUTHOR_CONTACT_ID,

b.INS_DT,

b.UP_DT,

a.AUTHOR_NAME,

r.RACK_NAME,

r.CONTACT_ID as RACK_CONTACT_ID,

rl.RACK_LOCATION_ID,

isnull(rl.RACK_VERTICAL_LOCATION,0) as RACK_VERTICAL_LOCATION,

isnull(rl.RACK_HORIZONTAL_LOCATION,0) as RACK_HORIZONTAL_LOCATION

from TBL_BOOKS as b

left outer join TBL_AUTHORS as a on a.CONTACT_ID = b.AUTHOR_CONTACT_ID

left outer join TBL_RACK_LOCATIONS as rl on rl.RACK_LOCATION_ID = b.RACK_LOCATION_ID

left outer join TBL_RACKS as r on r.RACK_ID = rl.RACK_ID)

I.2.3.2 Crearea unei funcții „scalar-valued”

CREATE FUNCTION [dbo].[fn_CheckAuthorIsUsed] (@p_AUTHOR_CONTACT_ID bigint)

RETURNS int

AS

BEGIN

declare @Ret int

if(SELECT COUNT(1) FROM TBL_BOOKS WHERE AUTHOR_CONTACT_ID = @p_AUTHOR_CONTACT_ID) > 0

begin

set @Ret = 1

end

else

begin

set @Ret = 0

end

return @Ret

END

I.2.4. Proceduri stocate

Procedurile stocate sunt un set de instrucții grupate pentru a efectua anumite sarcini
Beneficiile folosiri procedurilor stocate sunt:

Reduce cantitatea de informație trimisa către baza de date

Compilația este necesara doar când procedura stocata este creata

Odată compilata poate fi folosita de mai mulți clienți

O mai buna securizare a bazei de date

I.2.4.1 Crearea unei proceduri stocate

Exemplu:
CREATE PROCEDURE [dbo].[sp_Book_Insert]

(

@p_BOOK_NAME nvarchar (50),

@p_AUTHOR_CONTACT_ID bigint,

@p_BOOK_PAGES int,

@p_BOOK_RELEASE_DATE date,

@p_BOOK_OBS nvarchar (4000),

@p_COPIES int,

@p_RACK_LOCATION_ID bigint

)

AS

–insert the new book

insert into TBL_BOOKS

(BOOK_NAME,AUTHOR_CONTACT_ID,BOOK_PAGES,BOOK_RELEASE_DATE,

BOOK_OBS,COPIES,CONTACT_ID,INS_DT,UP_DT,RACK_LOCATION_ID)

values (@p_BOOK_NAME, @p_AUTHOR_CONTACT_ID, @p_BOOK_PAGES, @p_BOOK_RELEASE_DATE, @p_BOOK_OBS, @p_COPIES, @ContactId, @TodayDate, @TodayDate,@p_RACK_LOCATION_ID)

I.2.4.2 Modificarea unei proceduri stocate

Exemplu:
ALTER PROCEDURE [dbo].[sp_Book_Insert]

(

@p_BOOK_NAME nvarchar (50),

@p_AUTHOR_CONTACT_ID bigint,

@p_BOOK_PAGES int,

@p_BOOK_OBS nvarchar (4000),

@p_COPIES int,

@p_RACK_LOCATION_ID bigint

)

AS

–insert the new book

insert into TBL_BOOKS

(BOOK_NAME,AUTHOR_CONTACT_ID,BOOK_PAGES ,

BOOK_OBS,COPIES,CONTACT_ID,INS_DT,UP_DT,RACK_LOCATION_ID)

values (@p_BOOK_NAME, @p_AUTHOR_CONTACT_ID, @p_BOOK_PAGES, @p_BOOK_OBS, @p_COPIES, @ContactId, @TodayDate, @TodayDate,@p_RACK_LOCATION_ID)

I.2.4.3 Ștergerea unei proceduri stocate

Exemplu:

DROP PROCEDURE [dbo].[sp_Book_Insert]

Capitolul II.

Controale DevExpress utilizate la elaborarea aplicatiei

II.1. Prezentare generala

Pentru o experiență mai bogata si un design mai frumos, am folosit controalele găsite in librăriile puse la dispoziție de către firma DevExpress[2] , firma de talie mondiala si cu o lunga experiență in domeniul creări de module pentru a le pune la dispoziție programatorilor de pretutindeni.

II.2. Controale DevExpress

Cele mai importante module folosite in aplicația in cauza sunt:

Data Grid care este un puternic control pentru a afișa si administra un set de date cu multe caracteristici care deservesc utilizatorului precum căutare, sortare etc.

NavBar Menu este un control de meniu care afișează link-uri sortate in grupuri care pot fi extinse sau contracta pentru a ascunde sau afișa link-urile acestor grupuri

ValidationProvider este un component care permite programatorului sa seteze diferite reguli pentru a le putea asocia cu diferite controale ale aplicației.

Capitolul III.

Aplicație interfața grafică

III.1. Descriere aplicație interfața grafică

Aplicația pe care am creat-o este un manager de locații care in acest caz am personalizat-o pentru a fi folosita de către o biblioteca non-profit intr-un mod simplu si rapid.

Conține trei module:

Membri,

Cărti

Dulapuri

Pentru a stoca informațiile, se folosește baza de date Microsoft SQL Express LocalDB

Pornirea aplicației se face accesând iconița prin dublu-click.

Închiderea aplicației se face prin un singur click pe butonul „Închide” din meniu.

Observații

Unele din câmpurile ferestrelor-dialog in aceasta aplicație sunt obligatorii. De exemplu in acest caz daca nu se completează numele membrului se va atenționa utilizatorul când va încerca sa salveze datele.

III.2. Membri

La pornirea aplicației primul modul vizibil este cel al membrilor bibliotecii (Vezi fig. 1)

Figura 1

Acest modul fiind accesat, observam ca butonul „Membri” devine inaccesibil in grupul „Vederi” al meniului din stânga aplicației in timp ce celelalte butoane din acest grup sunt accesibile, iar in grupul „Acțiuni” sunt vizibile doar butoanele care au legătura cu acest modul. In tabelul „Lista Membri” sunt afișați toți membri bibliotecii iar in gridul „Cărți Membru” sunt listate toate cărțile pe care membrul selectat in primul Grid le-a preluat din aceasta biblioteca. La selectarea altui membru lista de cărți se va actualiza in funcție de situația membrului nou selectat.

Pentru a asocia o carte noua, trebuie selectat membrul in cauza si la apăsarea butonului „Asociază carte” se va deschide o fereastra dialog cu toate cărțile disponibile in aceasta biblioteca (vezi figura2).

Figura 2

Observații

Daca o carte care a fost introdusa cu un număr de 5 exemplare, si a fost deja asociata cu cinci membri, nu va mai fi listata in fereastra-dialog „Lista Cărți”.

III.2.1. Adăugarea unui membru nou

Pentru a adăuga un membru nou se apasă pe butonul „Adaugă Membru” care va deschide o fereastra dialog pentru a specifica datele personale ala noului membru (Vezi figura 3).

Figura 3

III.2.2. Modificarea unui membru existent

Pentru a modifica datele unui membru existent, trebuie selectat din lista de membri si se poate apasă butonul „Modifica Detalii Membru” sau se da dublu-click pe membrul respectiv in lista de membri care va deschide o fereastra dialog cu datele personale ala membru încărcate (Vezi figura 4).

Figura 4

După ce au fost făcute modificările dorite se apasă butonul „Salvează”.

III.2.2. Ștergerea unui membru

Pentru a șterge un membru, trebuie selectat in lista de membri si apoi se poate apasă buton „Șterge Membru” sau se poate apasă tasta „Delete” de pe tastatura calculatorului si o fereastra-dialog va apărea cerându-va sa confirmați ștergerea membrului (Vezi figura 5).

Figura 5

Observații

Daca la membrul care se dorește a fi stres sunt cărți asociate, ștergerea nu va putea fi făcută. Vor trebuie dezasociate toate cărțile, după care ștergerea se poate face (vezi figura 6).

Figura 6

III.3. cărți

Figura 7

Acest modul fiind accesat, observam ca butonul „cărți” devine inaccesibil in grupul „Vederi” al meniului din stânga aplicației in timp ce celelalte butoane din acest grup devin accesibile, iar in grupul „Acțiuni” sunt vizibile doar butoanele care au legătura cu acest modul. In gridul „Lista cărți” sunt afișate toate cărțile bibliotecii (vezi figura 7).

III.3.1. Adăugarea unei cărți noi

Pentru a adăuga o carte noua se apasă pe butonul „Adaugă Carte” care va deschide o fereastra dialog pentru a specifica detaliile noi cărți (Vezi figura 8).

Figura 8

După ce au fost făcute modificările dorite se apasă butonul „Salvează”.

III.3.1. Modificare datelor unei cărți existente

Pentru a modifica datele unui cărți existente, trebuie selectata din lista de cărți si se poate apasă butonul „Modifica Detalii Carte” sau se da dublu-click pe cartea respectiva in lista de cărți care va deschide o fereastra dialog cu datele cârtii încărcate (Vezi figura 9).

Figura 9

După ce au fost făcute modificările dorite se apasă butonul „Salvează”.

III.3.1. Ștergerea unei cărți

Pentru a șterge o carte, trebuie selectata in lista de cărți si apoi se poate apasă butonul „Șterge Carte” sau se poate apasă tasta „Delete” de pe tastatura calculatorului si o fereastra-dialog va apărea cerând-va sa confirmați ștergerea cărții (Vezi figura10).

Figura 10

Observații

Daca cartea care se dorește a fi ștearsa este asociata cu cel puțin un membru, ștergerea nu va putea fi făcută. Va trebui dezasociată de la toți membri, după care ștergerea se poate face (vezi figura 11).

Figura 11

III.4. Dulapuri

Figura 12

Acest modul fiind accesat, observam ca butonul „Dulapuri” devine inaccesibil in grupul „Vederi” al meniului din stânga aplicației in timp ce celelalte butoane din acest grup devin accesibile, iar in grupul „Acțiuni” sunt vizibile doar butoanele care au legătura cu acest modul. In gridul „Lista Dulapuri” sunt afișate toate dulapurile bibliotecii (vezi figura 12). In gridul „Detalii Dulap” este afișat dulapul selectat într-un mod ușor interpretabil pentru utilizator. Se pot vedea numărul de rafturi si numărul de locații orizontale, de asemenea se poate observa care locații sunt disponibile si care sunt. La selectarea altui dulap lista de dulapuri se va actualiza in funcție de detaliile dulapului selectat.

III.4.1. Adăugarea unui dulap nou

Pentru a adăuga un dulap nou se apasă pe butonul „Adaugă Dulap” care va deschide o fereastra dialog pentru a specifica detaliile noului dulap(Vezi figura 13).

Figura 13

După ce au fost făcute modificările dorite se apasă butonul „Salvează”.

III.4.2. Ștergerea unui dulap

Pentru a șterge un dulap, trebuie selectat in lista de dulapuri si apoi se poate apasă butonul „Șterge Dulap” sau se poate apasă tasta „Delete” de pe tastatura calculatorului si o fereastra-dialog va apărea cerându-va sa confirmați ștergerea cărții (Vezi figura14).

Figura 14

Observații

Daca dulapul care se dorește a fi șters are cel puțin o locație ocupata ștergerea nu va putea fi făcută. Vor trebui mutate toate cărțile din acest dulap într-un alt, după care ștergerea se poate face
(vezi figura 15).

Figura 15

Capitolul IV.

Aplicație baza de date

I acest capitol voi explica felul in care interacționează partea de interfața grafica a aplicației cu baza de date pentru a prelua si introduce datele necesare.

Conectarea interfeței grafice la baza de date se face prin specificarea „string-ului” de conectivitate specificat in fișierul de configurație al aplicației (app.config).

Exemplu:

<?xml version="1.0" encoding="utf-8" ?>

<configuration>

<configSections>

</configSections>

<connectionStrings>

<add name="LCM_Base.Properties.Settings.lcm_baseConnectionString"

connectionString="Data Source=(LocalDB)\MSSQLLocalDB; Initial Catalog=lcm_base;Integrated Security=True"

providerName="System.Data.SqlClient" />

</connectionStrings>

<startup>

<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/>

</startup>

</configuration>

In proiectul de dezvoltare a interfeței grafice am adăugat o clasa „Linq to SQL” care se poate folosii pentru a specifica care elemente SQL doresc sa folosesc din baza de date si in ce împrejurări (vezi figura 16).

In toata aplicația folosesc următoarea proprietate pentru a crea conecția la baza de date:

static DataClassesBaseDataContext m_DbConnect;

public static DataClassesBaseDataContext Prop_DbConnect

{

get

{

if (m_DbConnect == null)

m_DbConnect = new DataClassesBaseDataContext();

return m_DbConnect;

}

}

IV.1. Preluarea informațiilor

Procesul de preluare a informațiilor din tabelele bazei de date pornește din partea de interfața unde codul de execuție a unei acțiuni se conectează la baza de date accesând o funcție „table-valued” care returnează un set de date pe care le afișează in tabelul respectiv

Exemplu:

Pentru a afișa toate cărțile bibliotecii, pe încărcarea ferestrei respective se executa următorul cod:

fntGetBooksResultBindingSource.DataSource = ConnectToDB.Prop_DbConnect.fnt_Get_Books();

Din acest cod rezulta ca in baza de date se executa functia “fnt_Get_Books()” care la randul ei contine urmatorul cod:

RETURNS

TABLE

As

RETURN

(select b.BOOK_ID,

b.BOOK_NAME,

b.BOOK_OBS,

b.BOOK_PAGES,

b.BOOK_RELEASE_DATE,

b.COPIES,

b.CONTACT_ID,

b.AUTHOR_CONTACT_ID,

b.INS_DT,

b.UP_DT,

a.AUTHOR_NAME,

r.RACK_NAME,

r.CONTACT_ID as RACK_CONTACT_ID,

rl.RACK_LOCATION_ID,

isnull(rl.RACK_VERTICAL_LOCATION,0) as RACK_VERTICAL_LOCATION,

isnull(rl.RACK_HORIZONTAL_LOCATION,0) as RACK_HORIZONTAL_LOCATION

from TBL_BOOKS as b

left outer join TBL_AUTHORS as a on a.CONTACT_ID = b.AUTHOR_CONTACT_ID

left outer join TBL_RACK_LOCATIONS as rl on rl.RACK_LOCATION_ID = b.RACK_LOCATION_ID

left outer join TBL_RACKS as r on r.RACK_ID = rl.RACK_ID)

Aceasta funcție va returna o tabela virtuala cu un set de date care va fi interpretat de către tabelul căruia ii sunt trimise aceste date si le va afișa într-un mod ușor de înțeles de către utilizator.

In acest mod se preia si datele modulelor „Cărți” si „Dulapuri”

IV.2. Introducerea de noi informații si modificarea informațiilor existente

Procesul de introducere sau modificare a informațiilor din tabelele bazei de date pornește din partea de interfața unde codul de execuție a unei acțiuni se conectează la baza de date accesând o procedura stocata care executa un set de instrucțiuni in baza de date.

Exemplu:

Pentru a șterge o carte din baza de date, pe eventul de click al butonului „Șterge Carte” se executa următorul cod:

ConnectToDB.Prop_DbConnect.sp_Book_Delete(lBookContactId);

Din acest cod rezulta ca in baza de date se executa procedura stocata sp_Book_Delete(lBookContactId) cu nevoia de a specifica un parametru pentru a se indentifica care carte sa se stearga si care la randul ei contine urmatorul cod:

PROCEDURE [dbo].[sp_Book_Delete] (@p_CONTACT_ID bigint)

AS

begin try

declare @transOpen int

set @transOpen = 0

if @@TRANCOUNT = 0

begin

set @transOpen = 1

begin transaction

end

declare @TblLinkIdTmp table (rack_location_id bigint)

declare @RackLocationId bigint

delete from TBL_BOOKS

output deleted.RACK_LOCATION_ID into @TblLinkIdTmp

where CONTACT_ID = @p_CONTACT_ID

select @RackLocationId = rack_location_id

from @TblLinkIdTmp

update TBL_RACK_LOCATIONS

set IS_USED = 0

where RACK_LOCATION_ID = @RackLocationId

exec sp_Contact_Id_Delete @p_CONTACT_ID

commit;

end try

begin CATCH

if @transOpen = 1

rollback;

end CATCH

Pentru a introduce o carte noua in baza de date, pe eventul de click al butonului „Salvează” de pe fereastra „Adaugă Carte Noua” se executa următorul cod:

ConnectToDB.Prop_DbConnect.sp_Book_Insert(dlg.Prop_BookName, dlg.Prop_AuthorId,dlg.Prop_BookPages,dlg.Prop_ReleaseDate, dlg.Prop_BookObs, dlg.Prop_BookCopies, dlg.Prop_RackLocationId;

Din acest cod rezulta ca in baza de date se executa procedura stocata sp_Book_Insert()cu nevoia de a specifica parametrii necesari care reprezinta detaliile carti si care la randul ei contine urmatorul cod:

PROCEDURE [dbo].[sp_Book_Insert]

(

@p_BOOK_NAME nvarchar (50),

@p_AUTHOR_CONTACT_ID bigint,

@p_BOOK_PAGES int,

@p_BOOK_RELEASE_DATE date,

@p_BOOK_OBS nvarchar (4000),

@p_COPIES int,

@p_RACK_LOCATION_ID bigint

)

AS

begin try

declare @transOpen int

set @transOpen = 0

if @@TRANCOUNT = 0

begin

set @transOpen = 1

begin transaction

end

declare @TblContactIdTmp table (contact_id bigint)

declare @ContactId bigint

declare @TblLinkIdTmp table (link_id bigint)

declare @LinkId bigint

declare @TodayDate datetime = getdate()

–insert the contact and save the contact id

insert into TBL_CONTACTS

(CONTACT_TYPE_ID)

output inserted.CONTACT_ID into @TblContactIdTmp

values (2)

select @ContactId = contact_id from @TblContactIdTmp

–insert the new book and save the book's id

insert into TBL_BOOKS

(BOOK_NAME,AUTHOR_CONTACT_ID,BOOK_PAGES,BOOK_RELEASE_DATE,BOOK_OBS, COPIES,CONTACT_ID,INS_DT,UP_DT,RACK_LOCATION_ID)

output inserted.BOOK_ID into @TblLinkIdTmp

values (@p_BOOK_NAME, @p_AUTHOR_CONTACT_ID, @p_BOOK_PAGES, @p_BOOK_RELEASE_DATE,@p_BOOK_OBS,@p_COPIES,@ContactId,@TodayDate,@TodayDate,@p_RACK_LOCATION_ID)

select @LinkId = link_id

from @TblLinkIdTmp

update TBL_RACK_LOCATIONS

set IS_USED = 1

where RACK_LOCATION_ID = @p_RACK_LOCATION_ID

exec sp_Contact_Id_Insert @ContactId, @LinkId

commit;

end try

begin CATCH

if @transOpen = 1

rollback;

end CATCH

Concluzii

Aplicația in cauza reprezintă un bun manager pentru o biblioteca care nu implica tranzacții financiare.

Pe tot parcursul dezvoltării aplicației, am ținut cont de principiile de programare SOLID pentru o eventuala scalabilitate si transformare ușoare din punct de vedere programatic intr-un manager de locații pentru o cu totul alt gen de activitate precum o garderoba, magazin de închirieri DVD-uri si chiar adăugarea intr-un mod simplu de funcționalități noi precum tranzacții financiare, membri cu statuturi diferite etc.

Referințe

[1] http://en.wikipedia.org/wiki/Library_management#cite_note-Dewey1-3

[2] https://www.devexpress.com/

[3] http://blogs.msdn.com/b/sqlexpress/archive/2011/07/12/introducing-localdb-a-better-sql-express.aspx

Anexe

Preluare membri:

ALTER FUNCTION [dbo].[fnt_Get_Members]()

/*–––––––––––––––––––––––-

* Project: lcm_base

* Function: fnt_Get_Members

* Description: returns the members

* Authors: Emil Filip (ef)

* Generation-Date: 01.03.2014

* Changes:

*–––––––––––––––––––––––*/

RETURNS

TABLE

As

RETURN

(select MEMBER_ID,

MEMBER_NAME,

MEMBER_ADDRESS,

MEMBER_DOB,

MEMBER_CNP,

CONTACT_ID,

MEMBER_OBS,

MEMBER_PHONE,

INS_DT,

UP_DT

from TBL_MEMBERS)

Introducere membru nou:

ALTER PROCEDURE [dbo].[sp_Member_Insert]

(

@p_MEMBER_NAME nvarchar (50),

@p_MEMBER_ADDRESS nvarchar (500),

@p_MEMBER_CNP nvarchar (50),

@p_MEMBER_DOB date,

@p_MEMBER_OBS nvarchar (4000),

@p_MEMBER_PHONE nvarchar (50)

)

AS

/*–––––––––––––––––––––––-

* Project: scm_base

* Procedure: sp_Member_Insert

* Description: Inserts a new member into DB

* Authors: Emil Filip (ef)

* Generation-Date: 01.03.2014

* Changes:

*–––––––––––––––––––––––*/

begin try

declare @transOpen int

set @transOpen = 0

if @@TRANCOUNT = 0

begin

set @transOpen = 1

begin transaction

end

declare @TblContactIdTmp table (contact_id bigint)

declare @ContactId bigint

declare @TblLinkIdTmp table (link_id bigint)

declare @LinkId bigint

declare @TodayDate datetime = getdate()

–insert the contact and save the contact id

insert into TBL_CONTACTS

(CONTACT_TYPE_ID)

output inserted.CONTACT_ID into @TblContactIdTmp

values (1)

select @ContactId = contact_id from @TblContactIdTmp

–insert the new member and save the member's id

insert into TBL_MEMBERS

(MEMBER_NAME,MEMBER_ADDRESS,MEMBER_CNP,MEMBER_DOB,MEMBER_OBS,CONTACT_ID,INS_DT,MEMBER_PHONE)

output inserted.MEMBER_ID into @TblLinkIdTmp

values (@p_MEMBER_NAME,@p_MEMBER_ADDRESS,@p_MEMBER_CNP,@p_MEMBER_DOB,@p_MEMBER_OBS,@ContactId,@TodayDate,@p_MEMBER_PHONE)

select @LinkId = link_id from @TblLinkIdTmp

exec sp_Contact_Id_Insert @ContactId, @LinkId

commit;

end try

begin CATCH

if @transOpen = 1

rollback;

end CATCH

Modificare membru existent:

ALTER PROCEDURE [dbo].[sp_Member_Modify]

(

@p_MEMBER_NAME nvarchar (50),

@p_MEMBER_ADDRESS nvarchar (500),

@p_MEMBER_CNP nvarchar (50),

@p_MEMBER_DOB date,

@p_MEMBER_OBS nvarchar (4000),

@p_MEMBER_PHONE nvarchar (50),

@p_MEMBER_ID bigint

)

AS

/*–––––––––––––––––––––––-

* Project: lcm_base

* Procedure: sp_Member_Modify

* Description: Modifies the details of an existing member

* Authors: Emil Filip (ef)

* Generation-Date: 01.03.2014

* Changes:

*–––––––––––––––––––––––*/

begin try

declare @transOpen int

set @transOpen = 0

if @@TRANCOUNT = 0

begin

set @transOpen = 1

begin transaction

end

declare @TodayDate datetime = getdate()

update TBL_MEMBERS

set MEMBER_NAME = @p_MEMBER_NAME,

MEMBER_ADDRESS = @p_MEMBER_ADDRESS,

MEMBER_CNP = @p_MEMBER_CNP,

MEMBER_DOB = @p_MEMBER_DOB,

MEMBER_OBS = @p_MEMBER_OBS,

MEMBER_PHONE = @p_MEMBER_PHONE,

UP_DT = @TodayDate

where MEMBER_ID = @p_MEMBER_ID

commit;

end try

begin CATCH

if @transOpen = 1

rollback;

end CATCH

Stergere membru:

ALTER PROCEDURE [dbo].[sp_Member_Delete]

(

@p_CONTACT_ID bigint

)

AS

/*–––––––––––––––––––––––-

* Project: lcm_base

* Procedure: sp_Member_Delete

* Description: Deletes an existing member

* Authors: Emil Filip (ef)

* Generation-Date: 01.03.2014

* Changes:

*–––––––––––––––––––––––*/

begin try

declare @transOpen int

set @transOpen = 0

if @@TRANCOUNT = 0

begin

set @transOpen = 1

begin transaction

end

delete from TBL_MEMBERS

where CONTACT_ID = @p_CONTACT_ID

exec sp_Contact_Id_Delete @p_CONTACT_ID

commit;

end try

begin CATCH

if @transOpen = 1

rollback;

end CATCH

Preluare cărți:

ALTER FUNCTION [dbo].[fnt_Get_Books]()

/*–––––––––––––––––––––––-

* Project: lcm_base

* Function: fnt_Get_Books

* Description: returns the books

* Authors: Emil Filip (ef)

* Generation-Date: 01.03.2014

* Changes:

*–––––––––––––––––––––––*/

RETURNS

TABLE

As

RETURN

(select b.BOOK_ID,

b.BOOK_NAME,

b.BOOK_OBS,

b.BOOK_PAGES,

b.BOOK_RELEASE_DATE,

b.COPIES,

b.CONTACT_ID,

b.AUTHOR_CONTACT_ID,

b.INS_DT,

b.UP_DT,

a.AUTHOR_NAME,

r.RACK_NAME,

r.CONTACT_ID as RACK_CONTACT_ID,

rl.RACK_LOCATION_ID,

isnull(rl.RACK_VERTICAL_LOCATION,0) as RACK_VERTICAL_LOCATION,

isnull(rl.RACK_HORIZONTAL_LOCATION,0) as RACK_HORIZONTAL_LOCATION

from TBL_BOOKS as b

left outer join TBL_AUTHORS as a on a.CONTACT_ID = b.AUTHOR_CONTACT_ID

left outer join TBL_RACK_LOCATIONS as rl on rl.RACK_LOCATION_ID = b.RACK_LOCATION_ID

left outer join TBL_RACKS as r on r.RACK_ID = rl.RACK_ID)

Introducere carte noua:

ALTER PROCEDURE [dbo].[sp_Book_Insert]

(

@p_BOOK_NAME nvarchar (50),

@p_AUTHOR_CONTACT_ID bigint,

@p_BOOK_PAGES int,

@p_BOOK_RELEASE_DATE date,

@p_BOOK_OBS nvarchar (4000),

@p_COPIES int,

@p_RACK_LOCATION_ID bigint

)

AS

/*–––––––––––––––––––––––-

* Project: scm_base

* Procedure: sp_Book_Insert

* Description: Inserts a new book into DB

* Authors: Emil Filip (ef)

* Generation-Date: 01.03.2014

* Changes:

*–––––––––––––––––––––––*/

begin try

declare @transOpen int

set @transOpen = 0

if @@TRANCOUNT = 0

begin

set @transOpen = 1

begin transaction

end

declare @TblContactIdTmp table (contact_id bigint)

declare @ContactId bigint

declare @TblLinkIdTmp table (link_id bigint)

declare @LinkId bigint

declare @TodayDate datetime = getdate()

–insert the contact and save the contact id

insert into TBL_CONTACTS

(CONTACT_TYPE_ID)

output inserted.CONTACT_ID into @TblContactIdTmp

values (2)

select @ContactId = contact_id from @TblContactIdTmp

–insert the new book and save the book's id

insert into TBL_BOOKS

(BOOK_NAME,AUTHOR_CONTACT_ID,BOOK_PAGES,BOOK_RELEASE_DATE,BOOK_OBS,COPIES,CONTACT_ID,INS_DT,UP_DT,RACK_LOCATION_ID)

output inserted.BOOK_ID into @TblLinkIdTmp

values (@p_BOOK_NAME, @p_AUTHOR_CONTACT_ID, @p_BOOK_PAGES, @p_BOOK_RELEASE_DATE, @p_BOOK_OBS, @p_COPIES, @ContactId, @TodayDate, @TodayDate,@p_RACK_LOCATION_ID)

select @LinkId = link_id

from @TblLinkIdTmp

update TBL_RACK_LOCATIONS

set IS_USED = 1

where RACK_LOCATION_ID = @p_RACK_LOCATION_ID

exec sp_Contact_Id_Insert @ContactId, @LinkId

commit;

end try

begin CATCH

if @transOpen = 1

rollback;

end CATCH

Modificare carte existenta:

ALTER PROCEDURE [dbo].[sp_Book_Modify]

(

@p_BOOK_NAME nvarchar (50),

@p_AUTHOR_ID bigint,

@p_BOOK_PAGES int,

@p_BOOK_RELEASE_DATE date,

@p_BOOK_OBS nvarchar (4000),

@p_BOOK_ID bigint,

@p_COPIES int,

@p_RACK_LOCATION_ID bigint

)

AS

/*–––––––––––––––––––––––-

* Project: lcm_base

* Procedure: sp_Book_Modify

* Description: Modifies the details of an existing book

* Authors: Emil Filip (ef)

* Generation-Date: 01.03.2014

* Changes:

*–––––––––––––––––––––––*/

begin try

declare @transOpen int

set @transOpen = 0

if @@TRANCOUNT = 0

begin

set @transOpen = 1

begin transaction

end

declare @TblLinkIdTmp table (old_location_id bigint)

declare @OldLocationId bigint

declare @TodayDate datetime = getdate()

update TBL_BOOKS

set BOOK_NAME = @p_BOOK_NAME,

AUTHOR_CONTACT_ID = @p_AUTHOR_ID,

BOOK_PAGES = @p_BOOK_PAGES,

BOOK_RELEASE_DATE = @p_BOOK_RELEASE_DATE,

COPIES = @p_COPIES,

BOOK_OBS = @p_BOOK_OBS,

UP_DT = @TodayDate,

RACK_LOCATION_ID = @p_RACK_LOCATION_ID

output deleted.RACK_LOCATION_ID into @TblLinkIdTmp

where BOOK_ID = @p_BOOK_ID

select @OldLocationId = old_location_id

from @TblLinkIdTmp

update TBL_RACK_LOCATIONS

set IS_USED = 1

where RACK_LOCATION_ID = @p_RACK_LOCATION_ID

–if the book has been moved from one location to another

if @p_RACK_LOCATION_ID != @OldLocationId

begin

update TBL_RACK_LOCATIONS

set IS_USED = 0

where RACK_LOCATION_ID = @OldLocationId

end

commit;

end try

begin CATCH

if @transOpen = 1

rollback;

end CATCH

Ștergere carte:

ALTER PROCEDURE [dbo].[sp_Book_Delete]

(

@p_CONTACT_ID bigint

)

AS

/*–––––––––––––––––––––––-

* Project: lcm_base

* Procedure: sp_Book_Delete

* Description: Deletes an existing book

* Authors: Emil Filip (ef)

* Generation-Date: 01.03.2014

* Changes:

*–––––––––––––––––––––––*/

begin try

declare @transOpen int

set @transOpen = 0

if @@TRANCOUNT = 0

begin

set @transOpen = 1

begin transaction

end

declare @TblLinkIdTmp table (rack_location_id bigint)

declare @RackLocationId bigint

delete from TBL_BOOKS

output deleted.RACK_LOCATION_ID into @TblLinkIdTmp

where CONTACT_ID = @p_CONTACT_ID

select @RackLocationId = rack_location_id

from @TblLinkIdTmp

update TBL_RACK_LOCATIONS

set IS_USED = 0

where RACK_LOCATION_ID = @RackLocationId

exec sp_Contact_Id_Delete @p_CONTACT_ID

commit;

end try

begin CATCH

if @transOpen = 1

rollback;

end CATCH

Preluare dulapuri:

ALTER FUNCTION [dbo].[fnt_Get_Racks]()

/*–––––––––––––––––––––––-

* Project: lcm_base

* Function: fnt_Get_Racks

* Description: returns the racks

* Authors: Emil Filip (ef)

* Generation-Date: 01.03.2014

* Changes:

*–––––––––––––––––––––––*/

RETURNS

TABLE

As

RETURN

(select RACK_ID,

RACK_NAME,

RACK_HORIZONTAL_LOCATIONS,

RACK_VERTICAL_LOCATIONS,

RACK_LOCATION,

RACK_OBS,

CONTACT_ID,

INS_DT,

UP_DT

from TBL_RACKS)

Adăugare dulap nou:

ALTER PROCEDURE [dbo].[sp_Rack_Insert]

(

@p_RACK_NAME nvarchar (50),

@p_RACK_LOCATION nvarchar (500),

@p_RACK_VERTICAL_LOCATIONS int,

@p_RACK_HORIZONTAL_LOCATIONS int,

@p_RACK_OBS nvarchar (4000)

)

AS

/*–––––––––––––––––––––––-

* Project: scm_base

* Procedure: sp_Member_Insert

* Description: Inserts a new member into DB

* Authors: Emil Filip (ef)

* Generation-Date: 01.03.2014

* Changes:

*–––––––––––––––––––––––*/

begin try

declare @transOpen int

set @transOpen = 0

if @@TRANCOUNT = 0

begin

set @transOpen = 1

begin transaction

end

declare @TblContactIdTmp table (contact_id bigint)

declare @ContactId bigint

declare @TblLinkIdTmp table (link_id bigint)

declare @LinkId bigint

declare @TodayDate datetime = getdate()

–insert the contact and save the contact id

insert into TBL_CONTACTS

(CONTACT_TYPE_ID)

output inserted.CONTACT_ID into @TblContactIdTmp

values (4)

select @ContactId = contact_id from @TblContactIdTmp

–insert the new rack and save the rack's id

insert into TBL_RACKS

(CONTACT_ID,RACK_NAME,RACK_HORIZONTAL_LOCATIONS,RACK_VERTICAL_LOCATIONS,RACK_LOCATION,RACK_OBS,INS_DT)

output inserted.RACK_ID into @TblLinkIdTmp

values (@ContactId,@p_RACK_NAME,@p_RACK_HORIZONTAL_LOCATIONS,@p_RACK_VERTICAL_LOCATIONS,@p_RACK_LOCATION,@p_RACK_OBS,@TodayDate)

select @LinkId = link_id from @TblLinkIdTmp

exec sp_Contact_Id_Insert @ContactId, @LinkId

declare @iCntVertical int = 1

declare @iCntHorizontal int = 1

–create each location of this rack

while @iCntVertical <= @p_RACK_VERTICAL_LOCATIONS

begin

while @iCntHorizontal <= @p_RACK_HORIZONTAL_LOCATIONS

begin

insert into TBL_RACK_LOCATIONS

(RACK_ID,RACK_VERTICAL_LOCATION,RACK_HORIZONTAL_LOCATION)

values (@LinkId,@iCntVertical,@iCntHorizontal)

set @iCntHorizontal = @iCntHorizontal + 1

end

set @iCntHorizontal = 1

set @iCntVertical = @iCntVertical + 1

end

commit;

end try

begin CATCH

if @transOpen = 1

rollback;

end CATCH

Ștergere dulap existent:

ALTER PROCEDURE [dbo].[sp_Rack_Delete]

(

@p_CONTACT_ID bigint

)

AS

/*–––––––––––––––––––––––-

* Project: lcm_base

* Procedure: sp_Author_Modify

* Description: Modifies the details of an existing author

* Authors: Emil Filip (ef)

* Generation-Date: 21.03.2014

* Changes:

*–––––––––––––––––––––––*/

begin try

declare @transOpen int

set @transOpen = 0

if @@TRANCOUNT = 0

begin

set @transOpen = 1

begin transaction

end

delete from TBL_RACK_LOCATIONS

where RACK_ID = (select RACK_ID from TBL_RACKS where CONTACT_ID = @p_CONTACT_ID)

delete from TBL_RACKS

where CONTACT_ID = @p_CONTACT_ID

exec sp_Contact_Id_Delete @p_CONTACT_ID

commit;

end try

begin CATCH

if @transOpen = 1

rollback;

end CATCH

Preluare autori

ALTER FUNCTION [dbo].[fnt_Get_Authors]()

/*–––––––––––––––––––––––-

* Project: lcm_base

* Function: fnt_Get_Authors

* Description: returns the authors

* Authors: Emil Filip (ef)

* Generation-Date: 01.03.2014

* Changes:

*–––––––––––––––––––––––*/

RETURNS

TABLE

As

RETURN

(select AUTHOR_NAME,

AUTHOR_ID,

CONTACT_ID,

INS_DT

from TBL_AUTHORS)

Adăugare autor nou

ALTER PROCEDURE [dbo].[sp_Author_Insert]

(

@p_AUTHOR_NAME nvarchar (50),

@p_CONCTACT_ID bigint out

)

AS

/*–––––––––––––––––––––––-

* Project: scm_base

* Procedure: sp_Author_Insert

* Description: Inserts a new author into DB

* Authors: Emil Filip (ef)

* Generation-Date: 01.03.2014

* Changes:

*–––––––––––––––––––––––*/

begin try

declare @transOpen int

set @transOpen = 0

if @@TRANCOUNT = 0

begin

set @transOpen = 1

begin transaction

end

declare @TblContactIdTmp table (contact_id bigint)

declare @ContactId bigint

declare @TblLinkIdTmp table (link_id bigint)

declare @LinkId bigint

declare @TodayDate datetime = getdate()

–insert the contact and save the contact id

insert into TBL_CONTACTS

(CONTACT_TYPE_ID)

output inserted.CONTACT_ID into @TblContactIdTmp

values (3)

select @ContactId = contact_id from @TblContactIdTmp

set @p_CONCTACT_ID = @ContactId

–insert the new author and save the author's id

insert into TBL_AUTHORS

(AUTHOR_NAME,CONTACT_ID,INS_DT)

output inserted.AUTHOR_ID into @TblLinkIdTmp

values (@p_AUTHOR_NAME,@ContactId,@TodayDate)

select @LinkId = link_id from @TblLinkIdTmp

exec sp_Contact_Id_Insert @ContactId, @LinkId

commit;

end try

begin CATCH

if @transOpen = 1

rollback;

end CATCH

Ștergere autor existent

ALTER PROCEDURE [dbo].[sp_Author_Delete]

(

@p_CONTACT_ID bigint

)

AS

/*–––––––––––––––––––––––-

* Project: lcm_base

* Procedure: sp_Author_Modify

* Description: Modifies the details of an existing author

* Authors: Emil Filip (ef)

* Generation-Date: 01.03.2014

* Changes:

*–––––––––––––––––––––––*/

begin try

declare @transOpen int

set @transOpen = 0

if @@TRANCOUNT = 0

begin

set @transOpen = 1

begin transaction

end

delete from TBL_AUTHORS

where CONTACT_ID = @p_CONTACT_ID

exec sp_Contact_Id_Delete @p_CONTACT_ID

commit;

end try

begin CATCH

if @transOpen = 1

rollback;

end CATCH

Asociere carte la membru

ALTER PROCEDURE [dbo].[sp_Member_Book_Associate]

(

@p_MEMBER_ID bigint,

@p_BOOK_ID bigint

)

AS

/*–––––––––––––––––––––––-

* Project: scm_base

* Procedure: sp_Member_Insert

* Description: Associates a book with a member

* Authors: Emil Filip (ef)

* Generation-Date: 25.05.2014

* Changes:

*–––––––––––––––––––––––*/

begin try

declare @transOpen int

set @transOpen = 0

if @@TRANCOUNT = 0

begin

set @transOpen = 1

begin transaction

end

–insert the contact and save the contact id

insert into TBL_MEMBER_BOOKS

(MEMBER_ID, BOOK_ID, INS_DT)

values (@p_MEMBER_ID,@p_BOOK_ID, GETDATE())

commit;

end try

begin CATCH

if @transOpen = 1

rollback;

end CATCH

Dezasociere carte de la membru

ALTER PROCEDURE [dbo].[sp_Member_Book_Disassociate]

(

@p_MEMBER_BOOK_ID bigint

)

AS

/*–––––––––––––––––––––––-

* Project: scm_base

* Procedure: sp_Member_Book_Disassociate

* Description: Deletes the association between a book and a member

* Authors: Emil Filip (ef)

* Generation-Date: 25.05.2014

* Changes:

*–––––––––––––––––––––––*/

begin try

declare @transOpen int

set @transOpen = 0

if @@TRANCOUNT = 0

begin

set @transOpen = 1

begin transaction

end

–delete the association

delete from TBL_MEMBER_BOOKS

where MEMBER_BOOK_ID = @p_MEMBER_BOOK_ID

commit;

end try

begin CATCH

if @transOpen = 1

rollback;

end CATCH

Verificare daca autorul este in folosință

RETURNS int

AS

/*–––––––––––––––––––––––-

* Project: LCM

* Function: fn_CheckAuthorIsUsed

* Description: Returns 1 if the author has been assigned to at least one book, esle, will return 0

* Parameters: …

* Version: 1.00

* Authors: Emil Filip (ef)

* Generation-Date: 12.05.2015

*–––––––––––––––––––––––*/

BEGIN

declare @Ret int

if(SELECT COUNT(1) FROM TBL_BOOKS WHERE AUTHOR_CONTACT_ID = @p_AUTHOR_CONTACT_ID) > 0

begin

set @Ret = 1

end

else

begin

set @Ret = 0

end

return @Ret

END

Verificare daca dulapul este gol

RETURNS int

AS

/*–––––––––––––––––––––––-

* Project: LCM

* Function: fn_CheckAuthorIsUsed

* Description: Returns 1 if the author has been assigned to at least one book, esle, will return 0

* Version: 1.00

* Authors: Emil Filip (ef)

* Generation-Date: 12.05.2015

*–––––––––––––––––––––––*/

BEGIN

declare @Ret int

if(SELECT COUNT(1) FROM TBL_RACK_LOCATIONS WHERE RACK_ID = @p_RACK_ID and IS_USED = 1) > 0

begin

set @Ret = 1

end

else

begin

set @Ret = 0

end

return @Ret

END

Referințe

[1] http://en.wikipedia.org/wiki/Library_management#cite_note-Dewey1-3

[2] https://www.devexpress.com/

[3] http://blogs.msdn.com/b/sqlexpress/archive/2011/07/12/introducing-localdb-a-better-sql-express.aspx

Similar Posts