Hệ thống xây dựng cơ sở dữ liệu biểu thuế trên WindowsCE và các chức năng tìm kiếm thuế

Trong khoá luận này chúng tôi đã giới thiệu những nét cơ bản về các thiết bị cầm tay và nghiên cứu về cấu trúc cơ sở dữ liệu được sử dụng trên các thiết bị này. Chúng tôi đã xây dựng được một ứng dụng nhỏ về cơ sở dữ liệu đựoc quản lý bởi windows CE hệ điều hành được sử dụng rộng rãi trên các thiết bị cầm tay ngày nay. Kết quả bước đầu đạt được là đã xây dựng được một ứng dụng nhỏ phục vụ cho nhân viên Hải Quan tra tìm biểu thuế trên thiết bị cầm tay mà cụ thể là Pocket PC. Các kết quả đạt được tuy còn rất hạn chế về chức năng, nhưng những chức năng đã đạt được cũng đủ để cho phép người học cũng như giáo viên có thể cùng tham gia thảo luận, trao đổi học tập và kiểm tra trình độ của người học. Đây là tiền đề để phát triển tiếp hệ thống.

doc58 trang | Chia sẻ: lvcdongnoi | Lượt xem: 2214 | Lượt tải: 0download
Bạn đang xem trước 20 trang tài liệu Hệ thống xây dựng cơ sở dữ liệu biểu thuế trên WindowsCE và các chức năng tìm kiếm thuế, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Như vây, chỉ có 32 bytes đối với một bản ghi và 4 bytes đối với một thuộc tính. Và tất cả các chuỗi trong cơ sở dữ liệu của Windows CE đều được lưu dưới dạng Unicode. Thực tế thì cơ sở dữ liệu của một chương trình có thể bị thay đổi bởi một chương trình khác. Một ứng dụng không thể khoá cơ sở dữ liệu để hạn chế việc truy cập và hệ điều hành không đảm bảo tính toàn vẹn cho các bản ghi cơ sở dữ liệu( ví dụ nhiều ứng dụng xoá các bản ghi cùng một lúc). Nhưng các chương trình cũng có thể đưa ra thông báo khi một cơ sở dữ liệu bị thay đổi do Windows CE hỗ trợ một vài thông báo để thông báo khi một ứng dụng khác tạo, chỉnh sửa hay xoá bản ghi trong cơ sở dữ liệu. Windows CE thực thi nhiều hàm quản lý trên cơ sở dữ liệu như là việc nén dữ liệu khi dữ liệu được chèn vào hoặc giải nén dữ liệu khi dữ liệu được truy cập, và đảm bảo tính toàn vẹn của các bản ghi trong cơ sở dữ liệu. Thêm vào đó, Windows CE hỗ trợ kỹ thuật làm cho việc đồng bộ hoá cơ sở dữ liệu giữa desktop computer và Windows CE trở nên dễ dàng. Các chương trình tạo và sử dụng một cơ sở dữ liệu Windows CE thông qua hàm API Windows CE mới. Sau đây là bảng danh sách các hàm chức năng cơ sở dữ liệu và các hàm API tương ứng. Database Operation Windows CE Functions Create database PegCreateDatabase Delete database PegDeleteDatabase Enumerate databases PegFindFirstDatabase, PegFindNextDatabase Opendatabase PegOpenDatabase Seekrecord PegSeekDatabase Read record PegReadRecordProps Write record PegWriteRecordProps Retrieve object Information PegOidGetInfo Set database Information PegSetDatabaseInfo Bản ghi và thuộc tính của cơ sở dữ liệu: Các bản ghi và các thuộc tính theo các khối đã được tạo sẵn để xây dựng cơ sở dữ liệu Windows CE . Một cơ sở dữ liệu được bao gồm một số bản ghi, và mỗi bản ghi được bao gồm một hoặc nhiều thuộc tính. Tất cả các bản ghi trong cơ sở dữ liệu Windows CE được xác định bởi một cái tên duy nhất. Cái tên định danh này được gán bởi hệ thống khi một bản ghi mới được tạo ra. Tuy một chương trình không cần phải theo dõi tên của bản ghi, tên của bản ghi có thể được tìm kiếm trong cơ sở dữ liệu. Từ định danh bản ghi thuộc loại PEGOID. Mỗi thuộc tính của bản ghi lại bao gồm có tên thuộc tính, loại dữ liệu, giá trị. Tên và loại dữ liệu của thuộc tính được kết hợp làm một loại dữ liệu thuộc loại PEGPROPID có hai phần với giá trị là hai từ. Từ ở vị trí cao là tên, từ ở vị trí thấp là kiểu dữ liệu. Windows CE hỗ trợ các kiểu dữ liệu là kiểu integer, kiểu string, kiểu time, kiểu mảng (array). Bảng dưới đây cung cấp các kiểu dữ liệu Bảng các kiểu dữ liệu constant Kiểu của thuộc tính Kiểu dữ liệu PEGVT_BLOB Là một structure PEGBLOB PEGVT_FILETIME Là một structure FILETIME PEGVT_12 Là một số nguyên có dấu 16 bit PEGVT_I4 Là một số nguyên có dấu 32 bit PEGVT_LPWSTR Một chuỗi kết thúc với giá trị null PEGVT_UI2 Một số nguyên không dấu 16 bit PEGVT_UI4 Một số nguyên không dấu 32 bit Các bản ghi được trình bày như cấu trúc PEGPROPVAL định nghĩa các thuộc tính của bản ghi. Cấu trúc PEGPROPVAL được định nghĩa như sau: typedef struct _PEGPROPVAL{ PEGPROPID proid; WORD wLenData; WORD sFlags; PEGVALUNION val; } PEGPROPVAL; Cấu trúc PEGPROPVAL có các thành phần sau: PEGPROPVAL propid: chỉ ra giá trị của thuộc tính- trường tại phần từ cao là giá trị đã được chương trình định nghĩa, còn phần từ thấp là từ PEGVT_ chỉ ra kiểu của dữ liệu. WORD wLenData: hiện tại thuộc tính này không được sử dụng WORD wFlag: Cờ được thiết lập bởi một chương trình cho PEGDB_PROPDELETE để xác định thuộc tính bị xoá, hoặc thuộc tính được thiết lập bởi hệ thống cho PEGDB_PROPNOTFOUND khi cập nhật bản ghi tại nơi mà thuộc tính không được xác định. PEGVALUNION val: Chỉ ra giá trị thực cho các kiểu dữ liệu đơn, hoặc trỏ đến các string hoặc BLOBs. Structure PEGPROPVAL được sử dụng cả khi đọc và khi viết bản ghi. Khi đọc, ví dụ chương trình có thể sử dụng hàm TypeFromPropID để xác định để xác định kiểu thuộc tính được cấp cho tên của thuộc tính( PEGPROPID). 4.2. Tạo và xoá cơ sở dữ liệu Một chương trình có thể tạo và xoá cơ sở dữ liệu khi cần thiết. Số lượng cơ sở dữ liệu có thể tồn tại phụ thuộc vào bộ nhớ ( khoảng trống lưu trữ) trên thiết bị. Cơ sở dữ liệu của Windows CE được tạo bởi hàm PegCreateDatabase. Đối số của hàm là tên cơ sở dữ liệu và kiểu tên của cơ sở dữ liệu và xác định kiểu sắp xếp tuỳ ý. Kiểu sắp xếp được xác định bằng một chỉ số chỉ kiểu sắp xếp trong sơ sở dữ liệu. Đối số này có thể bằng không nếu không thực hiện sắp xếp. Bảng dưới đây tổng kết các đối số của hàm PegCreateDatabase Thống kê các đối số của hàm PegCreateDatabase Các đối của hàm PegCreateDatabase Miêu tả LPWSTR lpszName Tên của cơ sở dữ liệu với tối đa là 32 ký tự. DWORD dwDbaseType Loại cơ sở dữ liệu đã định nghĩa bởi chương trình. WORD wNumSortOrder Con số của kiểu sắp xếp trong mảng rgSortSpecs. Một cơ sở dữ liệu có thể có từ 0 tới 4 kiểu sắp xếp. SORTORDERSPEC * rgSortSpecs Con trỏ trỏ tới mảng của kiểu sắp xếp hoặc bằng NULL nếu là wNumSortOrder. Nếu hàm PegCreateDatabase thành công, nó trả về giá trị là tên của cơ sở dữ liệu. Tên của cơ sở dữ liệu dùng để mở cơ sở dữ liệu mục đích chính là để thao tác với nội dung của nó. Nếu không thành công trả về giá trị NULL. Hàm GetLastError có thể được sử dụng để lấy mã của lỗi. Bảng sau trình bày mã lỗi Thống kê mã lỗi Mã lỗi Miêu tả ERROR_DISK_FULL Lỗi không đủ bộ nhớ để tao dữ liệu ERROR_INVALID_PARAMETER Lỗi một đối số không có giá trị ERROR_DUP_NAME Lỗi tên cơ sở dữ liệu mới trùng tên với cơ sở dữ liệu đã tồn tại Hàm PegDeleteDatabase được dùng để huỷ một cơ sở dữ liệu . Một đối duy nhất - PEGOID là tên của cơ sở dữ liệu bị xoá. Nếu hàm thực hiện thành công thì giá trị trả về là TRUE, ngược lại không thành công thì giá trị trả về là FALSE. Sử dụng hàm GetLastError để lấy về thông tin của các lỗi đó. Mã lỗi có thể là ERROR_INVALID_PARAMETER, nghĩa là đối không có giá trị hoặc là ERROR_SHARING_VIOLATION nghĩa là một chương trình khác đang sử dụng cơ sở dữ liệu mà chương trình muốn xoá. 4.3. Liệt kê cơ sở dữ liệu Mỗi một đối tượng lưu trữ có một số lượng cơ sở dữ liệu tuỳ ý. Các hàm PegFindFirstDatabase và PegFindNextDatabase cho phép chương trình liệt kê cơ sở dữ liệu có trong đối tượng lưu trữ. Hàm PegFindFirstDatabase bắt đầu liệt kê theo trình tự và trả về bảng liệt kê theo hàm PegFindNextDatabase. Khi liệt kê hết cơ sở dữ liệu hàm PegFindNextDatabase sẽ trả về lỗi ERROR_NO_MORE_ITEM. Chỉ có một đối duy nhất cho hàm PegFindFirstDatabase là DWORD, là kiểu tên cơ sở dữ liệu được chương trình định nghĩa mà nó có thể được sử dụng khi tạo cơ sở dữ liệu mới. Chỉ đinh là zero cho kiểu tên cơ sở dữ liệu liệt kê tất cả các cơ sở dữ liệu trong đối tượng lưu trữ. Giá trị trả về là một trình điều khiển ngữ cảnh bảng liệt kê hoặc ERROR_HANDLE_INVALID nếu hàm thực hiện không thành công. Gọi hàm GetLastError có thể trả về ERROR_OUTOFMEMORY cho biết không đủ bộ nhớ để cấp phát cho điều khiển cơ sở dữ liệu. Chỉ có một đối số duy nhất cho hàm PegFindNextDatabase là HANDLE, đối số này nhận biết ngữ cảnh của bảng liệt kê. Nếu hàm thực hiện thành công thì giá trị trả về là tên của cơ sở dữ liệu tiếp theo được liệt kê. Nếu hàm thực hiện không thành công thì giá trị trả về là zero, sử dụng hàm GetLastError để có được nhiều thông tin về lỗi đó. Có thể là ERROR_NO_MORE_ITEM nghĩa là đối tượng lưu trữ không nhiều hơn một cơ sở dữ liệu hoặc ERROR_INVALID_PARAMETER nghĩa là việc điều khiển ngữ cảnh của bảng liệt kê là không có giá trị. Khi chương trình kết thúc liệt kê cơ sở dữ liệu thì cần phải đóng điều khiển đó lại bằng cách sử dụng hàm CloseHandle. Dưới đây là một đoạn lệnh giải thích từng bước liệt kê cơ sở dữ liệu trong Windows CE: HANDLE hEnumerator; PEGOID objectID; //Liệt kê tất cả các databases hEnumerator = PegFindFirstDatabase(0); if (hEnumerator == INVALID_HANDLE_VALUE) { ::MessageBox(NULL, L"Invalid handle", L"Error", MB_OK); return; } while( (objectID = PegFindNextDatabase(hEnumerator)) != 0) { // sử dụng objectID của database ... } CloseHandle(hEnumDB); // cần phải đóng ngữ cảnh bảng liệt kê 4.4. Mở cơ sở dữ liệu Theo trình tự truy cập cơ sở dữ liệu của Windows CE, trước tiên một chương trình phải có được quyền thao tác trên cơ sở dữ liệu. Trong quá trình thao tác với cơ sở dữ liêu được sử dụng các hàm cơ sở dữ liệu API . Sử dụng hàm PegOpenDatabse để mở một cơ sở dữ liệu Windows CE. Giá trị trả vể của hàm PegOpenDatabase là hành động mở cơ sở dữ liệu. Sau khi mở cơ sở dữ liệu thì có thể đọc hoặc sửa đổi cơ sở dữ liệu. Khi kết thúc việc sử dụng cơ sở dữ liệu cần phải đóng cơ sở dữ liệu bằng cách gọi hàm CloseHandle. Cờ không bắt buộc với hàm PegOpenDatabase là PEGDB_AUTOINCREMENT. Cờ này điều khiển cho hệ thống tự động tăng con trỏ tìm kiếm sau tất cả các lần gọi hàm PegReadRecordProps. Con trỏ tìm kiếm này đánh dấu bản ghi được đọc tiếp theo. Các chương trình có thể đọc nhiều bản ghi cùng một lúc bằng cách kết hợp cơ PEGDB_AUTOINCREMENT với cờ PEGDB_AUTOINCREMENT. Một đối số khác của hàm PegOpenDatabase là tên thuộc tính của thuộc tính được sử dụng như là kiểu sắp xếp cho hành động mở cơ sở dữ liệu. Hệ thống sử dụng kiểu sắp xếp này để xác định rõ nơi con trỏ tìm kiếm chuyển đến sau khi gọi hàm PegReadRecordProps (nếu cờ PEGDB_AUTOINCREMENT được chỉ định ). Kiểu sắp xếp cũng xác định được thuộc tính mà hàm PegSeekDatabase sử dụng để truyền cơ sở dữ liệu. Bởi vì có thể có nhiều chương trình chạy trên cùng một cơ sở dữ liệu cùng một lúc, có thể một chương trình thay đổi cơ sở dữ liệu mà hiện tại một chương trình khác cũng đang chạy trên nó. Hệ điều hành có thể đưa ra thông báo khi các sự việc này xuất hiện. Để lấy về các thông báo đó, chương trình ghi rõ cửa sổ hoạt động trong hàm PegCreateDatabase. Sau đó Windows CE sẽ gửi thông báo Thống kê các đối số của hàm PegOpenDatabase Các đối số của hàm PegOpenDatabase Miêu tả PPEGOID poid Trỏ tới từ định danh đối tượng của cơ sở dữ liệu được mở. Mở một cơ sở dữ liệu bằng tên , thiết lập giá trị của poid trỏ tới zero, tức là có thể lây được từ định danh đối tượng của cơ sở dữ liệu mới được mở khi tên của cơ sở dữ liệu được chỉ rõ cho lpszName. LPWSTR lpszName Trỏ tới tên của cơ sở dữ liệu được mở. Đối số nay được bỏ qua nếu giá trị của poid là khác zero PEGPROPID propid Chỉ rõ tên thuộc tính của khoá chính cho thứ tự sắp xếp trong quá trình duyệt toàn bộ dữ liệu. Sau khi gọi hàm PegSeekDatabase thì có được thứ tự sắp xếp này. Đối số này có thể bằng zero nếu thứ tự sắp xếp là không quan trọng. DWORD dwFlags Chỉ rõ cờ hoạt động là PEGDB_AUTOINCREMENT hoặc là 0 HWND hwndNotify Nhận dạng cửa sổ - window mà đưa ra thông báo (DB_PEGOID_*) được gửi nếu một chương trình khác thay đổi cơ sở dữ liệu mà chương trình của bạn đang thao tác trên cơ sở dữ liệu đó. Đối số này có thể nhân giá trị NULL nếu chương trình không cần nhân thông báo. Nếu hàm PegOpenDatabase thực hiện thành công, giá trị trả về là việc điều khiển việc mở cơ sở dữ liệu. Nếu hàm thực hiện không thành công, giá trị trả về là INVALID_HANDLE_VALUE. Để có được nhiều thông tin hơn về lỗi, gọi hàm GetLastError. Dưới đây là bảng có danh sách các mã lỗi: Danh sách các mã lỗi Mã lỗi Miêu tả ERROR_INVALID_PARAMETER Lỗi một đối số không có giá trị ERROR_FILE_NOT_FOUND Không có cơ sở dữ liệu tồn tại với tên được chỉ định. Lỗi này chỉ được sử dụng nếu giá trị của poid được đặt bằng NULL hoặc bằng zero khi hàm đã được gọi. ERROR_NOT_ENOUGH_MEMORY Lỗi không đủ bộ nhớ cấp phát để thao tác cơ sở dữ liệu. 4.5. Sắp xếp cơ sở dữ liệu Một chương trình thường đặt các thông tin cùng loại trong tất cả các bản ghi trong cơ sở dữ liệu đã cho. Mỗi bản ghi trong chương trình TravelManager có thể có các thông tin về hãng hàng không, số chuyến bay, giờ khởi hành, giờ đến, số chỗ ngôi v.v... Thêm vào đó các thuộc tính cùng loại đối với mỗi bản ghi có thể được đặt trong cùng một tên thuộc tính( ví dụ như, tên thuộc tính cho thuộc tính số chuyến bay của một bản ghi có thể giống với tất cả các bản ghi khác trong cơ sở dữ liệu đó). Khi tất cả các bản ghi trong cơ sở dữ liệu Windows CE dùng chung một tên thuộc tính, thì một chương trình có thể yêu cầu hệ thống sắp xếp các bản ghi dựa vào thuộc tính nhận được. Thứ tự trong các bản ghi đã được sắp xếp ảnh hưởng tới thứ tự mà hàm PegSeekDatabase tìm kiếm các bản ghi trong cơ sở dữ liệu, hoặc thứ tự bản ghi mà hệ thống tiến con trỏ tìm kiếm lên phía trước khi sử dụng cờ PEGDB_AUTOINCREMENT khi mở một cơ sở dữ liệu. Có tới 4 từ định danh thuộc tính khác nhau có thể được dùng để sắp xếp khi một cơ sở dữ liệu mới được tạo. Phần mô tả thứ tự sắp xếp đó được chỉ rõ với structure SORTORDERSPEC mà nó có chứa từ định danh của thuộc tính trên mỗi bản ghi cơ sở dữ liệu được lưu trữ. Structure này cũng chứa cả các cờ có liên quan tới thứ tự sắp xếp. SORTORDERSPEC được định nghĩa như sau: typed ef struct _SORTORDERSPEC { PEGPROPID propid; DWORD dwFlags; } SORTORDERSPEC; Giá trị hợp lệ cho các cờ thành viên được liệt kê trong bảng sau: Cờ Ý nghĩa PEGDB_SORT_DESCENDING Việc sắp xếp được thực hiện theo thứ tự đi xuống. Mặc định sắp xếp theo thứ tự đi lên PEGDB_SORT_CASEINSENSITIVE Quá trình sắp xếp phân biệt dạng chữ. Giá trị này chỉ đúng trong trường hợp là string. PEGDB_SORT_UNKNOWNFIRST Các bản ghi không có thuộc tính này được đặt trước tất cả các bản ghi khác. Mặc định, nhiều bản ghi được đặt trước các bản ghi khác. Một chương trình chỉ rõ thứ tự sắp xếp để sử dụng khi gọi hàm PegOpenDatabase để mở một điều khiển tới cơ sở dữ liệu. Chỉ có một thứ tự sắp xếp duy nhất có thể có hiệu lực cho một thao tác mở. Tuy nhiên, bằng việc mở nhiều điều khiển tới cùng một cơ sở dữ liệu, chương trình có thể sử dụng nhiều hơn một thứ tự sắp xếp. Thứ tự sắp xếp của cơ sở dữ liệu có thể tồn tại được định nghĩa khi cơ sở dữ liệu được tạo ra. Một chương trình cũng có thể sắp xếp thứ tự cho cơ sở dữ liệu sau khi cơ sở dữ liệu được tạo ra bằng việc sử dụng hàm PegSetDatabaseInfo. Tuy nhiên, bởi vì hệ thống phải xem lại danh mục quản lý thứ tự sắp xếp, do đó việc thay đổi thứ tự sắp xếp có thê sử dụng một lượng lớn tài nguyên hệ thống, và có thể mất nhiều thời gian để hoàn thành. 4.6. Tìm kiếm các bản ghi Các bản ghi trong cơ sở dữ liệu có thể lấy về từ bất cứ chỗ nào mà con trỏ tìm kiếm của cơ sở dữ liệu hiện tại trỏ tới. Vì vậy, một chương trình cần phải tìm kiếm bản ghi được yêu cầu trước khi đọc hoặc thay đổi dữ liệu. Hàm PegSeekDatabase được dùng để tìm kiếm bản ghi yêu cầu trong cơ sở dữ liệu. Bản ghi đó có thể được xác định rõ bằng từ định danh của nó hoặc bằng một giá trị liên quan ví dụ như thuộc tính “name” bằng “John Doe”. Khi hàm PegSeekDatabase tìm kiếm bản ghi yêu cầu, con trỏ tìm kiếm được đặt vào vị trí bản ghi đó. Sau đó, chương trình có thể đọc hoặc sửa đổi bản ghi đó. Thứ tự ở trong việc tìm kiếm các bản ghi của hệ thống phụ thuộc vào thứ tứ sắp xếp có hiệu lực trong cơ sở dữ liệu. Ví dụ, khi tìm kiếm giá trị của “John Doe”, thì hệ thống chỉ tìm kiếm trong các thuộc tính mà có cùng tên thuộc tính vì vậy thứ tứ sắp xếp tên thuộc tính được xác định khi mở cơ sở dữ liệu. Dưới đây là một số đối số của hàm PegSeekDatabase Các đối số của hàm PegSeekDatabase Các đối số của hàm PegSeekDatabase Miêu tả HANDLE hDatabase Nhận biết cơ sở dữ liệu mà thực hiện tìm kiếm trong cơ sở dữ liệu đó. DWORD dwSeekType Chỉ ra kiểu của phương thức tìm kiếm để thực hiện DWORD dwValue Chỉ ra giá trị sử dụng cho phương thức tìm kiếm. Ý nghĩa của đối số này phụ thuộc vào giá trị của dwSeekType. LPDWORD lpdwIndex Trỏ tới một biến mà nó có thể lấy về vị trí tính từ điểm bắt đầu cơ sở dữ liệu cho tới điểm bắt đầu bản ghi đã được tìm thấy. Các loại phương thức tìm kiếm mà hàm PegSeekDatabase có thể thực hiện. Bảng dưới đây miêu tả các giá trị có thể dùng cho đối số dwSeekType của hàm PegSeekDatabase. Các loại phương thức tìm kiếm của hàm PegSeekDatabase PEGDB_SEEK_PEGOID: Tìm kiếm cho tới khi tìm thấy một đối tượng có từ định danh được xác định bằng đối số dwValue. Cách tìm kiếm này có hiệu suất rất cao. PEGDB_SEEK_VALUESMALLER: Tìm kiếm cho tới khi tìm thấy giá trị lớn nhất nhưng nhỏ hơn giá trị đã cho. Nếu không có giá trị nào trong tất cả các bản ghi nhỏ hơn giá trị cho ban đầu thì con trỏ tìm kiếm trỏ tới bên trái tận cùng cơ sở dữ liệu, và hàm trả vể giá trị là zero. Đối số dwValue là một con trỏ cấu trúc PEGPROPVAL. Độ phức tạp của phép tìm kiếm này là O(n). PEGDB_SEEK_VALUEFIRSTEQUAL: Tìm kiếm đến khi tìm được giá trị đầu tiên bằng với giá trị đã cho ban đầu. Nếu quá trình tìm kiếm không thành công thì con trỏ tìm kiếm được đặt ở vị trí bên trái của tận cùng cơ sở dữ liệu, và hàm trả về giá trị là zero. Đối số dwValue là một con trỏ cấu trúc PEGPROPVAL. Độ phức tạp của phép tìm kiếm này là O(n). PEGDB_SEEK_VALUENEXTEQUAL: Bắt đầu vị trí hiện tại, tìm kiếm chính xác ở vị trí tiếp theo trong bảng đã sắp xếp thứ tự và kiểm tra nếu bản ghi tiếp theo có giá trị bằng giá trị đã cho thì hàm trả về từ định danh đối tượng của bản ghi tiếp theo, ngược lại thì trả về zero và chuyển con trỏ đên tận cùng của cơ sở dữ liệu. Phép tìm kiếm này có thể dùng chung với phép PEFDB_SEEK_VALUEFIRSTEQUAL để liệt kê tất cả các bản ghi có giá trị bằng. Đối số dwValue chỉ rõ giá trị để tìm kiếm. Độ phức tạp của phép tìm kiếm này là O(1). PEGDB_SEEK_CURRENT: Tìm kiếm ngược lại hoặc tiến lên kể từ vị trí hiện tại của con trỏ tìm kiếm đến số bản ghi đã định. Đối số dwValue chỉ rõ số của bản ghi từ vị trí hiện tại. Hàm tìm kiếm tiến lên nếu dwValue là giá trị dương, hoặc ngược lại khi nó nhận giá trị âm. Tìm kiếm tiến lên thì hiệu quả. Độ phức tập của tìm kiếm ngược là O(n). PEGDB_SEEK_END: Tìm kiếm ngược từ cuối cơ sở dữ liệu cho tới số của bản ghi đã cho ban đầu. Đối số dwValue chỉ rõ số của bản ghi. Độ phức tạp của phép tìm kiếm này là O(n). Nếu hàm PegSeekDatabase thực hiện thành công thì giá trị trả về là từ định danh đối tượng PEGOID của bản ghi. Nếu tìm kiếm không thành công hàm trả về giá trị zero. Hàm GetLastError có thể trả về lỗi ERROR_INVALID_PARAMETER nếu đối số của hàm PegSeekDatabase không hợp lệ. 4.7. Đọc bản ghi Sau khi một cơ sở dữ liệu được mở, thao tác chủ yếu là đọc thông tin. Dữ liệu được đọc từ cơ sở dữ liệu của Windows CE bằng hàm PegReadRecordProps. Không giống với cú pháp của cơ sở dữ liệu SQL, một chương trình không chỉ rõ tập có chứa bản ghi để đọc ví dụ mệnh đề “where”. Thay vào đó, các thuộc tính được đọc từ bản ghi có vị trí là vị trí hiện tại mà con trỏ tìm kiếm trỏ vào. Khi một cơ sở dữ liệu của Windows CE được mở, con trỏ tìm kiếm được đặt ở vị trí bản ghi đầu tiên theo thứ tự sắp xếp đã định. Ngoài ra, nếu chương trình chỉ rõ cờ PEGDB_AUTOINCREMENT khi mở CSDL, con trỏ tìm kiếm sẽ tăng theo bản ghi tiếp theo theo thứ tự sắp xếp mỗi lần gọi hàm PegReadRecordProps. Hàm PegReadRecordProps được dùng để đọc nhiều thuộc tính cùng một lúc. Các thuộc tính này được đọc thông qua các đối số của hàm PegReadRecordProps, đó là một mảng các từ định danh thuộc tính(PEGPROPID). Một đối số khác là số của từ định danh thuộc tính, mà được liệt kể vào trong một mảng. Định rõ là NULL cho mảng mà yêu cầu hệ thống truy lục tất cả các thuộc tính trong bản ghi hiện tại. Một đối số nữa của hàm PegReadRecordProps là bộ đệm để lưu kết quả. Chương trình chỉ rõ bộ đệm để hệ thống viết các thông tin về thuộc tính và chỉ rõ kích thước của bộ đệm. Mặc dù, một chương trình có thể có thể gọi hàm PegReadRecordProps để xác định kích thước của bộ đệm khi cần thiết và sau đó gọi lại hàm để truy vấn dữ liệu, nhưng hệ thống làm cho chức năng phổ biến này rất thuận lợi. Trong trường hợp thông tin lưu trữ quá ít, thì hệ thống sẽ cấp phát lại bộ đêm – buffer nếu chương trình gọi cờ PEGDB_ALLOWREALLO. Trường hợp chương trình đặt bộ đệm với giá trị NULL, thì hệ thống sẽ cấp phát và sử dụng bộ đệm trong kích thước chính xác. Mặc dù một chương trình có thể đọc số lượng bất kỳ các thuộc tính của bản ghi hiện tại, hệ thống lại lưu trữ bản ghi theo định dạng nén do đó cần phải giải nén các bản ghi trước khi các thuộc tính được đọc. Để đạt hiệu quả cao, chương trình nên đọc tất cả các thuộc tính cần thiết trong một lần gọi đơn hơn là dùng nhiều lần gọi song song với nhau. Nếu hàm PegReadRecordProps thực hiện thành công, thì các thông tin về thuộc tính yêu cầu được copy vào bộ đệm đã được chỉ định. Kết quả bộ đệm có một mảng cấu trúc PEGPROPVAL. Bằng cách sử dụng PEGPROPID của mỗi cấu trúc PEGPROPVAL, chương trình có thể xác định được giá trị của mỗi thuộc tính. Giá trị của thuộc tính có thể thay đổi theo kích thước. Dưới đây là một đoạn mã mô tả quá trình đọc các thuộc tính từ cơ sở dữ liệu của Windows CE. PEGOID objId; HANDLE hDb; WORD cProps; LPBYTE pBuf = NULL; DWORD cbBuf = 0; hDb = PegOpenDatabase(&objId, // tên định danh của cơ sở dữ liệu szDbName, // tên của database 0, // không thứ tự sắp xếp PEGDB_AUTOINCREMENT, // các cờ NULL); // không có của sổ thông báo while (objId = PegReadRecordProps(hDb, // thao tác cơ sở dữ liệu PEGDB_ALLOWREALLOC, // cho phép cấp phát lại &cProps, // số các thuộc tính cần đọc NULL, // đọc tất cả các thuộc tính &pBuf, // bộ đệm dữ liệu thuộc tính &cbBuf)) // kích thước của bộ đệm { //sử dụng giá trị các thuộc tính vừa đọc } CloseHandle(hDb); // đóng trình điều khiển đọc cơ sở dữ liệu hDB 4.8. Viết các bản ghi Dữ liệu được viết trong CSDL bằng hàm PegWriteRecordProps. Hàm này có thể được sử dụng để tạo một bản ghi mới hoặc thay đổi bản ghi đã tồn tại. Mỗi bản ghi bao gồm một tập các thuộc tính. Để viết các thuộc tính đó vào trong một bản ghi, chương trình phải tạo ra một mảng cấu trúc PEGPROPVAL. Mỗi một cấu trúc PEGPROPVAL là tên thuộc tính và giá trị tương ứng với thuộc tính. Dùng hàm PegWriteRecordProps để viết tất cả các thuộc tính yêu cầu vào trong bản ghi đã định. Cũng như việc đọc các thuộc tính từ các bản ghi, chương trình nên viết tất cả các thuộc tính của bản ghi tại một thời điểm để tránh sự va chạm khi lưu dữ liệu ở dạng nén. Hàm PegWriteRecordProps được sử dụng để tạo bản ghi mới và thay đổi bản ghi đã tồn tại. Nếu đối số của hàm là một bản ghi đã tồn tại thì hàm sẽ cập nhật các thuộc tính cho bản ghi đó. Nếu từ định danh của bản ghi đặt bằng 0 thì một bản ghi mới được đưa vào cơ sở dữ liệu với các thuộc tính đã xác định. Hàm PegWriteRecordProps không sử dụng hoặc di chuyển con trỏ tìm kiếm. Một chương trình có thể xoá một thuộc tính hoặc cả một bản ghi đã tồn tại. Dùng cờ PEGDB_PROPDELETE trong cấu trúc PEGPROPVAL để báo cho hàm PegWriteRecordProps di chuyển thuộc tính được cung cấp. Mô tả các đối số của hàm PegWriteRecordProps HANDLE hDbase: Nhận dạng cơ sở dữ liệu đã mở. Cơ sở dữ liệu phải được mở trước khi gọi hàm PegOpenDatabase. PEGOID oidRecord: Nhận dạng bản ghi mà có các thuộc tính đã định được ghi. Đối số này là zero, một bản ghi mới được tạo ra và được điền khớp với các thuộc tính đã xác định. WORD cPropID: Cho biết số thuộc tính trong mảng đã xác định bằng đối số rgPropVal. Đối số cPropID cần được đặt bằng zero. PEGPROPBVAL * rgPropVal: Trỏ tới một mảng của cấu trúc PEGPROPVAL mà nó chỉ ra giá trị của thuộc tính được viết trong bản ghi. Nếu hàm PegWriteRecordProps thực hiện thành công, trả về giá trị là tên của bản ghi với các thuộc tính đã được ghi. Nếu không thành công, trả về zero. Chương trình có thể sử dụng hàm GetLastError để có thêm thông tin về lỗi. Bảng dưới đây liệt kê các lỗi mà hàm GetLastError có thể trả về. ERROR_DISK_FULL: Không đủ khoảng trống bộ nhớ trong đối tượng lưu trữ để viết các bản ghi. ERROR_INVALID _PARAMETER: Lỗi đối số không hợp lệ. Đoạn lệnh sau mô tả quá trình viết một bản ghi vào trong cơ sở dữ liệu Windows CE: PEGPROPVAL NewProp; // thuộc tính mới có chứa blob... PEGBLOB blob; // blob chưa một dãy byte... BYTE * pBuf = NULL; // ...và đây là dữ liệu thực tế UINT cbBuf; // tính số bytes cân có trong blob ... // kích thước ngoài cân thiết, sau đó định vị pBuf = (BYTE *) LocalAlloc(LMEM_FIXED, cbBuf); // đặt dữ liệu thực vào trong pBuf... // bây giờ thiết lập viết thuộc tính blob mới NewProp.propid = PEGVT_BLOB; NewProp.wFlags = 0; NewProp.val.blob = blob; // blob tự trỏ tới bộ đệm blob.dwCount = cbBuf; // đếm số byte trong bộ đệm blob.lpb = pBuf; // tạo trường PEGBLOB trỏ tới bộ đệm oid = PegWriteRecordProps(hDb, // thao tác cơ sở dữ liệu 0, // bản ghi mới 1, // một thuộc tính &NewProp); // trỏ tới thuộc tính blob // thực hiện thao tác lỗi bằng cách kiểm tra oid... 4.9. Xoá bản ghi Chương trình sử dụng hàm PegDeleteRecord để xoá một bản ghi từ cơ sở dữ liệu, hàm này cung cấp tên bản ghi và điều khiển mở cơ sở dữ liệu có chứa bản ghi đó. Tóm tắt các biến cho hàm PegDeleteRecord. hDatabase: Chỉ ra CSDL mà có bản ghi bị xoá. Để xoá một bản ghi, CSDL phải được mở. Chương trình mở CSDL bằng cách gọi hàm PegOpenDatabase. oidRecord : Tên định danh bản ghi bị xoá. 4.10. Lấy về các thông tin của các đối tượng lưu trữ Chương trình có thể lấy thông tin của bất kỳ đối tượng nào được lưu trữ bằng cách dùng hàm PegOidGetInfo. Các đối tượng đó bao gồm các CSDL, các bản ghi, các thư mục, và các file. Một chương trình cung cấp tên của đối tượng và trỏ tới cấu trúc PEGOIDINFO. Các đối số của hàm PegOidGetInfo PEGOID oid: Cho biết tên của đối tượng được lấy thông tin. PEGOIDINFO *poidInfo: Trỏ tới cấu trúc PEGOIDINFO có chứa thông tin của đối tượng. Nếu gọi hàm PegOidGetInfo thành công, thì giá trị trả về là TRUE, và hệ thống sẽ điền vào structure PEGOIDINFO thông tin của đối tượng đã cho. Structure PEGOIDINFO được định nghĩa như sau: typedef struct _PEGOIDINFO { WORD wObjType; WORD wPad; union { PEGFILEINFO infFile; PEGDIRINFO infDirectory; PEGDBASEINFO infDatabase; PEGRECORDINFO infRecord; }; } PEGOIDINFO; Structure PEGOIDINFO có các thành phần sau: WORD wObjType: Xác định tên của đối tượng. Đối số này có thể nhận một trong các giá trị sau: OBJTYPE_INVALID: Kiểu của đối tượng lưu trữ không hợp lệ. OBJTYPE_FILE: Đối tượng là một file. OBJTYPE_ DIRECTORY: Đối tượng là một thư mục. OBJTYPE_ DATABASE: Đối tượng là một cơ sở dữ liệu. OBJTYPE_RECORD: Đối tượng là một bản ghi trong cơ sở dữ liêu. WORD wPad: Aligns the structure on a double word boundary. PEGFILEINFO infFile: Chỉ ra structure PEGFILEINFO có chứa thông tin của file. Thành phần này chỉ hợp lệ nếu wObjType là OBJTYPE_FILE. PEGDIRINFO infDirectory: Chỉ ra structure PEGDIRINFO có chứa thông tin về thư mục. Thành phần này chỉ hợp lệ nếu wObjType là OBJTYPE_DIRECTORY. PEGDBASEINFO infDatabase: Chỉ ra structure PEGDBASEINFO maf chứa thông tin về CSDL. Thành phần này chỉ hợp lệ nếu wObjType là OBJTYPE_DATABASE. PEGRECORDINFO infRecord: Chỉ ra structure PEGRECORDINFO mà chứa thông tin về một bản ghi trong CSDL. Thành phần này chỉ hợp lệ nếu wObjType là OBJTYPE_RECORD. Structure PEGFILEINFO được định nghĩa như sau: typedef struct _PEGFILEINFO { DWORD dwAttributes; PEGOID oidParent; WCHAR szFileName[MAX_PATH]; FILETIME ftLastChanged; DWORD dwLength; } PEGFILEINFO; Structure PEGOIDINFO có các thành phần sau: DWORD dwAttributes: Chỉ ra thuộc tính của file. PEGOID oidParent: Chỉ ra tên của thư mục gốc. WCHAR szFileName: Chỉ ra một chuỗi có chứa đầy đủ tên và đường dẫn của file. FILETIME ftLastChanged: Chỉ ra mốc thời gian mà nội dung của file bị thay đổi lần cuối cùng. DWORD dwLength: Chỉ ra kích thước của file dưới dạng byte. Structure PEGDIRINFO được định nghĩa như sau: typedef struct _PEGDIRINFO { DWORD dwAttributes; PEGOID oidParent; WCHAR szDirName[MAX_PATH]; } PEGDIRINFO; Structure PEGDIRINFO có các thành phần sau: DWORD dwAttributes: Chỉ ra thuộc tính của thư mục.l PEGOID oidParent: Chỉ ra tên của thư mục gốc. WCHAR szDirName: Chỉ ra một chuỗi có chứa đầy đủ tên và đường dẫn của thư mục. Structure PEGRECORDINFO được định nghĩa như sau: typedef struct _PEGRECORDINFO { PEGOID oidParent; } PEGRECORDINFO; Structure PEGRECORDINFO có một thành phần: PEGOID oidParent, chỉ ra tên của CSDL gốc. Structure PEGDBASEINFO được định nghĩa như sau: typedef struct _PEGDBASEINFO { DWORD dwFlags; WCHAR szDbaseName[PEGDB_MAXDBASENAMELEN]; DWORD dwDbaseType; WORD wNumRecords; WORD wNumSortOrder; DWORD dwSize; FILETIME ftLastModified; SORTORDERSPEC rgSortSpecs[PEGDB_MAXSORTORDER]; } PEGDBASEINFO; Structure PEGDBASEINFO có các thành phần sau: DWORD dwFlags. Chỉ ra các thành phần hợp lệ của structure. Đối số này có thể kết hợp với các giá trị sau: PEGDB_VALIDNAME: Thành phần szDbaseName là hợp lệ và có thể được sử dụng PEGDB_VALIDTYPE: Thành phần dwDbaseType là hợp lệ và có thể được sử dụng. PEGDB_VALIDSORT SPEC: Thành phần rgSortSpecs là hợp lệ và có thể được sử dụng. WCHAR szDbaseName: Chỉ ra một chuỗi có chứa đầy đủ tên và đường dẫn của CSDL. Chuỗi có tối đa là 32 ký tự bao gồm cả ký tự cuối cùng là ký tự NULL. DWORD dwDbaseType: Chỉ ra kiểu của CSDL. WORD wNumRecords: Chỉ ra số bản ghi trong CSDL. WORD wNumSortOrder: Chỉ ra con số của kiểu thứ tự sắp xếp trong CSDL, có tối đa là 4 kiểu thứ tự sắp xếp tại cùng một thời điểm. DWORD dwSize: Kích thước dạng bytes mà CSDL đang sử dụng. FILETIME ftLastModified: Lần cuối cùng CSDL này bị thay đổi. SORTORDERSPEC rgSortSpecs: Chỉ ra chỉ số thứ tự sắp xếp. Chỉ có n phần tử đầu tiên của mảng là có giá trị, n là giá trị được xác định bởi thành phần wNumSortOrder. 4.11. Thay đổi thông tin của cơ sở dữ liệu Thông tin của cơ sở dữ liệu có thể được thay đổi đối với cơ sở dữ liệu đang tồn tại. Một chương trình có thể thay đổi tên, kiểu, phần mô tả thứ tự sắp xếp đối với bất kỳ một cơ sở dữ liệu nào. Bảng sau liệt kê các đối số của PegSetDatabaseInfo. PEGOID oidDbase: Chỉ ra tên của cơ sở dữ liệu có các đối số được thiết lập. PEGDBASEINFO * pNewInfo: Trỏ đến structure PEGDBASEINFO mà chứa thông tin đối số mới trong cơ sở dữ liệu. Thành phần wNumRecords của structure không được sử dụng. Chương trình chỉ rõ thông tin trong cơ sở dữ liệu bị thay đổi bằng cách tạo ra các trường tương ứng trong structure PEGDBASEINFO. Structure PEGDBASEINFO được mô tả trong phần “Retrieving Object Information” của chương này. Giá trị trả về là TRUE nếu hàm thực hiện thành công, ngược lại trả về FALSE. Sử dụng hàm GetLastError để có thêm thông tin về lỗi: ERROR_INVALID_ PARAMETER: Một đối số không hợp lệ. ERROR_DISK_FULL: Ổ đĩa đã đầy, bất kỳ yêu cầu thay đổi kích thước nào cũng không được đáp ứng. Sự thay đổi thứ tự sắp xếp có thể làm thay đổi kích thước của các bản ghi tuy nhiên sự thay đổi đó là không đáng kể. ERROR_SHARING_ VIOLATION: Lỗi hàm thử xoá bỏ thứ tự sắp xếp trong cơ sở dữ liệu hiện tại 4.12. Handling Database Notification Messages Cơ sở dữ liệu Windows CE không có điều khiển truy cập, nhiều chương trình có thể mở cơ sở dữ liệu tại cùng một thời điểm. Hệ điều hành Windows CE không đảm bảo tính toàn vẹn cho cơ sở dữ liệu, ví dụ trong trường hợp một chương trình đang thay đổi một bản ghi, và một chương trình khác đang cố gắng xoá bỏ bản ghi đó. Hệ thống cũng có thể báo cho một chương trình biết là cơ sở dữ liệu đang bị thay đổi bởi một chương trình khác. Khi cơ sở dữ liệu được mở bằng cách dùng hàm PegOpenDatabase, nó có thể cung cấp trình điều khiển để nhận được các thông báo khi một chương trình khác thực hiện thay đổi trên cơ sở dữ liệu đó. Windows CE đã thêm vào một số thông báo được gửi tới cửa sổ window về kiểu thay đổi trong cơ sở dữ liệu. Cửa sổ - windows nhận thông báo DB_PEGOID_CREATED khi một chương trình khác đưa thêm một bản ghi mới vào cơ sở dữ liệu. Bảng dưới đây là danh sách các thông báo Thông báo Miêu tả WPARAM LPARAM DB_PEGOID_ CHANGED Một chương trình khác thay đổi đối tượng đã lưu PEGOID: là tên của đối tượng bị thay đổi PEGOID: là tên của đối tượng cha DB_PEGOID_ CREATED Một chương trình khác tạo một đối tượng trong đối tượng lưu trữ PEGOID: đối tượng được tạo PEGOID: Tên của đối tượng cha DB_PEGOID_ RECORD_DELETED Một chương trình khác đã xoá một bản ghi PEGOID: tên của đối tượng bị xoá PEGOID: tên của đối tượng cha 4.13. Cơ sở dữ liệu giao tiếp – Contacts Database Một trong những chương trình chuẩn trong Windows CE là chương trình giao tiếp. Chương trình này kiểm tra nhiều thông tin như tên, địa chỉ, số điện thoại. Chương trình giao tiếp lưu tất cả các dữ liệu giao tiếp trong cơ sở dữ liệu Windows CE gọi là Contacts Database. Do lưu trữ dữ liệu trong Windows CE, nên chương trình giao tiếp làm cho các thông tin của nó có thể dùng được đối với các chương trình khác. Nếu một chương trình cho phép người dùng nhập vào môt cái tên thì sau đó chương trình có thể tìm kiếm các thông tin có liên quan đến cái tên đó trong Contacts Database. Một chương trình có thể sử dụng các hàm database API chuẩn, như là PegOpenDatabase, PegReadRecordProps, v.v…để lấy các thông tin từ Contacts Database. Tuy nhiên, Windows CE còn có một tập các hàm và cấu trúc mà chương trình có thể sử dụng để truy vấn và thao tác nội dung của Contacts Database. Các hàm API trong Contacts Database AddAddressCard: Đưa thêm một thẻ địa chỉ vào DB giao tiếp. CloseAddressBook: Đóng đóng Contacts Database. CreateAddressBook: Tạo Contacts Database. DeleteAddressCard: Xoá bỏ một thẻ địa chỉ trong Contacts Database. FreeAddressCard: Giải phóng bộ nhớ đã cấp phát cho một thẻ địa chỉ. GetAddressCardIndex: Lấy về vị trí chỉ mục của thẻ địa chỉ. GetAddressCardOid : Lấy về tên tên đối tượng của thẻ địa chỉ. GetAddressCardProperties: Lấy về các thuộc tính của thẻ địa chỉ. GetColumnProperties: Lấy về các nhãn của các cột được dùng để sắp xếp Contacts Database. GetMatchingEntry: Tìm thuộc tính name của tất cả các thẻ điạ chỉ trong Contacts Database sao cho thuộc tính “name” khớp với xâu đưa vào. GetNumberOfAddressCards: Trả vê con số của thẻ địa chỉ trong Contacts Database. GetPropertyDataStruct: Lấy về thông tin của một thuộc tính trong Contacts Database. GetSortOrder : Lấy về trình tự trong Contacts Database mà đã được sắp xếp. ModifyAddressCard: Thay đổi một thẻ địa chỉ trong Contacts Database. OpenAddressBook: Mở Contacts Database. OpenAddressCard: Mở một thẻ địa chỉ và lấy về các thông tin của nó. RecountCards: Đếm lại số thẻ địa chỉ trong Contacts Database. SetColumnProperties: Chỉ ra các cột mà có thể được dùng để sắp xếp trong Contacts Database. SetMask: Chỉ rõ các thuộc tính được trình bày trong một thẻ địa chỉ. SetSortOrder: Đặt lại thứ tự sắp xếp trong Contacts Database. 4.15 Thẻ địa chỉ Cũng như bất kỳ database Windows CE nào, Contact database được bao gồm một tập các bản ghi. Mục đích của các hàm Contacts database API, các bản ghi trong Contacts Database được tham chiếu tới các thẻ địa chỉ. Mỗi thẻ địa chỉ có chứa một tập các thuộc tính đã được xác định. Tất cả các thẻ địa chỉ có cùng một tập các thuộc tính. Các thuộc tính đó bao gồm địa chỉ, số điện thoại ngày sinh. Mỗi thuộc tính của thẻ địa chỉ gọi tắt là thẻ thuộc tính. Thẻ thuộc tính gọi đến thông tin cụ thể của thẻ địa chỉ và trả về các thông tin đó. Danh sách các thẻ thuộc tính Contacts Database : HHPR_ANNIVERSARY HHPR_ASSISTANT_NAME HHPR_ASSISTANT_TELEPHONE_NUMBER HHPR_BIRTHDAY HPR_BUSINESS_FAX_NUMBER HHPR_CAR_TELEPHONE_NUMBER HHPR_CATEGORY HHPR_CHILDREN_NAME HHPR_COMPANY_NAME HHPR_DEPARTMENT_NAME HHPR_EMAIL1_EMAIL_ADDRESS HHPR_EMAIL2_EMAIL_ADDRESS HHPR_EMAIL3_EMAIL_ADDRESS HHPR_GENERATION HHPR_GIVEN_NAME HHPR_HOME2_TELEPHONE_NUMBER HHPR_HOME_ADDRESS_CITY HHPR_HOME_ADDRESS_COUNTRY HHPR_HOME_ADDRESS_POSTAL_CODE HHPR_HOME_ADDRESS_STATE HHPR_HOME_ADDRESS_STREET HHPR_HOME_FAX_NUMBER HHPR_HOME_TELEPHONE_NUMBER HHPR_MIDDLE_NAME HHPR_MOBILE_TELEPHONE_NUMBER HHPR_NAME_PREFIX HHPR_NOTES HHPR_OFFICE_ADDRESS_CITY HHPR_OFFICE_ADDRESS_COUNTRY HHPR_OFFICE_ADDRESS_POSTAL_CODE HHPR_OFFICE_ADDRESS_STATE HHPR_OFFICE_ADDRESS_STREET HHPR_OFFICE_LOCATION HHPR_OFFICE_TELEPHONE_NUMBER HHPR_OFFICE2_TELEPHONE_NUMBER HHPR_OTHER_ADDRESS_CITY HHPR_OTHER_ADDRESS_COUNTRY HHPR_OTHER_ADDRESS_POSTAL_CODE HHPR_OTHER_ADDRESS_STATE HHPR_OTHER_ADDRESS_STREET HHPR_PAGER_NUMBER HHPR_SPOUSE_NAME HHPR_SURNAME HHPR_TITLE HHPR_WEB_PAGE HHPR_LAST_FIRST_NAME HHPR_FIRST_LAST_NAME HHPR_HOME_ADDRESS HHPR_OTHER_ADDRESS HHPR_OFFICE_ADDRESS HHPR_EMAIL_TYPE HHPR_EMAIL_OR_PAGER_TYPE 4.16. Mở Contacts Database Trước khi truy cập thông tin trong Contacts Database, chương trình phải mở database. Hàm OpenAddressBook được dùng để mở Contacts Database. Khi mở một database Windows CE khác, hàm OpenAddressBook cho phép chương trình chỉ định thứ tự sắp xếp và của sổ window nhận các thông báo cho biêt những thay đổi được tạo ra trên Contacts Database. Vì Contacts Database không được tạo ra cho đến khi chương trình Contacts được sử dụng, nên việc gọi hàm OpenAddressBook rất có khả năng thất bại. Nếu Contacts Database không tồn tại, dùng hàm CreateAddressBook để tạo Contacts Database. Khi tạo Contacts Databasemới thì có 4 kiểu thứ tự sắp xếp có thể được chỉ định. Nếu trong chương trinh không chỉ rõ thứ tự sắp xếp thì hệ thông sẽ tự động gán thứ tự sắp xếp của HHPR_SURNAME, HHPR_COMPANY_NAME, HHPR_OFFICE_TELEPHONE_NUMBER, HHPR_HOME_TELEPHONE_NUMBER. Khi chương trình không sử dụng Contacts Database nữa thì phải gọi hàm CloseAddressBook. 4.17. Truy cập tới các thẻ địa chỉ Để truy cập các thuộc tính theo thứ tự của thẻ địa chỉ, cần phải có tên của thẻ địa chỉ yêu cầu. Mỗi thẻ địa chỉ có một cái tên duy nhất, được gán bởi hệ thống khi thẻ địa chỉ được tạo ra. Ngoài ra , mỗi thẻ địa chỉ còn có một chỉ số index của vị trí. Chỉ số của thẻ địa chỉ phụ thuộc vào thứ tự sắp xếp hiện thời trong database. Hàm GetAddressCardOid và hàm GetAddressCardIndex được dùng để lấy tên hoặc chỉ số của thẻ nếu chương trình có nhiều giá trị. Chương trình có thể tìm thẻ địa chỉ với hàm GetMatchingEntry. Hàm này tìm giá trị cho trước trong bất kỳ thuộc tính nào không quan tâm tới thứ tự trong database. Sau khi chương trình có được tên của thẻ yêu cầu, nó có thể sử dụng hàm OpenAddressCard và GetAddressCardProperties để lấy các thông tin của thẻ đó. Cả hai hàm đó phủ đầy structure AddressCard, structure này yêu cầu các thuộc tính của thẻ. Dùng hàm OpenAddressCard để lấy về một tập các thuộc tính, nếu chỉ cần lấy một vài thuộc tính trong thẻ thì dùng hàm GetAddressCardProperties, hàm này dùng ít bộ nhớ hơn hàm OpenAddressCard. Structure AddressCard chứa giá trị cho các thuộc tính của thẻ. Structure được định nghĩa như sau: typedef struct _AddressCard { // các thành phần thời gian của hệ thống SYSTEMTIME stBirthday; SYSTEMTIME stAnniversary; // Business view fields TCHAR *pszBusinessFax; TCHAR *pszCompany; TCHAR *pszDepartment; TCHAR *pszEmail; TCHAR *pszMobilePhone; TCHAR *pszOfficeLocation; TCHAR *pszPager; TCHAR *pszWorkPhone; TCHAR *pszTitle; // Personal view fields TCHAR *pszHomePhone; TCHAR *pszEmail2; TCHAR *pszSpouse; // Trường xem thông báo TCHAR *pszNotes; // Other fields the user can select TCHAR *pszEmail3; TCHAR *pszHomePhone2; TCHAR *pszHomeFax; TCHAR *pszCarPhone; TCHAR *pszAssistant; TCHAR *pszAssistantPhone; TCHAR *pszChildren; TCHAR *pszCategory; TCHAR *pszWebPage; TCHAR *pszWorkPhone2; // Thuộc tính tên TCHAR *pszNamePrefix; TCHAR *pszGivenName; TCHAR *pszMiddleName; TCHAR *pszSurname; TCHAR *pszGeneration; // Thuộc tính địa chỉ TCHAR *pszHomeAddrStreet; TCHAR *pszHomeAddrCity; TCHAR *pszHomeAddrState; TCHAR *pszHomeAddrPostalCode; TCHAR *pszHomeAddrCountry; TCHAR *pszOtherAddrStreet; TCHAR *pszOtherAddrCity; TCHAR *pszOtherAddrState; TCHAR *pszOtherAddrPostalCode; TCHAR *pszOtherAddrCountry; TCHAR *pszOfficeAddrStreet; TCHAR *pszOfficeAddrCity; TCHAR *pszOfficeAddrState; TCHAR *pszOfficeAddrPostalCode; TCHAR *pszOfficeAddrCountry; BYTE *rgbReserved[84] } AddressCard; Khi chương trình không sử dụng dữ liệu trong cấu trúc AddressCard, phải gọi hàm FreeAddressCard để giải phóng bộ nhớ cấp phát cho dữ liệu của thẻ. Tất cảc các lần gọi hàm OpenAddressCard và hàm GetAddressCardProperties tương ứng gọi hàm FreeAddressCard. 4.18. Thêm mới hoặc thay đổi thẻ địa chỉ Dữ liệu thẻ địa chỉ được thêm vào hoặc được thay đổi với cùng cấu trúc AddressCard được dùng để lấy thông tin của thẻ. Để tạo ra một thẻ mới , chương trình phải điền giá trị cho tất cả các thuộc tính. Sau đó gọi hàm SetMask để thiết lập giá trị cho mỗi thuộc tính trong structure AddressCard. Cuối cùng, gọi hàm AddAddressCard để tạo thẻ địa chỉ mới. Sửa đổi thẻ địa chỉ đã tồn tại cũng theo quy trình trên. Chương trình sẽ khớp structure AddressCard với các thuộc tính hiện thời bằng hàm GetAddressCardProperties hoặc hàm OpenAddressCard. Sau đó thay đổi các thuộc tính theo yêu cầu và với mỗi thuộc tính cần thay đổi gọi hàm SetMask. Cuối cùng gọi hàm ModifyAddressCard để cam kết thay đổi thẻ với database. Để xoá bỏ một thẻ từ một Contacts Database, dùng hàm DeleteAddressCard. Chương 5: Thiết kế hệ thống 5.1. Mô tả bài toán Khi công nghệ thông tin ngày càng phát triển và những ứng dụng của nó trong đời sống cũng như trong các ngành, các lĩnh vực ngày càng được mở rộng. Ngành Hải Quan cũng đã sử dụng những ứng dụng của CNTT vào hoạt động của ngành. Tính thuế nhập khẩu là một trong những công việc mất thời gian và công sức của nhân viên Hải Quan. Tương ứng với mỗi mặt hàng nhập khẩu từ các nước khác nhau lại có một mức thuế và loại thuế riêng: Thuế suất ưu đãi: Thuế suất ưu đãi là thuế áp dụng cho hàng hoá nhập khẩu có xuất xứ từ nước hoặc khối nước có thoả thuận về đối sử tối huệ quốc trong thương mại với Việt Nam. Thuế suất ưu đãi đặc biệt: Thuế suất ưu đãi đặc biệt là thuế suất được áp dụng cho hàng hoá nhập khẩu có xuất xứ từ nước hoặc khối nước đã có thoả thuận ưu đãi đặc biệt về thuế nhập khẩu theo thể chế thương mại tự do, liên minh thuế quan hoặc tạo điều kiện thuân lợi cho giao lưu thương mại biên giới và trường hợp ưu đãi đặc biệt khác. Trong đó, có một số nước và khu vực được hưởng mức thuế suất ưu đãi đặc biệt : Các nước trong hiệp hội ASEAN, các nước trong liên minh Châu Âu EU Thuế suất thông thường: Thuế suất thông thường là thuế suất được áp dụng cho hàng hoá nhập khẩu có xuất xứ từ nước hoặc khối nước mà Việt Nam không có thoả thuận về đối sử tối huệ quốc hoặc không có thoả thuân ưu đãi đặc biệt về thuế nhập khẩu. Thuế suất thông thường cao hơn 50% so với thuế suất ưu đãi của từng mặt hàng được quy định tại Biểu thuế nhập khẩu ưu đãi và được tính như sau: Thuế suất thông thường của hàng hoá nhập khẩu Thuế suất thông thường = Thuế suất ưu đãi + Thuế suất ưu đãi x 50% Các trường hợp đặc biệt: Với hàng hoá nhập khẩu thuộc đối tượng được miễn thuế, tạm miễn thuế, đã đưa vào sử dụng tại Việt Nam, nhưng sau đó được cơ quan Nhà nước có thẩm quyền cho phép chuyển nhượng hoặc thay đổi mục đích được miễn thuế, tạm miễn thuế trước đây, phải nộp thuế, thì giá tính thuế nhập khẩu phải được xác định trên cơ sở giá trị còn lại của hàng hoá theo thời gian sử dụng và lưu tại Việt Nam(tính từ thời điểm nhập khẩu đến thời điểm tính thuế) được xác định như sau: Thuế cho các trường hợp đặc biệt với hàng hoá nhập khẩu chưa qua sử dụng Thời gian sử dụng và lưu lại tại Việt Nam Giá tính thuế nhập khẩu = (%) giá hàng hoá mới tại thời điểm tính thuế Từ 6 tháng trở xuống (được tính tròn là 183 ngày) 90% Từ trên 6 tháng đến 1 năm (được tính tròn là 365 ngày) 80% Từ trên 1 năm đến 2 năm 70% Từ trên 2 năm đến 3 năm 60% Từ trên 3 năm đến 5 năm 50% Từ trên 5 năm 40% Thuế cho các trường hợp đặc biệt với hàng hóa nhập khẩu đã qua sử dụng Thời gian sử dụng và lưu lại tại Việt Nam Giá tính thuế nhập khẩu = (%) giá hàng hoá mới tại thời điểm tính thuế Từ 6 tháng trở xuống 60% Từ trên 6 tháng đến 1 năm 50% Từ trên 1 năm đến 2 năm 40% Từ trên 2 năm đến 3 năm 35% Từ trên 3 năm đến 5 năm 30% Từ trên 5 năm 20% Các loại thuế đó được trình bày trong Biểu thuế nhập khẩu. Hiện nay, trong Web site Hải Quan Việt Nam đã có biểu thuế nhập khẩu. Hình 6: Biểu thuế nhập khẩu trên Website Hải Quan Việt Nam Thuế suất của hàng hoá nhập khẩu được tính dựa vào công thức tính thuế cho hàng hoá nhập khẩu: Công thức tính thuế nhập khẩu Số thuế nhập khẩu phải nộp = Số lượng hàng hoá nhập X Đơn giá tính thuế x thuế suất nhập khẩu = Trị giá tính thuế x thuế suất nhập khẩu Sau khi tiếp nhận và đăng ký hồ sơ hải quan của người khai hải quan, công chức hải quan tiến hành kiểm tra hồ sơ hải quan, kiểm tra thực tế hàng hoá, phương tiện vận tải. Trong đó hồ sơ hải quan gồm có: Tờ khai hải quan Hoá đơn thương mại Hợp đồng mua bán hàng hoá Giấy phép của cơ quan nhà nước có thẩm quyền đối với hàng hoá xuất nhập khẩu, quá cảnh, phương tiện vận tải xuất nhập cảnh, nhập cảnh, quá cảnh, mà theo quy định của pháp luật phải có giấy phép. Các chứng từ khác theo quy định của pháp luật đối với từng mặt hàng mà người khai hải quan phải nộp hoặc xuất trình cho cơ quan hải quan. Khi đã xác minh được các giấy tờ thuộc hồ sơ hải quan là hợp lệ thì hàng hoá được tính thuế dựa vào biểu thuế nhập khẩu, giá tính thuế cho các đối tượng được hưởng thuế suất đặc biệt. 5.2 Sơ đồ phân rã chức năng Sau khi tiếp nhận hồ sơ hải quan, kiểm tra giấy tờ thuộc hồ sơ hải quan và kiểm tra thực tế hang hoá của người khai hải quan. Công chức hải quan tiến hành tìm kiếm trong biểu thuế những thuế tương ứng với hàng hóa đó. Rồi tính thuế nhập khẩu cho hàng hoá theo quy định. Ứng dụng có hai chức năng chính là từ hồ sơ hải quan và hàng tìm thuế suất cho hàng hoá trong biểu thuế, sau đó tính thuế cho hàng hoá. Tính thuế nhập khẩu Tiếp nhận và đăng ký hồ sơ hải quan Kiểm tra hồ sơ hải quan và phương tiện Đăng ký hồ sơ hải quan Tiếp nhận hồ sơ hải quan Kiểm tra phương tiện vận tải Kiểm tra thực tế hồ sơ hải quan Làm thuế Thu thuế Tính thuế Hình: Sơ đồ phân rã chức năng 5.3 Biểu đồ luồng dữ liệu Hồ sơ hải quan 3.0 Làm thuế Người khai hải quan 2.0 Kiểm tra hồ sơ và phương tiện 1.0 Tiếp nhập hồ sơ và phương tiện Hồ sơ hải quan Hàng hoá Hàng hoá Thông báo giầy tờ hợp lệ Thông báo giầy tờ không hợp lệ Phiếu thu thuế Hình: Biểu đồ luồng dữ liệu mức 0 Thông tin hàng hoá 3.1 Tìm thuế 3.2 Tính thuế Giá tính thuế Hàng hoá Biểu thuế D1 Giá tính thuế Tờ khai hải quan D2 Thuế đã tính Hình: Luồng dữ liệu mức 1 5.4 Thiết kế giao diện Hình7: Giao diện trước khi tìm kiếm Hình8: Giao diện sau khi tìm kiếm Chương 6: Kết quả Các thiết bị cầm tay đang ngày càng đi có những đột phá mới trong khả năng thâm nhập vào đời sống con người từ các ứng dụng về quản lý vật tư hang hoá , ứng dụng trong nha hang khách sạn, ứng dụng về đào tạo đến các ứng dụng giải trí như nghe nhạc xem phim.Tuy nhiên, các ứng dụng đó hầu hết phải kết nối với máy Server để có được dữ liệu mong muốn. Vậy với các ứng dụng có cơ sở dữ liệu nhỏ, việc kết nối với Server là không cần thiết. Trong quá trình nghiên cứu xây dựng cơ sở dữ liệu trên thiệt cầm tay chúng tôi đã ứng dụng vào xây dựng một cơ sở dữ liệu biểu thuế nhập khẩu làm mô hình mô phỏng. 6.1. Các chức năng chính của hệ thống đạt được Do tính đặc thù của hệ thống và phạm vi của đề tài: chúng tôi đã xây dựng được cơ sở dữ liệu trên thiết bị cầm tay và đưa ra chức năng chính của hệ thống là tìm kiếm và tính thuế cho hàng hoá nhập khẩu. 6.1.1. Giao diện cơ sở dữ liệu của hệ thống do WinCE quản lý Hình 9: Giao diện cơ sở dữ liệu của hệ thống do WinCE quản lý Hầu hết các ứng dụng cơ sở dữ liệu trên Destop cũng như thiết bị cầm tay, cơ sở dữ liệu đều có thể được nhập từ chính thiêt bị, những điều này là không khả thi với những dữ liệu lớn nhất là đối với những thiêt bị cầm tay như Pocket PC. Vì thế chúng tôi đã lưu cơ sở dữ liệu vào một file.txt với một định dạng đã quy định riêng. Khi chạy chương trình lần đầu, chương trình sẽ nạp dữ liệu từ file.txt này vào file database.db được lưu thường trú trên máy Pocket. 6.1.2. Giao diện trước khi tìm kiếm thuế H ình10: Giao diện trước khi tìm kiếm thuế. 6.1.3. Giao diện sau khi tìm kiếm thuế Hình11: Giao diện sau khi tìm kiếm thuế Ứng dựng sau khi chạy lần đầu sẽ lưu được cơ sở dữ liệu lên trên thiết bị, từ đó nhân viên Hải Quan có thể tra tìm thông tin về biểu thuế 6.2. Đánh giá kết quả đạt được Để đánh giá kết quả của hệ thống cần phải có một thời gian thử nghiệm lâu dài và chạy thử ở các trạm hải quan. Tuy nhiên với những kết quả đạt được ở trên thì hệ thống hoàn toàn có thể đáp ứng được những nhu cầu cơ bản của việc xây dựng cơ sở dữ liệu trên PocketPC do WinCE quản lý, tìm kiếm và tính thuế cho hàng hoá nhập khẩu. Hệ thống nhỏ gọn dễ sử dụng và được triển khai trên PocketPC hải quan có thể dễ dàng tìm kiếm và tính thuế cho hàng hoá nhập khẩu một cách hiệu quả và linh hoạt. Chương 7: Kết luận Trong khoá luận này chúng tôi đã giới thiệu những nét cơ bản về các thiết bị cầm tay và nghiên cứu về cấu trúc cơ sở dữ liệu được sử dụng trên các thiết bị này. Chúng tôi đã xây dựng được một ứng dụng nhỏ về cơ sở dữ liệu đựoc quản lý bởi windows CE hệ điều hành được sử dụng rộng rãi trên các thiết bị cầm tay ngày nay. Kết quả bước đầu đạt được là đã xây dựng được một ứng dụng nhỏ phục vụ cho nhân viên Hải Quan tra tìm biểu thuế trên thiết bị cầm tay mà cụ thể là Pocket PC. Các kết quả đạt được tuy còn rất hạn chế về chức năng, nhưng những chức năng đã đạt được cũng đủ để cho phép người học cũng như giáo viên có thể cùng tham gia thảo luận, trao đổi học tập và kiểm tra trình độ của người học. Đây là tiền đề để phát triển tiếp hệ thống. Ứng dụng của chúng tôi mới chỉ phục vụ được một số chức năng chính cho việc tìm biểu thuế. Hướng nghiên cứu tiếp theo chúng tôi sẽ là tiếp tục hoàn thiện những chức năng đã được phân tích, thiết kế nhằm tạo ra một hệ thống hoàn chình phục vụ cho nhân viên Hải Quan khi tác nghiệp ở bên ngoài không có hệ thống máy tính để bàn và Internet. Tài liệu tham khảo Tài liệu tiếng Anh: Advanced WindownsCe Application Programming ( Publisher: Macmillan Computer Publishing). Author(s): Jeff Baker. ISBN: 1578700051. Publication Date: 12/01/97. Tài liệu tiếng Việt: Nguyễn Văn Vỵ, Giáo trình phân tích thiết kế hệ thống thông tin, Đại Học Quốc Gia Hà Nội, 2004. Lê Quang Dũng - Truyền thông tin trong mạng không dây để phục vụ đào tạo điện tử thông qua các thiết bị cầm tay – Khoá luận tốt nghiệp Đại Học chính quy - Đại Học Công Nghệ Đại Học Quốc Gia Hà Nội. Website: http:// www.gorvernment.customs.vn.

Các file đính kèm theo tài liệu này:

  • docHệ thống xây dựng cơ sở dữ liệu biểu thuế trên WindowsCE và các chức năng tìm kiếm thuế.doc