You are on page 1of 15

Chng 6: Lp trnh VBA cn bn

CHNG 6
LP TRNH C S D LIU
1. Khi nim v k thut DAO
DAO (Data Access Objects Cc i tng truy xut d liu) l tp hp
bao gm lp cc i tng c th dng lp trnh truy cp v x l d liu
trong cc h CSDL. y CSDL Access, ngn ng lp trnh VBA.
1.1 Np th vin DAO
np th vin DAO3.6 vo lm vic, hy thc hin nh sau:
Bc 1: M ca s lp trnh VBA;
Bc 2: Chn thc n Tools | References .. Hp thoi sau xut hin:

Hy chn (tch) mc Microsoft DAO 3.6 Object Libraly trn danh sch
Available References; chn xong, nhn OK ng li.
1.2 S lin kt qun l c s d liu

Trong :

59

Chng 6: Lp trnh VBA cn bn

- Tng ng dng: bao gm nhng giao din ngi s dng cng nh


nhng cng c n gin m ngi lp trnh c th dng x l d liu theo cc
bi ton.
- Tng Kt ni d liu: bao gm tp hp cc cng c, phng thc kt
ni ti nhng d liu cn lm vic trong CSDL. y, tng kt ni bao gm cc
chun Microsoft Jet 4.0 v cc lp i tng DAO.
- Tng C s d liu: bao gm cc bng, cc query trong c s d liu
thc ti.
Nh vy lp trnh trn mt CSDL phi s dng cc i tng, cc
phng thc tng kt ni nh l nhng cng c c th truy cp c vo
CSDL tc nghip x l. Tng kt ni chnh l Jet 4.0 v DAO 3.6 m chng
ta s c tm hiu di y.
2. Lp i tng DAO
Cu trc mt CSDL bao gm nhiu thnh phn, i hi lp trnh cng cn
c nhng thnh phn tng ng lm vic. Lp cc thnh phn tng ng
c th lp trnh c trn ton b cu trc CSDL l lp cc i tng DAO.
Chng c tn gi, c nhng tp thuc tnh, cc phng thc lm vic v c quan
h mt thit vi nhau.
2.1 Cy phn cp lp cc i tng DAO

Trong :
Workspaces nh ngha tp hp cc vng lm vic. y c th coi l
lp lm vic cao nht. V l thuyt c th khai bo mt vi vng lm vic
(Workspace), nhng trn thc t ch cn khai bo mt vng lm vic v vng

60

Chng 6: Lp trnh VBA cn bn

ny lun c khai bo ngm nh cho CSDL hin ti. Nn s khng cn bn


nhiu n lp cc WorkSpace ny.
Databases - nh ngha tp hp cc CSDL Access cn lm vic trn mt
d n
RecordSets- nh ngha cc tp hp bn ghi (Records) cn lm vic.
QueryDefs - nh ngha tp hp cc Query lm vic. QueryDefs v
Recordsets l kh nng truy xut, x l d liu (Data Manipulation) ca DAO.
TableDefs - nh ngha tp hp cc bng (Table) cn lm vic. y l
kh nng nh ngh d liu (Data-Definition Language);
Relations - nh ngha tp hp cc quan h (Relationship) cn lm vic.
Mi lp cc i tng trn s bao gm tt c cc i tng i tng
cng loi trong mt i tng m ang m:
- Databases s bao gm tt c cc CSDL ang oc m trong vng lm
vic hin ti;
- RecordSets s bao gm tp hp tt c cc Recordset ang c m trn
CSDL hin ti.
Khi , tham chiu n mt i tng c th cn lm vic, c th dng
ch s (s th t ca i tng trn tp hp tt c cc i tng ) hoc
dng tn gi i tng tham chiu.
V d: lit k tn ca tt c cc Recordset ang s dng trong CSDL db.
Dim db As DAO.Database
For i = 0 To db.Recordsets.Count
MsgBox db.Recordsets(i).Name
Next
lm vic ti mt i tng c th, cn phi tham chiu t lp cc i
tng m ca n.
V d: hin th gi tr ca trng (Field) hoten trn tp hp cc bn ghi
(Recordset) rs1 lm nh sau:
MsgBox rs1.Fields("hoten").Value
hoc
MsgBox rs1.Fields![hoten].Value
2.2 i tng Database
Database l i tng dng lm vic vi mt CSDL (trong trng hp
ny c
th hiu mt CSDL nh mt tp Access .MDB).
Lp cc i tng con ca Database c th hin qua s sau:

