-
Tự động các field còn lại của Sub Form
Đình Phán > 10-06-22, 06:40 PM
Chào các anh chị.
Em đang có bài toán này chưa có lời giải, cụ thể em có 1 Form nhập liệu vào 2 bảng (gồm Main Form và Sub Form)
Nó tương tự như Form PhieuTra tại file anh Ongke0711 làm giúp em bên dưới.
https://www.mediafire.com/file/nj4lf988b...a.zip/file
Tuy nhiên em có 1 bảng tblCTGS chứa tất cả các thông tin cần nhập ở Form Phiếu Mượn
Em muốn khi em nhập So_CTGS, Nam_CTGS tại sub form thì các thông tin So_Thung, So_Tap sẽ truy vấn tại tblCTGS để điền vào sub form.
Sở dĩ phải theo 2 điều kiện trên, vì So_CTGS được đánh theo các năm có thể giống nhau.
Em cũng không DLooKup được, do yêu cầu theo 2 điều kiện.
Em cảm ơn -
RE: Tự động các field còn lại của Sub Form
cpucloi > 11-06-22, 06:09 AM
Bạn sẽ khó thực hiện các phương thức cập nhật (update) nếu không xác định được bản ghi duy nhất (khóa chính). Trước hết, bạn xem lại thiết kế bảng, bạn nên thêm khóa chính cho bảng (kinh nghiệm nên dùng AutoNumber). -
RE: Tự động các field còn lại của Sub Form
ongke0711 > 11-06-22, 10:43 AM
(10-06-22, 06:40 PM)Đình Phán Đã viết: Em muốn khi em nhập So_CTGS, Nam_CTGS tại sub form thì các thông tin So_Thung, So_Tap sẽ truy vấn tại tblCTGS để điền vào sub form.
Sở dĩ phải theo 2 điều kiện trên, vì So_CTGS được đánh theo các năm có thể giống nhau.
Em cũng không DLooKup được, do yêu cầu theo 2 điều kiện.
Như bạn CPULoi đã nói ở trên, muốn xử lý dữ liệu đúng thì Table tblCTGS phải có field là khóa chính.
CSDL Access hoàn toàn khác với dữ liệu Excel vì đối với Excel nó chỉ được gọi là "dữ liệu" chứ không phải "Cơ sở dữ liệu quan hệ" như Access. Nó đòi hỏi dữ liệu phải chuẩn hóa, ít nhất cũng chuẩn hóa ở mức cấp 1. Bạn muốn làm việc với Access thì phải bỏ công xử lý lại dữ liệu thô trước khi đưa vào Table của Access. Chứ để như vậy mà làm thì nó không trả về kết quả đúng thì cũng không ai muốn xử lý giùm bạn.
Như bạn nói là phải kết hợp thông tin của cả 2 Field [Số CTGS] + [Năm] thì mới tìm ra đúng dòng dữ liệu cần thao tác, vậy tại sao bạn không tạo thêm một Field nữa (làm ngay trong Excel) có dữ liệu là kết hợp của 2 Field trên và dùng nó làm khóa chính (không trùng) trước khi import dữ liệu vào Access.
Tôi cũng đã xử lý cách trên vào Table hiện tại tblCTGS của bạn và phát hiện ra nhiều dữ liệu rác như:
- Thiếu số năm.
- Thiếu mã So_CTGS
- Trùng lập dữ liệu: cùng số Năm, So_CTSG cùng [ngay_CTGS] => có hơn 7.000 dòng trùng 3 field trên, chỉ khác User. Nếu bạn muốn DLookup dựa trên 2 field [So_CTGS] + [Nam] thì kết quả trả về là nhiều dòng giống nhau chứ không phải một dòng duy nhất, vậy biết lấy dòng nào?
Xem cái query "Find Duplicate.."
Link file: https://www.mediafire.com/file/0qm7pm0cl...S.zip/file -
RE: Tự động các field còn lại của Sub Form
Đình Phán > 13-06-22, 09:23 AM
(11-06-22, 10:43 AM)ongke0711 Đã viết: Như bạn CPULoi đã nói ở trên, muốn xử lý dữ liệu đúng thì Table tblCTGS phải có field là khóa chính.
CSDL Access hoàn toàn khác với dữ liệu Excel vì đối với Excel nó chỉ được gọi là "dữ liệu" chứ không phải "Cơ sở dữ liệu quan hệ" như Access. Nó đòi hỏi dữ liệu phải chuẩn hóa, ít nhất cũng chuẩn hóa ở mức cấp 1. Bạn muốn làm việc với Access thì phải bỏ công xử lý lại dữ liệu thô trước khi đưa vào Table của Access. Chứ để như vậy mà làm thì nó không trả về kết quả đúng thì cũng không ai muốn xử lý giùm bạn.
Như bạn nói là phải kết hợp thông tin của cả 2 Field [Số CTGS] + [Năm] thì mới tìm ra đúng dòng dữ liệu cần thao tác, vậy tại sao bạn không tạo thêm một Field nữa (làm ngay trong Excel) có dữ liệu là kết hợp của 2 Field trên và dùng nó làm khóa chính (không trùng) trước khi import dữ liệu vào Access.
Tôi cũng đã xử lý cách trên vào Table hiện tại tblCTGS của bạn và phát hiện ra nhiều dữ liệu rác như:
- Thiếu số năm.
- Thiếu mã So_CTGS
- Trùng lập dữ liệu: cùng số Năm, So_CTSG cùng [ngay_CTGS] => có hơn 7.000 dòng trùng 3 field trên, chỉ khác User. Nếu bạn muốn DLookup dựa trên 2 field [So_CTGS] + [Nam] thì kết quả trả về là nhiều dòng giống nhau chứ không phải một dòng duy nhất, vậy biết lấy dòng nào?
Xem cái query "Find Duplicate.."
Link file: https://www.mediafire.com/file/0qm7pm0cl...S.zip/file
Cảm ơn anh Ongke0711,
Vấn đề trùng lặp dữ liệu ngay từ bài đầu tiên em hỏi anh đã cảnh báo và chỉ ra giúp em rồi. Em cũng biết là như thế, nhưng dữ liệu có vậy, em xóa đi không được mà thêm vào cũng ko biết thêm vào thông tin gì.
Em đang có ý tưởng là mình dùng 1 sự kiện nào đó trong sub form
Sau khi nhập xong So_CTGS và Nam_CTGS thì sẽ chạy sự kiện và dùng lệnh SELECT TOP 1 từ bảng tblCTGS để lấy ra thông tin cần thiết. (các trường thông tin cần lấy sẽ để Lock để người dùng không nhập vào)
Nhưng em chưa viết event nào là hợp lý ạ.Mã:SELECT TOP 1 tblCTGS.So_Thung FROM tblCTGS WHERE tblCTGS.So_CTGS = [Forms]![sfmPhieuTraCT]![So_CTGS] AND tblCTGS.Nam_CTGS = [Forms]![sfmPhieuTraCT]![Nam_CTGS]
-
RE: Tự động các field còn lại của Sub Form
ongke0711 > 13-06-22, 12:23 PM
(10-06-22, 06:40 PM)Đình Phán Đã viết: Tuy nhiên em có 1 bảng tblCTGS chứa tất cả các thông tin cần nhập ở Form Phiếu Mượn
Em muốn khi em nhập So_CTGS, Nam_CTGS tại sub form thì các thông tin So_Thung, So_Tap sẽ truy vấn tại tblCTGS để điền vào sub form.
Chính xác là bạn muốn xử lý trên Form nào?
Tôi thấy Form Phiếu Mượn chi có 1 form chính chứ đâu có SubForm đâu mà bạn nói là: "nhập [So_CTGS], [Nam_CTGS] tại subform"??
Còn nói về giải pháp "Select TOP 1...." thì cứ làm theo ý của bạn nhưng đã biết dữ liệu nó không chính xác mà vẫn làm à?
Ví dụ: cùng Số CTGS, cùng số Năm -> nó ra 7 dòng (có dòng khác về User), bạn "chọn đại" 1 dòng đầu tiên để nhập liệu thì nó còn gì là tính đúng đắn của dữ liệu.
Muốn chạy thì dùng sự kiện AfterUpdate của cả 2 Textbox nhập liệu đó để chạy lệnh gán dữ liệu. -
RE: Tự động các field còn lại của Sub Form
Đình Phán > 13-06-22, 05:35 PM
(13-06-22, 12:23 PM)ongke0711 Đã viết:
(10-06-22, 06:40 PM)Đình Phán Đã viết: Tuy nhiên em có 1 bảng tblCTGS chứa tất cả các thông tin cần nhập ở Form Phiếu Mượn
Em muốn khi em nhập So_CTGS, Nam_CTGS tại sub form thì các thông tin So_Thung, So_Tap sẽ truy vấn tại tblCTGS để điền vào sub form.
Chính xác là bạn muốn xử lý trên Form nào?
Tôi thấy Form Phiếu Mượn chi có 1 form chính chứ đâu có SubForm đâu mà bạn nói là: "nhập [So_CTGS], [Nam_CTGS] tại subform"??
Còn nói về giải pháp "Select TOP 1...." thì cứ làm theo ý của bạn nhưng đã biết dữ liệu nó không chính xác mà vẫn làm à?
Ví dụ: cùng Số CTGS, cùng số Năm -> nó ra 7 dòng (có dòng khác về User), bạn "chọn đại" 1 dòng đầu tiên để nhập liệu thì nó còn gì là tính đúng đắn của dữ liệu.
Muốn chạy thì dùng sự kiện AfterUpdate của cả 2 Textbox nhập liệu đó để chạy lệnh gán dữ liệu.
Form PhieuMuon là em ví dụ như Form Tra2 anh làm giúp em thôi ạ.
Tại Quản lý Mượn em cũng thiết kế Main From, Sub From.
Phần sự kiện AfterUpdate cần làm cho cả 2 text box luôn ạ?
Thực ra em dựng lên ứng dụng này, vừa để quản lý cho các dữ liệu cũ (đang có) và cho dữ liệu mới (từ 2022 trở đi) và dữ liệu mới này đảm bảo sẽ chuẩn.
Nên em chỉ nghĩ đến giải pháp thôi. Còn dữ liệu ko chuẩn, kết quả ko chính xác là tất yếu ạ. -
RE: Tự động các field còn lại của Sub Form
Đình Phán > 13-06-22, 07:06 PM
(13-06-22, 12:23 PM)ongke0711 Đã viết:
(10-06-22, 06:40 PM)Đình Phán Đã viết: Tuy nhiên em có 1 bảng tblCTGS chứa tất cả các thông tin cần nhập ở Form Phiếu Mượn
Em muốn khi em nhập So_CTGS, Nam_CTGS tại sub form thì các thông tin So_Thung, So_Tap sẽ truy vấn tại tblCTGS để điền vào sub form.
Chính xác là bạn muốn xử lý trên Form nào?
Tôi thấy Form Phiếu Mượn chi có 1 form chính chứ đâu có SubForm đâu mà bạn nói là: "nhập [So_CTGS], [Nam_CTGS] tại subform"??
Còn nói về giải pháp "Select TOP 1...." thì cứ làm theo ý của bạn nhưng đã biết dữ liệu nó không chính xác mà vẫn làm à?
Ví dụ: cùng Số CTGS, cùng số Năm -> nó ra 7 dòng (có dòng khác về User), bạn "chọn đại" 1 dòng đầu tiên để nhập liệu thì nó còn gì là tính đúng đắn của dữ liệu.
Muốn chạy thì dùng sự kiện AfterUpdate của cả 2 Textbox nhập liệu đó để chạy lệnh gán dữ liệu.
Mã:Private Sub So_CTGS_AfterUpdate()
Dim mySQL As String
Dim myDB As Database
Dim myRs As DAO.Recordset
mySQL = "SELECT top 1 tblCTGS.So_Thung, tblCTGS.So_Tap, tblCTGS.Gia_De, tblCTGS.Kho FROM tblCTGS WHERE tblCTGS.So_CTGS = " & Forms![sfmMuonDetail]![So_CTGS].Value & " AND tblCTGS.Nam_CTGS = " & Forms![sfmMuonDetail]![Nam_CTGS].Value & ";"
Set myDB = CurrentDb
Set myRs = myDB.OpenRecordset(mySQL)
Me.So_Thung.Value = myRs!So_Thung
Me.So_Tap.Value = myRs!So_Tap
Me.Gia_De.Value = myRs!Gia_De
Me.Kho.Value = myRs!Kho
Set myRs = Nothing
Set myDB = Nothing
End Sub
Em có dùng đoạn code này nhưng vẫn báo sai tại dòng mySQL