Sunteți pe pagina 1din 68

BAZE DE DATE

– CURS 9 -

Conf.univ.dr. Logica BĂNICĂ


PROGRAMARE
în Visual Basic for Application -VBA

1) Comenzi SQL în VBA


2) Controale VBA:
 Formular (Form)
 Buton de comandă (Command Button)
 Casetă de dialog (MsgBox)
Programare VBA
• VBA este un interpretor orientat pe obiecte și
evenimente.
• Obiectele Access au proprietăţi si metode, si răspund
anumitor evenimente.
1) Proprietăţile - definesc caracteristicile obiectelor

2) Metodele - sunt acţiuni pe care programatorul le


aplică unor tipuri de obiecte în timpul execuţiei
subrutinelor.
Programare VBA

3) Evenimentele - sunt acţiunile prin care utilizatorul


sau sistemul interacţionează cu obiectele
4) Procedurile-eveniment - constituie răspunsul
aplicaţiei Access la acţiuni.
• Subrutina (procedură) - răspunde unui anumit
eveniment sau îndeplineşte o anumită sarcină
Programare VBA

• Funcţia întoarce o valoare, ca răspuns la apariţia


unui eveniment.

5)Modulul VBA conţine declaraţii globale (variabile


publice) şi/sau locale, subrutine şi funcţii.
Programare VBA
În cadrul procedurilor VBA se foloseşte programarea
structurată pentru procesarea deciziilor şi ciclurilor.
Instrucţiunile de programare structurată
A) Structura de decizie If-then-Else
If conditie Then
Grup1 instrucţiuni
Else
Grup2 instrucţiuni
End If
Programare VBA

Structura multidecizională Select Case

B) Select Case variabila


Case val_1
Grup1
Case val_2
Grup2
................
Case Else
Grup n
End Select
Programare VBA

C) Structura ciclică Do While-Loop


Do While condiţie
Grup instrucţiuni
Loop

D) Structura ciclică Do-Loop While


Do
Grup instrucţiuni
Loop While condiţie
Programare VBA

E) Structura secvenţială For-Next

For var_contor=val_iniţială To val_finală


Step pas_increment
Grup instrucţiuni
Next var_contor
Programare VBA
• Pentru trecerea din Access în programare VBA se
activează comanda Create – Visual Basic sau
ALT+F11
Programare VBA

Succesiunea de operatii pentru crearea unei


proceduri este:
1. Se intră în editorul VBE;
2. Meniul Insert - opţiunea Procedure sau Module;
3. În caseta de dialog Add Procedure se completează
numele și se stabileşte tipul modulului : subrutină sau
funcţie ;
Programare VBA

5. se defineşte dacă este o procedură publică (accesibilă de


oriunde din aplicaţie) sau privată (disponibilă numai în
cadrul modulului).
Obiecte ACCESS

Obiectele sunt componentele unei baze de date. Ele


includ tabelele, interogarile, formularele, rapoartele,
macrocomenzile si modulele de program.

De asemenea, sunt considerate obiecte Access si


controalele plasate pe un formular: caseta-text,
butoane, caseta de validare sau caseta de optiuni,
lista, combo-box etc.
Buton de comandă
• Este controlul cel mai frecvent utilizat în programele
VBA.
• Evenimentele unui astfel de buton sunt:
- activarea cu mouse-ul (Click sau DblClick),
- activarea prin tastatură (KeyPress),
- focalizarea (On Got Focus)
- pierderea focalizării (On Lost Focus).
Buton de comandă
Acţiunile executate frecvent:
- deschiderea altui formular sau a unui raport,
- căutarea unei înregistrări într-o tabelă,
- declanşarea unei proceduri de validare a unui câmp
sau un import/export de fişier.
Cu ajutorul Command Button Wizard se poate ataşa una
dintre operaţiile predefinite, din cele 6 categorii
descrise la Formular de dirijare.
Buton de comandă

Sintaxa apelării unui buton de comandă:


DoCmd.nume_operaţie arg1,arg2,arg3, arg4, arg5

• Argumentele sunt stabilite în funcţie de operaţia


