Chứng chỉ B Tin Học Quốc Gia Trang 77/131
I. Di chuyển dữ liệu trên màn hình làm việc
Khi thiết kế màn hình làm việc bằng đối tượng Form của Access ta sẽ gặp một khái niệm gọi là Bộ mẩu tin (RecordSet) của Form, đó là tập hợp tất cả những dòng dữ liệu hiện có trong nguồn dữ liệu của Form.
Mỗi dòng dữ liệu có trong RecordSet gọi là một mẩu tin (Record). Tại một thời điểm, người sử dụng chỉ có thể thực hiện các thao tác dữ liệu trên một mẩu tin, mẩu tin đang làm việc gọi là mẩu tin hiện hành (Current Record).
Như ta đã biết thì Form có ba dạng hiển thị thường gặp là:
DataSheet: xem đồng thời nhiều mẩu tin, tương tự như đối tượng Table. Continuous: cũng xem nhiều mẩu tin cùng một lúc.
Single: tại một thời điểm chỉ xem được thông tin của 1 mẩu tin, gọi là mẩu tin hiện hành.
Trong chế độ Single Form, do mỗi lần chỉ xem được một mẩu tin nên ta phải có thao tác di chuyển qua các mẩu tin có trên màn hình đang làm việc.
I.1. Thao tác di chuyển dữ liệu trên Form
I.1.1. Những hình thức di chuyển dữ liệu
Thao tác di chuyển dữ liệu trên Fom giúp người dùng có thể làm việc với những dòng dữ liệu khác nhau có trong nguồn dữ liệu của Form. Ta có thể di chuyển đến một số vị trí mẩu tin có trong tập dữ liệu:
Di chuyển về đầu: chuyển đến mẩu tin đầu tiên trong nguồn dữ liệu Di chuyển về cuối: chuyển đến mẩu tin cuối trong nguồn dữ liệu Di chuyển về trước: chuyển đến mẩu tin đứng trước mẩu tin hiện hành Di chuyển về sau: chuyển đến mẩu tin đứng sau mẩu tin hiện hành
Di chuyển đến mẩu tin thêm mới: cho phép thêm mới một dòng dữ liệu vào nguồn của Form đang làm việc.
I.1.2. Chức năng di chuyển trên Form
Muốn thực hiện những hình thức di chuyển trên, ta cần phải sử dụng những công cụ di chuyển được thiết kế trên Form. Ta có thể sử dụng chức năng di chuyển sẳn có trên Form hay tự thiết kế những thao tác di chuyển cho riêng mình.
Di chuyển bằng thanh Navigation Buttons của Form
Navigation Buttons là một thuộc tính của Form, cung cấp các chức năng di chuyển đến các vị trí: Đầu, Trước, Sau, Cuối cùng với chức năng thêm mới. Để có được thanh công cụ này, ta chỉ cần chọn giá trị cho thuộc tính Navigation Buttons là Yes
Chứng chỉ B Tin Học Quốc Gia Trang 78/131
Ngoài các chức năng di chuyển, Navigaton Buttons còn cung cấp hai thông tin liên quan là vị trí của mẩu tin đang làm việc và tổng số mẩu tin hiện có trong nguồn dữ liệu của Form. Khi thực hiện thao tác di chuyển thì giá trị của mẩu tin hiện hành sẽ thay đổi theo.
Di chuyển bằng các nút lệnh
Trong hình thanh Navigation Buttons trên ta thấy chức năng di chuyển về trước bị mờ, đó là cách mà chương trình xử lý để không cho thực hiện thao tác di chuyển nếu việc di chuyển không thể thực hiện nữa. Trong trường hợp trên nếu đang ở mẩu tin đầu tiên thì không thể nào di chuyển đến mẩu tin trước nó được nữa.
Ngoài cách xử lý trên, ta cũng có thể thiết kế lại chức năng di chuyển để có những xử lý khác tuỳ theo yêu cầu của bài toán.
Hai dạng bộ nút di chuyển thường gặp khi thiết kế màn hình làm việc. Di chuyển mẩu tin theo danh sách
Dạng di chuyển này thường được áp dụng trong trường hợp số lượng mẩu tin lớn, tất cả các mẩu tin sẽ được liệt kê vào một danh sách. Khi cần di chuyển đến mẩu tin nào đó trong danh sách chỉ cần click chọn dòng dữ liệu có trên danh sách.
Chứng chỉ B Tin Học Quốc Gia Trang 79/131
nào, người dùng chỉ cần click chọn dòng dữ liệu hiển thị tên môn học cần làm việc.
I.2. Xử lý di chuyển bằng nút lệnh
Trong phần này, chúng ta sẽ tìm hiểu cách tự tạo các chức năng di chuyển trên màn hình làm việc và xử lý những lỗi phát sinh trong quá trình di chuyển
I.2.1. Các bước thiết kế chức năng di chuyển
Để tạo chức năng di chuyển trên màn hình, ta có thể thực hiện theo các bước sau: Bước 1: Tạo các điều khiển để kích hoạt chức năng di chuyển.
Bước 2: Viết lệnh xử lý di chuyển cho từng điều khiển. Chi tiết các bước trên như sau:
Bước 1: Tạo các điều khiển để kích hoạt chức năng di chuyển
+ Trước tiên ta sẽ tạo ra bộ nút, sử dụng đối tượng Command Button, tương ứng với các chức năng di chuyển trên màn hình: Về Đầu, Về Trước, Về Sau, Về Cuối.
+ Ta có thể sử dụng thuộc tính Caption của những nút để hiển thị cách thức di chuyển (Đầu, Trước, Sau, Cuối) hay là hình ảnh thông qua thuộc tính Picture tượng trưng cho vị trí di chuyển mẩu tin.
Bước 2: Viết lệnh xử lý di chuyển cho từng điều khiển
+ Mỗi điều khiển được tạo ở trên sẽ tương ứng với vị trí cần di chuyển mẩu tin. Ta sẽ viết lệnh cho từng điều khiển ứng với vị trí của mẩu tin cần di chuyển đến.
+ Trước tiên phải chọn sự kiện để xử lý, ở đây ta sẽ thực hiện việc di chuyển khi người dùng Click vào điều khiển. Sự kiện On Click của điều khiển sẽ được chọn để viết lệnh.
+ Trong vùng viết lệnh của thủ tục On Click, ta sẽ gọi hành động di chuyển của đối tượng DoCmd với tham số Cách di chuyển là một trong những giá trị: acFirst, acLast, acNext, acPrivious, như sau:
DoCmd.GoToRecord , , Cách di chuyển
Ví dụ:
Để xử lý di chuyển đến mẩu tiếp kế tiếp của Form trên, ta thực hiện các bước sau:
Chọn sự kiện On Click của nút , giả sử đặt tên cho nút này là cmdSau
Chứng chỉ B Tin Học Quốc Gia Trang 80/131
Trong thủ tục phát sinh cho sự kiện viết câu lệnh di chuyển như sau:
Private Sub cmdSau_Click() DoCmd.GotoRecord , , acNext End Sub
I.2.2. Hiển thị thông tin về mẩu tin trên Form
Một vấn đề khi làm việc với Form dạng Single là cung cấp cho người sử dụng biết họ đang làm việc trên dòng dữ liệu nào, hiện tại thì nguồn dữ liệu có bao nhiêu mẩu tin.
Để thể hiện được 2 thông này, ta sử dụng những thuộc tính của Form: CurrentRecord và RecordsetClone.RecordCount.
CurrentRecord là thuộc tính lưu trữ vị trí của mẩu tin đang được làm việc trên Form. Giá trị của thuộc tính tự động thay đổi khi có sự di chuyển qua lại giữa các mẩu tin.
Thuộc tính RecordCount của đối tượng RecordsetClone cho biết tổng số lượng mẩu tin hiện có trong nguồn dữ liệu của Form là bao nhiêu.
Đây là hai thuộc tính cung cấp thông tin cho người lập trình, ta không thể gán giá trị trực tiếp cho chúng.
Về mặt sử dụng, ta có thể dùng trực tiếp các thuộc tính trong thuộc tính Control Source của điều khiển hoặc viết lệnh xử lý trong VBA.
Sử dụng CurrentRecord và RecordCount trực tiếp trên các điều khiển của Form
Khi dùng trực tiếp trên các điều khiển, CurrentRecord và RecordCount sẽ xuất giá trị của chúng lên vùng hiển thị của điều khiển.
Để sử dụng ta sẽ gán giá trị của thuộc tính Control Source của điều khiển là CurrentRecord, RecordCount hay là kết hợp cả hai, có dạng như sau:
hoặc
hoặc
Dạng sử dụng thứ 3 nếu dùng cho điều khiển Text Box sẽ cho ta kết quả giống như trong màn hình Ví dụ trên, kết quả hiển thị là 1\3.
Sử dụng CurrentRecord và RecordCount trong cửa sổ lệnh của ngôn ngữ VBA
Sử dụng bằng VBA thì ta cũng sử dụng cú pháp tương tự như trên. Ta có thể dùng giá trị của các thuộc tính để so sánh tính toán hay hiển thị thông tin như sử dụng trên màn hình.
Với trường hợp xuất thông tin lên điều khiển thì ta không gán cho thuộc tính Control Source mà gán trực tiếp vào tên của điều khiển, theo cú pháp sau:
TênĐiềuKhiển = CurrentRecord hoặc
Chứng chỉ B Tin Học Quốc Gia Trang 81/131
TênĐiềuKhiển = CurrentRecord & “\” & RecordetClone.RecordCount
Cú pháp thứ ba thường dùng để hiển thị thông tin về số mẩu tin và thường được viết trong sự kiện On Current của Form, sự kiện sẽ phát sinh khi có sự di chuyển qua các mẩu tin.
Ví dụ:
Để hiển thị thông tin về vị trí mẩu tin trên tổng số mẩu tin ta có thể thực hiện như sau:
Đặt tên cho Text Box hiển thị vị trí mẩu tin là txtViTri
Chọn sự kiện On Current của Form để viết đoạn lệnh sau:
Sub Form_Current()
txtViTri = CurrentRecord & “\” & RecordsetClone.RecordCount End Sub
I.3. Xử lý lỗi khi di chuyển
Thao tác di chuyển có thể phát sinh ra một số lỗi, đó là các trường hợp khi ta đang ở vị trí mẩu tin đầu tiên hoặc cuối cùng nhưng vẫn muốn di chuyển tiếp đến vị trí của mẩu tin trước đó hoặc mẩu tin sau thì sẽ phát sinh lỗi.
Bộ mẩu tin dữ liệu nguồn có cấu trúc như sau:
BOF Begin of File
Record 1 Record 2
… Record n
EOF End of File
Với cấu trúc trên, nếu như ta đang đứng ở vị trí của Record 1 mà tiếp tục di chuyển về trước thì sẽ rơi vào vùng BOF, ngược lại nếu như ta đang đứng ở vị trí của Record n mà tiếp tục di chuyển về sau thì sẽ rơi vào vùng EOF. Trong hai trườhg hợp này Access sẽ xuất một thông báo lỗi về việc di chuyển đến một vị trí không hợp lệ.
Nhiệm vụ của ta khi xây dựng màn hình làm việc là phải xử lý để người sử dụng không gặp những câu thông báo của hệ thống. Để xử lý lỗi khi di chuyển, có nhiều hướng tiếp cận khác nhau tuỳ theo cách mà người thiết kế muốn tạo ra màn hình làm việc.
Chứng chỉ B Tin Học Quốc Gia Trang 82/131
I.3.1. Cách 1: Chỉ thực hiện thao tác di chuyển khi hợp lệ
Đối với hướng tiếp cận này, người sử dụng có thể tác động lên chức năng di chuyển bất kỳ lúc nào nhưng chương trình chỉ thực sự di chuyển dữ liệu khi nó đã kiểm tra việc di chuyển không gây ra lỗi.
Với bộ nút di chuyển và cấu trúc bộ mẩu tin được trình bày ở phần trên thì lỗi sẽ xảy ra nếu thực hiện di chuyển cho hai nút di chuyển về Sau và về Trước. Do đó, ta phải thực hiện thao tác kiểm tra trước khi thực hiện hành động di chuyển về sau và về trước.
Khi di chuyển về trước, ta sẽ dựa vào thuộc tính CurrentRecord để kiểm tra. Chỉ thực hiện hành động di chuyển khi CurrentRecord > 1.
Khi di chuyển về sau, ta sẽ dựa vào thuộc tính CurrentRecord và RecordCount để kiểm tra. Chỉ thực hiện hành động di chuyển khi CurrentRecord < RecordsetClone.RecordCount.
Ví dụ:
Trong màn hình trên, để thao tác di chuyển không bị lỗi ta cần phải kiểm tra điều kiện trước khi gọi hành động di chuyển, đặt tên cho nút là cmdSau, nội dung câu lệnh xử lý như sau:
Private Sub cmdSau_Click()
If CurrentRecord < RecordsetClone.RecordCount Then DoCmd.GotoRecord , , acNext
End If End Sub
Với đoạn lệnh trên thì hành động di chuyển chỉ được thực hiện khi vị trí của mẫu tin hiện hành còn nhỏ hơn tổng số mẫu tin hiện có
I.3.2. Cách 2: Làm mờ các nút di chuyển
Trong cách 1, ta sẽ luôn cho phép người sử dụng click vào các nút di chuyển, còn việc có di chuyển hay không tuỳ thuộc vào mẩu tin hiện hành. Điều này đôi khi làm cho người sử dụng không biết là chương trình có chạy hay là không.
Do đó, có một các giải quyết khác là ta sẽ làm mờ những nút di chuyển khi thao tác di chuyển không thực hiện được.
Trong trường hợp này ta sẽ gặp thao tác xử lý sáng mờ các điều khiển di chuyển trên màn
Chứng chỉ B Tin Học Quốc Gia Trang 83/131
hình. Trạng thái sáng mờ của điều khiển sẽ được xác định thông qua thuộc tính Enabled của điều khiển.
Để xứ lý sáng mờ các nút di chuyển, thông thường ta nên xử lý trong sự kiện Current của Form. Trong thủ tục xử lý sự kiện, ta dựa vào vị trí của mẩu tin hiện hành để thay đổi trạng thái của các điều khiển.
Ví dụ:
Sử dụng Form ở ví dụ trên, với bộ nút di chuyển được đặt là: cmdDau, cmdTruoc, cmdSau, cmdCuoi theo thứ tự từ trái qua.
Trong sự kiện On Current của Form ta sẽ viết đoạn lệnh xử lý sáng mờ như sau:
Private Sub Form_Current() If CurrentRecord =1 Then cmdDau.Enabled = False cmdTruoc.Enabled = False cmdSau.Enabled = True cmdCuoi.Enabled = True
ElseIf CurrentRecord = RecordsetClone.RecordCount Then cmdDau.Enabled = True cmdTruoc.Enabled = True cmdSau.Enabled = False cmdCuoi.Enabled = False Else cmdDau.Enabled = True cmdTruoc.Enabled = True cmdSau.Enabled = False cmdCuoi.Enabled = False End If End Sub
II. Tìm kiếm thông tin
Tin học hoá nhằm hỗ trợ người dùng trong việc quản lý thông tin lưu trữ và đặc biệt là đáp ứng nhu cầu về tìm kiếm dữ liệu. Trong Access, ta có thể thực hiện việc tìm kiếm thông tin bằng màn hình tìm kiếm nhanh do Access cung cấp, hoặc có thể tự thiết kế những dạng màn hình tìm kiếm theo yêu cầu riêng của chương trình.
Để mở màn hình tìm của Access, ta thực hiện câu lệnh sau: DoCmd.RunCommand acCmdFind
Tuy nhiên, màn hình tìm của Access ít chức năng và khó sử dụng. Do đó, ta sẽ tự thiết màn hình tìm cho phù hợp với yêu cầu của người dùng.
Việc tìm kiếm dữ liệu trên màn hình có thể được thực hiện thông qua hành động của bộ lệnh
Chứng chỉ B Tin Học Quốc Gia Trang 84/131
DoCmd hay đối tượng RecordsetClone của Form.
II.1. Sử dụng DoCmd
II.1.1. Hành động FindRecord
Cú pháp có dạng như sau:
DoCmd.FindRecord “Giá trị tìm”
Giá trị tìm chính là điều kiện mà hành động sẽ đi so sánh bằng với giá trị của Field trong nguồn dữ liệu, Field so sánh sẽ là Field đang được chọn trên Form.
Nếu tìm thấy thì mẩu tin chứa giá trị tìm sẽ là mẩu tin hiện hành, nếu không tìm thấy thì không có sự thay đổi về mẩu tin hiện hành.
Một số điểm cần lưu ý khi sử dụng FindRecord:
Tại một thời điểm, ta chỉ có thể tìm giá trị của một Field có trong nguồn dữ liệu.
Điều khiển chứa Field cần tìm giá trị phải là đang được chọn, có Focus. Thông thường ta dùng hành động SetFocus của điều khiển cần tìm trước hành động FindRecord.
II.1.2. Ví dụ
Trên màn hình trên, ta có thể thực hiện thao tác tìm kiếm theo mã nhân viên hoặc theo tên nhân viên. Để thực hiện việc tìm kiếm, ta sẽ viết lệnh xử lý trong sự kiện Click của nút Tìm. Ta qui ước tên của các đối tượng trên màn hình như sau:
TextBox chứa thông tin của Field Manv có tên là txtMaNv TextBox chứa thông tin của Field Tennv có tên là txtTenNv Frame chứa nội dung tìm có tên là fraNoiDungTim
Option tìm theo mã nhân viên có Option Value là 1
TextBox chứa giá trị tìm theo mã nhân viên có tên là txtMaNvTim TextBox chứa giá trị tìm theo tên nhân viên có tên là txtTenNvTim Nút tìm có tên là cmdTim
Chứng chỉ B Tin Học Quốc Gia Trang 85/131
Private Sub cmdTim_Click()
If fraNoiDungTim = 1 Then ‘ tìm theo mã nhân viên txtMaNv.SetFocus
DoCmd.FindRecord txtManvTim Else ‘ tìm theo tên nhân viên
txtTenNv.SetFocus
DoCmd.FindRecord txtTenNvTim End If
End Sub
II.2. Dùng RecordsetClone
Trong phần trên ta đã biết cách tìm kiếm bằng hành động của DoCmd nhưng FindRecord có một số hạn chế khi thực hiện thao tác tìm kiếm như: không thể tìm đồng thời nhiều điều kiện, FindRecord không trả về một kết quả cụ thể cho việc tìm kiếm là tìm thấy hay không dữ liệu cần tìm.
Do đó, trong những trường hợp tìm kiếm phức tạp và chương trình cần xử lý chính xác dựa trên kết quả tìm kiếm thì ta phải sử dụng đối tượng Recordset thay cho DoCmd. Tìm kiếm bằng Recordset sẽ giải quyết tốt hai vấn đề mà DoCmd còn bị hạn chế.