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!
- Tổ Chức Và Hoạt Động Của Chương Trình Trong Access
- Quản trị cơ sở dữ liệu Access - Đại học Kinh doanh và Công nghệ Hà Nội - 14
- Các Phép Toán, Hàm, Bi Ến, Biểu Thức.
- Quản trị cơ sở dữ liệu Access - Đại học Kinh doanh và Công nghệ Hà Nội - 17
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 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 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 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 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 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ó 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 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ó 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() 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