Hiển thị các bài đăng có nhãn CSDL. Hiển thị tất cả bài đăng
Hiển thị các bài đăng có nhãn CSDL. Hiển thị tất cả bài đăng

Thứ Hai, 14 tháng 1, 2008

Tạo bản in trong VB6

Đó hỏi: Làm thế nào để tạo bản in trong VB6? Em đang viết chương trình quản lý điện thoại mà không biết tạo bản in. <840976931930@>

Đây trả lời: Để tạo bản in trong VB6, bạn có thể sử dụng công cụ Data Report có sẵn của VB6 hoặc công cụ của hãng khác như Crystal Report chẳng hạn (tính năng của Data Report không nhiều bằng Crystal Report). Ví dụ sau đây giúp bạn sử dụng dễ dàng Data Report để in danh sách khách hàng từ table Customers trong NWIND.MDB có sẵn ở thư mục C:\Program Files\Microsoft Visual Studio\VB98. Trong VB6, bạn tạo một project kiểu Standard EXE. Vì một report cần sử dụng dữ liệu từ một table nên bạn cần chọn Project > Add Data Environment để thêm đối tượng DataEnvironment có tên DataEnvironment1. (Nếu trên trình đơn Project không thấy mục Add Data Environment, bạn chọn Project > Components để mở hộp thoại Components, chọn thẻ Designers và chọn Data Environment.) Trong cửa sổ DataEnvironment, chọn đối tượng Connection1. Đây là đối tượng dùng để kết nối với một database Access (hoặc loại khác). Để kết nối, bấm-phải vào đối tượng Connection1, chọn Properties để mở hộp thoại Data Link properties: - Trong thẻ Provider chọn mục Microsoft Jet 4.0 OLE DB Provider. - Trong thẻ Connection gõ tên tập tin .MDB cần kết nối (với đầy đủ đường dẫn), hoặc bấm nút <…> để chọn. Bấm Test Connection để kiểm tra, nếu nhận được thông báo Test Connection Succeeded thì mới làm tiếp được. Bạn bấm OK để tạo kết nối (mở NWIND.MDB). Để mở một table đưa vào report, bạn phải tạo một Command thuộc kết nối Connection1: bấm-phải vào đối tượng Connection1, chọn Add Command để tạo đối tượng Command1. Bấm-phải vào đối tượng Command1, chọn Properties để mở hộp thoại Command1 Properties. Trong thẻ General, chọn Table trong danh sách Database Object, rồi chọn Customers trong danh sách Object Name. Hình 1 minh họa việc mở thành công table Customers.

Hình 1: Data Environment

Để thêm một Report, chọn Project > Add Data Report, một đối tượng DataReport1 được tạo ra như hình 2. Để quy định report này sử dụng table Customers, bạn đặt thuộc tính của DataReport1 như sau: DataSourceDataEnvironment1; DataMember Command1. Trên hộp công cụ DataReport bên trái, bạn có thể sử dụng công cụ RptLabel để vẽ các label (như “DANH SACH KHACH HANG” trong hình 2), RptTextBox để vẽ các text box dùng hiển thị dữ liệu từ một field trong table. Trong ví dụ này, bạn vẽ một text box để in nội dung field ContactName bằng cách đặt thuộc tính của text box như sau: DataMemberCommand1; DataFieldContactName.

Hình 2: Đối tượng Data Report

Ngoài ra, công cụ RptImage dùng để đặt một hình ảnh lên report, công cụ RptLine dùng để vẽ các đường kẻ, công cụ RptShape dùng để vẽ các hình (hình chữ nhật, tròn, tam giác,...), công cụ RptFunction dùng để đặt các hàm tính toán (như Sum, Count, AVG, Min, Max,...) vào cuối report (phần Report Footer). Sau khi thiết kế xong report, để in report ra giấy, bạn dùng các lệnh:

‘ Có hiển thị hộp thoại chọn thông số máy in DataReport1.PrintReport True ‘ Không hiển thị hộp thoại chọn thông số máy in DataReport1.PrintReport False Để hiển thị report lên màn hình, bạn dùng lệnh: DataReport1.Show

Kiểm tra nhập liệu trong Visual Foxpro

Kiểm tra nhập liệu trong Visual Foxpro

Đó hỏi: Trong Visual Foxpro em đang thiết kế form để nhập liệu. Cần viết câu lệnh gì để chương trình hiển thị thông báo lỗi khi xảy ra trường hợp trùng khóa chính do lỗi nhập liệu?

