Cùng mổ xẻ chương trình mẫu VDP

behattieu

Member
Hội viên mới
Đây là một chương trình quản lý của bác Dang Dinh Ngoc ben dien dan excel. Em thấy nó rất hay, nhiều thủ thuật nhưng cũng khá là phức tạp.
Để hiểu kỹ về chương trình hơn em up lên và đề nghị các bác cùng tham khảo, phân tích các chức năng và giải thuật trong chương trình.
Vì trong chương trình có hơi nhiều data nên hơi nặng (bác nào có thể remove bớt một ít dữ liệu mà không làm ảnh hưởng đến cấu trúc của chương trình thì tốt để anh em tiện download về).
Một vài kỹ thuật được sử dụng trong chương trình
1. Tạo menu bằng VBA
2. Nén file
3. Mã hóa
4. Tree note
.....
Đề xuất:
Chúng ta sẽ cắn xén chỉ lấy ra những phần có tác động đến từng module được nghiên cứu. Ví dụ nếu nghiên cứu về menu thì các bác bỏ bớt đi những form, report hay các thứ khác không liên quan đến việc tạo menu.
http://www.zshare.net/download/18431842c3b0f71f/
Nào, xin mời các bác
 
Ðề: Cùng mổ xẻ chương trình mẫu VDP

Tạo menu:
tìm đến cái sub CreateMenubar() để thấy nó đọc từ table ra: "Select * from SysMenu where MenubarName= ..."
để tạo ra menu.

Nén file, mã hoá:
Dùng thư viện zip32.dll và unzip32.dll và lấy y sì mấy trang mdl_zips, CGZipfiles, CGUnZipfiles mà dùng.

Tree note:
Không hiểu behattieu nói về cái gì.

Sơ bộ là thế. Chán ba cái vụ mã hoá nên không có hứng xem kỹ.
 
Ðề: Cùng mổ xẻ chương trình mẫu VDP

BÁc ơi chỉ riêng 1 mình cái Sub CreateMenubar() không tạo nên menu bar. Bên cạnh đó cái này nó còn có thể phân quyền theo các mức độ người dùng, sử dụng được menu cho 2 ngôn ngữ Anh_Việt.
Có 1 vấn đề ngoài khả năng của em là việc đưa các Icon vào trước các đề mục của menu, cái này hơi khó khi dùng VBA
Sâu hơn nữa cái naỳ còn có các công thức và sử dụng Flexgrid để hiện thị và lập công thức tính toán.
THực sự nếu để chương trình với nhiều chức năng lẫn lôn như trên việc học hỏi là hơi khó, nếu tách biệt được các chức năng thành các chủ đề con thì ta sẽ dễ học hỏi hơn lại có thể dùng làm temp cho các ứng dụng phát triển sau này
 
Ðề: Cùng mổ xẻ chương trình mẫu VDP

BÁc ơi chỉ riêng 1 mình cái Sub CreateMenubar() không tạo nên menu bar. Bên cạnh đó cái này nó còn có thể phân quyền theo các mức độ người dùng, sử dụng được menu cho 2 ngôn ngữ Anh_Việt.
Có 1 vấn đề ngoài khả năng của em là việc đưa các Icon vào trước các đề mục của menu, cái này hơi khó khi dùng VBA
Sâu hơn nữa cái naỳ còn có các công thức và sử dụng Flexgrid để hiện thị và lập công thức tính toán.
THực sự nếu để chương trình với nhiều chức năng lẫn lôn như trên việc học hỏi là hơi khó, nếu tách biệt được các chức năng thành các chủ đề con thì ta sẽ dễ học hỏi hơn lại có thể dùng làm temp cho các ứng dụng phát triển sau này


Theo tôi thì không nên copy của người ta. Vì code của người ta nhìn vào như 1 đám rừng. Chỉ nên chạy thử để quan sát các tính năng.
Tự làm cái khác sẽ dễ hơn là sửa code của người khác.

======
Giải quyết từ từ từng vấn đề.

LÀM TOOLBAR:

Ở bước đầu tiên, để làm quen với thao tác, hãy làm đúng theo các bước sau:

Mở 1 form mới.
  1. Chuyển sang cửa sổ VB code.
  2. Chọn trên menu "Tools / References"
  3. Chọn Microsoft Office 11.0 Object Libary. <-- verson 11.0 là của Office 2003
  4. Trong sub Form_load() gõ vào đoạn code mẫu sau:
