Lớp học GPE tháng 10 - TPHCM: Conditional Formatting và Data Validation (tối 4, 6/10) | Excel cơ bản (tối 9, 11, 13/10) |
Thuần thục các hàm dò tìm (tối 10, 12/10) | Tất tần tật về PivotTable (tối 16, 18, 20/10) |
Tất tần tật về Filter và Advanced Filter (tối 23, 25/10) | Name động và biểu đồ (tối 24, 26, 28/10)

Đăng ký học Khởi đầu cùng Google Spreadsheet - 2 chủ nhật 1 và 8/10 - TPHCM

Đăng ký học Xây dựng ứng dụng Form bằng VBA - 2 chủ nhật 15 và 22/10 - TPHCM

Tạo form tìm kiếm đơn giản trong access

Thảo luận trong 'Ứng dụng Quản trị cơ sở dữ liệu' bắt đầu bởi dinhhe213, 3 Tháng sáu 2010.

  1. dinhhe213

    dinhhe213 Thành viên mới

    Bây giờ tôi có một tệp tin CSDL bao gồm các trường Mã, Tên, Địa Chỉ, DT, ... Nói chung là chỉ một bảng thôi. Tôi muốn tạo 1 form kiểu như thế này
    [​IMG]
    1Combo box load xuống khi không muốn gõ. 1 Subform hiện lên danh sách trong có mã trong combo. Một nút kìm kiếm, một nút thoát. Nút tìm kiếm có mục đích tìm khi không click vào combo mà tự gõ mã.

    Có ai làm được chỉ giùm tui chi tiết chút nha. Cảm ơn nhiều!!
     
  2. Hai Lúa Miền Tây

    Hai Lúa Miền Tây Thành viên gạo cội Staff Member Super Moderator

    Tạo 1 query
    Mã:
    SELECT Table1.STT, Table1.NGÀY, Table1.TÊN, Table1.[MA MAY], Table1.[MA KH]
    FROM Table1
    WHERE (((Table1.[MA KH]) Like [forms]![form1]![loc]));
    
    Tạo form có tên là Form1

    Trên form thiết kế các object như sau:

    -Subform có tên: KH

    -Combobox: loc
    RowSource:

    Mã:
    SELECT Table1.[MA KH], Table1.TÊN
    FROM Table1
    GROUP BY Table1.[MA KH], Table1.TÊN;
    
    Code cho Combo

    Mã:
    Private Sub loc_AfterUpdate()
    Forms!form1.KH.SourceObject = "Query.Query1"
    
    End Sub
    -CommandButton: cmdTatCa, caption: Tất Cả

    Mã:
    Private Sub cmdTatCa_Click()
    loc = "*"
    Forms!form1.KH.SourceObject = "Query.Query1"
    
    End Sub
    -CommandButton: cmdThoat, caption: Thoát

    Mã:
    Private Sub cmdThoat_Click()
    On Error GoTo Err_cmdThoat_Click
    
    
        DoCmd.Close
    
    Exit_cmdThoat_Click:
        Exit Sub
    
    Err_cmdThoat_Click:
        MsgBox Err.Description
        Resume Exit_cmdThoat_Click
        
    End Sub
    
    Code cho form

    Mã:
    Private Sub Form_Load()
    loc = "*"
    Forms!form1.KH.SourceObject = "Query.Query1"
    End Sub
     

    Các file đính kèm:

    • LOc.rar
      Kích thước:
      21.9 KB
      Đọc:
      4,582
  3. dinhhe213

    dinhhe213 Thành viên mới

    A ơi! Làm Query thế này hay bị lỗi quá. Không biết nhưng mà e làm bị lỗi hoài cứ xoá đi làm lại nhiều lần quá. Nó báo lỗi thế này
    [​IMG]
    Thật ra e ko chỉ làm lọc mỗi mã đâu, e còn lọc thêm ngày tháng, tên và nhiều nữa. E lấy code của a làm mẫu nhưng mà nó báo lỗi nhiều quá ko làm được. Có cách nào khắc phục ko a?
    Cho e hỏi thêm: Nếu mình cho lọc ngay trong table thì có được không?
     
    Lần chỉnh sửa cuối: 5 Tháng sáu 2010
  4. phatnq2002

    phatnq2002 Thành viên mới

    Theo tôi đề nghị, bạn không cần phải làm thêm nút Tìm kiếm.
    Bạn chỉ cần áp dụng cách thiết kế Master - Detail của Access là được.

    Giả sử cái combo box của bạn có tên là cboMAMAY.
    Bạn chọn cái subform, mở cửa sổ Properties ra, vào cái thẻ Data, chọn:
    Link Master Fields: cboMAMAY
    Link Child Fields: MAMAY

    Vậy là OK rồi. Mỗi khi có sự thay đổi nội dung combo box, nó sẽ thay đổi dữ liệu trong subform
     
  5. Hai Lúa Miền Tây

    Hai Lúa Miền Tây Thành viên gạo cội Staff Member Super Moderator

    Bạn gửi cái file của bạn lên mình sẽ xem giúp, có thể sẽ không dùng phương pháp cũ để lọc.
     
  6. TranThanhPhong

    TranThanhPhong Thời gian !!!

    Xem file mẫu này cũng hay nè bạn :)
     

    Các file đính kèm:

  7. bio87

    bio87 Thành viên mới

    Em là thành viên mới của GPE ạ. Bữa rồi trong lúc làm Chương trình cho công ty, em vào xem topic của các anh ạ
    Em áp dụng như file Access anh gửi nhưng không hiêu sao báo lỗi và không chạy được

    Đây là đoạn codes

    Private Sub Command23_Click()
    ' Update the record source
    Me.frmsubDulieuKhachhangXK.Form.RecordSource = "SELECT * FROM QryCIFXK " & BuildFilter
    (đây là chỗ bị báo lỗi method not found ạ)

    ' Requery the subform
    Me.frmsubDulieuKhachhangXK.Requery
    End Sub
    Private Function BuildFilter() As Variant
    Dim varWhere As Variant
    varWhere = Null ' Main filter

    If Me.Chinhanh_filter > 0 Then
    varWhere = varWhere & "[Chi_Nhanh] = " & Me.Chinhanh_filter & " AND "
    End If
    If Me.Khachhang_filter > "" Then
    varWhere = varWhere & "[Khach_Hang] LIKE """ & Me.Khachhang_filter & "*"" AND "
    End If
    If Me.CIF_filter > "" Then
    varWhere = varWhere & "[CIF] LIKE """ & Me.CIF_filter & "*"" AND "
    End If
    If Me.Taikhoan_filter > "" Then
    varWhere = varWhere & "[Tai_Khoan] LIKE """ & Me.Taikhoan_filter & "*"" AND "
    End If
    If Me.Bieuphi_filter > "" Then
    varWhere = varWhere & "[Bieu_Phi] LIKE """ & Me.Bieuphi_filter & "*"" AND "
    End If
    If Me.Ghichu_filter > "" Then
    varWhere = varWhere & "[Ghi_Chu] LIKE """ & Me.Khachhang_filter & "*"" AND "
    End If

    BuildFilter = varWhere
    End Function

    Em đã kiểm tra hết mà không hiểu sai ở đâu. Mong các anh giúp em. Em cảm ơn nhìu.
     
  8. bio87

    bio87 Thành viên mới

    Đây là file Access của em ạ
     

    Các file đính kèm:

    • LCXK.rar
      Kích thước:
      37.7 KB
      Đọc:
      666
  9. nguoiconxunui

    nguoiconxunui Thành viên chính thức

    1. Tham chiếu subform sai: (xem lại subform Name # subform label) cái bạn đang tham chiếu là subform label , bạn cần biết chính xác subform name
    2. Câu query của bạn viết nhìn vào chả hiểu ráo: theo minh hiểu là bạn dùng cấu trúc
    Select * from Query{source} Where Col1 = "xxx" and col2 = "yyy"
    Tuy nhiên mình thấy bạn định nghĩa varWhere không biết có giống Where ? giống thì mới xét tiếp, nếu không thì exit sub mà debug là vừa
    Phải hiểu được cấu trúc của câu SQL kia mới viết được điều kiện mà bạn viết là BuildFilter()
    ---------------
    Đúng hơn hãy viết cái sub nhìn cho rõ ràng dễ hiểu, kiểu:
    Mã:
    dim strSQl as string
    if condition (1) then
    strSQL= " " 
    else if condition (2) then
    strSQl=" "
    end if
    Forms!Form_main!Form_sub.form.recordSource = strSQL
    Forms!Form_main!Form_sub.form.recordSource.Requery
     
  10. bio87

    bio87 Thành viên mới

    - Em đã sửa lại cái Subform Name rùi ạ. Nhưng lại nảy sinh vấn đề. Nó bào lỗi cái từ FROM ở trong câu lệnh:
    Me.frmsubDulieuKhachhangXK.Form.RecordSource = "SELECT * FROM QryCIFXK " & BuildFilter. Lỗi FROM syntax error.
    - Cái BuildFilter em tham khảo chỗ file Access của anh TranThanhPhong. Em muốn lọc dữ liệu theo nhiều điều kiện. Nếu lọc dữ liệu theo một điều kiện thì em có thể tạo Query cho DataSource của Subform được mà. Mà em thấy Query trong cho Form chỉ lọc theo một điều kiện thôi phải không ạ.
    - Chú thích cái codes của em là 1 cai sub với 1 cái function ạ
    Cái Function này là :

    Private Function BuildFilter() As Variant
    Dim varWhere As Variant
    varWhere = Null ' Main filter

    If Me.Chinhanh_filter > 0 Then
    varWhere = varWhere & "[Chi_Nhanh] = " & Me.Chinhanh_filter & " AND "
    End If
    If Me.Khachhang_filter > "" Then
    varWhere = varWhere & "[Khach_Hang] LIKE """ & Me.Khachhang_filter & "*"" AND "
    End If
    If Me.CIF_filter > "" Then
    varWhere = varWhere & "[CIF] LIKE """ & Me.CIF_filter & "*"" AND "
    End If
    If Me.Taikhoan_filter > "" Then
    varWhere = varWhere & "[Tai_Khoan] LIKE """ & Me.Taikhoan_filter & "*"" AND "
    End If
    If Me.Bieuphi_filter > "" Then
    varWhere = varWhere & "[Bieu_Phi] LIKE """ & Me.Bieuphi_filter & "*"" AND "
    End If
    If Me.Ghichu_filter > "" Then
    varWhere = varWhere & "[Ghi_Chu] LIKE """ & Me.Khachhang_filter & "*"" AND "
    End If

    BuildFilter = varWhere
    End Function

    Cái Varwhere chính là Where trong cấu trúc mà anh nói đấy ạ
    Select * from Query{source} Where ...... Còn cái BuildFilter chính là các điều kiện sau Where.
    Em cảm ơn sự giúp đỡ của anh nhiều lắm.
     
  11. nguoiconxunui

    nguoiconxunui Thành viên chính thức

    ặc, ncxn nói lần nữa nhé:
    1. tham chiếu sai (vì sao thì là ncxn đã mở file bạn xem rồi nên mới biết nó sai)
    Cụ thể: sub của bạn có tên fm_x_y_z gì đó -> cái này do lúc bạn tạo main/subform theo wizard bạn đã đặt tên cho nó nên access hiểu theo tên này
    Tham chiếu trong VBA làm ơn viết đầy đủ nếu chưa hiểu, theo cấu trúc sau:
    Forms!Form_main!Form_sub.form.<exp> (<exp> là control hoặc thuộc tính có thể sử dụng trên subform)
    2. Đã nó đọc cái câu SQL của bạn muốn mệt cả người, đã chỉ thì không chịu đọc , copy cái code người ta mà lại chả hiểu mô tê gì ráo
    Ví dụ nhé, khi bạn click sẽ chạy câu này
    SELECT * FROM QryCIFXK & BuildFilter()
    tiếp nó tìm BuildFilter()
    Cái if đầu tiền: nếu chỉ chọn lọc chi nhánh thôi thì SQL của bạn nó ra thế này
    SELECT * FROM QryCIFXK Where [Chi_Nhanh] = '& Me.Chinhanh_filter' AND
    -> Dư chữ AND , mới bước đầu tiền đã lỗi rồi thì nói gì tới các bước tiếp theo?
     
  12. bio87

    bio87 Thành viên mới

    Em đã sửa lại cái Subform Name rồi mà. Em đã sửa cái Subform Name ngay trên Main form la fm_CIF_XK. Nên nó không báo lỗi về Form nữa.
    Thứ hai là em thấy cái Codes gốc của anh TranThanhPhong ý, câu lệnh :
    varWhere = varWhere & "[Chi_Nhanh] = " & Me.Chinhanh_filter & " AND "
    Từ "And" cho phép lọc dữ liệu với nhiều điều kiện, em nghĩ vậy.
    Anh có thể nói rõ ra cho em biết tại sao trong file Access của anh Phong, codes chạy được mà của em không chạy được. Hiện tại, ngoài lỗi Subform Name em đã sửa, em vẫn chưa hiểu lỗi gì nữa. Kể cả khi em đã sửa lại đường dẫn Form giống như của anh, nó vẫn báo lỗi Clause FROM. Em nghĩ không phải nó báo lỗi cái BuildFilter mà nó báo lỗi cai Query ý |||||.
    Hì, cảm ơn anh nhìu, cơ mà anh đừng nóng với em nha +-+-+-+.
    Em attach file vào rùi.
     

    Các file đính kèm:

    • LCXK.rar
      Kích thước:
      51.4 KB
      Đọc:
      336
  13. nguoiconxunui

    nguoiconxunui Thành viên chính thức

    mình hỏi 1 chút nhé:
    1.Bạn có thể diễn giải điều bạn muốn lọc(tìm kiếm) bằng ngôn ngữ viết không?
    2.Nếu diễn giải được bằng ngôn ngữ viết rồi, bạn hãy viết một câu SQL hoàn chỉnh cho điều kiện lọc đó không?
    -- --- --
    Chú ý:
    Hãy quên đi cái code của người đi trước nhé (đừng có lấy cái của họ áp vào mà mình không hiểu!)
    Tìm hiểu kỹ SQL trước khi làm nhé
    bạn đừng attach file thêm nữa (nhiều file chỉ cùng 1 vấn đề), nếu mình muốn làm thay cho bạn thì mình đã làm rồi,ỏw đây mình muốn bạn phải hiểu được những gì mình làm, tránh câu hỏi như thế này:
    "Tại sao code đó của anh kia thì chạy được mà em làm chạy không được?"
    -- ---- ----
     
  14. bio87

    bio87 Thành viên mới


    Tất nhiên là em biết em muôn lọc dữ liệu gì, và theo những điều kiện gì.
    Thứ hai là, nếu em viết được codes để lọc thì em đã không phải đi tham khảo của anh TranThanhPhong. Và hơn nữa, em tham khảo thì em cũng phải biết tại sao em không thể áp dụng được codes của anh Phong được. Có những khác biệt gì. Và nếu trong trường hợp file của em thì em phải làm thế nào. Nếu em có thể tự trả lời hết các câu hỏi thì em đã không hỏi các anh, những người có kinh nghiệm làm gì cả.
    Em hiểu những cái anh đưa ra, nhưng VD như codes này :
    if condition (1) then
    strSQL= " "
    else if condition (2) then
    strSQl=" "
    end if
    thì câu lệnh có lẽ sẽ phức tạp, vì em muốn lọc dữ liệu theo các criteria khác nhau. Với hơn 2 conditions thì câu lênh if sẽ phức tạp. Trong khi đó, file của anh Tran Thanh Phong làm được điều đó. Cái gì hay của người khác em nghĩ là nên học hỏi, và áp dụng nểu thấy thích hợp. Nếu không anh Phong share cho mọi người làm gì ạ?
    Nếu anh có thể giải thích cụ thể hơn em phải sửa ra sao, em xin cảm ơn.
     
  15. bio87

    bio87 Thành viên mới

    Em đã hỏi và được nghe giải thích cụ thể rồi ạ. Dù sao cũng cảm ơn anh rất nhìu.:hug:
     
  16. nguoiconxunui

    nguoiconxunui Thành viên chính thức

    1. không phải hiểu và muốn mà là phát biểu thành ngôn ngữ viết (mình nói có khó hiểu không nhỉ): phát biểu thành ngôn ngữ viết rất có lợi đối với những ai muốn học tiếp!
    2. Cách phát biểu của mình và của TranThanhPhong là hoàn toàn giống nhau về ý nghĩa -> thế mà bạn bảo bạn hiểu, còn nói là nó phức tạp !? thiệt tình mình viết mấy bài trong topic này hy vọng bạn hiểu (và bạn gì hum bữa yêu cầu lập form tìm kiếm gì đó cũng đọc các bài này).
    3. Đến đây thậm chí mình nghi ngờ bạn có đọc các bài viết của mình mà có một chút gì đọng lại hay không (vì những thứ mà bạn sai minh viết đã in đậm lên cả rồi)
    4. Thôi thì giải thích tại sao bạn sai bằng cái code của TranThanhPhong Vậy!

    Mình chú thích vì sao bạn làm không được trong đó! Nhớ đọc cho kỹ
    Trong này có thêm màu mè gì đó chắc là bạn không cần nhỉ
     
  17. bio87

    bio87 Thành viên mới

    /-*+/ Em đã thêm phần xử lý chữ AND nên codes đã hoạt động rồi ạ.
     
  18. hoaipnb

    hoaipnb Thành viên mới

    Chào các bạn.
    Mình cũng dựa vào đoạn code trên để tạo 1 form tìm kiếm và đã thành công với tìm theo tên người, tuy nhiên khi mình làm thêm tìm theo ngày tháng thì báo lỗi.
    Nhờ các bạn cho giúp mình đoạn code tìm ngày tháng để tham khảo.
    Thanks các bạn đã quan tâm
     
  19. sealand

    sealand Thành viên gạo cội

    Đây là điều hay gặp, điều kiện lọc trên Form có thể từ TextBox, Combo, DTPicker...rất có thể nó chưa phải kiểu dữ liệu Date như trong Recordset. Vậy bạn nên dùng hàm ngày tháng để chuyển đổi sang dạng Date và đưa vào SQL. Như vậy việc so sánh mới chuẩn xác và chắc bạn sẽ có kết quả như yêu cầu.
     
  20. hoaipnb

    hoaipnb Thành viên mới

    Bạn domfootwear có cách nào khác để khắc phục đc trường hợp cùng tìm tên và ngày ko vậy ?
     

Chia sẻ trang này