selectată.
Caseta de dialog MsgBox
Sintaxa funcției:
MsgBox (mesaj [,butoane][,titlu])
Afişează mesajul în fereastră şi aşteaptă activarea unui
buton de către utilizator, după care dă controlul secvenţei
următoare din program.
Mesajul - şir de caractere între ghilimele;
Butoanele - sunt valori predefinite ale tipului de răspuns,
care stabilesc şi simbolul grafic ataşat;
Titlul - şir de caractere , titlul ferestrei.
Butoanele pot avea următoarele valori:
Buton Explicaţii
vbOKOnly răspuns OK
vbOKCancel Răspunsuri OK şi Cancel
vbAbortRetryIgnor Răspunsuri Abort, Retry şi Ignore
e
vbYesNoCancel Răspunsuri Yes, No, Cancel
vbYesNo Răspunsuri Yes, No
vbCritical Buton de atenţionare, răspuns Ok

vbInformation Buton de informare, răspuns Ok


MsgBox
Funcţia MsgBox returnează o valoare care indică butonul
activat de utilizator şi în funcţie de care programul
poate lua o decizie:
Constantă Buton selectat
vbOK OK
vbCancel Cancel
vbAbort Abort
vbRetry Retry
vbIgnore Ignore
vbYes Yes
vbNo No
Exemplu MsgBox

Exemplu : Pe formular se plasează un buton de


comandă, la activarea lui se deschide o casetă de
dialog cu 2 răspunsuri posibile (vbYesNo).

Răspunsul=Yes  procedura-eveniment deschide un


alt formular, numit „Produse”,
Răspunsul=No  afişează un text în eticheta
Label1.
Exemplu MsgBox

Private Sub Command2_Click()

rasp=MsgBox("Deschide formular?",vbYesNo,
"Fereastra_mesaj")
If rasp = vbYes Then
DoCmd.OpenForm “Produse"
Else
Label1.Caption = "Raspuns NU!“
End If
End Sub
Programare VBA
Obiecte pentru administrarea BD;
Comenzi SQL în VBA

În cadrul SGBD-urilor relaționale, limbajul de


comunicare al utilizatorului cu BD este SQL
(Structured Query Language),
Language) care include:
1. Definirea structurilor de date - Limbajul de definire
a datelor (Data Definition Language – DDL) care
permite crearea, modificarea şi ştergerea structurilor
de date şi a legăturilor dintre ele:

CREATE, ALTER, DROP