Private Sub Form_Load()
'truoc khi dung office object libary hay nho phai khai bao link bang cach:
'Trong cua so VB code chon tren menu "Tools / References"
'Chon "Microsoft Office 11.0 Object Libary".
Dim cmb As CommandBar
Dim cbc As Office.CommandBarButton
Dim picPicture As IPictureDisp
'neu MyCommandBar da co thi khi Add them se gay loi
'vi vay ta xoa neu no da co truoc roi
For Each cbar In CommandBars
If cbar.Name = "MyCommandBar" Then
cbar.Delete
End If
Next
'khai bao picture kem theo button
'nho chon anh kieu .bmp va kich co nho nho thoi nha
Set picPicture = stdole.StdFunctions.LoadPicture( "D:-/danketoan\img\logo1.bmp")
'Tao va cho hien thi 1 cai toolbar (se di chung voi form)
Set cmb = Application.CommandBars.Add("MyCommandBar")
cmb.Visible = True
'them 1 nut vao cai toolbar vua tao ra
Set cbc = cmb.Controls.Add(msoControlButton)
cbc.Caption = "Button1"
cbc.Style = msoButtonIconAndCaption
cbc.Picture = picPicture
CommandBars("MyCommandBar").Controls( "Button1").OnAction = "=MsgBox(""Wow!"")"
'them 1 nut nua
Set picPicture = stdole.StdFunctions.LoadPicture( "D:-/danketoan\img\logo2.bmp")
Set cbc = cmb.Controls.Add(msoControlButton)
cbc.Caption = "Button2"
cbc.Style = msoButtonIconAndCaption
cbc.Picture = picPicture
CommandBars("MyCommandBar").Controls( "Button2").OnAction = "=MsgBox(""hoh!"")"

End Sub

Buớc đầu như thế.
Các tính năng khác bạn hãy nhấn F1 để biết thêm chi tiết.
Menu Bar cũng có cùng cách khai báo button control như thế.
 
Sửa lần cuối:
Ðề: Cùng mổ xẻ chương trình mẫu VDP

Em thấy như thế hay đấy. Nhất là mô tả cụ thể kể cả những cái này
Chọn trên menu "Tools / References"
Chọn Microsoft Office 11.0 Object Libary. <-- verson 11.0 là của Office 2003

Mọi người xem thế này dễ học hơn và có hệ thống hơn.
PS; Nếu có thể bác xây dựng từng sample rồi up lên. Em thấy trang
http://www.zshare.net
cho up mà không cần đăng ký lại nhanh nữa. Nếu có ví dụ anh em se hiểu nhanh hơn.
Thanks
-----------------------------------------------------------------------------------------
Em vừa test thử rồi. Có 2 vấn đề
1. Cái menubar nó chư nằm ở trên cùng của thanh
2. Nếu có thể dùng câu lệnh truy vấn từ table thì tốt hơn vì dựa vào đó để phân quyền cho người dùng
Kết nhất cái LoadPicture
-----------------------------------------------------------------------------------------
Cho thêm cái này để menu chạy lên đầu

Private Sub Form_Load()
.....
CommandBars("MyCommandBar").Position = msoBarTop
End Sub
-----------------------------------------------------------------------------------------
Làm sao để tạo menu con trên các menu cha đó hả bác?
 
Sửa lần cuối:
Ðề: Cùng mổ xẻ chương trình mẫu VDP

LÀM MENU:

Ở phần trước ta đã tạo được 1 cái toolbar.
Dĩ nhiên cái toolbar đó sẽ nằm ở vị trí của toolbar.
Bây giờ để đẩy nó lên nằm ở vị trí của menu thì ta chỉ việc khai báo cái toolbar (Commanbar) đó có kiểu là menu.
Việc đó được thực hiện khi ta khởi tạo nó:
Hãy sử dụng lại đoạn code làm toolbar cũ, ở dòng
Set cmb = Application.CommandBars.Add("MyCommandBar")
cmb.Visible = True
Sửa lại thành ra là:
Set cmb = Application.CommandBars.Add("MyCommandBar", , True, True)

Và ở đoạn cuối của sub, để ra lệnh dùng menu của ta thay thế cho menu hệ thống của Access, gõ vào dòng lệnh:
Me.MenuBar = "MyCommandBar"

