Những tính năng mới được coi là thú vị nhất của Access 2000.

binhnt

Member
Hội viên mới
Đặc tính Dirty

Chắc bạn đã làm quen với đặc tính Dirty của mẫu biểu Access (chỉ có từ Access 97). Nó cho phép từ chương trình viết bằng VBA (Visual Basic for Applications) có thể xác định được dữ liệu trong bản ghi hiện thời (gắn với mẫu biểu) có thay đổi và đã được ghi chưa. Bạn có thể sửa đặc tính này thành giá trị False từ mã VBA để ghi bản ghi đó ra đĩa. Thế nhưng nếu ta cần thực hiện thao tác gì đó khi mẫu biểu bị thay đổi thì làm thế nào? Access 97 không có sự kiện gọi là Dirty. Chắc bạn đã đoán ra: Access 2000 cuối cùng đã có sự kiện (event) như vậy. Thủ tục xử lý sự kiện Dirty có tham biến Cancel. Khi cần có thể thực hiện lệnh Cancel = True để thôi (undo) không làm những gì vừa thay đổi với bản ghi hiện thời nữa. Nhược điểm lớn của sự kiện Dirty là nó chỉ xảy ra khi người nhập liệu bắt đầu sửa nội dung mẫu biểu, chứ không xảy ra khi đặc tính Dirty bị sửa thành False từ chương trình. Nên có thêm sự kiện, chẳng hạn với tên là Undo để xử lý tình huống đó (bạn có thể lấy trình FrmSmp 97.exe từ cơ sở Web của Microsoft để tham khảo cách mô phỏng sự kiện After undo, nó sử dụng một điều khiển tính toán với biểu thức là một hàm người dùng, và hàm này thực hiện mỗi khi đặc tính Dirty của Access 97 thay đổi. Dùng kỹ thuật này để mô phỏng sự kiện Dirty, nhưng không hiệu quả bằng sự kiện Dirty cài sẵn trong Access 2000).

Định dạng có điều kiện

Đây là một trong những tính năng mà người lập trình Access khao khát nhất: làm thế nào để chỉ một số dòng nào đó (ví dụ: các dòng với doanh số lớn hơn 10.000 USD) của mẫu hoặc báo biểu hiện lên với dạng thức theo ý muốn (ví dụ: có màu đậm hơn các dòng khác, để dễ đọc, dễ nhấn mạnh). Với report thì có thủ thuật thêm cấu trúc IF - Endif vào thủ tục xử lý sự kiện Format của vùng (section) chứa hộp văn bản cần kiểm tra và nhấn mạnh. (Nếu thỏa điều kiện nào đó thì sửa các đặc tính Font, Fontweight,... của điều khiển cần định dạng riêng.) Tương tự, đối với mẫu biểu kiểu Single (đơn bản ghi) đưa nhóm lệnh kể trên vào thủ tục xử lý Current. Thế nhưng với kiểu mẫu biểu liên kế (Continuous Form, mẫu biểu đa bản ghi), làm như vậy sẽ thay đổi dạng thức cho tất cả các bản ghi! Nghĩa là không đạt được mục đích đặt ra. Vâng, bây giờ thì nhóm Access của Microsoft đã lắng nghe nguyện vọng của người sử dụng: có cách dễ dàng định dạng có điều kiện (conditional formatting) cho từng hộp văn bản, từng hộp chọn combo, từng dòng một. Có thể xác lập nhiều điều kiện định dạng cho mỗi điều khiển (dưới dạng biểu thức luận lý hay trạng thái điều khiển đang trong focus hay không). Nếu có vài điều kiện đúng, sẽ chọn điều kiện đúng đầu tiên kể từ đầu danh sách. Bạn đặt điều kiện trong cả chế độ Design (khi thiết kế) hoặc chế độ Form (khi mở mẫu biểu để làm việc, tức là định dạng động, trong thời gian vào hoặc xem số liệu). Hình 1 cho thấy hộp thoại Conditional Formatting mở ra khi người dùng nhập liệu hoặc xem form bằng cách vào thực đơn Format, sau đó chọn Conditional Formatting.

Hình 1. Hộp thoại định dạng có điều kiện mở trong Form View.

