Quản trị cơ sở dữ liệu Access - Đại học Kinh doanh và Công nghệ Hà Nội - 16

End Sub

8.5.5 Lệnh lặp For Next

Giả sử ta phải tính s =1+ 2+ 3+ 4+...+ 2000. R õ ràng ta không thể viết một lệnh gán gồm 2000

số hạng được. Do đó người ta phải dùng một “mẹo” khác:

Ta thấy số hạng thứ i bằng số hạng thứ i -1 cộng thêm 1. Chưa cộng thì s chưa có gì (bằng 0)

Ta “cộng dồn dần” như sau: Bước 1: Đặt s =0, i=1

Bước 2: s=s+i

Bước 3: i=i+1

Bước 4: Quay về Bước 2, lặp lại như trước.

Quá trình đó được lặp đi lặp lại cho đến khi i >2000 th ì thôi.

Có thể bạn quan tâm!

Xem toàn bộ 145 trang tài liệu này.

Chương trình như sau:

Sub Tong()

Dim i As Integer, s As Long s=0

i=1

10: s=s+i i=i+1

If i<=2000 Then Goto 10

End If

MsgBox(“s=”& Str(s))

End Sub


Trước lệnh gán s =s+i có mốc (10:) ng ười ta còn gọi là nhãn, nghĩa là nhảy đến nhãn 10. Còn lệnh Goto 10 là lệnh yêu cầu chương trình lại làm tiếp lệnh có nhãn 10. Để viết gọn quá trình trên người ta đưa ra lệnh For... Next. Ta sửa lại ch ương trình trên cho “đẹp” hơn như sau:

Sub Tong()

Dim i As Integer, s As Long s=0

For i=1 To 2000 Step 1 s=s+i

Next i

MsgBox(“s=”& Str(s))

End Sub

Lệnh For có cú pháp tổng quát nh ư sau:

For <Biến đếm >=<Giá trị đầu > To <Giá trị cuối >[Step <Bước tăng >]

<Nhóm lệnh >

Next

Ban đầu <Biến đếm > nhận <Giá trị đầu >, và so sánh với <Giá trị cuối >, nếu lớn hơn

thì kết thúc For, nếu nhỏ hơn hoặc bằng thì thực hiện <Nhóm lệnh >, gặp Next, <Biến đếm

> cộng thêm với <Bước tăng >, và đồng thời so sánh với <Giá trị cuối >, nếu lơn hơn thì kết thúc For, còn nếu đang nhỏ hơn hoặc bằng thì lại thực hiện <Nhóm lệnh>, gặp Next lại làm tiếp như trên.

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)

End Sub

8.5.6 Lệnh Do While .Loop

Lệnh For ứng với số lần lặp xác định, ví dụ b ài toán: s=11+22+33+...+1010 là 10 lần lặp, còn s

=1+ 2+ 3+ 4+...+ 2000. là 2000 l ần lặp. Nhưng có những bài toán ta không biết trước được số

lần lặp là bao nhiêu, thì làm thế nào? Ví dụ:

Cứ cộng mãi chỉ dừng khi một số hạng nhỏ hơn 0 0001 chẳng hạn Rõ ràng ta 1

Cứ cộng mãi, chỉ dừng khi một số hạng nhỏ hơn 0.0001 chẳng hạn. Rõ ràng ta phải có “mẹo” khác.

Cách lập luận như sau:

Ta gọi mỗi số hạng là a. Hình sau:

i cứ tiến từ 1 2 n đóng vai tr ò mẫu số Còn a được sinh ra từ i a 1 i v à so 3

i cứ tiến từ 1, 2, ..., n (đóng vai tr ò mẫu số). Còn a được sinh ra từ i (a=1/i) v à so sánh: nếu a

<=0.0001 thì dừng. Chương trình như sau: 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

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

End Sub

Vì i =1 nên a =1/1 cũng bằng 1, nên a không thể lớn hơn 0.0001, do đó tính s =s+a và i =i+1, a=1/i (=0,5). a=0.5 cũng không thể nhỏ hơn 0.0001 nên lại sinh ra s mới (s=s+a), i mới (i=i+1) và a mới (a=1/i), v.v..

Dạng tổng quát như sau:

Do While <Điều kiện >

<Nhóm lệnh >

Loop

Chừng nào <Điều kiện > còn đúng thì thực hiện <Nhóm lệnh >

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.

8.5.7 Lệnh Do Until Loop

Dạng tổng quát của dạng n ày:

Do Until <Điều kiện >

<Nhóm lệnh >

Loop

Chừng nào <Điều kiện > vẫn còn sai thì thực hiện <Nhóm lệnh >.

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)

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à cách xử lý các đối tượng