OK. Như vậy đoạn code hôm trước được sửa thành:
Private Sub Form_Load()
'truoc khi dung office object libary hay nho phai khai bao link bang cach:
'Trong cua so VB code chon tren menu "Tools / References"
'Chon "Microsoft Office 11.0 Object Libary".
Dim cmb As CommandBar
Dim cbc As Office.CommandBarButton
Dim picPicture As IPictureDisp
'neu MyCommandBar da co thi khi Add them se gay loi
'vi vay ta xoa neu no da co truoc roi
For Each cbar In CommandBars
If cbar.Name = "MyCommandBar" Then
cbar.Delete
End If
Next
'khai bao picture kem theo button
'nho chon anh kieu .bmp va kich co nho nho thoi nha
Set picPicture = stdole.StdFunctions.LoadPicture( "D:-/danketoan\img\logo1.bmp")
'Tao va cho hien thi 1 cai toolbar (se di chung voi form)
Set cmb = Application.CommandBars.Add("MyCommandBar", , True, True)
'them 1 nut vao cai toolbar vua tao ra
Set cbc = cmb.Controls.Add(msoControlButton)
cbc.Caption = "Button1"
cbc.Style = msoButtonIconAndCaption
cbc.Picture = picPicture
CommandBars("MyCommandBar").Controls( "Button1").OnAction = "=MsgBox(""Wow!"")"
'them 1 nut nua
Set picPicture = stdole.StdFunctions.LoadPicture( "D:-/danketoan\img\logo2.bmp")
Set cbc = cmb.Controls.Add(msoControlButton)
cbc.Caption = "Button2"
cbc.Style = msoButtonIconAndCaption
cbc.Picture = picPicture
CommandBars("MyCommandBar").Controls( "Button2").OnAction = "=MsgBox(""hoh!"")"
Me.MenuBar = "MyCommandBar"

End Sub

------------
Lưu ý:
Cú pháp của Commandbars.Add:
expression.Add(Name, Position, MenuBar, Temporary)
Như vậy muốn tạo menu thì ta đặt MenuBar:= True là xong.

Sau khi tạo menu, cái menu ta vừa đưa lên sẽ nằm hoài ở đó, thay thế menu của hệ thống.
Khi đưa menu của ta thay thế menu hệ thống thì :
Me.MenuBar = "MyCommandBar"
Để cất menu của ta đi và trả lại menu hệ thống như cũ thì dùng lệnh:
Me.MenuBar = ""<------- chuỗi rỗng.
Ta nên đặt lệnh đó nằm trong sub Form_Close():
Private Sub Form_Close()
Me.MenuBar = ""
End Sub
Như vậy khi đóng form thì menu chính thống sẽ trở về y như cũ.
 
Ðề: Cùng mổ xẻ chương trình mẫu VDP

LÀM POPUP MENU:

Ở phần trước ta đã tạo ra menu.
Nhưng mà menu đó nhìn hơi ngộ ngộ vì nó chỉ có 2 nút.
Trông giống toolbar nằm không đúng chỗ hơn là menu.

Ta muốn là khi nhấn vào 1 mục menu đó thì nó sẽ xổ ra 1 cái popup mà trong đó gồm có nhiều mục chọn con khác nữa.

Muốn thế thì phải khai báo cái mục cha đó là kiểu popup-menu chứ không phải là 1 cái button bình thường (mà trong ví dụ trước khi click vào nó sẽ hiện ra 1 bảng thông báo msgbox).
Set cmbc = CommandBars( "MyCommandBar" ).Controls.Add(msoControlPopup, , , , True)
Bây giờ ta sẽ tạo thêm 1 mục menu mới , tiếp theo 2 mục cũ của bài truớc, và khai báo nó là popup-menu.
Lấy lại bài trước và thêm vào 1 đoạn:

Private Sub Form_Load()
... (phần cũ giữ nguyên) ....
Me.MenuBar = "MyCommandBar"

..... (Phần thêm vào) .....
'------------- popup menu -----------------
Dim cmbc As CommandBarPopup
Dim ctrl1 As Office.CommandBarButton
Dim scmb As CommandBar


Set cmbc = CommandBars( "MyCommandBar" ).Controls.Add(msoControlPopup, , , , True)
cmbc.Caption = "My Popup 1"