of1.jpg


Người lập trình VBA có thể kiểm soát việc định dạng có điều kiện bằng cách thêm hoặc loại bỏ các đối tượng kiểu FormatCondition từ sưu tập (collection) FormatConditions, và đặt lại các đặc tính của các đối tượng đó. Ví dụ, để doanh số hàng tháng trở nên đậm và có màu xanh dương nếu lớn hơn hạn mức nào đó (nhập sẵn vào hộp văn bản textMonthQuota của mẫu biểu), ta dùng đoạn mã sau:

Mã:
 With Forms!frmSales!txtMonthSales. FormatConditions

    .Add(acFieldValue, acGreaterthan, "=[txtMonthQuota]")

    .FontBold = True

    .ForeColor = vbBlue

    End With
 
Gắn mẫu biểu với bộ bản ghi

Ngay trong Access 2.0, người lập trình đã có nhiều cách để kiểm soát đặc tính Record Source của mẫu biểu. Bạn có thể gửi tên bảng, tên câu hỏi (query) hoặc cả một lệnh SELECT của SQL vào đặc tính này để đặc tả nguồn bản ghi. Với bộ bản ghi (recordset) tính được trong VBA thì rắc rối hơn: phải tạo bảng trung gian hoặc bảng truy vấn chứa dữ liệu cần thiết. Trong Access 2000 có thể gắn recordset tính được với mẫu biểu. Access 97 truy cập bộ bản ghi của mẫu biểu bằng đặc tính RecordsetClone, nhưng vẫn chưa có đặc tính Recordset để ấn định bộ bản ghi nguồn.

Tính năng mới này của Access 2000 rất linh hoạt, nhất là khi tạo recordset trong một giao tác (transaction). Khi quay lui (roll back) toàn giao tác, tất cả các thay đổi làm với mẫu biểu dựa trên bộ dữ liệu tạo trong giao tác, kể cả các thay đổi tác động đến nhiều bản ghi, sẽ được hủy. Trong quá khứ thì cực kỳ vất vả: thông thường phải dùng bảng trung gian hoặc mảng dữ liệu.



Có thể gắn một recordset với vài mẫu biểu một lúc. Dữ liệu trong mẫu biểu này sẽ tự động đồng bộ với dữ liệu trong form khác, mà quay lui giao tác cũng sẽ quay lui đối với dữ liệu trong tất cả các biểu mẫu. Ngay cả khi dùng các recordset với nhiều mẫu biểu mà các recordset đó được tạo trong một giao tác, chúng cũng rollback được cùng nhau.

Trong các tập tin ADP, các bộ bản ghi ADO có thể cập nhập (sửa) được qua form nếu các ADP này được tối ưu để dùng OLE DB tương tác với SQL server. Nếu dùng Jet (tức dùng tập tin .MDB) vẫn phải sử dụng DAO (Data Access Object) để tạo recordset kiểu read/write cho mẫu biểu, còn dùng bộ bản ghi ADO cho mẫu biểu của .MDB thì nó chỉ có tính read-only mà thôi. Có lẽ Microsoft phải khắc phục nhược điểm này của ADO trong MDB khi đưa ra phiên bản cuối cùng của Access 2000.


Tự động nén tập tin


Hình 2: Đăng ký chế độ Compact on Close và tập tin Access sẽ được nén tự động khi đóng (miễn là không có ai khác vẫn còn mở nó).

of2.jpg


Đây là tính năng rất hữu ích, và để Access làm được điều đó khi đóng tập tin, chỉ việc vào trang General của hộp thoại Options, sau đó đánh dấu chọn ô Compact on Close (xem hình 2).

Thông thường ứng dụng Access được đưa vào MDB mặt trước (chứa query, form, report, module), dữ liệu tách ra tập tin MDB riêng (mặt sau). Đóng tự động được thực hiện cho MDB mặt trước, và cần một thủ thuật nhỏ để đảm bảo nén cả tập tin dữ liệu ở mặt sau. Access đòi hỏi tập tin này phải được mở trong chế độ Exclusive (độc chiếm) thì mới thực hiện compact được, tuy nhiên, ít nhất là từ nay không cần phải lo nén tập tin mặt trước nữa.

