• Truy vấn trực tiếp đến textbox subform Bound
  • RE: Truy vấn trực tiếp đến textbox subform Bound

    yamakashi2003 > 13-10-20, 09:32 PM

    (13-10-20, 01:15 AM)tranthanhan1962 Đã viết: Hiểu rồi! Bạn phải sử dụng bộ lọc của bạn. Dựa trên query bạn tạo. Do bạn dùng bộ lọc hệ thống để lọc, nên khi kiểm tra record source của form F_ChitietHang là Q_chitietHang, nó sẽ thấy thiếu tham số nên đòi bạn nhập tham số vào. Đây không phải lỗi mà do bạn xác định nguồn của query do bạn đặt tham số, nhưng bạn dùng phương pháp khác để xử lý. thiếu tham số thì nó đòi thôi.
    Nếu bạn làm đúng "quy trình" thì nó sẽ không báo lỗi
    Vâng em hiểu rồi ạ, nhưng ý em là hỏi cách: ấn tìm kiếm thoải mái và filter rồi chạy mà báo cáo không lỗi ạ,
    chắc chỉ có cách chạy lại record source của bác ông kẹ thôi  phải không ạ
  • RE: Truy vấn trực tiếp đến textbox subform Bound

    tranthanhan1962 > 13-10-20, 11:37 PM

    Không phải là không được! Nhưng khi bạn lọc bằng bộ lọc form hệ thống thì:
    1/Bạn phải bỏ hết tất cả các điều kiện lọc mà bạn đã tự tạo trên query
    2/Tạo một tetxbox trên sub form để lấy giá trị biểu thức lọc trên form sau mỗi lần lọc. Đây cũng là biểu thức lọc trên report
    Giá trị biểu thức lọc trên form là =[Filter].
    Nhớ bỏ lọc sau lệnh open report. Đây là điểm khác biệt giữa accdb và mdb. mdb khi bạn close form thì bộ lọc form sẽ xóa và khi mở form lai nó sẽ không được lọc băng bộ lọc cũ. con accdb sẽ lưu bộ lọc cho đến lần mở form sau đó
  • RE: Truy vấn trực tiếp đến textbox subform Bound

    yamakashi2003 > 14-10-20, 11:43 AM

    (13-10-20, 11:37 PM)tranthanhan1962 Đã viết: Không phải là không được! Nhưng khi bạn lọc bằng bộ lọc form hệ thống thì:
    1/Bạn phải bỏ hết tất cả các điều kiện lọc mà bạn đã tự tạo trên query
    2/Tạo một tetxbox trên sub form để lấy giá trị biểu thức lọc trên form sau mỗi lần lọc. Đây cũng là biểu thức lọc trên report
    Giá trị biểu thức lọc trên form là =[Filter].
    Nhớ bỏ lọc sau lệnh open report. Đây là điểm khác biệt giữa accdb và mdb. mdb khi bạn close form thì bộ lọc form sẽ xóa và khi mở form lai nó sẽ không được lọc băng bộ lọc cũ. con accdb sẽ lưu bộ lọc cho đến lần mở form sau đó

    1/Bạn phải bỏ hết tất cả các điều kiện lọc mà bạn đã tự tạo trên query => bác chỉ em rõ hơn được không ạ
    Em có thử dùng câu lệnh này để gán lại nguồn cho form trước khi chạy báo cáo:
    • Me.SF_ChitietHang.Form.RecordSource = "q_chitietHang"DoCmd.OpenReport "R_ChitietHang", acViewPreview, , Forms![F_BaoCao]![SF_ChitietHang].Form.Filter, acWindowNormalForms![F_BaoCao]![SF_ChitietHang].Form.FilterOn = False
    nhưng vẫn lỗi
    2/Tạo một tetxbox trên sub form để lấy giá trị biểu thức lọc trên form sau mỗi lần lọc. Đây cũng là biểu thức lọc trên report
    Giá trị biểu thức lọc trên form là =[Filter]. 
    => trên subform f_chitiethang em đã tạo textobx: txtFilter có giá trị bằng =[Filter]. và gán vào trường filter của report biểu thức = Forms![F_chitietHang]![txtFilter]
    nhưng mỗi khi lọc -> chạy report, biểu thức này lại bị access thay đổi, và chạy báo cáo ra vẫn bị lỗi như video em gửi ở trên 
  • RE: Truy vấn trực tiếp đến textbox subform Bound

    ongke0711 > 14-10-20, 01:42 PM

    (14-10-20, 11:43 AM)yamakashi2003 Đã viết: 1/Bạn phải bỏ hết tất cả các điều kiện lọc mà bạn đã tự tạo trên query => bác chỉ em rõ hơn được không ạ
    Em có thử dùng câu lệnh này để gán lại nguồn cho form trước khi chạy báo cáo:
    • Me.SF_ChitietHang.Form.RecordSource = "q_chitietHang"DoCmd.OpenReport "R_ChitietHang", acViewPreview, , Forms![F_BaoCao]![SF_ChitietHang].Form.Filter, acWindowNormalForms![F_BaoCao]![SF_ChitietHang].Form.FilterOn = False
    nhưng vẫn lỗi
    2/Tạo một tetxbox trên sub form để lấy giá trị biểu thức lọc trên form sau mỗi lần lọc. Đây cũng là biểu thức lọc trên report
    Giá trị biểu thức lọc trên form là =[Filter]. 
    => trên subform f_chitiethang em đã tạo textobx: txtFilter có giá trị bằng =[Filter]. và gán vào trường filter của report biểu thức = Forms![F_chitietHang]![txtFilter]
    nhưng mỗi khi lọc -> chạy report, biểu thức này lại bị access thay đổi, và chạy báo cáo ra vẫn bị lỗi như video em gửi ở trên 


    Tôi đã giải thích rất rõ trong bài trước, bạn đọc cho kỹ để hiểu. Tôi cũng đã đưa ra giải pháp thứ 3 cho bạn luôn rồi mà bạn cũng không tìm hiểu xem nó như thế nào.
  • RE: Truy vấn trực tiếp đến textbox subform Bound

    yamakashi2003 > 14-10-20, 01:57 PM

    (14-10-20, 01:42 PM)ongke0711 Đã viết:
    (14-10-20, 11:43 AM)yamakashi2003 Đã viết: 1/Bạn phải bỏ hết tất cả các điều kiện lọc mà bạn đã tự tạo trên query => bác chỉ em rõ hơn được không ạ
    Em có thử dùng câu lệnh này để gán lại nguồn cho form trước khi chạy báo cáo:
    • Me.SF_ChitietHang.Form.RecordSource = "q_chitietHang"DoCmd.OpenReport "R_ChitietHang", acViewPreview, , Forms![F_BaoCao]![SF_ChitietHang].Form.Filter, acWindowNormalForms![F_BaoCao]![SF_ChitietHang].Form.FilterOn = False
    nhưng vẫn lỗi
    2/Tạo một tetxbox trên sub form để lấy giá trị biểu thức lọc trên form sau mỗi lần lọc. Đây cũng là biểu thức lọc trên report
    Giá trị biểu thức lọc trên form là =[Filter]. 
    => trên subform f_chitiethang em đã tạo textobx: txtFilter có giá trị bằng =[Filter]. và gán vào trường filter của report biểu thức = Forms![F_chitietHang]![txtFilter]
    nhưng mỗi khi lọc -> chạy report, biểu thức này lại bị access thay đổi, và chạy báo cáo ra vẫn bị lỗi như video em gửi ở trên 


    Tôi đã giải thích rất rõ trong bài trước, bạn đọc cho kỹ để hiểu. Tôi cũng đã đưa ra giải pháp thứ 3 cho bạn luôn rồi mà bạn cũng không tìm hiểu xem nó như thế nào.
    à em có hiểu cái đó rồi ạ,
    vì em tháy bác thanhhan đưa ra giải pháp có vẻ ngắn mà đơn giản hơn nên e đang tìm hiểu
  • RE: Truy vấn trực tiếp đến textbox subform Bound

    tranthanhan1962 > 14-10-20, 05:51 PM

    Nếu đã dùng bộ lọc hệ thống thì bỏ hết criteria của query, thậm chí lấy table làm recordsource cũng được. Khi Record source của table và Report giống nhau, Filter giống nhau thì kết quả giống nhau. Report cũng là giao diện như form. Form là giao diện trên màn hình, Report là giao diên trên giấy. Có gì đâu khó hiểu
  • RE: Truy vấn trực tiếp đến textbox subform Bound

    ongke0711 > 14-10-20, 05:56 PM

    (14-10-20, 01:57 PM)yamakashi2003 Đã viết:
    (14-10-20, 01:42 PM)ongke0711 Đã viết:
    (14-10-20, 11:43 AM)yamakashi2003 Đã viết: 1/Bạn phải bỏ hết tất cả các điều kiện lọc mà bạn đã tự tạo trên query => bác chỉ em rõ hơn được không ạ
    Em có thử dùng câu lệnh này để gán lại nguồn cho form trước khi chạy báo cáo:
    • Me.SF_ChitietHang.Form.RecordSource = "q_chitietHang"DoCmd.OpenReport "R_ChitietHang", acViewPreview, , Forms![F_BaoCao]![SF_ChitietHang].Form.Filter, acWindowNormalForms![F_BaoCao]![SF_ChitietHang].Form.FilterOn = False
    nhưng vẫn lỗi
    2/Tạo một tetxbox trên sub form để lấy giá trị biểu thức lọc trên form sau mỗi lần lọc. Đây cũng là biểu thức lọc trên report
    Giá trị biểu thức lọc trên form là =[Filter]. 
    => trên subform f_chitiethang em đã tạo textobx: txtFilter có giá trị bằng =[Filter]. và gán vào trường filter của report biểu thức = Forms![F_chitietHang]![txtFilter]
    nhưng mỗi khi lọc -> chạy report, biểu thức này lại bị access thay đổi, và chạy báo cáo ra vẫn bị lỗi như video em gửi ở trên 


    Tôi đã giải thích rất rõ trong bài trước, bạn đọc cho kỹ để hiểu. Tôi cũng đã đưa ra giải pháp thứ 3 cho bạn luôn rồi mà bạn cũng không tìm hiểu xem nó như thế nào.
    à em có hiểu cái đó rồi ạ,
    vì em tháy bác thanhhan đưa ra giải pháp có vẻ ngắn mà đơn giản hơn nên e đang tìm hiểu

    Chỉ cần thêm 3 dòng code thôi nhé. 
  • RE: Truy vấn trực tiếp đến textbox subform Bound

    thuyyeu99 > 15-10-20, 01:51 PM

    (14-10-20, 05:56 PM)ongke0711 Đã viết:
    • Me.SF_ChitietHang.Form.RecordSource = "q_chitietHang"DoCmd.OpenReport "R_ChitietHang", acViewPreview, , Forms![F_BaoCao]![SF_ChitietHang].Form.Filter, acWindowNormalForms![F_BaoCao]![SF_ChitietHang].Form.FilterOn = False
    Hình như em có đọc ở đâu đó dùng Filter nó chậm hơn query phải không anh ?
  • RE: Truy vấn trực tiếp đến textbox subform Bound

    ongke0711 > 15-10-20, 03:19 PM

    (15-10-20, 01:51 PM)thuyyeu99 Đã viết:
    (14-10-20, 05:56 PM)ongke0711 Đã viết:
    • Me.SF_ChitietHang.Form.RecordSource = "q_chitietHang"DoCmd.OpenReport "R_ChitietHang", acViewPreview, , Forms![F_BaoCao]![SF_ChitietHang].Form.Filter, acWindowNormal
    • Forms![F_BaoCao]![SF_ChitietHang].Form.FilterOn = False
    Hình như em có đọc ở đâu đó dùng Filter nó chậm hơn query phải không anh ?

    Dùng Form Filter sẽ nhanh hơn Query nhưng việc dùng cái nào phải còn tuỳ theo nhiều trường hợp xử lý nữa.
    - Filter thì recordset sẽ lưu vào bộ nhớ Cache và trả về hay lọc tiếp rất nhanh. Thường thì dùng để lọc với các tham số rõ ràng, được chọn ra từ droplist. Ví dụ: Filter với MaStore ="9103".
    - Dùng Query: thì Access xử lý và lưu vô Record Source của Form, không lưu vào cache, muốn lọc thì phải chạy lại cái khác. Dùng Querry đối với các trường hợp gọi là "Full text search" tức là gõ ký tự vô rồi lọc records có chứa cái text gõ đó. 
  • RE: Truy vấn trực tiếp đến textbox subform Bound

    tranthanhan1962 > 15-10-20, 05:27 PM

    Sử dụng Form filter không phải là không được. Như mister ongke0711 hướng dẫn xử lý bằng query là phương pháp an toàn và dễ hiểu nhất mà bạn yamakashi2003 còn khó tiếp nhận thì đến việc code để xử lý form filter còn khó hơn. Đúng như bạn thuyyeu99 đã viết "form filter chậm hơn query". Đó là điều tất nhiên vì query là bộ lọc đơn giản với vài ba điều kiện (criteria), trong khi đó form filter là một bộ lọc hệ thống phức tạp cho tất cả các field của form datasheet với nhiêu kiểu lọc. Có nhiều bạn nghĩ rằng bộ lọc chỉ như thế này:
    [Hình: XSEO0Xk.png]
    Còn nữa:
    [Hình: 6SoqzBj.png]
    Chưa hết form access còn có thể xử lý tồn tại bộ lọc nhưng có quyền lọc hoăc không lọc:
    [Hình: kRoCvV9.png]
    Đúng là trên nguyên tắc nếu form và query có cùng recordsource và cùng biểu thức filter thì sẽ cho kết quả giống nhau. Nhưng với code của ongke0711 mà bạn yamakashi2003 chưa nuốt nỗi thì thử xem bạn cảm nhận gì được bộ code dành cho form filter mà tôi sẽ trình bày dưới đây dựa trên CSDL của bạn. Tôi không làm demo vì có cảm giác không phải bạn nhờ anh em giúp mà nhờ người làm hộ. Điều đầu tiên là tôi sẽ dùng table T_chitietHang lam recordsource cho cả sub form F_chitietHang và R_chitietHang, vì đã dùng bộ lọc form thì không cần query xử lý lọc nữa.
    Dù rằng tôi đã nói "form và query có cùng recordsource và cùng biểu thức filter" nhưng nếu so sánh trực tiếp:
    Report_R_chitietHang.Filter=Form_F_ChitietHang.Filter thì access sẽ báo lỗi ngay (trường hợp thường thấy khi access không xác đinh rõ ràng kiểu dữ liệu). Tất nhiên có nhiều cách xử lý, nhưng tôi sẽ sử lý một cách tuy hơi rườm rà nhưng có thể nói là dễ hiểu:
    Trên main form F_BaoCao tôi tạo một textbox tạm gọi Filter_F_chitietHang có giá trị =[SF_ChitietHang].[Form].[Filter] để lấy giá trị biểu thức filter của sub form này. Tất nhiên dù có biểu thức filter nhưng form vẫn có quyền lọc hoặc không lọc nên phải tạo thêm một textbox nữa tạm gọi FilterOn_F_chitietHang = [SF_ChitietHang].[Form].[FilterOn] đễ xác định form có đang lọc hay không.
    Trên form F_BaoCao button Command12 chỉ cần sử dụng mở repord một cách đơn giản
    Private Sub Command12_Click()

         DoCmd.OpenReport "R_chitietHang", acViewPreview
    End Sub
    Viêc lọc hay không, lọc như thế nào thì repord sẽ căn cứ vào giá trị của Filter_F_chitietHang và FilterOn_F_chitietHang xử lý:
    Vì vậy Khi mở report nó phải lọc để gống form F_chitietHang
    Private Sub Report_Open(Cancel As Integer)

         Me.Filter = Form_F_BaoCao.Filter_F_chitietHang.Value
         Me.FilterOn = Form_F_BaoCao.FilterOn_F_chitietHang.Value
    End Sub
    Đôi khi trên form không có lọc nhưng report vẫn lọc. Cái vụ nhớ bộ lọc cũ của access nà lúc có lúc không tôi vẫn chưa hiểu nguyên tắc của nó. Thôi thì dẹp nó đi cho chắc ăn.
    Private Sub Report_Load()

         Me.Filter = ""
    End Sub