Set ctrl1 = cmbc.CommandBar.Controls.Add( Type:=msoControlButton)
ctrl1.Caption = "Import"
ctrl1.OnAction = "=msgbox(""Helo! You clicked IMPORT MENU"")"

Set ctrl1 = cmbc.CommandBar.Controls.Add( Type:=msoControlButton)
ctrl1.Caption = "Export"
ctrl1.OnAction = "=msgbox(""Helo! ARE YOU SURE"")"

Set ctrl1 = cmbc.CommandBar.Controls.Add( Type:=msoControlButton)
ctrl1.Caption = "Close Form"
ctrl1.OnAction = "Close_myform_now"

End Sub


Chú ý: vì OnAction của cái menu thứ 3 là gọi 1 function nên ta cần mở 1 module và gõ vào:
Public Sub close_myform_now()
DoCmd.Close
End Sub
 
Sửa lần cuối:
Ðề: Cùng mổ xẻ chương trình mẫu VDP

Hoan hô bác, rất hay và rất cụ thể. Bác viết thế này anh em rất dễ đọc.
Nhưng em chưa thấy load cái Icon vào các menu con, có cách nào để xử lý không bác
 
Ðề: Cùng mổ xẻ chương trình mẫu VDP

Nhưng em chưa thấy load cái Icon vào các menu con, có cách nào để xử lý không bác
Quan sát các phần trước bạn sẽ thấy mấu chốt cũng chỉ là 2 đối tượng: CommandBarCommandBarButton.
Để dễ nhớ, hãy liên hệ chúng với 2 đối tượng mà ta rất quen thuộc: File và Folder.
- 1 file thì phải nằm trong 1 cái Folder nào đó.
- 1 cái Folder có thể chứa nhiều File, đồng thời cũng có thể chứa nhiều Folder con.
=>
- 1 CommandBarButton phải nằm trong 1 cái CommandBar nào đó.
- 1 cái CommandBar có thể chứa nhiều CommandBarButton , đồng thời cũng có thể chứa nhiều CommandBar con.

Chỉ có thế thôi. Nhớ kỹ cái này thì về sau sẽ ít rối hơn.

Như vậy, xem lại phần mà ta đã gán 1 picture vào button:
Dim cmb As CommandBar
Dim cbc As Office.CommandBarButton
Dim picPicture As IPictureDisp
.....
Set picPicture = stdole.StdFunctions.LoadPicture( "D:-/danketoan\img\logo2.bmp")
Set cbc = cmb.Controls.Add(msoControlButton)
cbc.Caption = "Button2"
cbc.Style = msoButtonIconAndCaption
cbc.Picture = picPicture

Và xem lại khi ta tạo menu popup:
Dim cmbc As CommandBarPopup
Dim ctrl1 As Office.CommandBarButton
......

Set ctrl1 = cmbc.CommandBar.Controls.Add( Type:=msoControlButton)
ctrl1.Caption = "Import"


Ta thấy CommandBar và CommandBarPopup là tương đương nhau.
Còn các CommandBarButton có các thuộc tính riêng của nó.
Như trên thì cbc và ctrl1 đều là CommandBarButton .
Muốn gán icon vào CommandBarButton thì cần khai báo Style:=msoButtonIconAndCaption và sau đó gắn icon vào thôi.
Có đặt tên là cbc hay là ctrl1 gì gì thì cũng như nhau thôi.


Trong ví dụ trước tôi không gắn icon vào mục chọn của menu popup vì muốn để cho gọn, dễ quan sát phần nội dung chính và ngoài ra còn vì để về sau ta sẽ tuỳ biến bề mặt của 1 button. Sẽ đề cập đến trong phần chi tiết của 1 button.

------------------
Để liên tục chương trình mời quý vị thưởng thức thêm 2 món nữa: Popup menu nhiều tầng và Shortcut menu.
----------
LÀM POPUP MENU CẤP 2, CẤP 3, CẤP 4 ....

Trong phần trước ta đã chèn 1 cái menu xổ xuống vào thanh menu chính (thanh menu nằm ngang).
Vậy không có lý do gì bạn lại không chèn được menu popup cấp 2, cấp 3 ...
Lấy lại ví dụ trước, tiếp theo phần mà ta đã khai báo 3 nút "Import", "Export", "Close" vào menu popup, bây giờ chèn tiếp thêm vào đó 1 cái popup con:

Private Sub Form_Load()
... (phần cũ giữ nguyên) ....
Dim cmbc As CommandBarPopup
Dim ctrl1 As Office.CommandBarButton
......
ctrl1.OnAction = "Close_myform_now"


..... (Phần thêm vào) .....
'------------- popup menu cap 2 -----------------
Dim cnbc As CommandBarPopup


Set cnbc = cmbc.CommandBar.Controls.Add(Type:=msoControlPopup, Before:=1)
cnbc.Caption = "Thue phai nop"


Set ctrl1 = cnbc.CommandBar.Controls.Add( Type:=msoControlButton)
ctrl1.Caption = "Thue GTGT"
ctrl1.OnAction = "=msgbox(""Helo! You clicked Thue GTGT"")"
Set ctrl1 = cnbc.CommandBar.Controls.Add( Type:=msoControlButton)
ctrl1.Caption = "Thue XNK"
ctrl1.OnAction = "=msgbox(""Helo! You clicked Thue XNK"")"
Set ctrl1 = cnbc.CommandBar.Controls.Add( Type:=msoControlButton)
ctrl1.Caption = "Thue TTDB"
ctrl1.OnAction = "=msgbox(""Helo! You clicked Thue TTDB"")"
Set ctrl1 = cnbc.CommandBar.Controls.Add( Type:=msoControlButton)
ctrl1.Caption = "Thue TNDN"
ctrl1.OnAction = "=msgbox(""Helo! You clicked Thue TNDN"")"


End Sub

Chỉ có thế. Ta chèn 1 cái CommandBarPopup lấy tên là cnbc vào cái CommandBarPopup cũ.
Giống như mở 1 thư mục con trong 1 thư mục.
Hôm nay còn có thêm 1 thuộc tính là Before:=1 là để đặt popup cnbc này vào vị trí đầu tiên của popup cmbc.
Rồi sau đó thêm các button vào trong cái popup cnbc đó.
Tương tự như thế bạn có thể làm menu đa tầng.
 
Sửa lần cuối:
Ðề: Cùng mổ xẻ chương trình mẫu VDP

LÀM SHORTCUT MENU:

Cái này thật là dễ.
Ta đã tạo được menu. Nay ta muốn 1 cái menu sẽ hiện ra khi nhấn chuột phải.
Muốn thế thì chỉ cần:
- Tạo 1 cái CommadBar (nằm khơi khơi thôi, không nằm trong CommadBar cha nào cả).
- Khai báo nó là kiểu popup.
- Ra lệnh lấy cái vừa tạo đó làm shortcut menu, thay thế cho cái shortcut menu hệ thống của Access.
Tip: nó tương tự như khi tạo menu chính.
Lấy lại ví dụ cũ, thêm vào phần sau:
Private Sub Form_Load()
... (phần cũ giữ nguyên) ....
Dim cmb As CommandBar
Dim cbc As Office.CommandBarButton
.......
..... (Phần thêm vào) .....
'-------------shortcut menu ---------------------
'neu Myshortcut da co thi khi Add them se gay loi
'vi vay ta xoa neu Myshortcut da co truoc roi
For Each cbar In CommandBars
If cbar.Name = "Myshortcut" Then
cbar.Delete
End If
Next
'Tao 1 cai khay CommandBar co dang msoBarPopup
Set cmb = CommandBars.Add( Name:="Myshortcut", Position:=msoBarPopup)
'Tao 2 button Copy va Paste bang cach "chom" cua Access:
Set cbc = cmb.Controls.Add(msoControlButton, CommandBars("Edit").Controls("Copy").Id)
Set cbc = cmb.Controls.Add( _
Type:=msoControlButton, _
Id:=CommandBars("Edit").Controls("Paste").Id)
'Ra lenh su dung menu shortcut cua ta thay the menu shortcut cua he thong
Me.ShortcutMenuBar = "Myshortcut"

End Sub

Bạn thấy nó rất tương tự như khi ta tạo menu:
  • Position:=msoBarPopup (Làm menu thì: menuBar:= True)
  • Me.ShortcutMenuBar = "Myshortcut" (Làm menu thì: Me.MenuBar = "MycommandBar" )