Obiecte pentru administrarea BD;
Comenzi SQL în VBA
2. Întreţinerea bazei de date (inserarea, actualizarea şi
ştergerea datelor se fac cu ajutorul Limbajului de
manipulare a datelor (Data Manipulation Language
– DML).
INSERT, UPDATE, DELETE
3. Interogarea datelor (operaţii de prelucrare -filtrare,
sortare etc) şi de extragere a datelor pentru
vizualizare se bazează pe Limbajul de interogare
(Data Query Language – DQL).
Comanda SELECT
Obiecte pentru administrarea BD;
Comenzi SQL în VBA

Există 2 modalități principale de a executa instrucțiuni


SQL (DML) din Microsoft Access, pe lângă
modalitatea de creare a unei interogări de acțiune.

DoCmd.RunSQL
[Database].Execute
Obiecte pentru administrarea BD;
Comenzi SQL în VBA

RunSQL este o metodă a obiectului DoCmd


proiectată pentru DML, cum ar fi instrucțiunile
UPDATE, INSERT și DELETE.
Nu se poate executa o interogare SELECT, prin
metoda RunSQL.
RunSQL necesită instrucțiunea SQL reală, astfel:

DoCmd.RunSQL "UPDATE Angajati “ _


& “SET Salariu = Salariu * 1.10”
Operatii in cadrul RecordSet

Metoda Execute este valabilă pentru interogările de


acțiune și pentru alte instrucțiuni SQL.

Deoarece o interogare de acțiune nu returnează nicio


înregistrare, Execute nu returnează un set de
înregistrări.
Obiecte pentru administrarea BD;
Comenzi SQL în VBA

1. Database – Baza Date


2. TableDef – Definirea unui tabel
3. Field – câmp din tabel, interogare, set de
inregistrari sau relatie
4. RecordSet – set de inregistrari dintr-un tabel sau o
interogare
5. Relation – legatura intre 2 tabele
Variabila de tip set de inregistrari

‘ Se declară obiectul Database și se identifică Baza de


date
‘ Declarare db ca obiect de tip Database
Dim db As Database

‘ identificarea BD curenta
Set db = CurrentDb()

sau
Set db=OpenDatabase (“Test_VBA.accdb”)
Variabila de tip set de inregistrari

‘ Declarare colectie ca set de inregistrari in DAO


Dim colectie As DAO.Recordset

Data Access Object (DAO) este o interfata abstractă


către un tip de BD si permite anumite operatii in
cadrul acesteia.
Variabila de tip set de inregistrari
Dezavantaje ale utilizării DAO:
- duplicarea codului și efectul invers al abstractizării.
Se pot declansa mai multe interogări ale bazei de date
pentru a prelua informații care altfel ar putea fi returnate
într-o singură operație cu operațiuni normale SQL .
Dacă o aplicație necesită mai multe colectii DAO, s-ar
putea să se repete același cod de creare, citire, actualizare
și ștergere pentru fiecare dintre ele.
Operatii in cadrul RecordSet
Parcurgerea Setului de inregistrari are 2 proprietati-
limita, si anume:
BOF – Begin of File = Inceput de fisier (colectie)
EOF – End of File = Sfarsit de fisier (colectie)

Metode de parcurgere a inregistrarilor:


•MoveFirst – focalizarea este pe prima inregistrare a
colectiei
•MoveLast – se trece controlul pe ultima inregistrare a
setului de inregistrari
•MovePrevious, MoveNext
Comenzi SQL in VBA
Plan de lucru pentru exemplul care urmează:
1.Procedura publica de declarare a BD curente
2.Stergere tabele ANGAJATI si DEPARTAMENTE
3.Creare tabele ANGAJATI si DEPARTAMENTE
4.Crearea legăturii între tabele prin modificarea tabelei
ANGAJATI – cod_departament va avea proprietatea Foreign
Key cu referire la DEPART.
5.Inserarea de înregistrări în DEPARTAMENTE și
ANGAJATI
6.Stergerea unei înregistrări din ANGAJATI
7.Selectarea și afișarea înregistrărilor din tabela ANGAJATI
Comenzi SQL in VBA
Comenzi SQL in VBA
Comenzi SQL in VBA
Comenzi SQL in VBA

Pe formular se creaza un buton b_creare_tabele si


procedura atașată evenimentului On_Click :

Dim sqlString As String


sqlString = "CREATE TABLE Angajati (CNP
Text(13), Nume Text(30) Not NULL, cod_dep Byte,
Salariu Integer, PRIMARY KEY(CNP));"
db.Execute (sqlString)
Comenzi SQL in VBA
Comenzi SQL in VBA

Pe formular se creaza un buton b_relatie si se adauga


procedura la evenimentul Click:

Dim sqlString As String


sqlString = "ALTER TABLE Angajati ADD
FOREIGN KEY (cod_dep) REFERENCES
Departamente(cod_dep);"
db.Execute (sqlString)
Comenzi SQL in VBA
Comenzi SQL in VBA
Pe formular sunt 2 butoane de inserare, corespunzatoare
celor 2 tabele:
b_insert_dep
b_insert_ang

Fiecarui buton ii este atasata o procedura eveniment


Click.
sqlString = "INSERT INTO
Departamente(cod_dep,den_dep)
VALUES (2,'Productie');"
db.Execute (sqlString)
Comenzi SQL in VBA
Comenzi SQL in VBA
Se parcurge tabela si se cauta inregistrarea care are
CNP=“111”

Do While Not t_angajati.EOF


If CNP = "111" Then
t_angajati.Delete
Exit Do
Else
t_angajati.MoveNext
End If
Loop
Comenzi SQL in VBA
Comenzi SQL in VBA

- Se parcurge setul de date si se afiseaza in caseta-mesaj


- Un câmp din tabel se identifica prin:
Nume_tabela ! Identif_câmp