8.6.1 Đối tượng và khai báo đối tượng

Trong Access có một số đối tượng mà bạn cần quan tâm:

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

Đối tượng 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 RecordSets: chứa các đối tượng trong 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 Field: chứa các trường trong bảng

Đối tượng Form: chứa các Form

v.v..

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

Dim <Tên_biến> As <Kiểu_đối_tượng >

Sử dụng biến đối tượng:

a. Kiểu Database cho phép tham chiếu đến một CSDL, vì vậy để làm việc với một 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ácL:

Dim Db As Database

Set Db= DBEngine.Wokspaces(0).Database (<Tên_CSDL>)

b. Sử dụng biến kiểu RecordSet

Kiểu RecordSets cho phép ta tham chi ếu đến các đối tượng của CSDL đã khai báo như: Bảng, truy vấn, các bản ghi, v.v..

Ví dụ 1: Tạo 1 biến kiểu RecordSet gắn với bảng So_luong của CSDL hiện 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ự động nạp Form.

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)

End Sub

Ví dụ 3: Ta có bảng KhoiA (khối A) gồm các tr ường: Hoten, NgaySinh, DienToan, 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 4

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

Loop

Rec.Close Db.Close

End Sub

Sau khi chạy chương trình ta có nội dung bảng mới như sau:


Chú ý Ta viết Rec TongDiem nghĩa l à trường TongDiem trong trong bản ghi để phân 5

Chú ý:

Ta viết Rec![TongDiem], nghĩa l à trường TongDiem trong trong bản ghi, để 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 TongDiem

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

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

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

Loop

Rec.Close Db.Close

End Sub

Sau khi chạy ta co:

8 6 2 Mở đóng các đối tượng bằng câu lệnh Macro a Câu lệnh Macro a Để thực 6

8.6.2 Mở đóng các đối tượng bằng câu lệnh Macro.

a. Câu lệnh Macro.a

Để thực hiện một Macro ta d ùng lệnh sau:

DoCmd. <Tên_hành_động>[,<danh sách đối số >]

Lệnh này phải đựơc đặt trong các hàm hoặc thủ tục để thực thi.

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

AcSaveYes: là thông số cho phép khi đóng Form thì ghi lại mọi sự thay đổi trên đó. Để đóng các đối tượng khác ta làm tương tụ như ví dụ trên.

Mở các đối tượng ta sử dụng những h ành động sau:

- OpenTable: Mở một bảng

- OpenForm: Mở một Form

- OpenReport: Mở một Report

- OpenQuery: Mở một Query

- 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

DoCmd.Opentable (“DanhSach”)

Để mở các đối tượng khác ta làm tương tự như trên.

Ví dụ 2: Giả sử trong CSDL hiện thời ta có:

1. Hai bảng TaHsTs (bảng Hồ sơ Tuyển Sinh) và bảng TaDiemD (bảng Điểm khối D) .

Bảng TaHsTs có các trường sau: Sbd, HoTen, NgaySinh, GioiTinh, KhuVuc, UuTien,

TonGiao, DanToc.

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

2. Ba Form TuyenSinh2007, FoHsTs, FoDiemD

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

Chú ý thuộc tính Name cho 4 nút tr ên như sau  Nút có tiêu đề nhập hồ sơ có 7

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

Nút có tiêu đề: “nhập hồ sơ” có tên NhapHoSo

Nút có tiêu đề: “nhập điểm” có tên NhapDiem

Nút có tiêu đề: “Kết thúc” có tên KetThuc

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


 Nút có tiêu đề nhập có tên NhapLyLich  Nút có tiêu đề kết thúc có tên 8

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

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 FoDiemD sẽ được 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  Nút có tiêu đề nhập liệu có 9

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

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

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

Sau đây là các thủ tục sự kiện cuả ba nút lệnh tr ên Form TuyenSinh2007 như sau:

Mở Form TuyenSinh2007 bằng cách về CSDL, chọn Forms, chọn tệp

TuyenSinh2007, chọn Design

Chọn nút có tiêu đề Nhập Hồ Sơ, chọn nút (Code) trên thanh Form Design ở hình sau:


 Viết Code cho 3 thủ tục đó nh ư sau Option Compare Database Private Sub KetThuc Click 11

Viết Code cho 3 thủ tục đó nh ư sau:

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

Private Sub KetThucLyLich_Click()

DoCmd.Close

End Sub

Rem +--------------------------------------------------

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 = "" KhuVuc = "" TonGiao = "" DanToc = "" UuTien = "" Sbd.SetFocus

End Sub

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

..... Xem trang tiếp theo?
⇦ Trang trước - Trang tiếp theo ⇨

Ngày đăng: 26/01/2024