Hôm nay phần khai báo button ta làm thêm chuyện: chôm cái "Copy" và "Paste" có sẵn của hệ thống.
Muốn chôm cái có sẵn của Access thì chỉ việc khai báo ID của button đó = id của 1 lệnh của hệ thống.
Nếu không nhớ chính xác id của lệnh mà ta muốn chôm đó là số mấy thì cũng chẳng cần biết, cứ truy vấn nó rồi gán vào:
CommandBars("Edit").Controls("Copy").Id
Đó là id của lệnh Copy trong menu Edit.
 
Ðề: Cùng mổ xẻ chương trình mẫu VDP

Rất hay, tập hợp các bài viết này tạo thành 1 cuốn sách có giá trị đấy bác. Hiện nay em đọc hầu hết các giáo trình access thì ít đề cập đến việc tạo menu bằng code mà chỉ có dùng Macro. Trong khi đó để thay đổi nội dung nhanh chóng thì dùng code (nhất là khi cho nó vào table để truy vấn) thì nhanh và hiệu quả hơn nhiều
 
Ðề: Cùng mổ xẻ chương trình mẫu VDP

Có 2 vấn đề em nhờ bác giải quyết giúp
1. Sau khi dùng đoạn code của bác em có dùng thêm 1 kết nối sql để truy vấn đến 1 table có tên là tbl_menu để lấy trường dữ liệu Tenmenu (dùng làm caption cho các menupopup hoặc button).
Tuy nhiên em gặp vấn đề về phân quyền, chưa biết xử lý như thế nào. Giả sử giờ ta có 3 trường dữ liệu(ID, Tenmenu, Quyen). Trong đó trường "Quyền" sẽ có dạng "1,2,3,..." với 1,2,3.. lần lượt của mức độ phân quyền sử dụng.
2. Cái này thì không quan trọng lắm nhưng nếu xử lý được thì cũng tốt : Đó là việc tạo Icon cho các menupopup.
 
Ðề: Cùng mổ xẻ chương trình mẫu VDP

Cái menu của behattieu ở đây.
Trong data menu.mdb thì field phân quyền bố trí như vậy sẽ khó quan hệ với file danhmucNhanvien (danhmucNhanvien chắc sẽ có field cấp-bậc của 1 nhân viên).
Field tbl_menu.quyen có kiểu là chuỗi chứa các giá trị "1,2,3" ... đã làm cho quan hệ của tbl_menu và danhmucNhanvien trở thành quan hệ nhiều-nhiều.
Với mức độ đơn giản như bài mẫu của behattieu ta có thể nguỵ biện là vẫn còn kiểm soát được.
Nhưng ở mức độ bắt đầu tập làm thì không nên bố trí như vậy.
Hãy cấu trúc lại tbl_menu ở cột "Quyen" trước.
Sau đó ta còn phải làm 1 cái form nhập để thiết kế 1 hệ thống menu hoàn chỉnh.
Đó sẽ là công cụ để dùng khi ta lập trình. Chắc sẽ là 1 cái tool cần dùng nhiều.
Lưu ý hướng đi là:
làm tool chứ không chỉ là 1 đoạn code khai báo menu cho người dùng cuối.
Làm cái tool cho người quản trị hệ thống, người thiết kế, người lập trình chứ không phải cho người dùng cuối.
Mặc dù công dụng trước mắt của nó (tạo menu đọc từ table ra) là vì nó chịu được font Unicode, menu tạo ra dùng font unicode được - trong khi không thể gõ trực tiếp trong VBA.
 

Đính kèm

  • BHXH.rar
    23.1 KB · Lượt xem: 197
Ðề: Cùng mổ xẻ chương trình mẫu VDP