61

Chng 6: Lp trnh VBA cn bn

Khai bo
Dim db As DAO.Database
' Gn db cho mt CSDL c th
Set db = OpenDatabase(C:\Baitap\qlbh.mdb)
'c bit, lnh gn db cho CSDL hin ti nh sau:
Set db = CurrentDb
Khi khng lm vic vi CSDL no , c th ra lnh ng gii phng
b
nh bng cch:
db.Close
Sau khi lnh ny thc thi, tt c cc i tng con ca db nu ang m s
c
ng li gii phng b nh. Bn thn db cng c gii phng b nh (bng
Nothing), tt nhin tp CSDL v d liu vn cn nguyn trn a.
2.3 i tng RecordSet
2.3.1 Khai bo
Recordset l i tng dng miu t tp hp cc bn ghi ca mt bng,
ca
mt query hoc tp cc bn ghi kt qu ca vic thi hnh mt cu lnh SQL no
.
Lp cc i tng con ca Recordset c th hin qua s sau:

Khai bo:
Set rs=db.OpenRecordset(<Name>)
Trong :
- Set rs = db.OpenRecordset l lnh to ra tp hp cc bn ghi
t CSDL db gn vo bin kiu recordset rs;

62

Chng 6: Lp trnh VBA cn bn

- <Name> l mt xu k t ch ra ngun d liu s tr v cho


