- Tham gia
- 17/8/08
- Bài viết
- 8,662
- Được thích
- 16,722
- Giới tính
- Nam
Đã test với rào # rồi. Nếu # thì nó sẽ chưa hiểu dd/mm/yyyy mà nó hiểu mm/dd/yyyy
Trong file gồm có các code.
Với dạng bài này, nếu dùng trực tiếp điều kiện thì code sẽ như vầy:
Mã:
Sub LayDuLieu02_1()
On Error GoTo Loi
Dim lsSQL As String: Dim rst As New ADODB.Recordset
If cnn.State <> 1 Then Moketnoi
[COLOR=#0000cd][B] lsSQL = "SELECT * FROM tblData " _
& "WHERE [ORIGIN] = 'VIETNAM' " _
& "AND [W_HDATE] >= #6/8/12# " _
& "AND [W_HDATE] <= #7/20/12#;"
[/B] [/COLOR]
rst.Open lsSQL, cnn, adOpenStatic, adLockReadOnly
With Sheets("BC")
.Cells.ClearContents
.Range("A5").CopyFromRecordset rst
End With
rst.Close
Set rst = Nothing
cnn.Close
Set cnn = Nothing
Exit Sub
Loi:
MsgBox Err.Description
End Sub
Tuy nhiên, tôi thích đưa dữ liệu gián tiếp hơn, bằng cách thông qua các INPUTBOX, nhằm đa dạng hóa điều kiện nhập vào:
Cũng giống như các Parameter của Access, tôi dùng InputBox (Nếu dùng trực tiếp trên Access thì không cần đặt InputBox làm gì, nhưng với ADO thì không làm sao cho nó hiển thị cái Parameter này nên phải dùng đến InputBox).
Mã:
Sub LayDuLieu02_2()
On Error GoTo Loi
Dim lsSQL As String: Dim rst As New ADODB.Recordset
Dim IptXuatXu As String, IptfDate As Date, IpteDate As Date
[B][COLOR=#0000cd] IptXuatXu = InputBox("ORIGIN", "INPUT ORIGIN")
If IptXuatXu = "" Then Exit Sub
IptfDate = InputBox("START DATE", "INPUT START DATE")
IpteDate = InputBox("END DATE", "INPUT END DATE")
[/COLOR][/B]
If cnn.State <> 1 Then Call Moketnoi
[COLOR=#800080] lsSQL = "SELECT * FROM tblData " _
& "WHERE [ORIGIN] LIKE [B]'[/B][/COLOR][B][COLOR=#ff0000]%[/COLOR][/B][COLOR=#800080][B]"[/B] & IptXuatXu & [B]"[/B][/COLOR][B][COLOR=#ff0000]%[/COLOR][/B][COLOR=#800080][B]'[/B] " _
& "AND [W_HDATE] >= #" & Format(IptfDate, "m/d/yyyy") & "# " _
& "AND [W_HDATE] <= #" & Format(IpteDate, "m/d/yyyy") & "#;"[/COLOR]
rst.Open lsSQL, cnn, adOpenStatic, adLockReadOnly
With Sheets("BC")
.Cells.ClearContents
.Range("A5").CopyFromRecordset rst
End With
rst.Close
Set rst = Nothing
cnn.Close
Set cnn = Nothing
Exit Sub
Loi:
MsgBox Err.Description
End Sub
Khi các InputBox nhập ngày tháng, với năm hiện hành chúng ta chỉ cần điền [ngày/tháng] (theo kiểu mặc định của hệ thống nếu ngày trước tháng sau, hoặc ngược lại), nhưng nếu điều kiện không phải năm hiện hành thì ta điền đấy đủ [ngày/tháng/năm] (theo cấu trúc mặc định hệ thống).
VỚI SQL TRONG ACCESS CHỈ ĐƠN GIẢN NHƯ VẦY:
Mã:
SELECT *FROM tblData
WHERE [ORIGIN] LIKE [B]'[COLOR=#ff0000]*[/COLOR]'[/B] & [XUAT XU:] & [B]'[COLOR=#ff0000]*[/COLOR]'[/B]
AND [W_HDATE]>=[TU NGAY:]
AND [W_HDATE]<=[DEN NGAY:];
Các bạn để ý thấy tôi sử dụng dấu phần trăm (%) và dấu sao (*), với 2 dấu này, với toán tử LIKE được xem như là dò tìm cụm từ nào đó trong toàn bộ điều kiện cần tìm.
VD: Cần tìm VIETNAM ta có thể gõ: VIE hoặc NAM hoặc IET v.v...
Tại sao lúc thì % lúc thì * , là vì với Access ta chỉ được dùng dấu * cho SQL thôi, còn với ADO thì ta phải dùng dấu % nó mới chạy đúng như ta mong đợi.