Trong data menu.mdb thì field phân quyền bố trí như vậy sẽ khó quan hệ với file danhmucNhanvien (danhmucNhanvien chắc sẽ có field cấp-bậc của 1 nhân viên).
Em nghĩ chưa hẳn vậy. Những người có thể đăng nhập chưa chắc có tên trong danh mục nhân viên ví dụ như Admin( người thiết kế chương trình). Do đó chỉ cần có 1 bảng tbl_user(ID,Tenuser, passuser" và 1 form login để kiểm tra là OK

Hãy cấu trúc lại tbl_menu ở cột "Quyen" trước.
Cái này chưa hiểu ý bác lắm, bác có thể mô tả rõ hơn không.
 
Ðề: Cùng mổ xẻ chương trình mẫu VDP

Em nghĩ chưa hẳn vậy. Những người có thể đăng nhập chưa chắc có tên trong danh mục nhân viên ví dụ như Admin( người thiết kế chương trình). Do đó chỉ cần có 1 bảng tbl_user(ID,Tenuser, passuser" và 1 form login để kiểm tra là OK

Dù là amdin hay không thì người đó vẫn là nhân viên hoặc thành viên của đơn vị. Bạn sẽ nghĩ sao nếu trong danh sách nhân viên, ta để luôn userName và password?

Việc thiết kế bảng dữ liệu không nên quá cứng nhắc, mà phải linh động và phải lường trước được khả năng lưu trữ tương lai của nó. Thế mới có môn phân tích và thiết kế hệ thống chứ!

Đối với cách thiết kế của tôi thì tôi sẽ có một table xác lập quyền cho user. Mỗi dòng bao gồm username, formname, available. Nếu available = True thì cho phép user đó truy cập form đó. Nếu nạp nó vào menu chẳng hạn thì cũng dễ dàng thôi.
 
Ðề: Cùng mổ xẻ chương trình mẫu VDP

Dù là amdin hay không thì người đó vẫn là nhân viên hoặc thành viên của đơn vị. Bạn sẽ nghĩ sao nếu trong danh sách nhân viên, ta để luôn userName và password?

.

Hình như các bác định lấy trường Hotennhanvien hoặc ID trong 1 bảng VD :tbl_Danhmucnhanvien để đưa vào form login phải không?
Sau đó dùng truy vấn để lấy Tên và mạtkhẩu trong table (tbl_user) để kiểm tra có được quyền truy cập không và mức độ quyền ra sao.

Tuy nhiên, ý đồ của em rất đơn giản , menu hoàn toàn không dính dáng đến nội dung của chươg trình, nó được coi như 1 module mỗi khi viết 1 chương trình mới mà cần đến việc phân quyền.
Chỉ cần dùng 1 table(tbl_user) sau đó chuyển dữ liệu vào form(frm_login) . Sau khi kiểm tra tên, mật khẩu nếu đúng nó sẽ cho load 1 main menu để gọi menubar, menupopup,....
Không biết làm thế có gì chưa chuẩn các bác cho em ý kiến.
Bac muontennguoi oi, cái shortcutbar của bác làm thế nào để cho 1 nút lệnh do mình địnhnghĩa: Mấy cái dòng như thế này Set cbc = Cmb.Controls.Add(msoControlButton, CommandBars("Edit").Controls("Paste").Id) là lấy ID sẵn có của access, em muốn tạo thêm 1 nút cho riêng mình
 
Ðề: Cùng mổ xẻ chương trình mẫu VDP

Hình như các bác định lấy trường Hotennhanvien hoặc ID trong 1 bảng VD :tbl_Danhmucnhanvien để đưa vào form login phải không?
Sau đó dùng truy vấn để lấy Tên và mạtkhẩu trong table (tbl_user) để kiểm tra có được quyền truy cập không và mức độ quyền ra sao.

Tuy nhiên, ý đồ của em rất đơn giản , menu hoàn toàn không dính dáng đến nội dung của chươg trình, nó được coi như 1 module mỗi khi viết 1 chương trình mới mà cần đến việc phân quyền.
Chỉ cần dùng 1 table(tbl_user) sau đó chuyển dữ liệu vào form(frm_login) . Sau khi kiểm tra tên, mật khẩu nếu đúng nó sẽ cho load 1 main menu để gọi menubar, menupopup,....
Không biết làm thế có gì chưa chuẩn các bác cho em ý kiến.

Không ai lấy trường họ tên để làm login name cả mà là một field khác. login name cũng giống như nick name của một người.
Bạn cứ hình dung, khi bạn đăng ký một tài khoản trên một forum (danketoan chẳng hạn), trước tiên bạn sẽ nhập cái login name và cái pasword của bạn. forum sẽ tạo một profile cho bạn. Bạn có thể điền thêm thông tin vào đây. Đồng thời khi bạn đã đăng ký, bạn sẽ được phân quyền là Registered User. Profile nó y chang cái danh mục nhân viên (thay vì nhân viên thì là thành viên) mà thôi. Mấy cái thông tin còn lại để dành đó dùng cho việc khác, mất đi đâu là lo, vả lại còn tiện nữa.
 
Ðề: Cùng mổ xẻ chương trình mẫu VDP

Có thể ý đồ của bác và của em khác nhau nên thuật toán khác nhau.
Của bác: Cho load toàn bộ các form... sau đó kiểm tra quyền và căn cứ vào đó để khóa hay không khóa
Của em: Kiểm tra quyền trước. Là quyền nào thì load menu tương ứng với quyền đó. Như thế có những menu em không muốn cho người ta nhìn thấy tên thì em không cho nó hiện ra ngay từ khi load menu
 
Ðề: Cùng mổ xẻ chương trình mẫu VDP

Có thể ý đồ của bác và của em khác nhau nên thuật toán khác nhau.
Của bác: Cho load toàn bộ các form... sau đó kiểm tra quyền và căn cứ vào đó để khóa hay không khóa
Của em: Kiểm tra quyền trước. Là quyền nào thì load menu tương ứng với quyền đó. Như thế có những menu em không muốn cho người ta nhìn thấy tên thì em không cho nó hiện ra ngay từ khi load menu

Không ai lại load hết form hay menu, thế là bạn chả hiểu ý tôi nói rồi.
Có nhiều cách để thiết kế table tạm gọi là table menu.

Cách một là sẽ có một table chứa các thông số về form được sử dụng trong chương trình (tạm gọi là table form mẫu). Nó chứa: ID của form, Caption tức là cái sẽ hiển thị trên một form điều khiển như là menu command vậy, và cái FormName.
Khi thêm một user thì tự động Add các field userName, formID vào một table khác (tạm gọi là table quyền của user). Trong đó userName là cái tên của người mới, formID là lấy từ table form mẫu. Trong table này còn có field available.
Quản trị viên có sẽ tự bật hay tắt field available cho user đó.
Khi load menu thì load dữ liệu trong table này với những em nào có userName = userName vừa login, và có available = True. Xong.

Cách hai là địnhn ghĩa sẵn các table tương tự như table form mẫu, nhưng có thể ít dòng hơn. Mỗi table chứa các form có quyền truy cập tùy theo quyền mà user được hưởng (ví dụ tableQuyen1, tableQuyen2, ...)

Khi tạo menu thì tìm trong danh sách user xem quyền của user đó là gì thì sẽ load dữ liệu tương ứng theo tableQuyen1 hay tableQuyen2, ...

Cái này là lượm chiêu của các đại gia đó bạn ơi.
 
Ðề: Cùng mổ xẻ chương trình mẫu VDP

Nếu vậy cách của bác có khi lại dài hơn cách của em mà lại khá phức tạp.
1.Dùng 1 form login để kiểm tra mật khẩu. Form này lấy dữ liệu từ table có tên là tbl_user(ID, Ten, matkhau,Level).
Nếu kiểm tra thấy sai, cho thoát luôn
Nếu đúng đóng form login lại chuyển "level" vào và mở form main
2. Form main khi load nó sẽ so sánh xem "level" vừa được chuyển vào có trong chuỗi ký tự "Quyen" trong table có tên tbl_menu(ID,Tenmenu,Quyen..)
Dùng vòng lặp để tạo menu. Nếu kiểm tra kết quả so sánh level với quyền =1 thì cho phép Add 1 đối tượng (1 button hoặc popup..) còn nếu kết quả so sánh =0 thì trượt qua)

Nhân tiện em hỏi 1 cái làm sao để 1 form khi load nó sẽ trượt đến bản ghi cuối cùng (có nhiều bản ghi trong 1 subform) mà không phải ấn thanh bar nhỉ? VD có 1000 bản ghi nhưng trong khung view ta chỉ cho hiện ra 10 record cuối thôi (để tiện cho việc addnew) lúc nào cần xem các cái phía trên thì dùng thank bar để kéo sau (chọn toàn bộ nhưng chỉ hiện ra vài cái cuối)

PS: Bác cho em 1 cái sample của bác (chỉ cần cái phần phân quyền thôi)
 

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


Liên hệ: 090.6969.247

KÊNH YOUTUBE DKT

Kỹ thuật giải trình thanh tra BHXH

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

SÁCH QUYẾT TOÁN THUẾ


Liên hệ: 090.6969.247

Top