Đây trả lời: Để bạn tham khảo, tôi trình bày một phương pháp đơn giản, sử dụng những gì có sẵn của Visual Foxpro (VFP). Giả sử bạn cần thiết kế form để nhập liệu cho tập tin KH_Code.DBF. Tập tin này có field Ma_KH được xem là khóa chính. Trong VFP, bạn chọn Tools > Wizards > Form. Trong hộp thoại Wizard selection, chọn mục Form wizard, bấm OK. Trong hộp thoại Step 1 – Select Fields, chọn Free Tables ở mục Databases and tables, bấm nút […] để mở bảng KH_Code. Bạn chọn các field (trong danh sách Available Fields) cần hiển thị trên form (ví dụ: Ma_KH và Ten_KH) bằng cách bấm kép vào tên field. Bấm Next để chuyển sang hộp thoại kế tiếp. Trong hộp thoại này, bạn lại bấm Next để chấp nhận kiểu form mặc định và chuyển sang hộp thoại kế tiếp. Tiếp tục bấm Next để chuyển sang hộp thoại Finish. Trong hộp thoại này, chọn Save form and modify it in the Form Designer, rồi bấm Finish để lưu form và mở form để sửa đổi (hình 1). Form vừa tạo có nhóm các nút lệnh do chính VFP tạo ra, nên thủ tục xử lý các tình huống Click của chúng đều được mặc định. Chọn View > Data Environment. Trong cửa sổ Data Environment (hình 2), bấm kép vào vùng trống để mở cửa sổ soạn thảo mã lệnh cho Data Environment, lần lượt gõ vào thủ tục xử lý tình huống OpenTables (đoạn mã 1) và CloseTables (đoạn mã 2) của DataEnvironment. Tiếp theo, bấm kép vào nhóm các nút lệnh để mở cửa sổ soạn thảo mã lệnh cho form. Sử dụng combo box Object và Procedure để gõ vào thủ tục xử lý tình huống Click của nút lệnh cmdAdd (đoạn mã 3) và nút lệnh cmdDelete (đoạn mã 4).

Đoạn mã 1

SELECT 0 ‘ Tạo danh sách các mã khách hàng có rồi CREATE CURSOR curListKH (Ma_KH C(7)) INDEX ON Ma_KH TAG Ma_KH APPEND FROM D:\VisualFoxpro9\KiemTraNhapTrungKhoaChinh\KH_Code.DBF

Đoạn mã 2

IF USED("curListKH") ‘ Xóa danh sách trước khi kết thúc USE IN curListKH ENDIF

Đoạn mã 3

IF "Save"$ This.Caption ‘ Vì nút lệnh Add và Save sử dụng chung IF SEEK(ThisForm.MA_KH1.Value, "curListKH") =MESSAGEBOX("Ma KH co roi!",0+16) ThisForm.MA_KH1.SetFocus ‘ Ma_KH1 là text box nhận dữ liệu cho Ma_KH RETURN ENDIF SELECT curListKH APPEND BLANK ‘ Thêm mã khách hàng vào danh sách tra cứu REPLACE Ma_KH WITH ThisForm.MA_KH1.Value SELECT KH_Code ENDIF =DODEFAULT() ‘ Thực thi mã lệnh mặc định của nút lệnh

Đoạn mã 4

SELECT curListKH SEEK ThisForm.MA_KH1.Value DELETE ‘ Xóa mã khách hàng khỏi danh sách tra cứu SELECT KH_Code =DODEFAULT() ‘ Thực thi mã lệnh mặc định của nút lệnh

Hình 1: Form cần thiết kế

Hình 2: Cửa sổ Data Environment

Tạo bảng Access bằng VB6

Đó hỏi: Xin e-CHÍP hướng dẫn cách viết mã VB6 để kiểm tra xem một bảng nào đó đã có trong cơ sở dữ liệu Access hay chưa và tạo bảng mới dựa trên cấu trúc bảng đã có.

