tranthanhan1962 > 04-03-20, 11:00 PM
(04-03-20, 10:10 PM)yamakashi2003 Đã viết: - AllowValueListEdits : NoĐây là thuộc tính mới mà access hỗ trợ người sử dụng cho accbd. Ở mdb, combobox không có thuộc tính này. Nó hỗ trợ bạn thay đổi, thêm bớt dữ liệu danh sách table liên kết ở Rowsource của combobox nếu Row Source type của bạn là Table/Query. Nếu bạn test không đúng thì sẽ không thấy gì lạ vì nó phải kết hợp với thuộc tính List Items Edit Form . Bạn phải set một form lên kết với nó (chắn chắn nó là form dữ liệu của table làm row source cho combobox chứ form khác thì liên quan gì). Khi đó khi bạn chuột phải vào conbobox sẽ có một lệnh là Edit List Item... Chọn lệnh này thì form được set ở thuộc tính List Items Edit Form sẽ mở ra. bạn có thể xử lý thay đổi thêm bớt danh sách trên combobox mà không cần dùng lệnh mở form danh sách ở nơi khác, để thay đổi dữ liệu trên table nguồn. (tất nhiên để cập nhật dữ liệu trên table nguồn cho combobox bạn phải viết code Requery cho combobox, nếu không bạn phải đóng tất cả rồi mở lại thì danh sách mới được cập nhật). Ở mdb muốn làm việc này phải viết code phức tạp hơn nhiều.
có tác dụng gi ạ, em test thử mà không thấy thay đổi gì
yamakashi2003 > 29-03-21, 01:06 PM
(02-03-20, 11:09 PM)tranthanhan1962 Đã viết: [quote="yamakashi2003" pid='44743' dateline='1583150487']Bác ơi, giả sử khi em muốn cập nhật dữ liệu đã được thay đổi trên form (dữ liệu ở record, listbox, combobox,... được thay đổi ở máy khác)
ongke0711 > 29-03-21, 02:17 PM
(29-03-21, 01:06 PM)yamakashi2003 Đã viết: Bác ơi, giả sử khi em muốn cập nhật dữ liệu đã được thay đổi trên form (dữ liệu ở record, listbox, combobox,... được thay đổi ở máy khác)
mà không muốn tắt file đi bật lại em hay dùng me.refresh
Nhưng nếu có nhiều form cần cập nhật dữ liệu thì có cách nào chạy tổng thể không ạ
Em thử sửa code này mà không được
Private Sub Command307_Click()
Dim XForm As AccessObject, CSDL As Object
Set CSDL = Application.CurrentProject
For Each XForm In CSDL.AllForms
If XForm.IsLoaded = True Then
DoCmd.RepaintObject acForm, XForm.Name
End If
Next XForm
End Sub
Trích dẫn:Ý em là giả sử em mở file BE, sửa dữ liệu ở các table, thì khi đó máy khác đang bật file FE, mở các form có liên quan đến table mà em sửa
Thì liệu có code nào mà có thể giúp tất cả các form, đối tượng trên form (listbox, combobox,...) đều requery lại dữ liệu của nó không ấy ạ
yamakashi2003 > 30-03-21, 12:20 AM
(29-03-21, 02:17 PM)ongke0711 Đã viết:Em dùng form unbound để nhập liệu bằng add new mà bác,(29-03-21, 01:06 PM)yamakashi2003 Đã viết: Bác ơi, giả sử khi em muốn cập nhật dữ liệu đã được thay đổi trên form (dữ liệu ở record, listbox, combobox,... được thay đổi ở máy khác)
mà không muốn tắt file đi bật lại em hay dùng me.refresh
Nhưng nếu có nhiều form cần cập nhật dữ liệu thì có cách nào chạy tổng thể không ạ
Em thử sửa code này mà không được
Private Sub Command307_Click()
Dim XForm As AccessObject, CSDL As Object
Set CSDL = Application.CurrentProject
For Each XForm In CSDL.AllForms
If XForm.IsLoaded = True Then
DoCmd.RepaintObject acForm, XForm.Name
End If
Next XForm
End Sub
Trích dẫn:Ý em là giả sử em mở file BE, sửa dữ liệu ở các table, thì khi đó máy khác đang bật file FE, mở các form có liên quan đến table mà em sửa
Thì liệu có code nào mà có thể giúp tất cả các form, đối tượng trên form (listbox, combobox,...) đều requery lại dữ liệu của nó không ấy ạ
Tôi gộp bài hỏi của bạn bên kia trả lời luôn vì nó cùng vấn đề cần giải quyết.
Bài toán của bạn đúng ra là bài toán "nhập liệu, câp nhật dữ liệu trong môi trường đa người dùng". Khi có một người cập nhật dữ liệu thì các máy con khác cũng thấy được sự cập nhật này.
Tách vấn đề ra làm 2 để giải quyết: nhập liệu và hiển thị dữ liệu.
1. Nhập liệu đa người dùng:
- Nếu đã Split Database để có thể nhiều người nhập liệu cùng lúc thì bạn phải biết tới tính năng Record Lock của Access. Thiết lập "Edited Record Lock" để khi một người đang cập nhật dòng dữ liệu nào đó thì người khác không thao tác gì được trên dòng đó.
- Bạn nói bạn sửa dữ liệu ở Table BE thì phải xem ai mở Table đó trước, người đó mới có quyền sửa dữ liệu (vì đã lọcked record).
2. Cập nhật thay đổi, hiển thị ở các Form, Query các liên quan:
- Không có chuyện tự động cập nhật dữ liệu tới các máy con khi dữ liệu BE thay đổi mà chỉ có các máy con chủ động Refresh dữ liệu để thấy được sự thay đổi. Refresh ở đây nói cho dễ hiểu chứ có nhiều cách Refresh dữ liệu ở các ngữ cảnh khác nhau. Ví dụ: khi bạn bấm nút lưu dữ liệu thì Refresh bằng cách: mở Recordset kèm thuộc tính dbSeeChange; rst.MoveLast + MoveFirst để refresh dữ liệu v.v...
- Muốn các Form tự động cập nhật dữ liệu để hiển thị thì có thể dùng Timer để định kỳ chạy code Requery. Vấn đề là bạn phải xét đến thực tiễn ứng dụng có cần phải dùng Timer thêm cho nó tốn thêm code mà có khi không cần thiết.
- Bạn đang ở FE này cập nhật dữ liệu thì không thể viết code để Refresh "ALL FORMS" ở các FE khác ở máy khác. Nếu có là phải cài ngầm Timer ở các máy con khác để tự chạy. Lúc này bạn phải xét là ứng dụng của bạn có nhiều giao dịch (transaction) xảy ra đồng thời (như các trang bán hàng trực tuyến Tiki, shopee...) không để lúc nào các máy con cũng chạy Timer để Refresh dữ liệu.
- Nếu bạn chỉ muốn Refresh dữ liệu ở trên chính máy bạn đang thao tác thì cần gì chạy ALL Forms cho lãng phí, có mở hết Form đâu mà Refresh, chỉ Refresh Form nào đang xử lý thôi. Trường hợp này thì đơn giản rồi.
Cuối cùng là làm gì có chuyện tắt file đi rồi mở lại mới Refresh??? Nếu có bạn đã thiết kế sai hoàn toàn rồi. Tắt file, khởi động lại chỉ áp dụng khi bạn chạy các code liên quan đến thay đổi hệ thống như: thay đổi định dạng số, dấu phân cách hàng ngàn, cập nhật nguyên file FE v.v..
Một điều nữa là bạn đừng nên đi tìm code cho cái giải thuật mà bạn tự nghĩ ra (phải Refesh All Forms...) nhưng chưa chắc nó đúng mà nên tư vấn giải thuật cho bài toán thực tế của bạn. Chuyện nhập liệu đa người dùng cũng đã có mấy bài viết rồi, bạn tìm kiếm đi.
ongke0711 > 30-03-21, 07:37 AM
(30-03-21, 12:20 AM)yamakashi2003 Đã viết: Em dùng form unbound để nhập liệu bằng add new mà bác,
Ý em là giả sử em sửa dữ liệu ở 1 form X ở máy A, và máy B đang mở 3 form khác ( form X là subform của 3 form này)
thì liệu có cách nào cập nhật dữ liệu lại cho 3 form này k, ngoài cách tắt bật lại 3 form main, hoặc chạy 3 lệnh me.refresh ở 3 form ạ
maidinhdan > 02-04-21, 12:03 AM
Public Sub Ham_TatFormDangMo()
Dim frm As Form
For Each frm In Forms 'Duyệt qua tất cả form đang kích hoạt
DoCmd.Close acForm, frm.Name, acSavePrompt 'Đóng form đó lại
Ham_TatFormDangMo 'Lặp lại quá trình duyệt lần nửa
Next frm
End Sub
Public Sub Ham_TatFormDangMo_Loai2()
Dim obj As AccessObject, dbs As Object
Set dbs = Application.CurrentProject
'Duyet qua Tat ca form hien co.
For Each obj In dbs.AllForms
'Neu form dang mo thi dong no lai
If obj.IsLoaded = True Then DoCmd.Close acForm, obj.Name, acSavePrompt
Next obj
End Sub
yamakashi2003 > 06-04-21, 12:39 PM
(02-04-21, 12:03 AM)maidinhdan Đã viết: Chủ thớt xem kỹ lại bài #13 của Ongke;
ongke0711 > 06-04-21, 04:50 PM
(06-04-21, 12:39 PM)yamakashi2003 Đã viết:(02-04-21, 12:03 AM)maidinhdan Đã viết: Chủ thớt xem kỹ lại bài #13 của Ongke;
Thực ra vấn đề em muốn hỏi là khi file backend được sửa dữ liệu ở máy khác thì máy em làm sao có thể refresh được dữ liệu ở tất cả các form đang mở, chỉ bằng 1 code,
Còn cách me.refresh hoặc tắt từng form mở lại thì em biết rồi ạ