Tại sao lại phải thường xuyên nén dữ liệu, trong khi bạn không tạo bảng tạm thời nào cả? Trên thực tế, Access tạo rất nhiều đối tượng trung gian và làm cho CSDL liên tục phình ra, do đó bị phân đoạn và giảm hiệu năng truy xuất.


Cần lưu ý rằng, nén tập tin có tác dụng đánh dấu các query cần được biên dịch lại trong lần vận hành kế tiếp. Khi bảng truy vấn lần đầu thực hiện sau khi thiết kế, cơ cấu Jet thiết lập một lược đồ truy vấn dựa trên các số liệu thống kê thu thập được. Nếu có ít số liệu (thường ban đầu dùng số liệu thử do người lập trình tự tạo), lược đồ truy vấn không sử dụng các chỉ mục mà trực tiếp quét các bản ghi trong bảng từ đầu đến cuối vì như thế sẽ nhanh hơn. Khi hệ thống áp dụng cho số liệu thực, liên tục biến đổi tăng dần, lược đồ truy vấn cũ không còn thích hợp nữa. Chính việc nén tập tin có tác dụng thiết lập lược đồ truy vấn mới cho query, dựa trên tình trạng mới nhất của số liệu. Nén cũng kéo theo việc sửa chữa tập tin, do đó không cần thực hiện thao tác repair như trong Access 2.0. Nén tự động sẽ không thực hiện nếu không tiết kiệm thêm ít nhất 256 KB.
 
Sửa lần cuối:
Bộ soạn thảo VBE

Hình 3. Từ nay Access 2000 dùng chung VBE với các thành phần khác của Office 2000.

of3.jpg


Làm việc với Word, Excel chắc bạn đã quen thuộc với Visual Basic Editor (VBE). Bản thân Access 95 đã chấp nhận VBA nhưng đến Access 97 vẫn trung thành với giao diện soạn thảo chương trình theo kiểu riêng. Kể từ Office 2000, tất cả các ứng dụng cấu thành của nó, trong đó có Access, đều chung VBE với giao diện thống nhất (Hình 3).

Dường như đây là một bước thụt lùi của Access 2000. Trong phần lớn các phần mềm dùng VBA, các mẫu biểu được thiết kế ngay trong VBE. Người lập trình Access 2000 buộc phải tiến/lui giữa cửa sổ VBE và cửa sổ Access nơi có các mẫu biểu đang mở.

Nếu là người lập trình từng trải, bạn có thể đóng cửa sổ Properties trong VBE vì nó chỉ lặp lại những gì có trong các hộp thoại Access, không có cả các đặc tính của điều khiển. Cửa sổ Project Explorer theo phong cách treeview (dạng cây) thật hữu ích khi làm việc với các CSDL thư viện. Ngoài ra, Project Explorer còn có khả năng mở rộng, cho thấy cả những gì không có trong cửa sổ CSDL của Access. Bạn có thể làm cho cửa sổ Immediate di động tự do giống như cửa sổ Debug trước kia. Nếu không thấy cánh Locals hoặc Watch, có thể mở chúng trong cửa sổ riêng nằm trên phần còn lại là cửa sổ soạn thảo mã VBA, không khác gì mấy so với trong Access 97, ngoại trừ việc các đơn thể chỉ mở trong khuôn khổ của cửa sổ VBE mà thôi. Bản thân VBE có gì mới? Hấp dẫn nhất là thanh công cụ Edit: có cặp nút lệnh cho phép thêm/bớt câu chú thích cho toàn khối mã chỉ bằng một thao tác nhấp chuột. Điểm mới nữa là thanh Edit cho phép đặt thẻ đánh dấu (bookmark) vào văn bản mã trình. Khi cần thiết có thể dễ dàng quay lại những nơi đã đặt dấu, hoàn toàn chỉ bằng cách nhấp vào lệnh tương ứng trong thanh công cụ. Thực ra thì bookmark đã có từ thời Access 97 nhưng thao tác đặt lại nằm sâu trong hệ thống thực đơn, do đó nhiều người không để ý và chẳng bao giờ dùng đến.

