Access trong chế độ nhiều người dùng và trong mạng nội bộ

Liên hệ QC

levanduyet

Hãy để gió cuốn đi.
Thành viên danh dự
Tham gia
30/5/06
Bài viết
1,798
Được thích
4,704
Giới tính
Nam
Chào các bạn,
Tôi đang thiết kế một ứng dụng trong Access. Tôi muốn ứng dụng của mình thỏa mãn các yêu cầu sau:
_ Nhiều người dùng. Có thể phân quyền cho từng form, thao tác.
_ Có thể dùng trong mạng nội bộ được.

Với yêu cầu trên, tôi phải thực hiện như thế nào? Và trong lúc thiết kế, tôi phải làm như thế nào? ( Ví dụ: trong lúc thiết kế form tôi lấy nguồn trực tiếp là một bảng trong CSDL chẳng hạn. Còn khi thiết kế với các yêu cầu trên thì tôi không biết như thế nào?)

Lê Văn Duyệt
 
1. Access Database là 1 Desktop Database nên việc chạy trên mạng là phải Share full --> High risk!
2. Có 2 cách để cùng mở 1 file MDB.
- Một là Open database với tham số Share gì đó (ko nhớ kỹ lắm, anh có thể google)
- Hai là sử dụng Attached Table (cách này tốt hơn cách 1 rất nhiều). Tức là chỉ có 1 file CSDL gốc (data.mdb chẳng hạn), trên mỗi máy trạm có 1 file mdb khác dùng để link tới file CSDL gốc (Link.mdb chẳng hạn)
- Chương trình chính sẽ truy cập tới file Link.mdb
- Phải quản lý "link" giữa file Link.mdb với Data.mdb (rất dễ)
3. Để nhiều người cập nhật cùng 1 chức năng (cùng thêm mới 1 chứng từ chẳng hạn), ta phải tăng ID (khóa) của đối tượng của chức năng đó vào lúc save.
4. Cần quản lý xem User nào tạo mới, User nào sửa, thời gian cập nhật (tạo mới, sửa,...)
5. Thông báo khi nhiều hơn 2 người cùng sửa 1 đối tượng (danh mục, chứng từ, ....0
6. Việc phân quyền theo chức năng (form chỉ là thể hiện chức năng mà thôi, xem 1 báo cáo cũng là 1 chức năng) không phải là khó. Anh tự nghĩ ra để làm. (chú ý: cần phải phân quyền chi tiết tới từng action của 1 chức năng (ví dụ: thêm, sửa, xóa, in, thực hiện, v.v... tùy theo mỗi chức năng có các action khác nhau)
7. Lý do tại sao ko dùng MSDE mà lại dùng MS ACCESS?

trong lúc thiết kế form tôi lấy nguồn trực tiếp là một bảng trong CSDL chẳng hạn.

Bound controls là cách của newbie rồi anh ơi.

Regards,
 
Lần chỉnh sửa cuối:
Re 2: Anh có thể google được, có rất nhiều code liên quan tới việc attached tables, nếu ko nhầm thì trong MS Access samples ngày xưa có ví dụ này. Trên WKT cũng đã có bài trao đổi về việc tạo Attached table của DoHung khi làm phần mềm kế toán trên Access rồi. Quả thực, ngay trên Help của Access cũng cho ta biết cách tạo attached table như thế nào. Chỉ cần trong code viết 1 đoạn Check Attached cho 1 table nào đó 1 tý thôi là xong. Nếu chưa attached (vì thay đổi đường dẫn file data.mdb) thì chỉ việc Open file (Open file Dialog) để chọn file rồi reattached. Vấn đề này rất giản đơn mà.

Tham khảo: http://www.webketoan.vn/forum/showthread.php?t=17632&page=1

Re 3: ID = MaxID(Object name) + 1
Cái này đơn giản quá, ko cần chi tiết
Re 4: Thêm các thông tin đó vào bảng chứa đối tượng liên quan (UserID, TimeStamp, LastUpdateUserID, LastUpdateTimeStamp)
Re 5: Bỏ qua, anh ko làm cũng được
Re 6: Cái này nói quá nhiều rồi, và chính anh đã từng tạo ra topic về chủ đề này.
Re 1, 7: Chỉ là thông tin, ko cần thiết.

Re Bound/Unbound: File ví dụ load data từ excel lên Grid của Hải là cách làm UnBound. Unbound thì kiểm soát tốt hơn, chuyên nghiệp hơn. Còn cách dùng Data Control tới 1 DB Source nào đó, rồi gắn thuộc tính data source vào từng field của cái Data Control đó gọi là cách dùng Bound Control. Cách đó ko kiểm soát tốt, liên tục fetch vào CSDL, thường là cách làm của newbie (vì ko quen viết unbound).

Xưa kia h2h và nhiều người trên diễn đàn đã từng nói nhiều về cách làm class trong VB rồi, vậy sao ko ai áp dụng? Chỉ nói chơi chơi thôi à?

Ví dụ: (Đại khái thôi)

Mã:
Dim objCustomer AS clsCustomer

...

Set objCustomer = New clsCustomer

ID = objCustomer.NextID  '// See Re 3

With objCustomer
   .ID = ID
   .Code = txtCustomerCode.Text
   .Name = txtCustomerName.Text
   ...
   If Not .Insert() Then Goto PROC_DONE

End With
...

PROC_DONE:
   Set objCustomer = Nothing
...

Hai2Hai nghĩ, chỉ cần có định hướng đúng, còn làm như thế nào thì không hề khó. Mà nếu có khó thì đặt câu hỏi cụ thể lúc làm tới vấn đề đó tốt hơn.

PS:

Anh là newbie của MS Access mà !

Anh chỉ nên coi Access là CSDL thôi (tức là chỉ dùng file MDB làm CSDL thôi), đã biết VB rồi thì phải dùng nó chứ. Ngày xưa anh Duyệt còn sài .NET để làm ứng dụng cơ mà :)
 
Lần chỉnh sửa cuối:
1. c1: Nhiều người dùng. Có thể phân quyền cho từng form, thao tác. ==> anh dùng splitdata wizard cách này anh sẽ tạo nhiều file data.mdb và theo từng user khi login thì sẽ liên kết đến file data.mdb đó. đường link bên dưới để relink đến file data.mdb
http://www.giaiphapexcel.com/forum/showthread.php?t=9671

c2: anh dùng user and group account trong tools để phân quyền.

2. dùng splitdata wizard, máy tính chứa file data.mdb phải được share full


Chào các bạn,
Tôi đang thiết kế một ứng dụng trong Access. Tôi muốn ứng dụng của mình thỏa mãn các yêu cầu sau:
_ Nhiều người dùng. Có thể phân quyền cho từng form, thao tác.
_ Có thể dùng trong mạng nội bộ được.

Với yêu cầu trên, tôi phải thực hiện như thế nào? Và trong lúc thiết kế, tôi phải làm như thế nào? ( Ví dụ: trong lúc thiết kế form tôi lấy nguồn trực tiếp là một bảng trong CSDL chẳng hạn. Còn khi thiết kế với các yêu cầu trên thì tôi không biết như thế nào?)

Lê Văn Duyệt
 
Vậy theo tôi nghĩ cách tốt nhất là tôi sẽ dùng một file Access để làm DB.
File cho từng người dùng tôi sẽ để riêng. Mỗi lần mở file sẽ kết nối với CSDL ở trên.

Đây là cách tôi đang dùng cho các file kết hợp Excel + Access.

Biết vậy nhưng cảm thấy hơi "làm biếng", vì phải viết từ A-Z.

Anyway, tks.

LVD
 
Vậy theo tôi nghĩ cách tốt nhất là tôi sẽ dùng một file Access để làm DB.
File cho từng người dùng tôi sẽ để riêng. Mỗi lần mở file sẽ kết nối với CSDL ở trên.

LVD

Không phải là file riêng cho từng người, mà vẫn là 1 file (hoặc 1 số file trong đó có 1 file exe) giống hệt nhau.

Ví dụ:
- Anh có bộ cài đặt Setup.exe, trong đó có 3 files (ví dụ thế): AccountingBusiness.DLL, ACCLink.mdb, LVDAccounting.exe
- Còn ở "máy chủ", anh share full thư mục \AccountData, trong thư mục đó có file Data.mdb (ví dụ thế) - Và như thế, người ngồi trên máy trạm có thể <Shift + Del>, Copy, hoặc Move, Rename cái file Data.mdb đó khi không có connection nào tới :-= (Hight risk là vì thế). Trong khi MS SQL thì ko có chuyện như vậy (mà dùng cũng dễ như MS ACCESS)
- Khi anh chạy file LVDAccounting.exe, nó sẽ open cái ACCLink.mdb (sử dụng ADO như anh đã thành thạo) và check luôn xem đã attached file hay chưa. Nếu chưa thì chọn lại dữ liệu để attach là file \\TenMayChu\AccountData\Data.mdb và sau đó chạy chương trình. Còn nếu attached rồi thì chạy thẳng chương trình
- File ACCLink.mdb coi như là "ảnh" chứa dữ liệu (thực chất file này ko hề chứa dữ liệu nào), anh có thể thiết kế Query trong file đó để join các bảng với nhau (Chú ý: file Data.mdb chỉ có các tables chứa dữ liệu mà thôi, ko chứa Query)
- Với kinh nghiệm của hai2hai, sure rằng đây là cách tốt nhất khi làm việc với MDB qua mạng (không chỉ chạy mạng tốt, thậm chỉ là làm giảm thiểu file CSDL khỏi cồng kềnh, ít bị lỗi "mdb corruption", dễ nâng cấp khi thay đổi cấu trúc CSDL, v.v...).
- Tuy nhiên, đã dùng MDB thì thà dùng MSDE còn hơn (cũng na ná như nhau về khối lượng công việc, chả phải học hành gì nhiều, trong khi MSDE thì hơn hẳn ở mọi mặt)

Như vậy, ko có khái niệm "file riêng cho mỗi người" nhé, chỉ là cài (copy) riêng cho mỗi máy, còn đó vẫn chỉ là 1 phần mềm (chứ ko phải mỗi người 1 phần mềm)

PS: Hình như anh Duyệt vẫn chưa thử tạo 1 file mdb trong đó có các attached tables được attached từ file mdb khác nhỉ? Không phải là ta "mở" cùng 1 file mdb mà là ta attached cùng tới 1 file mdb (Anh ko mở nhiều connections trực tiếp như mọi lần đến file MDB được đâu. Nếu anh mở nhiều connections trực tiếp tới file mdb đó thì phải mở với tham số share (ko nhớ nữa nhưng anh có thể tra trên mạng) chứ ko phải mở bình thường. Vả lại, em đã nói là cách này ko tốt rồi mà). Làm attached tables dễ như "ăn bánh quy" mà sao anh có vẻ lăn tăn thế nhỉ?
 
Lần chỉnh sửa cuối:
Không phải là file riêng cho từng người, mà vẫn là 1 file (hoặc 1 số file trong đó có 1 file exe) giống hệt nhau.
Anh hiểu, nhưng do cách anh diễn đạt không rõ ràng lắm.
Hình như anh Duyệt vẫn chưa thử tạo 1 file mdb trong đó có các attached tables được attached từ file mdb khác nhỉ? Không phải là ta "mở" cùng 1 file mdb mà là ta attached cùng tới 1 file mdb (Còn nếu anh mở trực tiếp connection tới file mdb đó thì phải mở với tham số share chứ ko phải mở bình thường, em đã nói là cách này ko tốt rồi mà). Làm attached tables dễ như "ăn bánh quy" mà sao có vẻ lăn tăn thế nhỉ?
Đúng là anh chưa thử :(

Tks,

LVD
 
Cách làm của anh hai2hai giống như cách em đang áp dụng tại cơ quan, nhưng MDBMS là Ms SQL Server trên AD luôn chứ không phải Access và em phân quyền từ Ms SQL Server/ AD. Phía client thì dùng Access làm UI để kết nối vào và thực hiện tất cả công việc trên đó. Chương trình như thế đúng là làm rất nhanh dễ bảo trì và nâng cấp.

Thanh Phong
 
Cách làm của anh hai2hai giống như cách em đang áp dụng tại cơ quan, nhưng MDBMS là Ms SQL Server trên AD luôn chứ không phải Access và em phân quyền từ Ms SQL Server/ AD. Phía client thì dùng Access làm UI để kết nối vào và thực hiện tất cả công việc trên đó. Chương trình như thế đúng là làm rất nhanh dễ bảo trì và nâng cấp.

Thanh Phong

Chuyện phân quyền, rồi chuyện đa người dùng ko chỉ đơn giản là thực hiện trên MS SQL mà phải thực hiện cả 2 (Data Layer and Business Layer).

Ví dụ:
Có 1 table như sau:

tb_T_Transaction {ID (PK), TransNo, TransDate, TransType, ... Note}

Table đó chứa tất cả các giao dịch.

Bây giờ ta xét đến cùng 1 loại giao dịch: Ví dụ là 1 Purchase Order (tức: TransType = 'PO')

Vì ID là PK, nên khi tạo mới chứng từ, hoặc khi save chứng từ thì ID đó phải ko được trùng nhau. Nếu ở 2 màn hình cùng mở giao dịch, khi 1 bên save trước thì bên kia ID phải ko được trùng (Dĩ nhiên TransNo có thể ko trùng vì 2 bên cầm 2 chứng từ gốc khác nhau nên ta tạm bỏ qua chuyện trùng đó - mặc dù, chương trình vẫn phải check xem có duplicate hay ko).
Nếu cứ để thông báo mặc định là ID bị trùng thì tệ quá vì giao dịch là thực hiện liên tục, liên tục ở nhiều điểm cách xa nhau (thậm chí 1 nơi là Mỹ, 1 nơi là Nam phi)

Giờ ta lại xét đến vài trường hợp khác:
Giả sử khi phân quyền, có 2 "ông" ở 2 nơi khác nhau (1 ông đang ở cơ quan tại Nam Phi, một ông đang đi công tác bên Mỹ --=0) cùng có thể xem được 1 loại chứng từ (của cùng 1 đơn vị chứ ko phải của 2 đơn vị riêng biệt) (tức là họ có cùng 1 quyền như nhau). Giờ ta xem xét trường hợp cả 2 "ông" này cùng mở chứng từ có ID là 100 chẳng hạn. Cả 2 ông cùng sửa diễn giải của chứng từ. Dĩ nhiên, nếu ko để ý trường hợp này thì sẽ có 1 ông sửa "1 đằng", kết quả lại ra "1 nẻo" (mà thực chất là ông kia sửa - update sau).
Rồi ta lại xét tiếp, có 1 ông đang mở 1 mặt hàng có mã là "HH001", trong khi ông bên kia thực hiện lệnh "Delete" cái mặt hàng "HH001" đó (Cứ cho là Delete được đi vì HH đó chưa tham gia giao dịch nào cả).
Tiếp tục: Giờ ta lại nói về chuyện quy trách nhiệm, để xem ông nào sửa, ông nào xóa (Ví dụ có ông kế toán trước khi rời khỏi công ty làm "trò mèo" chẳng hạn - Vụ này ở VN là ko hiếm nhé !$@!!). Để khôi theo dõi (auditing) được "ông" nào, làm gì, tại thời điểm nào, thực hiện từ đâu (tracked by IP/location), sửa/xóa những dữ liệu nào (dữ liệu trước và sau thay đổi/xóa của từng lần) thì cần phải có 1 công cụ theo dõi vấn đề đó. Và món đó người ta gọi là Log Auditing (giống như Events Logging của Windows ấy). Món này thực hiện trực tiếp trên CSDL cho từng đối tượng để tránh sự truy cập trái phép trực tiếp vào CSDL mà ko thông qua phần mềm.

Sẽ còn nhiều trường hợp liên quan tới Multi-Concurrent Users mà ta sẽ thấy nó chẳng liên quan tới chuyện phân quyền trên MS SQL tý nào cả.
 
Em đang nói tới việc phân quyền truy cập CSDL mà anh, những cái anh nói đúng là cần phải quan tâm khi xây dựng PM. Tuy nhiên chỉ những người phát triển phần mềm chuyên nghiệp như anh mới quan tâm hết các vấn đề thường phát sinh đó, chứ newbie như tụi em thì khó mà thực hiện tốt được.

Thanh Phong
 
Chào các bạn,
Tôi đang thiết kế một ứng dụng trong Access. Tôi muốn ứng dụng của mình thỏa mãn các yêu cầu sau:
_ Nhiều người dùng. Có thể phân quyền cho từng form, thao tác.
_ Có thể dùng trong mạng nội bộ được.

Với yêu cầu trên, tôi phải thực hiện như thế nào? Và trong lúc thiết kế, tôi phải làm như thế nào? ( Ví dụ: trong lúc thiết kế form tôi lấy nguồn trực tiếp là một bảng trong CSDL chẳng hạn. Còn khi thiết kế với các yêu cầu trên thì tôi không biết như thế nào?)

Lê Văn Duyệt

Các Bạn có thể tham khảo tài liệu Hỏi và Đáp của Microsoft về phân quyền trong MS. Access tại link sau: http://support.microsoft.com/?id=165009 hoặc tải trực tiếp tài liệu (PDF) về từ: http://www.mediafire.com/download.php?ydfnbgv7z86bof2
 
Mình vẫn chưa thực sự hiểu ý nghĩa của việc phải tạo một file .mdb trên destop để tham chiếu vào 1 file nguồn .mdb trên sever trên mạng LAN.
Nếu truy xuất trực tiếp từ sever thì sẽ xảy ra điều gì?
 
Lập trình VBA trong Excel kết nối CSDL Access trong mạng LAN, Internet - A-Tools

Video này tôi hướng dẫn mọi người dùng ADO kết nối tới CSDL Access trong mạng LAN, với các CSDL khác như Excel, Foxpro, SQL Server.... Các CSDL Access, Excel, Foxpro, Paradox,... chỉ có thể chia sẻ qua mạng LAN phải share folder vì vậy bảo mật không tốt, không thể chia sẻ qua Internet. Trong video này tôi đưa ra một giải pháp mới với Add-in A-Tools cho phép chúng ta kết nối CSDL qua LAN, Internet theo giao thức TCP IP (Client-Server không phải share folder) với những loại CSDL mà bình thường không thể làm được.

[video=youtube;lSyoR1XFte8]https://www.youtube.com/watch?v=lSyoR1XFte8&feature=youtu.be[/video]​
 
SQL Server, My SQL có thể làm server CSDL (máy chủ cơ sở dữ liệu) không như nhiều người hiểu lầm, nhưng Excel thì làm việc với những cái này không tốt - do Microsoft không hỗ trợ, có lẽ vì họ coi Excel là phần mềm văn phòng tính toán là chính, việc chia sẻ quản lý CSDL là nhiệm vụ của các phần mềm, hệ thống khác...
 
SQL Server, My SQL có thể làm server CSDL (máy chủ cơ sở dữ liệu) không như nhiều người hiểu lầm, nhưng Excel thì làm việc với những cái này không tốt - do Microsoft không hỗ trợ, có lẽ vì họ coi Excel là phần mềm văn phòng tính toán là chính, việc chia sẻ quản lý CSDL là nhiệm vụ của các phần mềm, hệ thống khác...
Hiện tại mình có thể dùng Excel để cập nhật, truy vấn dữ liệu qua internet
 
Vậy thì bạn chia sẻ giải pháp cho các thành viên đi. Còn tôi thì không dùng excel.

Đây là diễn đàn giải pháp excel nên phần lớn giải pháp của mọi người bằng mọi cách đều hướng tới ứng dụng vào Excel. Phần lớn các doanh nghiệp cần Excel là có lý do. Một số giải pháp lớn của doanh nghiệp phải lựa chọn CSDL khác Excel cũng là lý do. Và một điều gần như giải pháp nào cũng liên quan đến Excel thông qua import/export excel.
 
Đây là diễn đàn giải pháp excel nên phần lớn giải pháp của mọi người bằng mọi cách đều hướng tới ứng dụng vào Excel. Phần lớn các doanh nghiệp cần Excel là có lý do. Một số giải pháp lớn của doanh nghiệp phải lựa chọn CSDL khác Excel cũng là lý do. Và một điều gần như giải pháp nào cũng liên quan đến Excel thông qua import/export excel.

Đó là việc của diễn đàn, còn người dùng chọn cái thì cứ theo quy mô công việc mà chọn, không thể bên trọng bên khinh, cái gì sinh ra cũng có nhiệm vụ chính của nó, không phải ngẫu nhiên mà có, mà phải tách các phần việc ra. Người dùng hãy chọn cửa chính mà đi, phù hợp với công việc của ta.
 
Ví dụ như file excel để chế độ dùng chung trên mạng LAN của công ty. Chỉ cần 2000 người vào đồng loạt là file excel bị tê liệt ngay.
Khi đó sử dụng access share full folder mạng LAN, người dùng thông qua excel có viết macro để truy xuất dữ liệu và nhập liệu vào access cũng là một giải pháp.

Sự kết hợp giữa excel và CSDL là một giải pháp tốt.
 
Web KT
Back
Top Bottom