Đây trả lời: Trong VB6, bạn hãy tạo một project mới kiểu Standard EXE. Bạn chọn Project > References để thêm reference Microsoft DAO 3.6 Object Library (hoặc phiên bản mới nhất) vào project. Giả sử trong cùng thư mục chứa ứng dụng này có một database mang tên ViDu.MDB, trong đó có một table mang tên tbCauTrucCoSan và table này có thể có hoặc không có record. Ta sẽ tạo một table mới có tên tbNew từ cấu trúc table tbCauTrucCoSan. Có thể sử dụng đối tượng TableDef để khai báo cấu trúc, nhưng viết mã lệnh hơi rối rắm, dài dòng. Ví dụ này dựa trên một cách làm đơn giản: dùng SQL để tạo một table tbNew từ table tbCauTrucCoSan, rồi xóa các record (nếu có) trong table tbNew. Trên form mặc định Form1, bạn vẽ một nút lệnh có tên cmdCheckCreateTable, rồi gõ đoạn mã 1 vào form. Bạn nên nhập một số record vào table tbCauTrucCoSan để kiểm tra cả hai trường hợp: có hoặc không có record. Sau khi tạo tbNew, bạn thử tạo lần nữa để kiểm tra hàm lTableCoRoi().

Đoạn mã 1

Dim dbViDu As Database ' Khai báo đối tượng Database mới Private Sub cmdCheckCreateTable_Click() Set wrkDefault = DBEngine.Workspaces(0) Set dbViDu = OpenDatabase(App.Path & "\ViDu.mdb") If lTableCoRoi("tbNew") Then MsgBox "Table tbNew có rồi!" Exit Sub End If sSQL = "SELECT * INTO tbNew FROM tbCauTrucCoSan;" dbViDu.Execute (sSQL) ‘ Tạo table mới sSQL = "DELETE * FROM tbNew;" dbViDu.Execute (sSQL) ‘ Hủy các record, nếu có dbViDu.Close End Sub Function lTableCoRoi(sTenTable As String) As Boolean Dim i As Integer lTableCoRoi = False For i = 0 To dbViDu.TableDefs.Count - 1 If UCase(dbViDu.TableDefs(i).Name) = UCase(sTenTable) Then lTableCoRoi = True Exit For End If Next End Function

Tạo chương trình "quay số" bằng Access

Tạo chương trình "quay số" bằng Access

Đó hỏi: Trong Access em muốn tạo chương trình "quay số". Nghĩa là khi bấm nút "Bắt đầu", dãy số gồm 5 chữ số chạy hỗn loạn; bấm nút "Kết quả" thì đưa ra dãy số gồm 5 chữ số ngẫu nhiên từ những chữ số "hỗn loạn" đó. Xin quý báo giúp em!

Đây trả lời: Có 2 vấn đề cần giải quyết: • Để tạo hiệu ứng chữ số chạy hỗn loạn, bạn chỉ cần thay đổi liên tục trị của chữ số theo một chu kỳ khoảng 5% giây (hoặc ít hơn tùy bạn). Do vậy, trên form Access, bạn phải sử dụng thuộc tính TimerInterval và thủ tục xử lý tình huống On Timer. • Để tạo trị số ngẫu nhiên của một số nguyên trong khoảng từ M đến N, bạn sử dụng hàm Randomize và công thức: Int((N * Rnd()) + M). Ví dụ, bạn tạo form tương tự như hình 1, gồm 5 text box có tên lần lượt (theo thứ tự từ trái sang phải): txtSo1, txtSo2, txtSo3, txtSo4, txtSo5 (có thuộc tính Locked = Yes, để người sử dụng không thay đổi được trị của số, bảo đảm tính trung thực của kết quả) và 2 nút lệnh có tên cmdBatDau và cmdKetQua. Xong, bạn gõ vào đoạn mã 1. Bạn có thể "chế biến" thêm để khi bấm nút "Kết quả", các số từ từ dừng lại (bằng cách tăng dần trị số của thuộc tính TimerInterval và đạt trị bằng 0 khi muốn số dừng lại ở kết quả cuối cùng).

Đoạn mã 1

Private Sub cmdBatDau_Click() Me.TimerInterval = 50 Randomize ' Khởi động bộ tạo số ngẫu nhiên End Sub Private Sub cmdKetQua_Click() Me.TimerInterval = 0 End Sub Private Sub Form_Timer() ‘ Tạo số ngẫu nhiên từ 0 đến 9 txtSo1 = Int((9 * Rnd()) + 0) txtSo2 = Int((9 * Rnd()) + 0) txtSo3 = Int((9 * Rnd()) + 0) txtSo4 = Int((9 * Rnd()) + 0) txtSo5 = Int((9 * Rnd()) + 0) End Sub