Do While Not t_angajati.EOF


MsgBox ("Nume: " & t_angajati!Nume & vbNewLine
& "Salariu: " & t_angajati!Salariu)
t_angajati.MoveNext
Loop
VĂ MULŢUMESC PENTRU
ATENŢIE!

ÎNTREBĂRI ?
Buton de comandă

Sintaxa apelării unui buton de comandă:


DoCmd.nume_operaţie arg1,arg2,arg3, arg4, arg5

• Argumentele sunt stabilite în funcţie de operaţia


selectată.
Buton de comandă
DoCmd.OpenForm n_form, mod_afiş, n_filtru, condiţie,
m_date, m_fereastra
• n_form – nume formular
• mod_afiş – deschiderea formularului în Form View,
Design View, Print Preview
Exemplu: acDesign, acNormal default, acPreview
• n_filtru – ataşarea unui filtru operaţiei pentru selectarea
anumitor date; numele unei interogari;
• condiţie – formulare condiţie de selectare înregistrări;
Buton de comandă
• m_date – poate lua valorile Add (adăugare date), Edit
(modificare) sau ReadOnly (citire);
Exemplu: acFormAdd, acFormEdit, default
acFormReadOnly
• m_fereastra – deschiderea ferestrei în mod Normal, Icon,
Hidden, Modal.
Exemplu: acIcon, acWindowNormal
Singura proprietate din Data a butonului este:
• Enabled – accesibilitatea butonului.

Submeniul Other din Properties:


• Name - schimbarea numelui butonului, care implicit era
Command0, Command1 etc.
Parcurgerea unui Set de inregistrari

Exemplu de parcurgere a unui set de inregistrari,


sortarea in ordinea alfabetică a înregistrărilor după
câmpul Denumire-produs si afisarea într-o caseta de
tip ListBox.
ListBox este un obiect cu proprietati si metode:
•RecordCount = numar total de articole
•RemoveItem – sterge articolul current
•AddItem – adauga un nou articol (coloana1;coloana2)
Parcurgerea unui Set de inregistrari

‘ Sterge lista anterioara


For i = 1 To Lista_sortata.ListCount
Lista_sortata.RemoveItem 0
Next I

‘ Adaugare articole in lista din setul de date f_ies


