CATEGORII DOCUMENTE |
Descrierea bazei de date si a formularelor
1 Logica bazei de date
Pentru a concepe baza de date, este nevoie de a intelege cum functioneaza sistemul de salarizare, adica din ce este format acesta si, in special, care sunt procesele la care sunt supuse datele si cum se modifica datele in urma acestor porcese, precum si cum interactioneaza datele intre ele.
Este important de specificat ca nu exista o sigura modalitate corecta pentru a crea baza de date. Aceasta poate fi abordata din mai multe perspective, important fiind sa raspunda la toate necesitatile sistemului. Un alt argument pentru a acorda o atentie deosebita logicii bazei de date este faptul ca nu este suficiet ca baza de date sa fie functionala, trebuie si ca aceasta sa fie optima, pentru ca, odata cu cresterea numarului de inregistrari, timpul necesar exragerii datetelor se mareste, astfel, la un numar mai mare ce cereri, creste posibilitatea ca serverul sa nu mai faca fata.
Prin urmare, la inceput trebuiesc identificate toate datele care sunt folosite la compunerea salariului unui angajat in sitemul de invatamant preuniversitar, dupa care trebuiesc identificate relatiile dintre aceste date. Aceste relatii trebuiesc tratate prin prisma normalizarii, care lucreaza strict cu tehnologia relationala. Se spune ca pentru a putea implementa o baza de date este nevoie ca aceasta sa fie cel putin in forma a treia de normalizare. Acest lucru presupune doua conditii a) toate atributele ne-cheie din R sunt independente unele de altele, in sensul ca nici unul dintre atribute neparticipante in cheia primara nu apare in vreo dependenta functional in care sursa este constituita dintr-o combinatie de celelalte atribute ne-cheie; b) toate atributele ne-cheie din R sunt dependente ireductibil de cheia primara.
Pana la acest moment, am realizat o analiza a aplicatiei din mai multe puncte de vedere, incepand cu alaliza factorilor economici, in functie de care se stabileste salariul unui angajat pana la modelarea grafica a bazei de date care va retine toate datele necesare calculului salarial, si nu numai. Din acest moment, crearea aplicatiei de salarizare va avea un demers mai mult practic, cu unele comentarii si sugestii pe parcurs.
Figura nr. 6 Shema bazei de date conform modelului relational
Urmatorul pas in realizarea aplicatiei il reprezinta transpunerea schemei bazei de date in sintaxa SQL, care permite creare tabelelor si a legaturilor dintre acestea prin comezi relativ simple, deoarece limbajul sql este unul de nivel patru, fiind cel mai apropiat limbaj de programare de cel uman.
Comanda sql pentru crearea unui tabel simplu este:
CREATE TABLE numetabela
camp1 tip_date1,
camp2 tip_date2,
campN tip_dateN
In care camp1campN reprezinta atributele care se regasesc in tabel si tip_data sunt tipurile de date care definesc aceste atribute. Pentru aplicatie, se vor folosi patru tipuri de date: a) numeric (nu necesita explicatii) b) varchar - sir de caractere cu lunghime variabila, c) text - sir de caractere cu lungime variabila, nelimitata, d) date - retine data calindaristica.
CREATE TABLE liceu (
id_liceu NUMERIC (5) NOT NULL PRIMARY KEY,
CONSTRAINT ck_id_liceu CHECK (id_liceu > 0),
Adresa VARCHAR(50),
Denumire VARCHAR (50),
Profil VARCHAR (40)
Asa arata tabelelul parinte "liceu" din schema baze de date. Prin atribuirea proprietatii de cheie primara elementului id_liceu, acesta nu poate lua valori nule, iar in sql aceasta restrictie se seteaza prin comanda NOT NULL. In acest mod se pot defini o multime de restrictii daca e cazul, in functie de necesitatile aplicatiei sau din preferintele programatorului, care se poate lipsi de niste restrictii la nivelul bazei de date pentru a le implementa in aplicatia care va folosi aceasta baza de date.
Exemplu tabelul copil:
CREATE TABLE useri (
username VARCHAR (20),
parola VARCHAR (20),
id_liceu NUMERIC (5)
CONSTRAINT fk_useri_liceu REFERENCES liceu(id_liceu)
ON DELETE CASCADE ON UPDATE CASCADE ,
CONSTRAINT pk_useri_liceu PRIMARY KEY (id_liceu)
In acest tabel, se specifica faptul ca atributul id_liceu se "refera" la id_liceu din tabelul parinte de mai sus. Inserarea unei linii intr-un tabel parinte, ca si stergerea de linii dintr-un tabel copil nu reprezinta nici un pericol "referential", la stergerea unei linii dintr-un tabel parinte trebuie precizat cum se prezinta restrictia referentiala: fie prin stergerea in cascada a tuturor inregistrarilor copil (ON DELETE CASCADE), (cum ar fi cazul si in exemplu de mai sus, deoarece, odata sters din baza de date, un liceu nu va mai fi nevoie nici de contul alcelui liceu) fie , pur si simplu prin interzicerea stergerii (ON DELETE RESTRICT). In aceeasi maniera se procedeaza si la modificarea unei chei primare/alternative pentru care exista in alt tabel, inregistrari-copil, fiind necesara precizarea actiunii intreprinsa de SGBD: modificarea in cascada a tuturor liniilor copil (ON UPDATE CASCADE) sau interzicerea modificarii, daca exista cel putin o inregitrare copil (ON UPDATE RESTRICT).
2 Creare interfetelor pentru utilizatori
La dezvoltarea aplicatiei sa folosit o baza de date din figura
Pentru a incepe crearea formularelor in mediul de lucru Visula Baisic, se va deschide un proiect nou, pe care il vom numi "Alpicatie Salarizare" si se va selecta windows aplication care va avea, in mod implict, un formular gol, se va seta denumirea formularului, intr-un mod sugestiv.
Primul formular descris amanuntit in acest demers teoretic, va servi la autentificarea utilizatorilor. Pentru a incepe sesiunea de editare, se va aplica click dreapta view code
2.1 Autentificare
Public Class Logare
//Primul lucru care trebuie facut este crearea unei functii responsabile de conectarea la baza de date si pe care o vom folosi de fiecare data cand vom avea nevoie de a deschide o sesiune de lucru cu postgres-ul. Pentru a putea fi folosita de toate procedurile si functie din acest formular o vom declara la inceput. O alta medota ar fi declarearea functiei intr-un modul de unde va putea fi apelata pe tot parcursul aplicatie.
Public postgres As String = 'DRIVER=;DATABASE=postgres;SERVER=localhost;UID=postgres;PWD=licenta;'
Function conexiune() As Odbc.OdbcConnection
conexiune = New Odbc.OdbcConnection(postgres)
Return conexiune
End Function
Declaram setul de date(DataSet) de care vom avea nevoie, ele servesc la afisarea datelor extrase de adaptoare in structurile vizulare
Dim dslog As New DataSet
Dim dslic As New DataSet
Porcedura urmatoare se ocupa de "incarcarea" formularului, ea este responsabila de starea de "start" a formularului si a datelor care apar in el chiar la inceput, inainte de a declansa un alt eveniment
Private Sub Logare(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
End Sub
In continuare este descrisa procedura care este apelata la clickul butonului de Logare, cele mai importante obiecte care raspund la acest evenimet sunt: adaptorule denumit OdbcDataAdapter1 si OdbcDataAdapter2 care are rol de intermediar inteligent intre seturile de date locale si baza de date, precum si obiectele de tip TextBox cum este Me.usertxt in care se va introduce nume de cont.
Private Sub Logare_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Try
conexiune.Open()
Dim OdbcDataAdapter1 As New Odbc.OdbcDataAdapter
Dim user As String
user = Me.usertxt.Text
Dim parola As String
parola = Me.parola.Text
OdbcDataAdapter1.SelectCommand = New System.Data.Odbc.OdbcCommand('Select * from useri where parola = '' & parola & '' and username = '' & user & )
OdbcDataAdapter1.SelectCommand.Connection = conexiune()
OdbcDataAdapter1.Fill(dslog) serveste la popularea setului de date dslog de catre adaptorul OdbcDataAdapter1 prin instructiunea Fill, dupa care datele sunt transmise si afisate prin obiectele de tip TextBox.
dslog.Clear()
OdbcDataAdapter1.Fill(dslog)
Me.idlictxt.DataBindings.Clear()
Me.idlictxt.DataBindings.Add('TEXT', dslog.Tables(0), 'id_liceu')
Dim OdbcDataAdapter2 As New Odbc.OdbcDataAdapter
OdbcDataAdapter2.SelectCommand = New System.Data.Odbc.OdbcCommand('Select * from liceu where id_liceu = '' & Me.idlictxt.Text & )
OdbcDataAdapter2.SelectCommand.Connection = conexiune()
OdbcDataAdapter2.Fill(dslic)
Me.numelictxt.DataBindings.Clear()
Me.numelictxt.DataBindings.Add('TEXT', dslic.Tables(0), 'Denumire')
Se verifica daca s-a reusit extragerea datelor si afisarea lor in obiectele de tip TextBox, in caz ca nu s-a reusit, acestea se golesc pentru a mai permite incercari de completare a lor.
If Me.numelictxt.Text = Then
Me.usertxt.Text =
Me.parola.Text =
End If
Catch ex As Exception
dslog.Clear()
MsgBox('Nume de cont sau parola gresita')
End Try
End Sub
La apasarea butonui Continuare se va testa daca au fost extrase datele necesare si se va deschide urmatorul formular, autentificarea realizandu-se cu succes.
Private Sub Continuare_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
If Val(Me.idlictxt.Text) > 0 Then
Me.SetVisibleCore(False)
MeniuLiceu.Show()
End If
End Sub
Butonul de Revocare va inchide formularul curent.
Private Sub Revocare_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonClick
Me.Close()
End Sub
End Class
Figura nr.7 Formular "Autentificare" primul pas
Figura nr. 8 Formular "Autentificare" pasul al doilea
Pasul 1- Se introduce numele de cont si parola, ca in figura nr x, dupa care se apasa butonul Logare, in acest moment se va executa secventa de cod din "spatele" butonului, care a fost comentata mai sus.
Pasul 2- Dupa executia secventei de cod echivalenta, butonul Logare se va optine situatia din figura nr y, in care se precizeaza carei institutie ii corespunde numele de cont si numarul de ordine al institutiei. La apasarea butonului Continuare, va fi deschis formularul denumit MeniuLiceu.
Figura nr y- Formular "Autentificare" pasul doi
In ameble situatii, la apasaea butonului Revocare formularul se va inchide
In cazul in care se va introduce un nume de cont inexistent sau o parola gresita, aplicatia va furniza un mesaj de avertizare prezentat in figura 10
Figura nr 10
2.2 Date personale:
Pentru a reusi implementarea acestei aplicatii in mai multe licee, este nevoie de o limitare a accesului utilizatorilor doar la datele unui liceu pentru care a fost creat un cont, in acest fel, cu un cont creat, un utilizator va putea manipula datele aferente unei singure institutii. Acest lucru presupune declararea unei varialibe globale care va putea fi "vazuta" in orice loc al aplicatiei, astfel incat sa permita mentinerea "legaturii" dintre contul utilizat si datele care pot fi accesate folosind acel cont.
Am realizat aceasta legatura prin atributul id_liceu, care corespunde unui nume de cont si unei parole asa cum se vede din schema bazei de date.
Module Functii
Public idlictxt As TextBox
In acest fel, voi putea extragre datele in functie de contul liceului care este logat.
Private Sub CalculSalariiPersonal_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim idlic As Integer
Atribui unei variabile valoarea extrasa la logare.
idlic = Val(Logare.idlictxt.Text)
conexiune.Open()
Folosesc aceasta variabila in fraza SQL a adaptorului pentru a obtine datele necesare.
Dim adapterpers As New Odbc.OdbcDataAdapter
adapterpers.SelectCommand = New System.Data.Odbc.OdbcCommand('select distinct nume, prenume from liceu l inner join stat_salariu ss on ss.id_liceu = l.id_liceu inner join personal p on p.id_personal = ss.id_personal where l.id_liceu = '' & idlic & )
adapterpers.SelectCommand.Connection = conexiune()
dslic.Clear()
adapterpers.Fill(dslic)
Me.numetxt.DataBindings.Clear()
Me.numetxt.DataBindings.Add('TEXT', dslic.Tables(0), 'nume')
Me.prenumetxt.DataBindings.Clear()
Me.prenumetxt.DataBindings.Add('TEXT', dslic.Tables(0), 'prenume')
Me.cbolistanume.DataSource = dslic.Tables(0)
Me.cbolistanume.DisplayMember = 'nume'
End Sub
In urma executiei acestei secvente de cod, sunt extrase in formular numele si prenumele personalului dintr-un singur liceu. M-am limitat doar la nume si prenume, insa se mai pot extrage si alte date precum: CNP, Adresa, Sex sau se poate verifica daca angajatul este profesor.
(CREATE TABLE personal ( []Profesor boolean,[] );
Me.numetxt Me.cbolistanume (Obiect de tip comboBox) In aceast
camp se introduc luna si anul. Exemplu(luna:
08 anul:2008)
Figura nr.11 Date personale
Pentru a naviga spre o anumita persoana, se foloseste obiectul de tip ComboBox care permite afisarea, intr-o lista, a tuturor persoanelor dintr-un liceu. Lista este completata prin setul de date dslic odata cu "incarcarea" formularului. Odata cu selectarea altei persoane din lista, adica la modificarea de stare a acesteea, se vor "goli" toate campurile care sunt folosite la extragerea datelor unei persoane, pentru ca datele sunt extrase in functie de nume si prenume.
Private Sub cbolistanume_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cbolistanume.SelectedIndexChanged
Me.imptxt.Text = |
TextBox impozit |
Me.cboimp.Text = |
ComboBox impozit |
Me.totalimptxt.Text = |
TextBox total impozit |
Me.vechimetxt.Text = |
TextBox vechime invatamant |
Me.gradtxt.Text = |
TextBox grad didactic |
Me.studiitxt.Text = |
TextBox nivel studii |
Me.salbazatxt.Text = |
TextBox valoare salariu de baza |
Me.vspor.Text = |
TextBox valoare spor |
Me.cbospor.Text = |
ComboBox lista sporuri |
Me.tspor.Text = |
TextBox total sporuri |
Tabelul 2 obiectele de TextBox si ComboBox folosite in formularul "Calcul salarii personal"
End Sub
2.3 Salariu de baza:
La calculul salariului de baza am tratat una din doua situatii posibile. Logica bazei de date permite abordarea ambelor solutii, dar pentru acest demers teoretic am ales varianta cea mai des intalnita in practica, si anume calcularea salariului de baza in functie de grilele de salarizare si de numarul de zile lucrate lunar.
Buton "Continuare" Butoane Radio
Figura nr. 12 Salariu de baza
Toate obiectele din acest formular, de tip TextBox, sunt descrise in Tabelul 2. Chiar daca sunt extrase alte date, principiul de lucru nu s-a schimbat, din acest motiv se vor mentine doar secventele de cod care sunt mai importante, precum fraza SQL si cazul structurii alterative IF ELSE.
Private Sub Continuare_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
In cazul in care este bifat butonul radio Nu exista exceptii, se intra pe aceasta prima ramura a structurii alterative, de unde sunt extrase datele si afisate asa cum sunt stocate iin baza de date, adica in conformitate cu grilele de salarizare din invatamant.
If Me.RadioButton1.Checked = True Then
conexiune.Open()
Dim adaptersalbaza As New Odbc.OdbcDataAdapter
adaptersalbaza.SelectCommand = New System.Data.Odbc.OdbcCommand('select distinct v_grila, nr_zile, Grad_didactic, Vechime, Nivel_studii from v_sal_baza v inner join sal_baza sb on sb.id_sal_baza = v.id_sal_baza inner join stat_salariu ss on ss.id_sal_baza = v.id_sal_baza inner join personal p on p.id_personal = ss.id_personal where p.nume = '' & nume & '' and p.prenume = '' & prenume & '' and ss.luna = '' & luna & '' and ss.an ='' & an & )
adaptersalbaza.SelectCommand.Connection = conexiune()
(Setul de date este "incarcat" si datele sunt afisate in obiecte de timp TexBox)
Else
Exista insa si situatii in care norma de zile lucratoare dintr-o luna nu se respecta. In aceste cazuri, de altfel deseori intalnite, se va bifa butonul radio Exista exceptii, care, odata bifat, va face vizibile un set de obiecte, care vor ajuta la tratarea exceptiei
If Me.RadioButton2.Checked = True Then
(Setul de date este "incarcat" si datele sunt afisate in obiecte de tip TexBox)
Me.nrluc.Visible = True
Me.Numarzile.Visible = True
Me.salnou.Visible = True
Me.ok.Visible = True
Me.zileluc.Visible = True
Me.zileluctxt.Visible = True
Me.Panel5.Visible = True
End If
End If
If Me.RadioButton2.Checked = False And Me.RadioButton1.Checked = False Then
Tratarea situatiei cand nu e bifat nici unul dintre butoale radio:
MsgBox('Selectati situatia care se potriveste')
End If End Sub
Drept raspuns la cea de a doua situattie in care exista exceptii, codul va genera urmatorul formular:
Me.salnou Me.salnou Me.salnou Me.nrluc Me.nrluc
|
|
Figura nr. 12 Salariu de baza 'Exceptii'
Sub ok_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ok.Click
Dim a As Integer
a = Val(Me.salbazatxt.Text) / Val(Me.zileluctxt.Text)
Me.salnou.Text = a * Val(Me.Numarzile.Text)
End Sub
2.4 Impozite:
Chiar daca se extrag date diferite in acest formular, modalitatea lor de extragere este aceeasi, la fel se intampla si la afisarea lor cu ajutorului obiectelor de tip TexBox sau ComboBox sau la actionarea butoanelor, se executa secvente de cod diferite, dar asemanatoare ca modalitate de concepere.
Figura nr. 13 Impozite
(precizez ca graficul din antetul formularului este o imagine, coloanele nu se modifica odata cu modificarea datelor extrase.)
2.5 Total:
Aceste date sunt extrase si calculate pe baza pasilor precedenti prin aplicarea formulei de calcul al salariului
Figura nr. 14 Total
2.6 Stat salariii:
O metoda eleganta de a pastra si apoi reveda datele din statul de salarii pentru toti angajatii ar fi crearea unei noi tabele in baza de date care ar avea drept atribute campurile calculate pana in acest moment. Odata obtinut salariu, cu toate componentele sale si datele personale, ar putea fi inserat in acea tabela ca mai apoi sa fie extrase datele tuturor angajatilor in obiectul de tip DataGrigView.
Figura nr.15 Formular pentru statul de salarii
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 1996
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved