Deschiderea unui set de înregistrări

Pentru a ajunge la înregistrările din baza de date în care stabiliți conexiunea, trebuie să deschideți un set de înregistrări. ADO și DAO utilizează abordări diferite. Următoarele subsecțiuni vă oferă detaliile.

Deschiderea unui set de înregistrări utilizând ADO

Pentru a deschide un set de înregistrări utilizând ADO, utilizați metoda Open a obiectului RecordSet. Sintaxa pentru metoda Open este:

recordset.Open Source, ActiveConnection, CursorType, LockType, Options

Iată componentele sintaxei:

  • recordset este obiectul RecordSet pe care doriți să îl deschideți. De multe ori, veți utiliza o variabilă obiect care face referire la obiectul RecordSet.
  • Source este un argument opțional de tip Variant care specifică tabelul, comanda, instrucțiunea SQL sau fișierul care conține setul de înregistrări.
  • ActiveConnection este un argument opțional de tip Variant. Aceasta poate fi fie o variabilă obiect a tipului Connection sau un tip Variant/String care conține parametrii pentru conexiune.
  • CursorType este un argument opțional care specifică tipul de cursor de utilizat în setul de înregistrări. Tabelul următor explică tipurile de cursor.
  • LockType este un argument opțional pentru specificarea modului de blocare a setului de înregistrări în timp ce acesta este deschis. Opțiunile de blocare sunt descrise în tabelul al doilea.
  • Options este un argument opțional de tip Long care se poate utiliza pentru a controla modul în care valoarea sursă este evaluată dacă nu este un obiect Command. Tabelul al treilea explică constantele disponibile, care se încadrează în două categorii: opțiuni de tip comandă și opțiuni de executare. Puteți utiliza două sau mai multe constante pentru argumentul Opțiuni.

O alternativă la furnizarea de argumente pentru metoda Open

În loc să specificați argumentele cu metoda Open, aveți posibilitatea să setați proprietățile Source, ActiveConnection, CursorType și LockType ale obiectului RecordSet pe care îl deschideți, apoi să utilizați metoda Open fără argumente. Această abordare ar putea face codul mai ușor de citit.

Constante de tip cursor pentru deschiderea unui set de înregistrări

Opțiuni de blocare pentru deschiderea unui set de înregistrări prin ADO

Opțiuni pentru argumentul Options la deschiderea unui set de înregistrări

Veți vedea exemple de deschidere a unui set de înregistrări un pic mai târziu. Mai întâi, trebuie să decideți ce abordare doriți să utilizați pentru a accesa datele din setul de înregistrări. Cele mai simple metode sunt utilizarea unui tabel existent sau a unei instrucțiuni SQL SELECT.

Alegerea modului de accesare a datelor într-un set de înregistrări ADO

Modul în care ajungeți la datele din setul de înregistrări pe care îl deschideți depinde dacă doriți să preluați toate datele dintr-un tabel sau doar o parte din acesta. Dacă doriți toate datele dintr-un tabel, utilizați un obiect tabel pentru a accesa datele. Dacă doriți să returnați numai un subset cu anumite înregistrări, aveți posibilitatea să utilizați o instrucțiune SQL SELECT pentru a le prelua.

Utilizarea unui tabel pentru a accesa datele într-un set de înregistrări ADO

Pentru a deschide într-un set de înregistrări un întreg tabel dintr-o bază de date, specificați numele tabelului ca argument Source din instrucțiunea Open. Următorul exemplu declară o variabilă de obiect RecordSet, utilizează o instrucțiune Set pentru a atribui tipul corespunzător de set de înregistrări, utilizează metoda ActiveConnection pentru a vă conecta la baza de date activă în prezent (indiferent ce ați încărcat în Access la momentul respectiv), apoi utilizează metoda Open pentru a deschide întregul tabel Clienți. Vom utiliza baza de date eșantion Northwind (care a fost aleasă pentru exerciții în secțiunea Descrierea Access Object Model și a Key Objects), care are un tabel Customers.