VBE còn hỗ trợ mô hình các công cụ bổ trợ linh hoạt, cho phép tùy biến môi trường mã hóa của người lập trình. Bạn tự động thêm khối chú thích hoặc đoạn mã xử lý sự kiện trong thủ tục hoặc hàm mới? Có thể tự tạo add-in để làm điều đó hoặc dùng các công cụ do người khác cung cấp. Dự đoán sẽ có nhiều phương tiện bổ trợ cho VBE xuất hiện trên thị trường.

AutoCorrect

Giả sử bạn dùng trường tên là CustomerID trong một hoặc nhiều bảng. Một ngày nào đó bạn muốn đổi tên nó thành ClientID. Như trước kia thì thật vất vả: phải rà soát tất cả bảng truy vấn (query) để tìm các trường CustomerID đang sử dụng và đổi nó thành tên mới. Cũng làm như vậy với các form và report để thay lại các nguồn điều khiển gắn với trường cũ. Tin tốt lành cho chúng ta: Access 2000 tự động đổi tên trường trong tất cả các thành phần liên quan kể trên, nhưng đừng vội hân hoan: hệ chưa mò được tới các module, các đoạn mã lập trình và recordset. Bạn vẫn phải sửa bằng tay như thường làm, do đó đừng vội vứt bỏ SpeedFerret, một sản phẩm thứ ba, vì chắc nó vẫn còn hữu hiệu cho Access 2000. Tuy nhiên, dùng AutoCorrect của Access 2000 một cách thận trọng cũng giúp được nhiều việc.
 
CurrentProject

Có một đối tượng mới trong Access 2000 gọi là CurrentProject.

Những ai từng lập trình DAO chắc khá quen thuộc với hàm CurrentDb () để tham chiếu tới CSDL đang mở. CurrentProject cũng có mục đích tương tự nhưng áp dụng cho cả ADO, ví dụ CurrentProject.Connection trả lại đối tượng kết nối ADO. Ngoài ra còn có CodeProject gần giống với hàm CodeDb () trong DAO để dùng với các add-in. Ta thực hiện một số lệnh sau để kiểm tra trong cửa sổ Immediate:
Mã:
    ?CurrentProject.FullName

    D:\Temp\db1.mdb

    ?CurrentProject.Name

    db1.mdb

    ?CurrentProject.Path

    D:\Temp

Đối tượng CurrentProject có các sưu tập (collection) chứa tất cả các đối tượng khác của Access, chẳng hạn AllForms, AllReports, AllMacros, AllModules và AllDataAccessPages. Mỗi sưu tập này chứa các đối tượng kiểu AccessObject với nhiều đặc tính (Property) rất hữu ích:
Mã:
    ?CurrentProject.AllForms.Count

    6

    ?CurrentProject.AllForms (5) .Name

    frmQuery1

    ?CurrentProject.AllForms (5) .IsLoaded

    False
Còn với các bảng và query thì sao? Có đối tượng khác gọi là CurrentData với đặc tính là các sưu tập AllTables, AllQueries, rồi cả AllViews, AllStoredProcedures và AllDatabaseDiagrams.

Tuy CurrentProject.Connection trả về đối tượng kết nối ADO, đặc tính ngầm định của đối tượng kết nối này là một chuỗi kết nối (Connect String):

Mã:
 ?CurrentProject.Connection

Kết quả là một chuỗi ký tự bao gồm các tham trị chia tách nhau bằng dấu chấm phẩy (;). Dùng các hàm mới của Access 2000, trong đó có Split() và Filter() để tách và lấy ra các tham trị cần thiết.
 
Các hàm chuẩn mới

Một loạt hàm mới được bổ sung so với Access 97, dùng để xử lý xâu ký tự: Replace(), InstrRev(), StrReverse(), Split(), Join() và Filter().

Hàm Replace() dùng để thay xâu con của xâu nào đó bằng xâu con mới:

?Replace ("a1a2a3a4a5", "a", "b")

b1b2b3b4b5

?Replace ("a1a2a3a4a5", "a", "b", 3)

b2b3b4b5

?Replace ("a1a2a3a4a5", "a", "b", 3, 2)

b2b3a4a5

