Làm form chỉ cho nhập không cho sửa, xoá

  • Thread starter chihienphuco
  • Ngày gửi
C

chihienphuco

Trung cấp
20/4/09
109
1
0
Bình Chánh
#1
Mấy lão huynh chỉ giáo cách nào để tạo form cho nhập phiếu mới, mà không cho sửa, xoá?
Mong giúp đở!
 
C

chihienphuco

Trung cấp
20/4/09
109
1
0
Bình Chánh
#4
Sẳn đây bạn Spammail chỉ dùm, có cách nào dấu cái thùng database mà khi nhấn unhide trên tool Window cũng ko hiện ra? Chỉ khi tự mình thao tác mới mở ra để thiết kế.
 
C

chihienphuco

Trung cấp
20/4/09
109
1
0
Bình Chánh
#5
Sưu tầm được cái này, nhưng mục cuối cùng, tốt nhưng phức tạp quá.
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/Page là frmKhoiDong. Để 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 Visible là No 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, ê.", vbOKOnly, " 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,.", _
vbOKOnly, " 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
 
S

spammail

Sơ cấp
#6
OK.Vào menu Tools-> Start Up bỏ chọn hết các mục ở trong đó. Khi muốn hiện lại cửa sổ database thì lúc mở file Access thì đồng thời giữ phím Shift là ra.
Còn nếu muốn vô hiệu hoá phím Shift k cho người dùng nhấn phím Shift và vào cửa sổ database thì cũng có cách luôn. Nhưng mình nghĩ bạn chỉ cần đến đây là đủ rồi nhỉ. :036:
 
Thích: TrangTrang11
T

tung1999

Sơ cấp
9/2/09
41
0
0
can gio
#9
OK.Vào menu Tools-> Start Up bỏ chọn hết các mục ở trong đó. Khi muốn hiện lại cửa sổ database thì lúc mở file Access thì đồng thời giữ phím Shift là ra.
Còn nếu muốn vô hiệu hoá phím Shift k cho người dùng nhấn phím Shift và vào cửa sổ database thì cũng có cách luôn. Nhưng mình nghĩ bạn chỉ cần đến đây là đủ rồi nhỉ. :036:
Mình đã làm rồi, khoá phím shift luôn nhưng vẫn có thể bị mở trong trường hợp người phá phách biết được đường dẫn của file chương trình và gõ đường dẫn vào đoạn code mở khoá (như đoạn code của bạn chihienphuco sưu tầm)
Không biết còn diệu kế nào nữa không, các cao thủ cùng góp ý xem bởi vì nếu chương trình chỉ có mình và 1 vài người sử dụng thì không sao chứ đem ứng dụng rộng rãi trong cơ quan lớn nhiều người thì coi chừng cũng có 1 vài kẻ rất quỉ kế đa đoan.
Làm sao đề phòng đây?
 
C

chihienphuco

Trung cấp
20/4/09
109
1
0
Bình Chánh
#10
Mình đã làm rồi, khoá phím shift luôn nhưng vẫn có thể bị mở trong trường hợp người phá phách biết được đường dẫn của file chương trình và gõ đường dẫn vào đoạn code mở khoá (như đoạn code của bạn chihienphuco sưu tầm)
Không biết còn diệu kế nào nữa không, các cao thủ cùng góp ý xem bởi vì nếu chương trình chỉ có mình và 1 vài người sử dụng thì không sao chứ đem ứng dụng rộng rãi trong cơ quan lớn nhiều người thì coi chừng cũng có 1 vài kẻ rất quỉ kế đa đoan.
Làm sao đề phòng đây?
Xưa nay xây dựng phòng thủ thì khó phá nó thì dễ. Thôi thì hên xui, tốt nhất cho nghĩ mấy IT cao thủ trong công ty vừa phòng nó phá vừa ko bị cạnh tranh. Tuyển mấy em mới ra trường về đào tạo, phỏng vấn phải xem mấy tấm bằng gặp IT cao chút thì :004:
Đùa thôi, ăn thua mình phân công nhập liệu, và mỗi ngày phải export bản cân đối ra excel để theo dõi cho chắc. Tạo form pass đăng nhập cho mỗi cá nhân.
 
C

chihienphuco

Trung cấp
20/4/09
109
1
0
Bình Chánh
#11
Tại cửa sổ properties của Form. Set thuộc tính:
+ Allow Edits: No.
+ Allow Deletions: No
+ Allow Additions: Yes.
Làm như trên cho mainform, thì subform nó ko hiện record khi thêm mới.

Spammail nhờ bạn giúp dùm, thanks!
 
C

chihienphuco

Trung cấp
20/4/09
109
1
0
Bình Chánh
#12
Tại cửa sổ properties của Form. Set thuộc tính:
+ Allow Edits: No.
+ Allow Deletions: No
+ Allow Additions: Yes.
Làm như trên cho mainform, thì subform nó ko hiện record nhập liệu. Khi nhấn nút thêm mới.