Exemplul următor demonstrează cum se pot prelua într-un set de înregistrări ADO datele dintr-un tabel întreg și apoi cum se poate naviga în setul de înregistrări. Codul nu va trebui să instanțieze obiect bază de date, dar în schimb va lucra cu baza de date Northwind care este încărcată în prezent în Access. (Acesta este un exemplu foarte simplu pentru a ilustra unele concepte de bază. În mod normal, atunci când accesați o bază de date, veți dori să utilizați o instrucțiune SQL și să verificați condițiile limită ale setului de înregistrări, utilizând proprietățile BOF și EOF. SQL și BOF/EOF sunt descrise mai târziu. Pentru moment, în următorul exemplu de cod se ia în considerare o ilustrare a principiilor elementare, la care veți adăuga manevre din lumea reală demonstrat în exemple de cod ulterioare.)

Ca întotdeauna, este necesar să vă asigurați mai întâi că se face referire la biblioteca ADO. Deci, în VBA Editor, alegeți Tools > References și bifați caseta de selectare de lângă Microsoft ActiveX Data Objects 6.1 Library. Apoi încărcați în Access baza de date Northwind.accdb. Apoi, puteți lipi acest cod într-un modul VBA Access, apăsați F5 cu cursorul de inserare situat în cod și urmăriți diferitele casete de mesaje care demonstrează că codul funcționează:

1. Sub ExploreRecordset()
2.   Dim myRecordset As ADODB.Recordset
3.   Set myRecordset = New ADODB.Recordset
4.
5.   'indică spre baza de date încărcată în prezent
6.    myRecordset.ActiveConnection = CurrentProject.Connection
7.    myRecordset.CursorType = adOpenStatic
8.    myRecordset.Open Source:="Customers"
9.
10.    'afișează First Name de pe primul rând
11    MsgBox myRecordset("First Name")
12.
13.   'deplasare la ultimul rând și afișarea Last Name
14.   myRecordset.MoveLast
15.   MsgBox myRecordset("Last Name")
16.
17.   'deplasarea la rândul anterior și afișarea Job Title
18.   myRecordset.MovePrevious
19.   MsgBox myRecordset("Job Title")
20.
21.   'deplasare înapoi la primul rând și afișare Phone Number
22.   myRecordset.MoveFirst
23.   MsgBox myRecordset("Business Phone")
24.
25.   'deplasare la rândul următor și afișarea Last Name
26.   myRecordset.MoveNext
27.   MsgBox myRecordset("Last Name")
28.
29.
30.   myRecordset.Close
31.   Set myRecordset = Nothing
32. End Sub

În acest cod, declarați mai întâi o variabilă recordset și în linia 6 indicați baza de date încărcată în prezent în Access. Linia 7 definește tipul cursorului ca static, iar linia 8 încarcă datele, întregul tabel Customers - în setul de înregistrări.

Linia 11 nu se deplasează nicăieri în cadrul setului de înregistrări, astfel încât prin simpla furnizare a numelui setului de înregistrări, MyRecordset, împreună cu unul dintre numele câmpurilor tabelului, Last Name, într-o funcție MsgBox, aveți posibilitatea să afișați prima înregistrare din tabel.

Linia 14 se mută într-o altă înregistrare din cadrul setului de înregistrări – ultima înregistrare – înainte de a afișa datele în câmpul Last Name al înregistrării respective. Linia 18 se mută la penultima înregistrare, linia 22 se mută la prima înregistrare, iar linia 26 se mută la a doua înregistrare. În cele din urmă, linia 30 închide setul de înregistrări, iar linia 31 atribuie Nothing variabilei obiect, care are ca efect eliminarea ei.

Ce este o "prima înregistrare" într-un tabel?

Este important ca începătorii sa înțeleagă diferența practică dintre un tabel de date brute dintr-o bază de date și un set de înregistrări recordset organizat, extras din acea bază de date. Conceptul de "prima înregistrare" într-o bază de date relațională este, în esență, lipsit de sens până când utilizați o instrucțiune SQL pentru a organiza (sorta sau grupa) înregistrările tabelului într-un anumit mod.