Recordset. Xu ny c th l tn mt bng, mt Query hoc mt cu lnh
SQL.
Mi bin Recordset khi lm vic, phi c ch ra Database xut x ca
n (phi c tham chiu t mt bin kiu Database c khai bo).
V d: Gn tp hp cc bn ghi t bng canbo vo bin Recordset
Dim rs As DAO.Recordset
Set rs = db.OpenRecordset("canbo")
V d: Gn tp hp cc bn ghi t mt cu lnh chn d liu SQL vo bin
Recordset ( y l cc thng tin hoten, ngaysinh ca tt c cc cn b n t
bng canbo).
Dim rs As DAO.Recordset
Set rs = db.OpenRecordset("SELECT hoten, ngaysinh FROM
canbo
WHERE gioitinh = False")

2.3.2 Mt s thuc tnh ca Recordset


a, Thuc tnh Name
Tr v xu k t trong tham s <name> ca lnh gi Recordset.
V d: MsgBox rs.Name
b, Thuc tnh AbsolutePosition
Cho bit v tr bn ghi hin ti (c tnh t 0). Trong trng hp khng
c bn ghi no trn recordset hoc con tr bn ghi ang nm EOF- s khng
th ly c gi tr thuc tnh ny. Do vy s dng thuc tnh ny thng
phi i km thuc tnh kim tra c tn ti bn ghi no hay khng (RecordCount
> 0) v con tr bn ghi c cui tp cha (EOF = False).
c, Thuc tnh RecordCount
Cho bit tng s bn ghi tr v trn Recordset.
d, Thuc tnh EOF
Cho bit con tr bn ghi hin ti c nm EOF hay khng? Nu c gi tr
thuc
tnh ny l True, tri li l False.
e, Thuc tnh Fields
Dng tham chiu ti cc trng (Fields) trn tp hp cc bn ghi m
Recordset tr v. Thc t Field cng l mt i tng v cng c b thuc tnh
v cc phng thc ca n. Vi Field ca Recordset thng thng ngi ta hay
s dng thuc tnh Value. Nu khng ch nh thuc tnh c th no cho Field,
VBA vn hiu ngm nh l Value.
V d: Hin th gi tr trng hoten trong Recordset rs
63

Chng 6: Lp trnh VBA cn bn

Msgbox rs.Fields("hoten").Value
hoc
Msgbox rs.Fields("hoten")
2.3.3 Mt s phng thc ca Recordset
a, Phng thc Close
ng Recordset, gii phng b nh. Ch thc hin hnh ng ny khi
khng lm vic vi Recordset no .
b, Phng thc di chuyn bn ghi ca Recorset
- Phng thc MoveFirts: Dch chuyn con tr v bn ghi u tin
- Phng thc MoveLast: Dch chuyn con tr v bn ghi cui cng
- Phng thc MoveNext: Dch n bn ghi k sau
- Phng thc MovePrevious: Dch n bn ghi k trc
V d: duyt v hin th ton b Hoten ca bng canbo
Dim db As DAO.Database
Dim rs As DAO.Recordset
Set db = CurrentDb
Set rs = db.OpenRecordset("canbo")
If rs.RecordCount > 0 Then
rs.MoveFirst
While rs.EOF = False
MsgBox rs.Fields("hoten").Value
rs.MoveNext
Wend
End If
c, Phng thc AddNew, Update
thm mi mt bn ghi vo Recordset. Qui trnh thm mt bn ghi mi
nh sau:
1. Ra lnh Addnew
2. Gn gi tr cho cc trng ca bn ghi mi
3. Ra lnh Update
.
V d: thm mi mt h s cn b mi vo bng canbo
Dim
Dim
Set
Set

db
rs
db
rs

As DAO.Database
As DAO.Recordset
= CurrentDb
= db.OpenRecordset("canbo")
64

Chng 6: Lp trnh VBA cn bn

rs.AddNew
rs.Fields("canboID") = "CB0001"
rs.Fields("hoten") = "Lang Vn Tin"
rs.Fields("ngaysinh") = #10/08/1989#
rs.Fields("gioitinh") = True
rs.Fields("chucvuID") = "CV001"
rs.Update

d, Phng thc Edit, Update


Phng thc Edit sa d liu mt bn ghi no trn recordset. Qui
trnh sa mt bn ghi nh sau:
1. nh v ti bn ghi cn s trn recordset
2. Ra lnh Edit
3. Gn gi tr mi cho cc trng cn sa
4. Ra lnh Update
V d: sa h s cn b c m CB0001
Dim rs As DAO.Recordset
Set db = CurrentDb
Set rs = db.OpenRecordset("SELECT * FROM canbo WHERE
canboID='CB000565'")
If rs.RecordCount > 0 Then
rs.MoveFirst
rs.Edit
rs.Fields("hoten") = "Nguyn Vn Tin"
rs.Fields("ngaysinh") = #22/11/1990#
rs.Update
End If

e, Phng thc Delete


xo bn ghi hin ti ra khi Recordset. Khi bn ghi hin ti s b
xo b khi CSDL. Cn thn trng mi khi ra lnh ny. Thng thng cc lnh
mt nt Xo bn ghi ca mt mu nhp liu (nhp vo bin Recordset rs) nh
sau:
Private Sub cmDelete_Click()
Dim tbao
tbao = MsgBox(" chc chn xo cha?", vbYesNo
+ vbCritical)
If tbao = vbYes Then
rs.Delete
rs.MoveNext
65

Chng 6: Lp trnh VBA cn bn

End If
End Sub

2.4 i tng QueryDef


i tng Querydef dng tham chiu ti cc Query c sn (Buil-in)
trn CSDL Access, hoc cng c th lp trnh to cc Query t cc cu lnh
SQL.

to v kch hot mt query trn VBA bng cch thc thi cu lnh SQL
chng ta thc hin nh sau:
'Khai bo mt bin kiu Database v mt bin kiu QueryDef
Dim db As DAO.Database
Dim qr As DAO.QueryDef

'Ra lnh to mt Query mi, c tn rng (ch trong b nh)


Set qr = db.CreateQueryDef(<tn query>)

'Gn chui lnh SQL vo thuc tnh SQL ca query


qr.SQL = "lnh SQL cn thi hnh"
'Ra lnh thi hnh query
qr.Execute
'gii phng b nh
qr.Close
Trong :
- Bt buc phi khai bo mt bin kiu QueryDef lm vic (bin qr);
- Phi c mt bin Database c khai bo sn (bin db);
- Lnh Set qr = db.CreatQueryDef(<tn query>) to mt query
mi ln CSDL. <tn query> s c hin th trn danh sch trong th Queries
trn ca s Database. Nu <tn query>="", query ny s ch tn ti trong b
nh.
Tu thuc vo mc ch cng vic m c t tn query hay khng, nu ch
n thun to mt query x l cng vi no ri gii phng, nn t <tn
query>="";
- Lnh qr.SQL=<cu lnh SQL> gn lnh SQL cn thc thi vo
Query. Tu thuc vo cu lnh SQL ny m query s thc hin nhng g.
V d: xo tt c cc bn ghi trn bng cn b:
qr.SQL = "DELETE * FROM canbo"

66

Chng 6: Lp trnh VBA cn bn

- Lnh qr.Excute thi hnh cu lnh SQL c thit lp. Lnh ny


tng ng nhn nt Run i vi mt query trn ch thit k;
- Lnh qr.Close ng query hin ti v gii phng b nh khi khng
cn lm vic n na.
V d: To DELETE query xo danh sch nhng cn b c tui ln hn 60
ra khi bng canbo (cn b ngh hu)
Dim db As DAO.Database
Dim qr As DAO.QueryDef
Set db = CurrentDb
Set qr = db.CreateQueryDef("")
qr.SQL="DELETE * FROM canbo WHERE Year(Date())- "
& " Year(Ngaysinh)>=60"
qr.Execute
qr.Close

2.5 i tng TableDef


i tng TableDef c dng tham chiu ti cc bng d liu
(Table) trn CSDL. Thng qua i tng ny c th thit k, chnh sa c cu
trc cc bng d liu trong ch Run-time ca VBA nh trn ch thit k
bng Design View.

2.5.1 Mt s thuc tnh quan trng ca TableDef:


- Thuc tnh Name: Cho bit tn bng c gn vo bin kiu TableDef
- Thuc tnh RecordCount: Cho bit tng s bn ghi hin c trn bng
c gn bi bin TableDef
- Thuc tnh DateCreated: Cho bit thi gian to ra bng c gn vo
bin kiu TableDef
- Thuc tnh Fields: tham chiu ti cc trng ca bng. y l thuc
tnh hay c s dng nht i vi TableDef. Thc cht, Field y l mt i
tng, do cng c tp cc thuc tnh v phng thc ring cho thuc tnh
ny.
V d: th tc hin th tn ca tt cc cc trng trong mt bng (ngm nh
trn mt CSDL c khai bo v gn bin db - kiu Database).
Sub LietKeTenTruong(tenbang As String)
Dim tbl As DAO.TableDef
67

Chng 6: Lp trnh VBA cn bn

Set tbl = db.TableDefs(tenbang)


For i = 0 To tbl.Fields.Count - 1
MsgBox tbl.Fields(i).Name
Next
End Sub
2.5.2 Mt s phng thc ca TableDef
a, Phng thc CreateTableDef
to ra mt bng mi bng VBA. C php to bng mi nh sau:
Set tbl = db.CreateTableDef(<Tn bng mi>)

------------------------------------------....Cc th tc to trng mi cho bng


------------------------------------------db.TableDefs.Append tbl

Trong :
- db l bin kiu Database c gn bi CSDL cn lm vic (bng
mi s c to ra trn CSDL ny);
- <Tn bng mi> l tn bng cn to.
- Lnh db.TableDefs.Append tbl l lnh ghi cu trc bng ang khai bo
ln CSDL ch nh.
b, Phng thc CreateField
to ra cc trng cho mt bng kiu TableDef no . thm mt
trng mi ln bng, s dng c php sau:
tbl.Fields.Append tbl.CreateField(<tn trng>,<KiuDL>,<ln>)
Trong :
- <tn trng> - tn trng mi cn to;
- <KiuDL> - l mt tu chn khai bo kiu d liu ca trng cn
to. Kiu d liu c khai bo theo cc hng s nh sau:
dbBoolean
Boolean
dbByte
Byte
dbChar
Currency
dbDate
Date/Time
dbDecimal
Decimal
dbDouble
Double
dbFloat
Float
dbGUID
GUID
dbInteger
Integer
68

Chng 6: Lp trnh VBA cn bn

dbLong
Long
dbMemo
Memo
dbNumeric
Numeric
dbSingle
Single
dbText
Text
dbTime
Time
- < ln> l mt tu chn khai bo ln d liu nu cn.
V d:
Sub TaoBangMoi()
On Error GoTo Loi
Dim tbl As DAO.TableDef
Set tbl = db.CreateTableDef("NewTable")
tbl.Fields.Append tbl.CreateField("ID", dbInteger)
tbl.Fields.Append tbl.CreateField("Name", dbText)
tbl.Fields.Append tbl.CreateField("Age", dbByte)
tbl.Fields.Append tbl.CreateField("DateBirth", dbDate)
tbl.Fields.Append tbl.CreateField("Comment", dbMemo)
db.TableDefs.Append tbl
Exit Sub
Loi:
If Err.Number = 3010 Then
MsgBox " tn ti bng c tn " + tbl.Name
End If
End Sub
1.6 i tng Relation
i tng Relation dng to kt ni (RelationShip) gia 2 bng trong
CSDL Access.
V d: to kt ni gia 2 bng hoadon v khach trong CSDL Qun l bn hng.
Sub CreatRelationShip()
On Error GoTo Loi
Dim db As DAO.Database
Dim rls As DAO.Relation
Set db = CurrentDb
Set rls = db.CreateRelation("TaoQuanHe", "khach", "hoadon",
dbRelationUpdateCascade)

69

Chng 6: Lp trnh VBA cn bn

rls.Fields.Append rls.CreateField("khachID")
rls.Fields("khachID").ForeignName = "khachID"
db.Relations.Append rls
Loi:
If Err.Number = 3012 Then
MsgBox " tn ti quan h ny !"
End If
End Sub
Trong trung hp tn ti kt ni ny, mt thng bo li ting Vit "
tn ti quan h ny !" xut hin.
3. t lc d liu
t lc l lp bi ton ph dng trong thc t. Vi bi ton ny phi c
nhng yu cu c th v lc d liu (iu kin lc). Kt qu tr v s l mt tp
hp cc bn ghi, c th c kt xut trn form hoc c in ra my in di
dng report.
3.1 Quy trnh thc hin
Bc 1: Xy dng Subform - form s cha nhng kt qu lc c.
Bc 2: Xy dng Mainform - form cha nhng thit lp iu kin
lc.
Bc 3: Thc hin lc ra cc bn ghi tho mn cc iu kin trn
Mainform v hin th kt qu ln Subform.
V d: Thc hin form lc d liu sau:

Bc 1: Xy dng Form con


S dng cc k nng thng thng to mt form con p ng c cc
kt qu theo nh bi ton. C th tng bc nh sau:
70

Chng 6: Lp trnh VBA cn bn

- To mi form ch Design view;


- Thit lp thuc tnh Record Source cho form l mt Total Query nh
sau:

- Thit lp thuc tnh Defaul View cho form con l Datasheets;


- M ca s FieldList v thit k form nh sau:

- ng thit k form con li v ghi ten l frm_formcon.


Bc 2: Xy dng form m
- To mi form ch Design view;
- a hp Combobox t thnh cng c Toolbox ln form m (gi s tn
(Name) ca Combo ny l Combo0). S dng tnh nng Combobox Wizard ca
Access lm vic ny. Mc ch l a danh sch cc khch hng t bng
khach vo hp Combo chn, phc v nhu cu lc d liu.
- S dng i tng Sub-form/Sub-report trn thanh cng c Toolbox
a form con va to ln form m. Ngm nh tn ca subform ny l
frm_formcon.

71

Chng 6: Lp trnh VBA cn bn

Bc 3: Thit lp lnh lc d liu trn form m


Cng vic ca bc ny l lm sao sau khi chn tn mt khch hng
hp Combobox, danh sch cc ho n mua hng ca khch s c hin th
ln form con. Mun th, vic lp trnh lc d liu y phi c thc hin
trong th tc p ng s kin Combo0_Click.
Gii thut p ng s kin Combo0_Click:
- To mt bin Recordset thi hnh cu lnh SQL a ra danh sch kt
qu tho mn iu kin t lc:
"SELECT
hoadonID,
khachID,
ngayban,
Sum([soluong]*[dongia])"
+ " AS tongtien FROM "
+ " hoadon INNER JOIN (hang INNER JOIN hangban ON "
+ " hang.hangID = hangban.hangID) ON hoadon.hoadonID ="
+ " hangban.hoadonID WHERE Trim(khachID)='"+Trim(Combo0)"
+ " GROUP BY hoadonID, khachID, ngayban "

- Gn thuc tnh Recorset ca form con l bin kiu recordset va to ra


(cha kt qu lc).
- Ra lnh lm ti d liu cho form con.
Ch : trc phi khai bo mt bin kiu Database ton cc trong form v
nh ngha n th tc Form_Load()
Code:
Dim db As DAO.Database
Private Sub Form_Load()
Set db = CurrentDb
End Sub
Private Sub Combo0_Click()
Dim rs As DAO.Recordset

72

Chng 6: Lp trnh VBA cn bn

Set rs = db.OpenRecordset("SELECT hoadonID, khachID, "


+ " ngayban, Sum([soluong]*[dongia]) AS tongtien FROM"
+ " hoadon INNER JOIN (hang INNER JOIN hangban ON "
+ " hang.hangID = hangban.hangID) ON hoadon.hoadonID ="
+ " hangban.hoadonID WHERE Trim(khachID)='"+Trim(Combo0)"
+ " GROUP BY hoadonID, khachID, ngayban ")
Set frm_formcon.Form.Recordset = rs
frm_formcon.Requery
End Sub

73

You might also like