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

Liên hệ QC

dinhhe213

Thành viên mới
Tham gia
21/11/08
Bài viết
6
Được thích
1
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
anhs.png

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!!
 
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

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!!

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
 

File đính kèm

  • LOc.rar
    21.9 KB · Đọc: 4,713
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
loi.png

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:
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
 
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
loi.png

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?

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.
 
Xem file mẫu này cũng hay nè bạn :)
 

File đính kèm

  • dbSearchExample.zip
    23.8 KB · Đọc: 2,485
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.
 
Đây là file Access của em ạ
 

File đính kèm

  • LCXK.rar
    37.7 KB · Đọc: 700
Đây là file Access của em ạ

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
 
- 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.
 
ặ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?
 
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.
 

File đính kèm

  • LCXK.rar
    51.4 KB · Đọc: 356
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?"
-- ---- ----
 
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?"
-- ---- ----


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.
 
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?"
-- ---- ----

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:
 
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.

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ỹ
' *************************************
'
' Search Form Example
' by gromit
' 12-26-05
'
' You are free to adapt this for your own use
'
' *************************************

Option Compare Database
Option Explicit

Private Sub btnClear_Click()
Dim intIndex As Integer
'Đây là thủ tục làm cho các ô tìm kiếm trở về trống trơn , khi mở form lên ta gọi nó hoặc muốn trở về trạng thái ban đầu.
' Clear all search items
Me.txtFirstName = ""
Me.txtLastName = ""
Me.txtMaxAge = ""
Me.txtMinAge = ""
Me.cmbCompany = 0
Me.cmbCountry = 0

' De-select each item in Color List (multiselect list)
For intIndex = 0 To Me.lstFavColor.ListCount - 1
Me.lstFavColor.Selected(intIndex) = False
Next

End Sub

Private Sub btnSearch_Click()

' Update the record source: Soucre của subform được gán bằng câu lệnh SQL (phần trong ngơặoc kép và function BuildFilter
Me.frmsubClients.Form.RecordSource = "SELECT * FROM qryClientData " & BuildFilter

' Requery the subform : Cái này để load lại dữ liệu của subform
Me.frmsubClients.Requery
End Sub


Private Sub Form_Load()

' Clear the search form: trạng thái mặt định
btnClear_Click

End Sub

Private Function BuildFilter() As Variant
'Định nghĩa các biến dạng tùy ý
Dim varWhere As Variant
Dim varColor As Variant
Dim varItem As Variant
Dim intIndex As Integer

varWhere = Null ' Main filter: Dạng dữ liệu NULL
varColor = Null ' Subfilter used for colors

' Check for LIKE First Name
' Phát biểu đoạn 1(cái này mình yêu cầu bạn phát biểu đó): Nếu ô tìm kiếm theo FirstName có dữ liệu nhập vào thì hãy chọn các dòng trong query nguồn với điều kiện (Where) thỏa mãn: cột firstName phải chứa chuỗi vừa nhập vào
' Phát biểu thành SQL: SELECT * FROM qryClientData Where [FirstName] LIKE "Me.txtFirstName *" AND (Dấu * đại diện chuỗi ký tự sau đó, và dư Chữ AND nên gây lỗi) tuy nhiên chữ And đã được sử lý phía dưới!
If Me.txtFirstName > "" Then
varWhere = varWhere & "[FirstName] LIKE """ & Me.txtFirstName & "*"" AND "
End If

' Check for LIKE Last Name
' Kế tiếp chữ AND phía trên nối vào nếu có dữ liệu nhập vào và vẫn dư chữ AND
If Me.txtLastName > "" Then
varWhere = varWhere & "[LastName] LIKE """ & Me.txtLastName & "*"" AND "
End If

' Check for min Age
If Me.txtMinAge > "" Then
varWhere = varWhere & "[Age] > " & Me.txtMinAge & " AND "
End If

' Check for max Age
If Me.txtMaxAge > "" Then
varWhere = varWhere & "[Age] < " & Me.txtMaxAge & " AND "
End If

' Check for CompanyID
If Me.cmbCompany > 0 Then
varWhere = varWhere & "[CompanyID] = " & Me.cmbCompany & " AND "
End If

' Check for CountryID
If Me.cmbCountry > 0 Then
varWhere = varWhere & "[CountryID] = " & Me.cmbCountry & " AND "
End If

' Check for Colors in multiselect list
For Each varItem In Me.lstFavColor.ItemsSelected
varColor = varColor & "[FavColor] = """ & _
Me.lstFavColor.ItemData(varItem) & """ OR "

Next

' Test to see if we have subfilter for colors...
If IsNull(varColor) Then
' do nothing
Else
' strip off last "OR" in the filter :
If Right(varColor, 4) = " OR " Then
varColor = Left(varColor, Len(varColor) - 4)
End If

' Add some parentheses around the subfilter
varWhere = varWhere & "( " & varColor & " )"
End If

' Check if there is a filter to return...
If IsNull(varWhere) Then
varWhere = ""
Else
varWhere = "WHERE " & varWhere

' strip off last "AND" in the filter Ở đây người ta xử lý chữ AND dư thừa phía sau câu truy vấn: bạn sai do thiếu chỗ này
If Right(varWhere, 5) = " AND " Then
varWhere = Left(varWhere, Len(varWhere) - 5)
End If
End If

BuildFilter = varWhere

End Function

Trong này có thêm màu mè gì đó chắc là bạn không cần nhỉ
 
/-*+/ Em đã thêm phần xử lý chữ AND nên codes đã hoạt động rồ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
 
Đâ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.
 
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 ?
 
Web KT
Back
Top Bottom