Înregistrările dintr-o bază de date relațională (tipul de bază de date pe care o utilizează Access) nu sunt neapărat organizate. De exemplu, acestea nu sunt neapărat ordonate alfabetic după un anumit câmp (cum ar fi LastName) sau listate crescător după un număr de Identificare sau organizate utilizând orice altă schemă. Adevărat, datele sunt stocate în tabele, iar un tabel are structură: câmpurile sale separă datele în categorii logice, ar fi Nume de familie, Adresa, Telefon mobil și așa mai departe. Dar înregistrările sale (rândurile de date reale) nu sunt neapărat menținute într-o anumită ordine.

Un set de înregistrări (un recordset) este extras dintr-o bază de date atunci când executați o instrucțiune SQL. Această declarație vă permite să specificați modul în care doriți să vedeți înregistrările organizate (grupate după oraș, ordonate alfabetic sau orice altceva). SQL este flexibil: Aveți posibilitatea să organizați înregistrările în mai multe moduri atunci când extrageți un set de înregistrări dintr-o bază de date. Aveți posibilitatea să sortați înregistrările după oricare dintre câmpurile lor; de asemenea, puteți sorta fie în ordine crescătoare (implicită), fie în ordinea descrescătoare (specificați DESC pentru descrescătoare). Care înregistrare sfârșește prin a fi prima după interogarea tabelului de date depinde, de asemenea, de câmpul după care îl sortați noul set de înregistrări, așa cum se specifică în instrucțiunea ORDER BY.

În exemplul din secțiunea "Utilizarea unui tabel pentru accesarea datelor într-un set de înregistrări ADO", înregistrările sunt mutate în setul de înregistrări nesortate. Pe măsură ce fiecare acțiune este efectuată în acest cod – avansând și înapoi prin setul de înregistrări – casetele de mesaje afișează înregistrările în ordinea lor nesortată. Cu toate acestea, poate doriți să organizați înregistrările în ordine alfabetică după numele de familie al fiecărui client. Pentru aceasta, modificați interogarea care preia înregistrările. Trebuie să adăugați cuvântul cheie ORDER BY în instrucțiunea SQL, astfel:

myRecordset.Open "Select * from Customers ORDER BY 'Last Name'

Puteți obține un recordset fără a specifica chiar și o instrucțiune SQL, astfel:

myRecordset.Open Source:="Customers"

Dar conceptul de "prima înregistrare" în acest set de înregistrări, probabil nu va avea nici un sens.

Cu toate acestea, puteți obține un recordset utilizând o instrucțiune SQL, astfel:

myRecordset.Open strSQL

În acest caz, "prima înregistrare" va avea sens pe baza criteriilor specificate în instrucțiunea SQL (aici strSQL, ar fi un șir definit anterior, care conține o instrucțiune SQL). Secțiunea intitulată "Utilizarea unei instrucțiuni SQL SELECT pentru a accesa un subset de date într-un set de înregistrări ADO" de mai jos, explică modul de utilizare a unei instrucțiuni SQL.

UTILIZAREA UNEI INSTRUCȚIUNI SQL SELECT PENTRU A ACCESA UN SUBSET DE DATE DINTR-UN SET DE ÎNREGISTRĂRI ADO

Dacă doriți să adăugați la setul de înregistrări nu întregul tabel, ci numai acele înregistrări care se potrivesc cu un criteriu pe care îl specificați, utilizați o instrucțiune SQL SELECT. Declarațiile SELECT pot fi construite în moduri complexe, dar puteți crea, de asemenea, declarații simple cu o mică practică folosind această sintaxă:

 SELECT [DISTINCT] fields FROM table WHERE criteria ORDER BY fields [DESC]