Spammail nhờ bạn giúp dùm, thanks!
 
S

spammail

Sơ cấp
#13
Bạn thử set các thuộc tính đó cho Subform còn mainform thì bạn dùng sự kiện Form_Load() thử xem sao:

Lưu ý: Bạn đừng set các thuộc tính đó cho Mainform.

Mã:
Private Sub Form_Load()
 Dim frm As Form
  For Each frm In Forms
    With frm
            .AllowAdditions = True
            .AllowDeletions = False
            .AllowEdits = False
    
     End With
  Next frm
End Sub
 
C

chihienphuco

Trung cấp
20/4/09
109
1
0
Bình Chánh
#14
Bạn thử set các thuộc tính đó cho Subform còn mainform thì bạn dùng sự kiện Form_Load() thử xem sao:

Lưu ý: Bạn đừng set các thuộc tính đó cho Mainform.

Mã:
Private Sub Form_Load()
 Dim frm As Form
  For Each frm In Forms
    With frm
            .AllowAdditions = True
            .AllowDeletions = False
            .AllowEdits = False
    
     End With
  Next frm
End Sub
Nó chịu rồi, cám ơn Spammail nhiều lắm!
 
T

tung dung

Sơ cấp
20/4/09
18
0
0
TP.HCM
#15
Bạn có thể dùng cách nầy:
trong mục Properties,Set Data Entry=Yes,các khoản khác đều bình thường,Subform cũng vậy
 
T

tung dung

Sơ cấp
20/4/09
18
0
0
TP.HCM
#16
còn về khoản dấu thùng Database thì nên để riêng ở 1 .mdb khác,đặt Password(Access)dùng Link
 
Đ

ĐỖ SƠN HẢI

Thành viên thân thiết
10/10/06
130
0
0
40
Phan Thiết
#17
Gửi chihienphuco

Ban cung cấp nhiều kiến thức thật tuyệt, trở lại vấn đề bảo mật database. Thực ra bạn sử dụng doan code :

Private Sub d4_Click()

ChangeProperty "StartupShowDBWindow", dbBoolean, False
ChangeProperty "StartupShowStatusBar", dbBoolean, False
ChangeProperty "AllowBuiltinToolbars", dbBoolean, False
ChangeProperty "AllowFullMenus", dbBoolean, False
ChangeProperty "AllowBreakIntoCode", dbBoolean, False
ChangeProperty "AllowSpecialKeys", dbBoolean, False

'khoa phim shift khi khoi dong
ChangeProperty "AllowBypassKey", dbBoolean, False

End Sub

Dã khoá thủ tục nhấn phím shift khi khởi động vào chương trình rồi. dat password cho code thì ổn
Tuy nhiêm mình vẫn không khoá được khi link vào dữ liệu từ một file dbf khác
Vậy có cách nào khắc phục nhược điểm này không ?
 
C

chihienphuco

Trung cấp
20/4/09
109
1
0
Bình Chánh
#18
Bạn thử set các thuộc tính đó cho Subform còn mainform thì bạn dùng sự kiện Form_Load() thử xem sao:

Lưu ý: Bạn đừng set các thuộc tính đó cho Mainform.

Mã:
Private Sub Form_Load()
 Dim frm As Form
  For Each frm In Forms
    With frm
            .AllowAdditions = True
            .AllowDeletions = False
            .AllowEdits = False
    
     End With
  Next frm
End Sub
Ấy chết khóa được những phiếu đã nhập xong ở mainform, nhưng người ta có thể thêm record vào subform. Còn cách nào không Spammail ui?
 
C

chihienphuco

Trung cấp
20/4/09
109
1
0
Bình Chánh
#20
Ý của bạn mình k hiểu :wall:. Có phải bạn muốn k xoá,k sửa và chỉ thêm ở trên Mainform còn Subform thì k được thao tác gì? :a_ok_u:
Ý mình không cho sửa, xoá, hoặc thêm mới những phiếu đã nhập rồi mà chỉ có thể nhấn lui tới để xem. Khi nhấn nút thêm hoá đơn thì cập nhật bình thường.
( Ở formsub do nó thuộc dạng Continuous Forms nên có cột thêm mới phía sau mặt định, nên người ta thêm vẫn bình thường ) rắt rối chổ này.

Mình đang tính thiết kế lại form bỏ hết các nút lui tới để xem, và khi nhấn nút mở form sẻ thêm mới hoá đơn. Còn muốn xem lại thì vào form khác thiết kế chỉ cho xem. ( Thế này chắc ăn nhưng không chuyên nghiệp lắm ) :wall:
 

Thành viên trực tuyến

Không có thành viên trực tuyến.

Xem nhiều