Hình 1: Form cần thiết kế

Thứ Bảy, 20 tháng 10, 2007

Lập trình bảo mật cơ sở dữ liệu Access

Hầu như ai mần một ứng dụng Microsoft Access cũng xài một trong những (hoặc tất cả) cách sau để bảo vệ cơ sở dữ liệu (CSDL), hòng khóa tay, khóa chân những nhân viên tò mò, thích quậy:

1. Bảo vệ mã lệnh VBA (Visual Basic for Application) bằng cách chọn mục Properties trên trình đơn Tools của cửa sổ soạn thảo Microsoft Visual Basic rồi chọn trang Protection trên hộp thoại Project Properties. Cuối cùng, chọn Lock project for viewing, kèm theo là mật khẩu bảo vệ. Với cách này, cấu trúc và dữ liệu các bảng (table) vẫn có thể được xem và sửa đổi.

2. Dùng chức năng Make MDE file để ngăn không cho sửa đổi mã lệnh, thiết kế biểu mẫu (form) và thiết kế báo biểu (report). Với cách này, cấu trúc và dữ liệu các bảng (table) vẫn có thể được lấy đi để chuyển vào tập tin .MDB khác mà xem và sửa đổi.

3. Dùng chức năng Encrypt / Decrypt database… để mã hóa CSDL, ngăn không cho các chương trình tiện ích hay xử lý văn bản giải mã nhưng vẫn có thể dùng Access để mở.

4. Dùng chức năng Set database password để quy định mật khẩu cho CSDL. Cách này hơi phiền nếu có một bảng trong CSDL khác liên kết (link) với nó. Nếu quên mật khẩu thì … khóc luôn chứ sao!

5. Thiết kế một biểu mẫu khởi động, trong đó yêu cầu cho biết tên và mật khẩu, dùng hộp thoại Startup (từ danh sách Display Form/Page) để quy định phải mở biểu mẫu này trước tiên mỗi lần mở CSDL. Nhờ cách này, ta có thể giấu luôn cửa sổ Database, nơi có thể xem và chọn các thành phần của CSDL để sửa chữa.

Trong những cách trên, cách thứ 5 vẫn có thể bị vượt qua bằng cách nhấn và giữ phím Shift trong lúc mở CSDL. Để khắc phục, ta có thể dùng Visual Basic gán trị False cho thuộc tính AllowBypassKey để vô hiệu hóa phím Shift khi mở CSDL.

Giả sử bạn có một CSDL tên dbLock.MDB. Mỗi lần người ta mở nó, bạn muốn biểu mẫu frmKhoiDong luôn được hiển thị trước tiên bằng cách xác định Display Form/PagefrmKhoiDong. Để thay đổi thuộc tính AllowBypassKey, bắt buộc phải mở CSDL, gán trị mới cho thuộc tính này, đóng CSDL lại thì lần mở sau mới có ép-phê. Bạn nhớ, cần khóa làm sao để người ta không mở được mà mình mở được, nghĩa là ta phải có chìa khóa để mở. Chìa ở đây chính là một biểu mẫu khác, chẳng hạn có tên là frmChiaKhoa.

Khi đã thay đổi thuộc tính AllowBypassKey được rồi, chắc chắn biểu mẫu frmKhoiDong được hiển thị khi mở CSDL. Cho nên ta đặt chìa khóa thông qua biểu mẫu này bằng cách vẽ một ô điều khiển nào đấy (miễn sao nó có thủ tục xử lý tình huống Click là được), chẳng hạn nhãn lblChiaKhoa, rồi đặt thuộc tính VisibleNo và thêm dòng lệnh DoCmd.OpenForm “frmChiaKhoa” vào thủ tục xử lý tình huống Click. Bạn phải nhớ vị trí nhãn lblChiaKhoa để lôi chìa khóa ra nhé. Như vậy, vấn đề còn lại nằm ở biểu mẫu frmChiaKhoa.

Bạn mở cửa sổ soạn thảo Microsoft Visual Basic, chọn mục References… để bảo đảm Microsoft DAO xx.xx Object Library (trong đó, phiên bản xx.xx có thể là: 2.5 hoặc 3.51 hoặc 3.6 tùy theo phiên bản Access, dĩ nhiên nên chọn phiên bản mới nhất) đã được chọn trong danh sách Available References.