Cuvintele scrise cu majuscule sunt cuvintele cheie SQL, iar cuvintele scrise cu litere mici sunt nume de locuri pentru datele pe care le furnizați, cum ar fi numele real al unui tabel real. Iată detaliile:

  • Cuvântul cheie SELECT indică faptul că creați o instrucțiune pentru a selecta înregistrări (spre deosebire de, să zicem, ștergeți înregistrările).
  • Opțional, aveți posibilitatea să includeți cuvântul cheie DISTINCT (parantezele pătrate indică faptul că este opțional) pentru a face ca declarația să returneze numai înregistrări unice, eliminând orice dubluri pe care altfel le-ar returna declarația. Dacă omiteți DISTINCT, veți obține și înregistrări duplicate.
  • fields este o listă a câmpurilor care doriți să apară în setul de înregistrări. Dacă utilizați două sau mai multe nume de câmpuri, separați-le cu virgule - de exemplu, contact, compania, adresa. Pentru a returna toate numele câmpurilor, introduceți un asterisc (*).
  • FROM table specifică numele tabelului din care se pot extrage datele.
  • WHERE criteria specifică criteriile de filtrare a înregistrărilor. Introduceți numele câmpului, un semn egal, și între ghilimele simple, valoarea pe care o căutați. De exemplu, WHERE Oras = 'Cluj' returnează numai rezultatele în cazul în care Cluj apare în câmpul Oras.
  • ORDER BY fields specifică câmpul sau câmpurile după care se sortează rezultatele. Dacă utilizați două sau mai multe câmpuri, puneți-le în ordinea priorității dorite (mai întâi primul câmp de sortare, apoi al doilea câmp de sortare și așa mai departe) și separați-le cu virgule. Ordinea de sortare implicită este ascendentă, dar aveți posibilitatea să forțați un sortare descendentă adăugând cuvântul cheie DESC. De exemplu, ORDER BY Zip DESC produce o sortare descendentă după câmpul Zip, în timp ce ORDER BY Judet, Oras produce o sortare ascendentă după câmpul Judet și, în cadrul lui, dupa Oras.

Deoarece instrucțiunile SQL SELECT conțin atât de multe elemente, plasarea unei instrucțiuni SELECT ca argument într-o instrucțiune Open poate crea linii de cod lungi greu de citit. În VBA Editor aveți posibilitatea să rupeți liniile de cod, folosind ca de obicei simbolul de subliniere, dar este posibil să vi se pare mai ușor să utilizați proprietățile obiectului RecordSet pentru a specifica detaliile setului de înregistrări, în loc să utilizați argumentele Open.

O altă modalitate de a evita utilizarea unei instrucțiuni SQL mari ca argument pentru metoda Open este de a atribui mai întăi instrucțiunea SELECT la o variabilă de tip String și apoi să o utilizați pentru a furniza argumentul. Următorul cod ilustrează această abordare.

În acest cod, vom atribui o instrucțiune SQL la un șir și apoi vom folosi acel șir ca argument pentru instrucțiunea Open. Înainte de a executa acest exemplu, apăsați Ctrl+G în Editorul VBA pentru a deschide fereastra Immediate, unde vor fi afișate rezultatele.

Sub SubSet()
  Dim strSQL As String
  Dim myRecordset As ADODB.Recordset 
  Set myRecordset = New ADODB.Recordset
  myRecordset.ActiveConnection = CurrentProject.Connection 
  strSQL = "Select * FROM Customers WHERE ID > 17"
  myRecordset.Open strSQL
  Do Until myRecordset.EOF
    Debug.Print myRecordset("Last Name") 
    myRecordset.MoveNext
  Loop 
End Sub

În acest exemplu, se vor importa în setul de înregistrări numai acele înregistrări care au ID-ul mai mare de 17, deci parametrizați o instrucțiune SQL care specifică această condiție. Apoi, folosind o buclă în setul de înregistrări până la EOF (sfârșitul fișierului), se preia și se afișează numele de familie în fereastra Immediate.

Rețineți că aici folosim fereastra Immediate, deoarece afișarea rezultatelor testării acestui cod prin intermediul casetelor de mesaje repetate este incomodă - sunt prea multe rezultate.

Deschiderea unui Recordset folosind DAO

Atunci când lucrați cu DAO, utilizați o abordare diferită de tehnicile ADO explorate până în prezent în acest capitol. Utilizați metoda OpenRecordset a obiectului bază de date pentru a crea un set de înregistrări nou și adăugați-l la colecția Recordsets.

Sintaxa pentru metoda OpenRecordset este următoarea:

Set recordset = object.OpenRecordset (Name, Type, Options, LockEdit)

