ƯỜ

Ạ Ọ

TR

Ộ NG Đ I H C KINH DOANH CÔNG NGH  HÀ N I

KHOA CÔNG NGH  THÔNG TIN

MICROSOFT                  ACCESS 2010

1

ƯỜ

Ạ Ọ

TR

Ộ NG Đ I H C KINH DOANH VÀ CÔNG NGH  HÀ N I Ệ

KHOA CÔNG NGH  THÔNG TIN

Module – L p trình trong Access

ươ

Ch

ng 8

ạ ộ

ươ

8.1 T  ch c và ho t đ ng c a ch

ng trình trong Access

ươ ạ ỗ ươ ộ Ch ng trình con có hai d ng: ng trình con là m t dãy Th  t củ ụ  ho c ặ hàm. M i ch

ể ự ệ ệ ệ ộ ộ ươ ề ấ các l nh đ  th c hi n m t công vi c nào đó. M t ch ể ng trình có th  có r t nhi u

ươ ch ng trình con.

ươ ủ ụ ạ ầ ầ ồ ủ ụ Bao g m các thành ph n: Đ u th  t c, thân a. Ch ng trình con d ng th  t c:

ủ ụ ủ ụ ế th  t c và k t thúc th  t c.

ầ ạ ủ ụ 1. Đ u th  t c có d ng:

ố ố ủ ụ