Hình 1: Biểu mẫu cần thiết kế

Hình 1 là biểu mẫu frmChiaKhoa cần thiết kế, bao gồm một ô văn bản txtPassword để nhận mật khẩu mà người cần mở khóa phải gõ vào, một nút lệnh cmdLock thực hiện việc khóa CSDL và một nút lệnh cmdUnlock thực hiện việc mở khóa CSDL. Xong, bạn gõ các thủ tục xử lý như đoạn mã 1. Trước khi quậy chuyện này trên một CSDL, bạn nên sao chép phòng hờ CSDL để tránh sự cố khóa được rồi nhưng không mở được (do bạn gõ nhầm các dòng lệnh).

Đoạn mã 1

'Hàm ChangeProperty thay đổi các thuộc tính của CSDL

Function ChangeProperty(strPropName, varPropType, varPropValue)

Dim dbs As Database, prp As Property

Const conPropNotFoundError = 3270

Set dbs = CurrentDb

On Error GoTo Change_XuLyLoi

dbs.Properties(strPropName) = varPropValue

ChangeProperty = True

Change_KetThuc:

Exit Function

Change_XuLyLoi:

'Thuộc tính không thấy

If Err = conPropNotFoundError Then

Set prp = dbs.CreateProperty(strPropName, _

varPropType, varPropValue)

dbs.Properties.Append prp

Resume Next

Else

'Không biết lỗi gì

ChangeProperty = False

Resume Change_KetThuc

End If

End Function

'Xử lý tình huống chọn nút [Khóa database]

Private Sub cmdLock_Click()

‘Biểu mẫu này được nạp trước

ChangeProperty "StartupForm", dbText, "frmKhoiDong"

ChangeProperty "StartupShowDBWindow", dbBoolean, False

ChangeProperty "StartupShowStatusBar", dbBoolean, False

ChangeProperty "AllowBuiltinToolbars", dbBoolean, False

ChangeProperty "AllowFullMenus", dbBoolean, False

ChangeProperty "AllowBreakIntoCode", dbBoolean, False

ChangeProperty "AllowSpecialKeys", dbBoolean, False

‘Không cho xài phím Shift để bỏ qua biểu mẫu frmKhoiDong

ChangeProperty "AllowBypassKey", dbBoolean, False

MsgBox "Cơ sở dữ liệu đã được khóa! Đóng cơ sở dữ liệu, _

rồi mở lại mới có ép-phê.", vbOKOnly, "eChip Security"

cmdExit.SetFocus

cmdUnlock.Visible = True

cmdLock.Visible = False

End Sub

'Xử lý tình huống chọn nút [Mở database]

Private Sub cmdUnlock_Click()

‘Không cần biểu mẫu khởi động nữa

ChangeProperty "StartupForm", dbText, ""

ChangeProperty "StartupShowDBWindow", dbBoolean, True

ChangeProperty "StartupShowStatusBar", dbBoolean, True

ChangeProperty "AllowBuiltinToolbars", dbBoolean, True

ChangeProperty "AllowFullMenus", dbBoolean, True

ChangeProperty "AllowBreakIntoCode", dbBoolean, True

ChangeProperty "AllowSpecialKeys", dbBoolean, True

ChangeProperty "AllowBypassKey", dbBoolean, True

MsgBox "Cơ sở dữ liệu đã được mở khóa ! _

Đóng cơ sở dữ liệu, rồi mở lại mới có ép-phê.", _

vbOKOnly, "eChip Security"

cmdExit.SetFocus

txtPassword = ""

cmdLock.Visible = True

cmdUnlock.Visible = False

txtPassword.Visible = False

End Sub

'Xử lý tình huống khi mở biểu mẫu

Private Sub Form_Open(Cancel As Integer)

Dim dbs As Database

Set dbs = CurrentDb

On Error GoTo KhongCoThuocTinh_Err

If dbs.Properties("AllowBypassKey") Then

cmdLock.Visible = True

txtPassword.Visible = False

Else

cmdLock.Visible = False

txtPassword.Visible = True

End If

Exit Sub

KhongCoThuocTinh_Err:

cmdLock.Visible = True

txtPassword.Visible = False

End Sub

'Khi người ta gõ mật khẩu và nhấn phím Enter

Private Sub txtPassword_LostFocus()

If txtPassword = "echip" Then

cmdUnlock.Visible = True

End If

End Sub