Iată componentele sintaxei:

  • recordset este o variabilă obiect care reprezintă obiectul RecordSet pe care îl deschideți.
  • object este o variabilă obiect are reprezintă baza de date din care se creează noul obiect RecordSet.
  • Name este un argument obligatoriu de tip String care specifică tabelul, interogarea sau instrucțiunea SQL care furnizează înregistrările pentru setul de înregistrări. Dacă utilizați o bază de date Jet și returnați un set de înregistrări de tip tabel, aveți posibilitatea să utilizați numai un nume de tabel pentru argumentul Name.
  • Type este un argument opțional care se poate utiliza pentru a specifica tipul setului de înregistrări pe care îl deschideți. Tabelul de mai jos explică constantele pe care le puteți utiliza pentru Type.
  • Options este un argument opțional care se poate utiliza pentru a specifica constantele care controlează modul în care Access deschide setul de înregistrări. Constantele pe care le puteți utiliza pentru Options sunt afișate în tabel.
  • LockEdit este o constantă opțională care se poate utiliza pentru a specifica modul în care este blocat setul de înregistrări. Access 2013 a încetat să mai suporte spațiile de lucru ODBCDirect. Deci, dacă aveți nevoie să vă conectați direct la date stocate extern (nu prin intermediul motorului de baze de date Access), atunci trebuie să utilizați ADO, mai degrabă decât DAO. Constantele pe care le puteți utiliza pentru LockEdit sunt afișate în tabel.

Constante pentru argumentul Options

Constante pentru argumentul LockEdit

DESCHIDEREA UNUI SET DE ÎNREGISTRĂRI DAO UTILIZÂND UN TABEL

Cel mai simplu mod de a deschide un set de înregistrări DAO este să deschideți un întreg tabel specificând numele tabelului pentru argumentul Name și utilizând Type: = dbOpenTable pentru a afirma în mod explicit că deschideți un tabel. Următorul exemplu declară variabila obiect myRecordset ca obiect DAO.Recordset și apoi i se atribuie înregistrările din tabelul Customers în baza de date identificată de variabila obiect myDatabase:

Sub DAOTest()
Dim myRecordset As DAO.Recordset 
Dim myDatabase As DAO.Database
'deschide copia northwind de pe hard disk
Set myDatabase = DBEngine.OpenDatabase("C:\temp\Northwind.accdb")
'creaza setul de înregistrări în stil DAO
Set myRecordset = myDatabase.OpenRecordset(Name:="Customers", _ 
    Type:=dbOpenTable)
MsgBox myRecordset("ID")
MsgBox myRecordset("Company")
MsgBox myRecordset("Address")
MsgBox myRecordset("City")
Set myRecordset = Nothing 
End Sub

DESCHIDEREA UNUI SET DE ÎNREGISTRĂRI DAO UTILIZÂND O INSTRUCȚIUNE SQL SELECT

Dacă doriți să returnați numai un subset de înregistrări și nu un întreg tabel, utilizați o instrucțiune SQL SELECT pentru a deschide setul de înregistrări DAO. (Consultați "Utilizarea unei instrucțiuni SQL SELECT pentru a accesa un subset de date într-un set de înregistrări ADO", de mai sus, pentru o explicație a esențiale de declarații SQL SELECT.)

Specificați instrucțiunea SQL ca argumentul Name pentru metoda OpenRecordset, după cum se ilustrează în următorul exemplu. Acest cod declară o variabilă obiect bază de date, atribuie baza de date eșantion Northwind la ea, declară o variabilă obiect RecordSet, și apoi atribuie la variabila obiect rezultatele unei instrucțiuni SELECT executată în baza de date:

Sub DAOSelect()
Dim myDatabase As DAO.Database
Set myDatabase = DBEngine.OpenDatabase("C:\temp\Northwind.accdb")
Dim myRecordset As DAO.Recordset
Set myRecordset = myDatabase.OpenRecordset _
  (Name:="SELECT * FROM Customers WHERE City ='Boston,M, _
  Type:=dbOpenDynaset)
Do Until myRecordset.EOF
  Debug.Print myRecordset("Last Name") myRecordset.MoveNext
Loop
Set myRecordset = Nothing 
End Sub

Rețineți că rezultatele din acest exemplu sunt afișate în fereastra Immediate a editorului VBA, deci dacă acea fereastră nu este vizibilă, apăsați Ctrl+G pentru a o deschide înainte de a apăsa F5 pentru a testa această procedură.