o [Private] Sub  [(]

2. Thân th  t củ ụ

ủ ụ ủ ụ ủ ụ ứ ệ ằ ầ ế i quy t

o Thân th  t c n m sau đ u th  t c. Thân th  t c ch a các l nh đ  gi ể ả

ụ ể ạ ệ ệ ẽ ể ộ m t công vi c nào đó (các l nh c  th  b n s  tìm hi u sau).

ủ ụ ế 3. K t thúc th  t c

ể ế ế ủ ụ ế ệ ộ t k t thúc m t th  t c, ta vi t dòng l nh: End Sub

o Đ  báo cho máy tính bi

ố ố

3

ủ ụ ủ ụ

[Private] Sub  [(]      End Sub

ạ ộ

ươ

8.1 T  ch c và ho t đ ng c a ch

ng trình trong Access

ươ ạ ng trình con d ng hàm (Funtion)

ầ ầ b. Ch Ø Cũng nh  th  t c, hàm cũng có c u trúc ba ph n: Đ u hàm, thân hàm và k t  ế

ố ố

[Private] Function  [(]      End Function

ư ủ ụ ạ ư ấ ổ thúc hàm. D ng t ng quát nh  sau:

ộ ố ậ ể ị ớ ậ ạ ế “Chào  b n  đã  đ n  v i  l p  trình

Ø Sau đây là m t s  ví d : ụ o Ví  d 1ụ :  L p  trình  hi n  th   câu  chào:

ọ ổ ể ạ ử ạ , sau đó c a s  đ  b n so n

4

ọ New ch n Macro & code  ọ ử ổ ư ệ Access” o B c 1: ướ o Ch n Create ch n  ọ ươ ả th o ch ng trình (hay còn g i là c a s  Code) hi n ra nh  sau:

ạ ộ

ươ

8.1 T  ch c và ho t đ ng c a ch

ng trình trong Access

ẽ ể ệ ử ứ ệ ạ ạ ổ ồ B n gõ vào c a s  Code các l nh (b n c  gõ r i sau s  hi u l nh đó là

Ø B c 2:  ướ

ư gì?) nh  hình sau:

ươ ạ ươ ế ng trình: Ch n ng trình, k t ọ  Run/Run Sub. Sau khi ch y ch

ØB c 3:  ướ ư ả

ạ Ch y ch qu  nh  hình sau:

ØGi

ươ

i thích:

MsgBox(“Chao ban da den voi lap trinh Access”) s  đ a ra m t thông báo nh  hình  ng

ị ữ ệ ươ

ẽ ư ư ế c. Khi đ a ra k t qu  trên ch ự

ả ệ ệ

ượ ẽ

ư ế

ế

ng trình s  ch y ti p và th c hi n l nh sau

ọ OK thì ch

L nh   ệ ể ọ trên. Ta có th  g i đây là  l nh hi n th  d  li u cũng đ trình t m d ng và n u b n ch n  l nh ệ MsgBox(...).

5

ạ ộ

ươ

8.1 T  ch c và ho t đ ng c a ch

ng trình trong Access

ị ổ ủ ố

Ø Ví d  2:ụ  Vào 2 s  nguyên, tính t ng và hi n th  t ng c a hai s  đó. ổ ư

ố ử ạ ể o B n gõ vào c a s  Code nh  hình sau:  ổ

ạ ươ ầ ạ ừ ư ị ng trình, máy yêu c u b n gõ t bàn phím giá tr  a nh  giao

o Khi ch y ch di n sau:

6

ạ ộ

ươ

8.1 T  ch c và ho t đ ng c a ch

ng trình trong Access

ế ế ạ ố ẽ ư ấ ố

ØĐ n đây n u b n gõ vào s  5 và ch n

ọ OK (Hay  n Enter) thì s  nguyên 5 s  l u

ế ạ ư ệ vào bi n a. Máy l i đ a ra giao di n:

ế ạ ố ẽ ư ế ế ố

ØVà n u b n gõ vào s  4 và ch n

ọ OK thì máy s  l u s  nguyên 4 vào bi n b. Ti p

7

ư ư ẽ ế ả ổ ụ t c máy s  tính t ng và đ a k t qu  là 9 nh  hình sau:

ạ ộ

ươ

8.1 T  ch c và ho t đ ng c a ch

ng trình trong Access

ả i thích:

ØGi ØL nhệ : Dim a As Integer

ế

ể ớ

ế

o Nghĩa là: Bi n (Dim) a là (As) nguyên (Integer). B n khai báo bi n a là nguyên , đ  máy  ả ố ự  thì ô nh  ph i

ế ạ ấ t nhiên n u là

ng  ng v i

mà!, t

ớ s  nguyên

s  th c

ố ậ

ử ụ ớ ươ s  d ng ô nh  t ơ ớ l n h n, v.v.. lý do khai báo là v y.

ØL nhệ : a = InputBox("Moi ban go vao so a? ")

ế

o Nghĩa là: H p nh p li u (InputBox) ra thông báo: "Moi ban go vao so a? “. N u b n gõ

ộ ố

ế

ệ ộ ượ ư vào m t s  thì s  đó đ

c l u vào bi n a

ØL nhệ : s = a + b

ẽ ấ

ế

ệ ủ

ả ẽ

ừ ế

ế

ế

ế

ạ ư ậ

o Đây là l nh “gán”, nghĩa là máy s  l y n i d ng bi n a (b n v a gõ vào 5), c ng v i n i  ớ ộ ộ ụ ọ dung c a bi n b (b n v a gõ vào 4), k t qu  s  là 9, “gán” k t qu  này cho bi n s (g i  ệ l nh “gán” là nh  v y).

ả ồ

ØL nhệ : MsgBox "Tong 2 so la: " & Str(s)  ữ ệ ế

o Đây là l nh hi n th  d  li u, nh ng d  li u thì ph i đ ng nh t,  ấ ở ư ể ủ

ể ả

ữ ệ ộ

ị ữ ệ ộ ố

ế

ượ Str vi

ộ ố ả ấ

ư ể ộ

đây: "Tong 2 so la: "(là  ạ ả ổ c b n ph i đ i  d  li u văn b n) còn n i dung c a bi n s là m t s  nguyên. Đ  ghép đ ữ ế ắ ừ t t n i dung c a bi n s (s  nguyên) thành d ng văn b n b ng hàm Str(s):   ch   t t ố String (văn b n). Đ  ghép hai văn b n ta dùng d u & (cũng nh  đ  c ng 2 s  ta dùng  d u + ).

8

ự ệ

ủ ụ

8.2 Th  t c đáp  ng s  ki n v i form, report

ở ố ượ ặ ở ế ộ

ØM  đ i t

ng form ho c report ch  đ  design.

→ ả ố

ØClick ph i trên control mu n gán module

ch n ọ properties.

→ → ọ ọ ợ ể ượ

ØCh n tab event

ch n event thích h p Click nút bi u t ng.

ử ệ ấ

ØXu t hi n c a s  Choose Builder. ổ

ØCh n l nh

. ọ ệ Code Builder OK→

ớ ộ ử ệ ấ ạ ặ ổ ị

ØXu t hi n c a s  so n th o module v i n i m c đ nh. ả

ự ệ ể ạ ầ ọ

ØB n ch n Event và cu n đ  tìm s  ki n mình c n. ố

9

ự ệ

ủ ụ

8.2 Th  t c đáp  ng s  ki n v i form, report

ể ở ả ủ ụ ạ

ØVí d :ụ  T o th  t c đ  m  b ng có tên

SO_LUONG  khi ta kích vào vùng tiêu đ  ề

ư ầ đ u trang Form. Ta thao tác nh  sau:

ØCh n ọ Create  vào tap Form chon Form Design

ể ậ ử ự ệ ủ ụ ứ ứ ổ

ØKích vào thanh FormHeader đ  b t c a s  ch a các th  t c đáp  ng s  ki n

10

ứ ớ ấ ng v i vùng này (t t nhiên ban chon ư Event), nh  hình sau:

ự ệ

ủ ụ

8.2 Th  t c đáp  ng s  ki n v i form, report

ả ứ ớ ể ố ọ

ØKích  vào ô bên ph i  ng v i dòng

On Click, kích mũi tên xu ng đ  ch n [Event

ự ệ ủ ụ ứ ế ấ ả Procedure], kích ti p vao nút ba ch m bên ph i , Sau đó th  t c đáp  ng s  ki n

11

ệ hi n ra:

ự ệ

ủ ụ

8.2 Th  t c đáp  ng s  ki n v i form, report

ệ DoCmd.OpenTable “So_luong”.

ạ ư ả ử ộ s  tên DauForm

ạ ọ

ØB n gõ dòng l nh:  ØL u th  t c này b ng m t tên nào đó, gi ằ ủ ụ ØThoát v  ề CSDL  ØCh y th  t c này b ng cách ch n Navigation pane/

Forms, kích đúp vào tên

ệ ủ ụ DauForm ta th y m t ằ ộ Form hi n ra.

ế ươ ế ả ả ạ ng trình ch y và k t qu  là b ng FormHeader, ch

ấ ØTi p theo b n kích vào vùng  ạ ượ ư ở c m  ra nh  sau: SoLuong đ

ở ạ ự

ØS  ki n

12

các vùng còn l i thi ế ế ươ t k  t ng t . ự ệ Click

ủ ụ

ệ 8.3 T o và th c hi n th  t c và hàm

ủ ụ

Macro & Code Tab. ọ Macro & Code ch n Module

a. Ta  th  t c, hàm trong   Create ch n Tab  ạ ậ  Khai báo và t o l p th  t c ho c hàm  Ghi Module ọ ủ ụ o B c 1: ướ o B c 2: ướ o B c 3: ướ

ổ ủ ườ ổ ủ ọ i, tính tu i trung bình c a h .

ể ả ả ả ổ

ự ậ ấ ấ ố ố

13

Ví d :ụ  Vào tu i c a hai ng           Function Tong()                  Dim T1 As Interger                  Dim  T2 As Interger                  Dim TB As Single                  T1 = InputBox(“vào tuoi cua nguoi thu nhat?”)                  T2 = InputBox(“vào tuoi cua nguoi thu hai?”)                 TB=(T1+T2)/2                  MsgBox “Tuoi trung binh la:” &  Str(TB)             End Function  ØTu i trung bình có th  không ph i nguyên (vì ph i chia cho 2), do đó ta ph i khai  ụ ự báo  là  th c  (Single).  S   th c  trong  máy  là  s   có  d u  ch m  th p  phân,  ví  d :  23.45, 12.00, ­45.34567, v.v..

ủ ụ

ệ 8.3 T o và th c hi n th  t c và hàm

ạ ể ề ự ủ ụ

ệ ệ ẳ ạ

ệ ướ ế

ộ ố ượ ả ử ệ s  nút l nh (Button) ng lên Form, gi

ch ng h n.

ổ Code: ả ộ ộ ạ Code ứ ủ b. T o th  t c đáp  ng s  kiên c a các đi u khi n trên Form. ư ể ặ ể ề Trên Form ta có th  đ t các đi u khi n nh  nút l nh ch ng h n, nút l nh này cũng  ự có các s   ki n. Các b c ti n hành: ØB c 1: ổ  M  ở Form và b  sung m t đ i t ướ ẳ ạ ØB c 2: ướ o Ch n nút l nh, kích ph i chu t ch n Build event  , sau đó h p tho i  ọ ọ

14

ở ử  M  c a s   ệ ệ Builder  hi n ra:

ủ ụ

ệ 8.3 T o và th c hi n th  t c và hàm

ự ệ ủ ụ ệ ấ ộ

ØCh n ọ Code Builder  và ch n ọ OK, m t th  t c s  ki n xu t hi n:

ự ệ ặ

ủ ụ ủ ụ ứ ử ạ ạ

ØSo n th  t c ho c hàm đáp  ng s  ki n. ạ ØGhi l

15

i th  t c đó và ch y th

ủ ụ

ệ 8.3 T o và th c hi n th  t c và hàm

ươ

ủ ụ

ủ ụ

ể ủ ụ

ặ ủ ụ

ng trình có nhi u th  t c ầ ề ị ọ i đúng tên th  t c b  g i, ví d  hai th  t c sau:

c vi

c. Ch ộ ủ ụ M t th  t c khi ch y có th  yêu c u (g i) m t ho c nhi u th  t c khác làm vi c. L nh g i này  ượ ế ạ đ t l      Sub MoBang()            DoCmd.OpenTable”So_luong”

ủ ụ

End Sub   Và th  t c tính t ng:

Sub Tong()      Dim a As Integer, b As Integer, s As Integer

a = 12

b = 20

s = a + b

MsgBox ("s=" & Str(s))

ể ạ

ủ ụ

ủ ụ

ả ử

ủ ụ

ượ

c 2 th  t c trên, ta có th   t o m t th  t c khác (gi

s  có tên là

GOI(), th  t c

End Sub Đ  ch y đ ạ GOI có d ng sau:    Sub GOI()           MoBang

Tong

End Sub

16

ủ ụ

ệ 8.3 T o và th c hi n th  t c và hàm

ạ ủ ụ ầ

ế ệ ủ ụ MoBang() làm vi c, th  t c MoBang() làm  ủ ụ GOI() yêu c u th  t c  ọ ệ ạ i quay v  th  t c GOI() và th c hi n ti p l nh sau  đó (t c là l nh g i  ượ c t  c   các  l nh  trong  th   t c  GOI()  đ

17

ề ủ ụ ư ế ằ ứ ủ ụ ư ứ ủ ụ ấ ộ Khi ch y, th  t c  ự ệ vi c xong l ấ ả ủ ụ th   t c  Tong).  C   nh   th   cho  đ n  khi  t ạ hoàn t ế ệ ệ ươ ng trình) nh  sau: t. Ba th  t c đó n m trong m t đo n mã (ch

ế

8.4 Các phép toán, hàm, bi n, bi u th c

a. Các phép toán s  h c ố ọ

ư

ỹ ừ

ầ Mod  : Chia l y ph n d \         : Chia nguyên ^        : Lu  th a

+  : C ngộ ­   : Trừ *  : Nhân  /   : Chia

b. Các phép toán so sánh:

ặ ặ

ằ ằ

=  : B ngằ ỏ ơ <  : Nh  h n ơ ớ >  : L n h n

ơ >=  : L n h n ho c b ng ỏ ơ <=  : Nh  h n ho c b ng <>  : khác

c. Các phép toán Logic:  AND, OR, NOT: Các phép toán so sánh t o nên bi u th c logic

ế cho k t qu

ả True(­1) ho c ặ False(0)

X And Y ­1 ­1 ­1 0

Y ­1 0 0 0 ố

Not (x) 0 0 ­1 ­1 ử ụ

ta s  s ng phép toán

ặ & ho c d u

ấ +

X Or Y X ­1 ­1 ­1 ­1 ­1 0 0 0 ự Mu n ghép 2 chu i ký t :

d. Phép ghép chu i ký t

18

ế

8.4 Các phép toán, hàm, bi n, bi u th c

ả ế ể ị

ươ ươ ẽ ớ ng trình xác đ nh: ệ ng trình s  làm vi c v i tên đó.

ủ ủ ự ả ả Khai báo bi n:ế ØBi n ph i khai báo đ  ch ØTên c a bi n là gì? vì ch ế ØKi u c a bi n là gì? (nguyên, th c, logic, văn b n, v.v..) vì ch ế

ư ể ỗ ế ợ ả ớ

ủ ế ế ớ

ể ệ ụ ế ể ế ớ ớ

ế ỗ ể ư ư ủ

ư ế

ạ ự ặ

ữ ố ấ

B n t

ượ

ữ  đ t theo lu t sau: là m t chu i các ch  cái, ch  s , d u g ch chân,  ừ  khoá có trong Access và đ c

ỗ ớ c trùng v i các t

, không đ

ự ầ

ươ ng trình ph i “x p  ộ ươ ng trình ph i huy đ ng ô nh  phù h p  ch ” cho các bi n “l u trú”, nghĩa là ch ố ự ế ớ v i  ki u  c a  bi n,  ví  d   n u  bi n  nguyên  thì  ô  nh   “bé”,  s   th c  thì ô  nh   “to”,  ợ ỗ ở ủ v.v..Vi c  khai  báo  là  đ   x p  ch     c a  bi n  (ô  nh )  cho  h p  lý,  tránh  lãng  phí  ừ ặ (th a không gian “l u trú” ho c không đ  ch  đ  “l u trú”) ØD ng khai báo bi n nh  sau: ạ ế Dim  [As]

:ế ộ đ  dài tên không quá 40 ký t ệ bi

ự  đ u ph i là ch  cái..

t ký t

ế

ư ế

N u ph n này không ghi thì coi nh  bi n đó ng m đ nh có các ki u: Ki u s ,

ế

ầ ữ ả ả

ử ụ ể

ế

[As]: chu i, Date/Time, Null (r ng). Khi s  d ng bi n đó tu  ng  c nh mà xác đ nh ki u sau.  Còn n u ghi ph n này thì ki u có th  là: Nguyên, th c, văn b n, v.v..

ế

ế

Ví dụ v  khai báo bi n: Dim  i As Interger (i là bi n nguyên ng n)

19

ế

8.4 Các phép toán, hàm, bi n, bi u th c

ườ Các hàm th ử ụ ng s  d ng.

ạ ả ớ ế ụ ị

ØV i  các  hàm,  b n  cũng  ph i  vi

ủ t  đúng  theo  quy  đ nh  c a  Access,  ví  d   Sin(x),

ư ở ươ Cos(x), Sqr(x), v.v..các hàm  nh  đã trình bày ch ng 5.

ứ ể Bi u th c (Expression)

ố ớ ế ằ ở ượ ứ ể ể ọ

Ø... Các bi n, h ng, hàm  n i v i  nhau b i phép  toán đ

c g i là bi u th c, bi u

ể ế ề ạ ả ằ ọ ỉ ế ứ th c cũng có th  ch  là 1 bi n , 1 h ng, 1 hàm. Đi u quan tr ng là b n ph i vi t

ứ ế ị ị ể bi u  th c  đúng  quy  đ nh  (đúng  phép  toán  đã  quy  đ nh,  đúng  tên  bi n,  đúng  tên

ằ ế ằ h ng, đúng cách vi ụ t h ng v.v..). Ví d :

ứ ứ ể ằ ỉ

o Bi u th c ch  ch a h ng: (234+678)/13

ứ ể ế ố ỉ

o Bi u th c s  ch  ch a bi n: (a+b+c)*(a+b) ứ

ố ừ ứ ể ế ằ

o Bi u th c s   v a ch a bi n và h ng: (a+b)/7 ứ

ứ ể ả

o Bi u th c văn b n: “Tin hoc” & “Văn phong”

ứ ể

o Bi u th c logic:(5>13) Or (3<9)

20

ộ ố ệ

ề ậ

8.5 M t s  l nh v  l p trình

ỉ ượ ệ ậ ế ế ố ế

ØKhi l p trình trong Access, 1 câu l nh ch  đ

c vi t trên 1 dòng, n u mu n vi t

ề ệ ể ấ ấ ả nhi u câu l nh trên 1 dòng ta ph i dùng d u hai ch m(:) đ  ngăn cách.

ụ Ví d : a=4: b=7: s=a+b

ả ứ ứ ừ ể ế ằ

Ø Các câu ghi chú, có ý nghĩa gi

i thích rõ ch c năng t ng h ng, bi n, bi u th c,

ả ắ ầ ệ ặ ấ ằ ơ ụ câu l nh, v.v.. Câu ghi chú ph i b t đ u b ng REM ho c d u nháy đ n (‘), ví d :

21

Rem Doan ma sau là de vao du lieu

ộ ố ệ

ề ậ

8.5 M t s  l nh v  l p trình

ữ ệ

8.5.1 Vào ra d  li u

a. L nh Inputbox$

ị ể

ớ ừ

Cho phép nh p giá tr  ki u văn b n vào b  nh  t

bàn

Ø  Ch c năng:

phím

Ø  Cú pháp:

Inputbox$([ , [][,]])

ế

Ví d : Nh p tên c a m t khách hàng vào bi n Kh

Dim Kh As String *20

Kh=InputBox$(“Tên khách hàng”)

22

ữ ệ

8.5.1 Vào ra d  li u

ị ể ậ ừ Cho phép nh p giá tr  ki u Varial vào t bàn phím

b. L nh Inputbox Ø  Ch c năng: ứ Ø  Cú pháp:

ề ầ ị ị InputBox([ , [][,]])

ứ ụ ậ ố ừ ủ ế ộ Ví d :Nh p s  ch ng t ơ  c a m t hoá đ n vào bi n Sct

Dim Sct

ứ ừ ố Sct=InputBox(“S  ch ng t ”)

ệ ả ạ : Hi n chu i văn b n (thông báo) ra h p tho i.

ỗ ộ ộ ề ể c. L nh MsgBox ØCh c năng ứ ØCú pháp: MsgBox([ ,[ ,]])

ụ Ví d : MsgBox (“Hello Thao”)

ụ ế ậ ả ố ộ ổ ạ Ví  d  2: Nh p và tính t ng hai s  và in k t qu  ra h p tho i

Sub Tong()

Dim a As Interger, b As Interger

a=InputBox(“vào a=”)

23

b= InputBox(“vào b=”)

ế ả Msgbox “K t qu  là:” & Str(a+b)

End Sub

ệ 8.5.2 L nh gán

ư ầ ậ ệ ầ ạ ph n đ u l p trình, l nh gán có d ng:

ế ụ

ØNh  đã nói qua  ở ứ = Ví d : s=s+i

ệ ẽ

ệ ề ứ If  Then              ệ End If

8.5.3 L nh r  nhánh IF…THEN…END IF ØD ng 1: ạ

ư

ØHo t đ ng  c a l nh này nh  sau: ủ ệ ề ứ

N u đúng thì th c hi n 

ế

ệ N u sai thì b  qua l nh If.

Ví d :ụ

ạ ộ ể ế

Sub XemTuoi()

Dim tuoi As Integer

tuoi=InputBox(“ Vao tuoi cua ban?”)

If tuoi>60 Then

ắ              MsgBox(“Ch c b n ngh  h u r i?”)

ỉ ư ồ 24

End If

End Sub

8.5.3 L nh r  nhánh IF...THEN...END IF

ươ ạ ng trình:

ẽ ắ ạ ơ ơ

o N u b n gõ vào 65 (l n h n 60) và Enter thì máy s  in ra câu: “Ch c b n ngh   ỉ

ỏ ơ ư ạ

ØKhi ch y ch ế ạ ư ồ h u r i”. ế

o Còn n u b n gõ vào 25 (nh  h n 60) và Enter thì máy không đ a ra gì c . ả

ØD ng 2: ạ

ề If  Then   Else End If

ể ề ự ệ ệ ệ ỏ ệ  đúng thì th c hi n  b  

ạ ộ Ho t đ ng: N u ế ứ 2>

ể ề ự ệ ệ ệ ỏ ệ  sai thì th c hi n  b  

25

N u ế ứ 1>

8.5.3 L nh r  nhánh IF...THEN...END IF

ể ặ ủ ụ ườ ả ờ ợ ụ i th  t c XemTuoi() đ  g p tr ng h p nào máy cũng tr  l i:

ØVí d  1:  Ta s a l ử ạ Sub XemTuoi()

Dim tuoi As Integer

tuoi=InputBox(“ Vao tuoi cua ban?”)

If tuoi>60 Then

ỉ ư ồ

ắ              MsgBox(“Ch c b n ngh  h u r i?”)

Else

ỉ ư

ư

ế

MsgBox(“B n ch a đ n tu i ngh  h u!” )

End If

End Sub

ụ ậ ả ươ ậ

ØVí d  2: L p trình gi

i ph ng trình b c hai:ax2+bx+c=0

ệ ươ ế ạ ả

ớ ậ ế ấ ệ ể ạ

26 ế

ở ị ụ ể ế ế ạ ờ

ạ ệ ự ệ ả ậ ể ị ụ ể ng trình b c hai này, b n ph i cho máy bi t ba giá tr  c  th   ả ự ng v i a, b, c (  đây ki u 3 bi n  y là th c, rõ ràng b n ph i dùng l n InputBox).  ượ Delta, sau đó b n ph i xem xét n u (If)  c  i  thu t) đó  (gi

Đ  tính nghi m ph ứ ả Nh  giá tr  c  th  3 bi n đó b n tính đ Delta  không  âm  thì  có  2  nghi m,  n u  âm  thì  vô  nghi m.    Trình  t đ ư t kê nh  sau: ượ ệ c li

8.5.3 L nh r  nhánh IF...THEN...END IF

27

Sub GPTB2() Dim a As Double, b As Double, c As Double, Delta As Double Dim  x1 As Double, x2 As Double a= InputBox(“vao a=”) b= InputBox(“vao b=”) c= InputBox(“vao c=”) Delta= b*b ­ 4*a*c    If Delta>0 Then    x1=(­b+Sqr(Delta))/(2*a)    x2=(­b­Sqr(Delta))/(2*a)    MsgBox (“x1=” & Str(x1))    MsgBox (“x2=” & Str(x2)) Else    MsgBox (“Pt vo nghiem”) End If End Sub

ọ 8.5.4 L nh ch n Select...Case

ả ữ ế

ợ ạ ụ ọ ố ng h p b n ph i ch n 1 trong nhi u nhánh, ví d : Gi

ủ ế i. N u

ượ ượ

ØKhông  ph i  lúc  nào  cũng  “không  th   này  thì  th   kia”  (2  nhánh)  mà  có  nh ng  ệ t nghi p c a  ng 100.000đ, n u  ng.

ế khá thì đ ng 200.000đ, còn trung bình thì không đ ả ử ằ  s  b ng t ưở c th ưở c th ạ ưở c th

ế ề ả ườ tr ỏ ạ b n có 3 lo i: Trung bình,  Khá và Gi ỏ ượ i đ gi ØCh ươ ng trình nh  sau:

Dim Loai As Integer

ỏ ố

Loai=InputBox(“Vào lo i: Trung bình gõ vào s 1, Khá s 2, Gi

i s 3”)

Select Loai

Case 1

ượ

ưở

MsgBox(“B n không đ

c th

ng”)

Case 2

ượ

ưở

MsgBox(“B n đ

c th

ng 100.000đ”)

Case Else

ượ

ưở

MsgBox(“B n đ

c th

ng 200.000đ”)

End Select

28

End Sub

ư     Sub XetThuong()

ọ 8.5.4 L nh ch n Select...Case

ạ ươ ượ ế ạ ạ ố

ØKhi  ch y  ch

ng  trình,  n u  b n  gõ  vào  s   3  thì  máy  s   in  dòng:”  B n  đ

ầ ạ ầ ẽ ố

ạ ạ

ưở ườ ả ư ể c  ư ng  200.000đ”.  Nh ng  n u  b n  không  may  gõ  nh m  s   6  (gõ  nh m  là  bình  th ạ ẫ ng b n 200.000đ, m c dù không có lo i nào là lo i  ng mà!) thì máy v n th th ử ạ 6 c . Đ  an toàn b n s a l ế ặ ưở i đoan mã trên nh  sau:

Dim Loai As Integer

ỏ ố

Loai=InputBox(“Vào lo i: Trung bình gõ vào s 1, Khá s 2, Gi

i s 3”)

Select Loai

Case 1

ượ

ưở

MsgBox(“B n không đ

c th

ng”)

Case 2

ượ

ưở

MsgBox(“B n đ

c th

ng 100.000đ”)

Case 3

ượ

ưở

MsgBox(“B n đ

c th

ng 200.000đ”)

Case Else

ạ ằ

MsgBox(“B n gõ nh m lo i b ng r i!”)

ầ 29

End Select

End Sub

ạ     Sub XetThuong()

ọ 8.5.4 L nh ch n Select...Case

ủ ệ ư ổ

ØCú pháp t ng quát c a l nh Select nh  sau:

ể Select Case                Case ị                                Case ị                                        ………..               Case ị ệ                                [Case Else ệ                  ]  End Select ự

ệ ị ằ ế ệ ế

ệ ệ ườ ự ế ợ

ØN u  b ng i thì th c hi n  và k t thúc l nh Select Case. ØCòn n u không có 1 tr

ệ ệ ế ặ ỏ

30

ệ ng h p nào đúng thì h c hi n  và cũng  ế k t  thúc  luôn  l nh  Select  Case  ho c  ra  kh i  Select  Case  n u  không  dùng  l nh  Case Else..

ọ 8.5.4 L nh ch n Select...Case

ủ ụ ậ ụ ế ặ ầ ạ ộ

ạ ươ ệ ượ ủ ụ ệ ạ

ØVí  d :  T o  m t  th   t c  l p  k   ho ch  công  tác  trong  tu n,  đ t  vào  nút  l nh  c

ạ ng trình và kích ho t nút l nh th  t c đ

ệ Command() trên Form. Khi ch y ch th c hi n:

ự Private Sub command0_Click()

Dim Thu As Integer

ạ ế Thu = InputBox(“B n cho bi ứ t th ? ”)

Select Case Thu

Case 2

ọ MsgBox (“H p giao ban”)

Case 3

ố ưở MsgBox (“Đi xu ng phân x ng”)

Case 4

ổ MsgBox (“Đi lên t ng công ty”)

Case 5 Or 6

ưở MsgBox (“H p các phân x ng”)

ọ 31

Case Else

MsgBox (“Ngh ”)ỉ

End Select

End Sub

ặ 8.5.5 L nh l p For...Next

ư ệ ổ

ØL nh For có cú pháp t ng quát nh  sau:

ế

ế

ị ầ

ướ

For = To [Step ]          ệ Next

ế ế ị ầ ị ố , n u ế

ØBan đ u ầ

nh n ậ , và so sánh v i ớ

ế ơ ỏ ơ ệ ự ế ằ ớ l n h n thì  k t thúc ặ For, n u nh  h n ho c b ng thì th c hi n ệ ,

ế ế ướ ộ ồ ờ ớ c ng thêm v i và đ ng th i so sánh v i g p ặ Next, ,

ế ơ ế ỏ ơ ế ặ ằ ơ ố , n u l n h n thì k t thúc ị For, còn n u đang nh  h n ho c b ng

32

ạ ệ ự ạ ư ế thì l i th c hi n i làm ti p nh  trên. ệ , g pặ  Next l

ặ 8.5.5 L nh l p For...Next

ụ ổ

ØVí d : Tính t ng s=11+22+33+...+1010 .

Sub Tong()

Dim s As Double, i As Integer

For i = 1 To 10 Step 1

s = s + i^i

Next

ế ả MsgBox “K t qu  là:” & Str(s)

33

End Sub

8.5.6 L nh Do while... Loop

ư

ØD ng t ng quát nh  sau:

ệ Do While <Đi u ki n>            ệ Loop

ØCh ng nào <Đi u ki n> còn đúng thì th c hi n  ự ØKhi <Đi u ki n> sai thì ra thì thoát kh i vòng l p và th c hi n nhóm l nh sau Loop  . ệ Ví d :ụ

Sub Tong()

Dim s As Double, a As Double,  i As Integer

i= 1

a=1/i

s= 0

Do While a>=0.0001

s= s+a

i= i+1

a=1/i

Loop

34

ế

MsgBox (“K t qu :”) & Str(s)

End Sub

8.5.7 L nh Do Until... Loop

ư

ØD ng t ng quát nh  sau:

ề Do Until <Đi u ki n> ệ Loop

ệ  v n ẫ còn sai thì th c hi n

<Đi u ki n>

.

ØCh ng nào  ừ ØVí d  trên ta vi ụ

ế ạ t l

ệ i theo l nh này:

Sub Tong()

Dim s As Double, a As Double,  i As Integer

i= 1

a=1/i

s= 0

Do Until a< 0.0001

s= s+a

i= i+1

a=1/i

Loop

ế

MsgBox (“K t qu :”) & Str(s)

35

End Sub

ØKhi <Đi u ki n> đúng thì ra kh i vòng l p và th c hi n nhóm l nh sau Loop.

ố ượ

ố ượ

ố ượ

8.6 Đ i t

ế ng, bi n đ i t

ử ng và x  lý đ i t

ng

ộ ố ố ượ ạ

ØTrong Access có m t s  đ i t

ầ ng mà b n c n quan tâm:

ứ ng ng

ØĐ i t

ố ượ DBEngine: ch a đ i t ố ượ Workspaces (vùng làm vi c)ệ

ứ ứ ệ ề ỗ ộ ng

ØĐ i  t

ố ượ Workspaces:  ch a  nhi u  vùng  làm  vi c,  m i  vùng  ch a  m t

Database.

ØĐ i t

ng ố ượ Database: ch a ứ CSDL

ố ượ ứ

ØĐ i t

ng ng trong ố ượ  RecordSets: ch a các đ i t CSDL

ố ượ ủ ứ ả

ØĐ i t

ng Tabledefs: ch a các b ng c a m t ộ CSDL

ủ ấ

ØĐ i t

ng ứ ố ượ Querydefs: ch a các truy v n c a m t ộ CSDL

ố ượ ườ ả

ØĐ i t

ng ng trong b ng ứ Field: ch a các tr

ố ượ

ØĐ i t

ng ứ Form: ch a các Form

Øv.v..

36

ố ượ

ố ượ

8.6.1 Đ i t

ng và khai báo đ i t

ng

ố ượ

ế

Dim  As 

ng>

ố ượ ế Cách khai báo bi n đ i t ng:

ể ệ ậ ớ ộ ế ế cho phép tham chi u đ n m t ể ộ CSDL, vì v y đ  làm vi c v i m t a. Ki u Database

ế ả CSDL ta ph i khai báo bi n ki u ể Database

ư ờ ớ ộ ệ ệ ể

ØĐ  làm vi c v i m t CSDL hi n th i ta làm nh  sau:

ế

Dim Db As Database  (Khai báo bi n Db có ki u Database)

ế

Set Db=DBEngine.Wokspaces(0).Database(0) (g n bi n Db  ng v i CSDL hi n th i)

ØHo c có th  vi ể ế

t:

Dim Db As Database

ế

Set Db=CurrentDb() (G n bi n Db v i CSDL hi n th i)

Ø Làm vi c v i 1 CSDL khác: ớ

Dim Db As Database

37

Set Db= DBEngine.Wokspaces(0).Database()

ố ượ

ố ượ

8.6.1 Đ i t

ng và khai báo đ i t

ng

ể ế ử ụ

ế ố ượ ủ ng c a CSDL đã khai b. S  d ng bi n ki u RecordSet ØKi u ể RecordSets cho phép ta tham chi u đ n các đ i t

ế ấ báo nh : B ng, truy v n, các b n ghi, v.v.. ắ ư ả ạ ớ ả ế ệ T o  1  bi n  ki u ể RecordSet  g n  v i  b ng ủ So_luong  c a  CSDL  hi n

ØVí  d   1:ụ th i:ờ

Sub Form_Load()

Dim Db As Database

Dim Rec As Recordset

Dim Dem As Integer

Set Db = CurrentDb()

Set Rec = Db.OpenRecordset("So_luong", DB_OPEN_TABLE)

Dem = Rec.RecordCount

ổ ố ả     MsgBox "T ng s  b n ghi là" + Str(Dem)

End Sub

ủ ụ ủ ụ ạ ở ự ộ

Ø  trên ta dùng th  t c Form_Load(), th  t c này khi ch y thì t

38

ạ  đ ng n p Form.

ố ượ

ố ượ

8.6.1 Đ i t

ng và khai báo đ i t

ng

ư ể ế ả ộ Ví d  2:ụ  Ta có th  dùng m t bi n  b ng nh  sau::

Sub Form_Load()

Dim Db As Database

Dim TB As TableDef

Dim Dem As Integer

Set Db = DBEngine.Workspaces(0).Databases(0)

Set TB = Db.TableDefs("So_luong")

Dem = TB.RecordCount

ủ MsgBox "So ban ghi c a Bang So_luong la:" & Str(Dem)

39

End Sub

ố ượ

ố ượ

8.6.1 Đ i t

ng và khai báo đ i t

ng

ả ố ồ ườ ng: Hoten, NgaySinh, DienToan,

ư Ví d  3:ụ  Ta có b ng KhoiA (kh i A) g m các tr DienLy. DienHoa, DiemTong, GhiChu nh  sau:

ậ ể

Hãy l p trình đ  tính DiemTong:

DiemTong=DiemToan+DiemLy+DiemHoa.

Sub Form_Load()

Dim Db As Database

Dim Rec As Recordset

Set Db = CurrentDb()

Set Rec = Db.OpenRecordset("KhoiA")

ế ệ

ế

Do Until Rec.EOF  ‘Làm cho đ n h t t p

ử      Rec.Edit   ‘cho phép s a n i dung các b n ghi

Rec![TongDiem] = Rec![DiemToan] + Rec![DiemLy] + Rec![DiemHoa]

ị ớ ậ      Rec.Update  ‘c p nh t giá tr  m i

ế ế

ế

Rec.MoveNext  ‘Di chuy n đ n b n ghi k  ti p

40

Loop

Rec.Close

Db.Close

End Sub

ố ượ

ố ượ

8.6.1 Đ i t

ng và khai báo đ i t

ng

ạ ươ ư ả ớ ộ

ØSau khi ch y ch

ng trình ta có n i dung b ng m i nh  sau:

ØChú ý:

ế ườ ả t  Rec![TongDiem],  nghĩa  là  tr ng ể TongDiem  trong  trong  b n  ghi,  đ

o Ta  vi

ệ ớ ế ừ phân bi t v i bi n khi khai báo t khoá Dim...

ụ ừ ụ ể ậ ữ ế

ØVí d  4: Cũng t

ví d  3, hãy l p trình đ  ghi vào tr ng ườ GhiChu ch  “Do” n u

41

ữ ế ặ TongDiem>=15 ho c ch   “Truot” n u TongTong<15

ố ượ

ố ượ

8.6.1 Đ i t

ng và khai báo đ i t

ng

Sub Form_Load()

Dim Db As Database

Dim Rec As Recordset

Set Db = CurrentDb()

Set Rec = Db.OpenRecordset("KhoiA")

ế ệ

ế

Do Until Rec.EOF  ‘Làm cho đ n h t t p

If Rec![TongDiem]>=15 Then

Rec.Edit   ‘cho phép s a n i dung các b n ghi

Rec![GhiChu]=”Do”

Else

Rec.Edit   ‘cho phép s a n i dung các b n ghi

Rec![GhiChu]=”Truot”

End If

ị ớ ậ      Rec.Update  ‘c p nh t giá tr  m i

ế ế

ế

42 ả

Rec.MoveNext  ‘Di chuy n đ n b n ghi k  ti p

Loop

Rec.Close

Db.Close

End Sub

ố ượ

ố ượ

8.6.1 Đ i t

ng và khai báo đ i t

ng

Sau khi ch y ta có:

43

ố ượ

8.6.2 M  đóng đ i t

ng b ng câu l nh Marco

a. Câu l nh Macro.

ể ự

ØĐ  th c hi n m t Macro ta dùng l nh sau:

ả ựơ

ể ự

ủ ụ

ØL nh này ph i đ

ặ c đ t trong các hàm ho c th  t c đ  th c thi.

ố ố ộ DoCmd. [,]

ố ượ

ở b. Hành đ ng m , đóng các đ i t

ng.

ố ượ

ØĐóng các đ i t

ng: CLOSE

ư

ví d : Đ  đóng m t Form

DanhSach ta gõ nh  sau:

DoCmd.Close acForm, “DanhSach”, acSaveYes

ạ ộ

AcForm: là thông s  ch

ỉ Form đang ho t đ ng

ọ ự

i m i s  thay đ i trên đó.

AcSaveYes: là thông s  cho phép khi đóng

Form thì ghi l

ố ượ

ươ

ư

Đ  đóng các đ i t

ng khác ta làm t

ng t

nh  ví d  trên.

44

ố ượ

8.6.2 M  ở đóng đ i t

ng b ng câu l nh Marco

ộ ố ượ

ØM  các đ i t

ữ ng ta s  d ng nh ng hành đ ng sau:

ử ụ ở ộ ả ở ộ

ở ộ ở ộ

ở ộ ở o OpenTable: M  m t b ng o OpenForm: M  m t Form o OpenReport: M  m t Report o OpenQuery: M  m t Query o OpenModule: M  m t Module

ở ả ủ ụ ự ạ ộ ộ ệ Ví d  1ụ : T o m t th  t c th c hi n m t Macro m  b ng DanhSach

ố ượ ự ư  nh  trên.

ệ DoCmd.Opentable (“DanhSach”) ØĐ  m  các đ i t ươ ể ở Ví d  2ụ : Gi

ng khác ta làm t ng t ờ  s  trong CSDL hi n th i ta có: ể ồ ơ ả TaHsTs (b ng H  s  Tuy n Sinh) và b ng ả  TaDiemD (b ng ả

ố ể ả ử 1. Hai b ng ả Đi m kh i D) .

ả ng sau: Sbd, HoTen, NgaySinh, GioiTinh, KhuVuc,

ườ B ng TaHsTs có các tr UuTien, TonGiao, DanToc.

ả ườ B ng TaDiemD có các tr ng: Sbd, Toan, Van, Anh

2. Ba Form TuyenSinh2014, FoHsTs, FoDiemD

45

ủ ư ệ ộ M t giao di n chính c a Form TuyenSinh2014 nh  hình sau:

ố ượ

8.6.2 M  đóng đ i t

ng b ng câu l nh Marco

ư

ØChú ý: thu c tính Name cho                4 nút trên nh  sau:

ề ề ề

o Nút có tiêu đ : “NHAP HO SO” có tên NhapHoSo o Nút có tiêu đ : “NHAP DIEM” có tên NhapDiem o Nút có tiêu đ : “KET THUC” có tên KetThuc

ạ ẽ ượ ở ể ư ữ c m  đ  ta đ a d FoDsTs s  đ

46

ế ế ượ ư a. Khi ta kích ho t nút NHAP HO SO thì Form  ệ li u vào, Form này đ ạ t k  có hình d ng nh  sau: c thi

ố ượ

8.6.2 M  đóng đ i t

ng b ng câu l nh Marco

o Nút có tiêu đ : “nh p” có tên NhapLyLich ậ

ề ế

o Nút có tiêu đ : “k t thúc” có tên KetThucLyLich

ể ậ ạ ở ệ ẽ ượ b. Khi ta kích ho t nút “NH P Đi m” giao di n chính thì Form c FoDiemD s  đ

ở ể ữ ệ ư ư ể ệ ấ ấ m  đ  ta đ a d  li u đi m sau khi đã ch m. Giao di n này có c u trúc nh  sau:

ư ộ

ØChú ý: Thu c tính Name cho 2 nút trên nh  sau:

ề ậ

o Nút có tiêu đ : “nh p li u” có tên NhapDuLieu ệ

ề ế

o Nút có tiêu đ : “K t thúc” có tên KetThucNhap

47

ố ượ

8.6.2 M  đóng đ i t

ng b ng câu l nh Marco

ủ ụ ệ ả

ự ệ ằ ư ọ ệ

Ø Sau đây là các th  t c s  ki n cu  ba nút l nh trên Form TuyenSinh214 nh  sau: ọ Navigation pane/ Form, ch n t p

o M  Form TuyenSinh2014 b ng cách v  CSDL, ch n

TuyenSinh2014, ch n Design

ư

ề ủ ụ t Code cho 3 th  t c đó nh  sau:

o Ch n nút có tiêu đ  NHAP HO SO/ kích ph i chu t ch n Code buider ọ o Vi ế Option Compare Database

Private Sub KetThuc_Click()

DoCmd.Close

End Sub

Private Sub NhapDiem_Click()

DoCmd.OpenForm ("FoDiemD")

End Sub

Private Sub NhapHoSo_Click()

DoCmd.OpenForm ("FoHsTs")

End Sub

ươ

ủ ụ

ư

T

ng t

ự ế  vi

ệ t Code cho 2 th  t c c a nút l nh trên Form FoHsTs nh  sau:

ủ ụ

Rem Th  t c trên Form FoHsTs

Option Compare Database

48

Private Sub KetThucLyLich_Click()

DoCmd.Close

End Sub

Rem ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­

ố ượ

8.6.2 M  đóng đ i t

ng b ng câu l nh Marco

Private Sub NhapLyLich_Click()

Dim Db As Database, Rec As Recordset

Set Db = CurrentDb()

Set Rec = Db.OpenRecordset("TaHsTs")

Rec.AddNew

Rec("SBD") = Sbd

Rec("HOTEN") = HoTen

Rec("GIOITINH") = GioiTinh

Rec("KHUVUC") = Val(KV)

Rec("TONGIAO") = TonGiao

Rec("DANTOC") = DanToc

Rec.Update

Sbd = ""

HoTen = ""

NgaySinh = ""

GioiTinh = ""

49

KhuVuc = ""

TonGiao = ""

DanToc = ""

UuTien = ""

Sbd.SetFocus

End Sub

ố ượ

8.6.2 M  đóng đ i t

ng b ng câu l nh Marco

ươ

ế ế

ủ ụ

T

ng t

ư ậ  nh  v y vi

t ti p cho 2 th  t c c a hai nút l nh trên Form: FoDiemD

ủ ụ

Rem Th  t c trên Form FoDiemD

Option Compare Database

Private Sub KetThucNhap_Click()

DoCmd.Close

End Sub

Rem ....................................................................

Private Sub NhapDuLieu_Click()

Dim Db As Database, Rec As Recordset

Set Db = CurrentDb()

Set Rec = Db.OpenRecordset("TaDiemD")

ớ    Rec.AddNew 'Thêm b n ghi m i

Rec("SBD") = Sbd

Rec("Toan") = Val(Toan)

Rec("Van") = Val(Van)

Rec("Anh") = Val(Anh)

50 ả

Rec.Update 'C p nh p b n ghi m i vào b ng TaHsTs

Sbd = ""

Toan = ""

Anh = ""

Van = ""

ỏ ế

Sbd.SetFocus  'Chuy n tr  đ n  SBD.

End Sub

ố ượ

8.6.2 M  đóng đ i t

ng b ng câu l nh Marco

ươ

ế ế

ủ ụ

T

ng t

ư ậ  nh  v y vi

t ti p cho 2 th  t c c a hai nút l nh trên Form: FoDiemD

ủ ụ

Rem Th  t c trên Form FoDiemD

Option Compare Database

Private Sub KetThucNhap_Click()

DoCmd.Close

End Sub

Rem ....................................................................

Private Sub NhapDuLieu_Click()

Dim Db As Database, Rec As Recordset

Set Db = CurrentDb()

Set Rec = Db.OpenRecordset("TaDiemD")

ớ    Rec.AddNew 'Thêm b n ghi m i

Rec("SBD") = Sbd

Rec("Toan") = Val(Toan)

Rec("Van") = Val(Van)

Rec("Anh") = Val(Anh)

51 ả

Rec.Update 'C p nh p b n ghi m i vào b ng TaHsTs

Sbd = ""

Toan = ""

Anh = ""

Van = ""

ỏ ế

Sbd.SetFocus  'Chuy n tr  đ n  SBD.

End Sub