Do While Not f_ies.EOF()
Lista_sortata.AddItem f_ies ! Denumire_produs
f_ies.MoveNext
Loop
Private Sub b_sortare_Click()
Dim db As Database
Dim f_ies As DAO.Recordset
Dim i As Byte
Set db = CurrentDb()
‘Sortare fisier dupa Denumire_produs
Set f_ies = db.OpenRecordset("SELECT * FROM Produse ORDER
BY Denumire_produs;")
f_ies.MoveFirst
‘Stergerea listei
For i = 1 To Lista_sortata.ListCount
Lista_sortata.RemoveItem 0
Next i
‘Afisare articole sortate
Do While Not f_ies.EOF()
Lista_sortata.AddItem f_ies!Denumire_produs
f_ies.MoveNext
Loop
End Sub
Contorizarea inregistrarilor dintr-o colectie

- Proprietatea RecordCount – returneaza numarul de


inregistrari din colectie.
Public Sub Contorizare ()
Dim db as Database
Dim colectie as DAO.RecordSet
Set db=CurrentDB()
Set colectie=db. OpenRecordset (“Produse”)

MsgBox “Nr.inreg:” & colectie ! RecordCount

End sub
Căutarea unei inregistrari intr-o colectie
- Proprietatea SEEK permite localizarea datelor intr-un
set de inregistrari de tip tabel, dupa valoarea unui camp
- In cazul in care se returneaza mai multe inregistrari,
parcurgerea lor se face cu FindFirst, FindNext,
FindPrevious, FindLast
Observatii:
1. Pentru cautarea unei inregistrari cu SEEK, se face initial
setarea proprietatii Index curent
2. Daca exista cel putin o inregistrare identificata,
proprietatea NoMatch returneaza FALSE, altfel
returneaza TRUE
Căutarea unei inregistrari intr-o colectie

- In exemplul urmator, se cauta un anumit cod_produs,


citit de la tastatura si transmis ca parametru al functiei
Cautare

- Se afiseaza un mesaj (MsgBox) care contine


denumire_produs, corespunzator codului
Căutarea unei inregistrari intr-o colectie

Caseta text
Căutarea unei inregistrari intr-o colectie

Private Sub caseta_cod_AfterUpdate()


‘ se preia codul produsului
v_cod = caseta_cod.Text

‘apelare procedura
Cautare (v_cod) Cautare
End Sub
Public Sub Cautare(v_cod As Byte)
………………….. ‘ Declaratii
Set colectie = db.OpenRecordset("Produse")

colectie.MoveFirst ‘prima inregistrare

‘Declararea indexarii dupa PK


colectie.Index = "PrimaryKey”

‘Cautare dupa v_cod


colectie.Seek "=", v_cod
‘ Testare regasire cod, proprietatea NoMatch = True,
implica cod inexistent

If colectie.NoMatch Then
MsgBox "Cod eronat!"
Else
MsgBox colectie ! Denumire_produs
End If
colectie.Close
Modificarea unei inregistrari intr-o colectie

- Proprietatile EDIT si UPDATE


1. localizarea inregistrarii de modificat - SEEK
2. Inceperea modificarii – metoda EDIT
3. Finalizarea modificarii, rescrierea in tabela – metoda
UPDATE

In exemplul urmator se cauta inregistrarea dupa cheia


primara (Cod_produs) si se inlocuieste valoarea din
campul Denumire_produs
Modificarea valorilor unei inregistrari
Sub Cautare (v_cod as byte)
……………………………………………
colectie.Index=“PrimaryKey”
colectie.Seek “=“, v_cod
If colectie.Match Then
colectie.Edit
colectie ! Denumire_produs=“Testare EDIT”
colectie.Update
Else
MsgBox “Cod eronat !”
End If
colectie.Close
End sub
Modificarea valorilor unei inregistrari
Stergerea unei inregistrari intr-o colectie

- Metoda DELETE
1. localizarea inregistrarii de sters (SEEK)
2. Stergerea inregistrarii DELETE

In exemplul urmator se cauta inregistrarea dupa cheia


primara (Cod_produs) si se sterge.
Raman valabile conditiile de Cascading Delete, daca
tabela este in relatie 1 – ∞ cu alte tabele din BD.
Stergerea unei inregistrari intr-o colectie

Sub Stergere(v_cod as byte)


……………………………………………
colectie.Index=“PrimaryKey”
colectie.Seek “=“, v_cod
If colectie.Match Then
colectie.Delete
Else
MsgBox “Cod eronat !”
End If
colectie.Close
End sub
Adaugarea unei inregistrari intr-o colectie

- Metoda ADDNEW prin care se precizeaza adaugarea


unei noi inregistrari;
- intr-un buffer se preiau valorile campurilor
- Se finalizeaza prin scrierea inregistrarii pe disc prin
metoda UPDATE
Subrutina Adaugare contine valorile campurilor din noua
inregistrare
Cod_produs=10
Den_produs=“Calculator”
Adaugarea unei inregistrari intr-o colectie

Sub Adaugare(v_cod As Byte,v_den as String)


……………………………………………
colectie.AddNew
With colectie
.cod_produs=v_cod
.den_produs=v_den
.Update
End with
colectie.Close
End sub
OBS. Initial, se face verificarea faptului ca nu exista codul
inserat, pentru a nu dubla inregistrarea
Private Sub b_adaugare_Click()
……………………….. ‘Declaratii BD, RecordSet
colectie.Index = "PrimaryKey"
colectie.MoveFirst
colectie.Seek "=", m_cod
If colectie.NoMatch = True Then
With colectie
.AddNew
!Cod_produs = m_cod
!Denumire_produs = m_denumire
.Update
End With
MsgBox "Articol adaugat: " & m_denumire
Else
MsgBox "Duplicare cod !!!"
cod_nou.SetFocus
End If
End Sub
VĂ MULŢUMESC PENTRU
ATENŢIE!

ÎNTREBĂRI ?

S-ar putea să vă placă și