Trong 2 ví dụ cuối, số 3 ở tham số thứ tư dùng chỉ vị trí từ đó bắt đầu cần thay thế (và kết quả cũng từ đó luôn). Tham số thứ 5 trong ví dụ cuối cùng để đặc tả số lần phải thay (xâu con có thể hiện diện nhiều lần).

Hàm StrReverse() trả về chuỗi ký tự đảo ngược (không rõ thực tế ứng dụng CSDL có cần đến hàm này không?).

?StrReverse ("abcdef")

fedcba

Hàm InstrRev() có cơ chế làm việc như Instr() nhưng tìm kiếm ngược từ ký tự cuối đến ký tự đầu (hàm này thì thật sự cần thiết):

?InstrRv ("C:-/MyPath\MyFile.ext", "\")

10

Các hàm Split(), Join() và Filter() cũng rất hữu ích. Split() chuyển đổi xâu ký tự có chia tách (bởi một ký tự nào đó, ví dụ dấu chấm phẩy) thành mảng các giá trị. Join() thực hiện thao tác ngược lại, từ mảng trở về xâu ký tự có chia tách. Filter() trích từ mảng các dòng thỏa mãn điều kiện nào đó.

? Filter(Split(CurrentProject.Connection, ","), _

"Data Source = ") (0)

Data Source=D:-/Temp\db1.mdb

Thêm một bước nữa thì nhận được trị của Data Source.

? Split (Filter(Split(CurrentProject .Connection, ";"), _

"Data Source = ") (0) ,"=") (1)

D:-/Temp\db1.mdb

Nếu đã quen thuộc với ngôn ngữ Lisp, chắc bạn rất hài lòng với bộ hàm trên và tự hỏi: tại sao đến bây giờ VBA mới có được khả năng phân tích xâu ký tự như vậy?
 
Ngang ngửa với VB 6

Những năm qua, người lập trình Access dùng VBA luôn lạc hậu so với Visual Basic, do đó có ý nghĩ cho rằng VBA là một tập con của VB. Sự thực thì VBA và VB luôn là một, có điều là người lập trình Visual Basic có được phiên bản mới hơn một chút. Giờ đây Microsoft đảm bảo Visual Basic và VBA đồng bộ với nhau. Như vậy, Office 2000 có ngôn ngữ lập trình hoàn toàn ngang ngửa với VB 6.0. Dưới đây tóm lược một số tính năng nâng cao của VBA mới.

- Bộ chuyển AddressOf cho phép truyền địa chỉ hàm gọi ngược cho thủ tục khác.

- Lệnh Implements được dùng với các đơn thể lớp để đặc tả lớp (class) thực thi giao diện (tập hợp các đặc tính và phương thức) định nghĩa trong một lớp khác. Như vậy, VBA bây giờ có tính năng đa hình (polymorphism), nghĩa là giao diện chuẩn có hành vi khác trong các lớp khác nhau.

- Với Access 97, bạn có thể dùng khai báo With Events trong đơn thể lớp để tạo khoang sự kiện, do đó đơn thể lớp đó có thể bắt được sự kiện phát sinh trong đối tượng. Từ nay có thể dùng lệnh Event để khai báo sự kiện theo ý muốn và lệnh RaiseEvent để làm cho nó xảy ra bất cứ lúc nào.

- Từ khóa Enum cho phép khai báo các hằng liệt kê, chẳng hạn như các hằng bắt đầu bằng ac, vb hoặc db. Các biến và tham số sau đó có thể được đăng ký với kiểu mới.

- Từ khóa Friend thêm lựa chọn thứ ba vào danh sách các khai báo (trước đó có Public và Private) khi cần định nghĩa phạm vi của thủ tục trong đơn thể lớp. Các thủ tục có tính Friend thấy được từ tất cả các thủ tục khác trong dự án. Khác với Public, chúng không thấy được bên ngoài dự án. Nếu dùng VBA để dựng các Com server cho các trình khác sử dụng, phạm vi kiểu Friend rất hữu ích.

- Đối tượng Debug có thêm phương thức Assert dùng đặt điểm ngắt vào mã trình. Ngắt sẽ xảy ra khi tại điểm đó biểu thức đặc tả trong Assert cho trị False. Lại thêm một cách mới để gỡ rối chương trình khi khó tìm được lỗi.

Jet Engine 4.0

Gần đây có nhiều tin đồn về giờ tận thế của Jet, một cơ cấu CSDL vốn dùng từ lâu nay cho Access (ở ta hay lẫn Jet với Access và một vài cổ động viên còn sót lại của FoxPro for DOS đã vội hoan hỉ là Access sắp chết - ND). Trên thực tế, người dùng được lựa chọn trong 2 khả năng: dùng Jet Engine 4.0 hoặc SQL Server 7.0 làm động cơ cho Access. Phiên bản 4.0 của Jet mạnh mẽ hơn bao giờ hết. Nhiều ứng dụng Access có thể không cần đến cơ cấu SQL Server 7 quá mạnh, và nhóm Jet của Microsoft vẫn nỗ lực hoàn thiện sản phẩm truyền thống của mình.

Động cơ Jet mới cho phép khóa chốt đến từng bản ghi (xem tùy chọn tương ứng trong trang Advanced thuộc hộp thoại Options ở hình 5).

Người dùng các phần mềm CSDL khác thường chê Access (đúng hơn: cơ cấu Jet của nó) là chỉ khoá chốt được toàn trang (page-level locking) khi bản ghi nào trong đó cần khóa. Từ Jet 3.x trở về trước một trang CSDL có dung lượng 2 KB. Jet 4.0 dùng trang 4 KB do đó nếu không hỗ trợ khóa chốt đến từng bản ghi thay cho việc khóa chốt toàn trang (gấp đôi so với trước), nhiều bản ghi sẽ bị "khóa lây". Dung lượng trang 4 KB là để hỗ trợ bộ mã Unicode, vì theo bộ này mỗi ký tự sẽ chiếm 2 byte. Giờ đây kích cỡ tối đa của tập tin MDB được nâng lên 2 GB so với 1 GB trước đây.

Việc khóa chốt theo kiểu nào cũng được Jet xác định một cách thông minh. Nếu có nhiều bản ghi trong trang 4 KB nào đó được khóa chốt, Jet tự động khóa cả trang cho hiệu quả, thậm chí nó khóa chốt cả bảng luôn nếu không có người dùng nào khác trên mạng truy cập bảng đó (đúng hơn: đang sửa - ND)

Nhiều đặc tính mới khác của Jet chủ yếu định hướng cho mô hình đối tượng ADO mà Microsoft khuyến nghị sử dụng thay cho mô hình DAO. Mô hình DAO cũ sẽ vẫn còn và giữ được giá trị sử dụng, nhất là về phương diện bảo mật và nhân bản (replication).

Dùng ADO nghĩa là sử dụng ngôn ngữ SQL đổi mới. Dưới đây liệt kê một số điểm mới của SQL theo chuẩn ANSI-92 mà Jet 4.0 hỗ trợ.

- Thêm các lệnh GRANT, REVOKE cho mục đích bảo mật

- Thêm các lệnh CREATE và DROP để tạo và loại bỏ câu hỏi (VIEW và PROCEDURE)

- CASCADE dùng để định nghĩa tính toàn vẹn tham chiếu

- Ràng buộc CHECK dùng để đặc tả biểu thức luận lý mà các bản ghi trong một hoặc nhiều bản phải thỏa.

- Các lệnh ALTER TABLE và ALTER COLUMN để sửa cấu trúc bảng mà không phải thêm cột mới, sao chép cột cũ sang và loại bỏ cột cũ như trước kia.

- IDENTITY là từ khóa đặc tả tính tăng tự động của cột

- Thêm một số kiểu cột mới để tương hợp với SQL Server, ví dụ kiểu Decimal

(tktdl@hcm.vnn.vn
Kỹ thuật viên lập trình K2-Nhóm 3)
 

CẨM NANG KẾ TOÁN TRƯỞNG


Liên hệ: 090.6969.247

KÊNH YOUTUBE DKT

Cách làm file Excel quản lý lãi vay

Đăng ký kênh nhé cả nhà

SÁCH QUYẾT TOÁN THUẾ


Liên hệ: 090.6969.247

Top