ADO căn bản: Kết nối truy vấn CSDL từ file Excel đến file Access.

Liên hệ QC

Hai Lúa Miền Tây

❆❆❆❆❆❆❆❆
Thành viên BQT
Administrator
Tham gia
18/3/08
Bài viết
8,281
Được thích
15,776
Giới tính
Nam
Nghề nghiệp
Làm ruộng.
Mình rất đắng đo khi quyết định mở topic này, do kiến thức chấp vá, cách diễn đạt cũng như khả năng hiểu biết về ADO có hạn. Mong nhận được sự góp ý của các anh chị nhiều hơn.

Chuẩn bị môi trường làm việc: Vào cửa sổ code click chọn Tools>Refrences, xong chọn Microsoft ActiveX Data Objects x.x Library (ADO)

[video=youtube;9g8izYUQrnE]


Lưu ý: Để bài viết được liên tục, các bạn nếu có góp ý hay thảo luận về đề tài này, vui lòng ghé sang topic sau:
[h=3]Thảo luận về bài: ADO căn bản Kết nối truy vấn CSDL từ file Excel đến file Access.[/h]
 
Lần chỉnh sửa cuối:
Code kết nối với CSDL ví dụ file Access có tên là CSDL.mdb với Pass là 1234 , code kết nối sẽ như sau:

Mã:
Public cnn As New ADODB.Connection
Sub Moketnoi()
Set cnn = New ADODB.Connection
Dim strCNString As String
strCNString = "Data Source=" & ThisWorkbook.Path & "\CSDL.mdb"
With cnn
    .Provider = "Microsoft Jet 4.0 OLE DB Provider"
    .ConnectionString = strCNString
    .Properties("Jet OLEDB:Database Password") = "1234"
    .CursorLocation = adUseClient
    .Open

End With

End Sub

[video=youtube;JicwsL8zrGY]http://www.youtube.com/watch?v=JicwsL8zrGY&feature=youtu.be[/video]


Mình xin gửi Data mẫu để các bạn tiện thực hành.
Lưu ý các bạn chép file này vào chung với folder file excel truy vấn của các bạn nhé.
 

File đính kèm

  • CSDL.rar
    26.7 KB · Đọc: 540
Lần chỉnh sửa cuối:
Phát biểu SQL SELECT

Phát biểu SQL SELECT: Chọn các cột theo ý muốn từ 1 cơ sở dữ liệu, ở đây là tên file cần kết nối là CSDL.mdb:
Dùng phát biểu này để chọn (SELECT) thông tin từ (FROM) một bảng như sau:

Mã:
SELECT TenCotCanLay FROM TenBang

Ví dụ hình bên dưới là bảng dữ liệu có tên là tblData, trong bảng này có đầy đủ các trường (Cột) như sau:

ADO1.jpg

Bây giờ tôi lấy ví dụ là chỉ lấy 3 cột (TP, [MATERIAL NAME],[COLOR NAME]) Lưu ý đối với những cột có tên đặc biệt và có cách trắng chúng ta nên thêm [] vào tên cột đó.

SELECT TP, [MATERIAL NAME],[COLOR NAME]
FROM tblData;

Kết quả sẽ như sau:

ADO2.jpg

Lưu ý nếu muốn chọn tất cả các cột thì chỉ cần Select * from TenBang là đủ.
 
Bây giờ bắt đầu ta lấy dữ liệu từ bảng tblData ra Excel cell bắt đầu là A5.

1./ Lấy tất cả các cột có trong bảng:

Mã:
Sub LayDuLieuTatCaCot()
On Error GoTo loi


Dim lsSQL As String: Dim rst As New ADODB.Recordset
If cnn.State <> 1 Then Moketnoi


    lsSQL = "SELECT * " & _
            "FROM tblData"
            
    rst.Open lsSQL, cnn, adOpenStatic, adLockReadOnly
    Cells.ClearContents
    Range("A5").CopyFromRecordset rst
    
rst.Close
Set rst = Nothing
cnn.Close
Set cnn = Nothing
Exit Sub
loi:
MsgBox Err.Description
End Sub

2./ Lấy 3 cột (SUPPLIER, [MATERIAL NAME], [COLOR NAME]) lưu ý nếu ta select cột nào trước thì nó sẽ ra cột đó trước, ví dụ tôi lấy cột Supplier trước thì nó sẽ hiển thị cột này trước, mặc dù vị trí thực của nó nằm trong bảng ở sau các cột kia.

Mã:
Sub LayDuLieu3Cot()
On Error GoTo loi


Dim lsSQL As String: Dim rst As New ADODB.Recordset
If cnn.State <> 1 Then Moketnoi


    lsSQL = "SELECT SUPPLIER, [MATERIAL NAME], [COLOR NAME] " & _
            "FROM tblData"


            
    rst.Open lsSQL, cnn, adOpenStatic, adLockReadOnly
    Cells.ClearContents
    Range("E5").CopyFromRecordset rst
    
rst.Close
Set rst = Nothing
cnn.Close
Set cnn = Nothing
Exit Sub
loi:
MsgBox Err.Description
End Sub

[video=youtube;MH2-fAElpXw]http://www.youtube.com/watch?v=MH2-fAElpXw&amp;feature=youtu.be[/video]
 
Lần chỉnh sửa cuối:
Mệnh đề SQL WHERE

Để bóc dữ liệu trong 1 bảng dữ liệu theo ý muốn ta có mệnh đề WHERE vào sau phát biểu SELECT với cú pháp như sau:
*./ Cú pháp:


Mã:
Select TenCot.....
         From TenBang
         Where  Điều kiện của TenCot cần lọc


PHÉP TOÁN | MÔ TẢ
=|So sánh bằng
<>|So sánh không bằng, khác
>|Lớn hơn
<|Nhỏ hơn
>=|Lớn hơn hoặc bằng
<=|Nhỏ hơn hoặc bằng
BETWEEN|Nằm giữa một khoảng
LIKE|So sánh mẫu chuỗi

*./ Lưu ý: - Đối với các điều kiện lọc dữ liệu là chuổi ta nên bao quanh chúng bằng dấu nháy đơn ví dụ ta cần lọc cột [COLOR NAME] là màu BLACK thì ta phải ghi 'BLACK' còn nếu là số thì không cần thêm gì hết.
- Nếu ta muốn lọc theo điều kiện 1 phần của chuổi thì ta thêm dấu % vào điều kiện lọc, ví dụ ta muốn lọc những loại vật tư có tên đầu tiên là POLY thì ta thêm như sau 'POLY%', thì nó sẽ cho ra kết quả là chỉ lọc những loại vật tư bắt đầu là chữ POLY

Ví dụ: Cũng CSDL trên ta có câu lệnh truy vấn so sánh chuổi của cột [ORIGIN] nào có dữ liệu thõa điều kiện là 'KOREA' thì bóc ra: TA DÙNG PHÉP TOÁN LIKE như sau:

Mã:
Sub LayDuLieuDK()
On Error GoTo loi
Dim lsSQL As String: Dim rst As New ADODB.Recordset
If cnn.State <> 1 Then Moketnoi

[B][COLOR=#ff0000]    lsSQL = "SELECT * " & _[/COLOR][/B]
[B][COLOR=#ff0000]            "FROM tblData " & _[/COLOR][/B]
[B][COLOR=#ff0000]            "Where [ORIGIN] [/COLOR][COLOR=#0000ff]like [/COLOR][COLOR=#ff0000]'KOREA'"[/COLOR][/B]
            
    rst.Open lsSQL, cnn, adOpenStatic, adLockReadOnly
    Cells.ClearContents
    Range("A5").CopyFromRecordset rst
    
rst.Close
Set rst = Nothing
cnn.Close
Set cnn = Nothing
Exit Sub
loi:
MsgBox Err.Description
End Sub

[video=youtube;-mrG5xcUXus]http://www.youtube.com/watch?v=-mrG5xcUXus&amp;feature=youtu.be[/video]
 
Lần chỉnh sửa cuối:
Xin được góp ý thêm 1 chút:

SQL WHERE Clause:

The WHERE clause is used to filter records.

Mệnh đề WHERE được sử dụng để lọc records

The WHERE clause is used to extract only those records that fulfill a specified criterion.

Mệnh đề WHERE được sử dụng để trích xuất các records đáp ứng một tiêu chí xác định.

Cú pháp SQL WHERE:
Mã:
SELECT column_name(s)
FROM table_name
WHERE column_name operator value

LƯU Ý:

SQL sử dụng dấu nháy đơn (') bao quanh các giá trị chuỗi (hầu hết các hệ thống cơ sở dữ liệu cũng sẽ chấp nhận dấu ngoặc kép).

Tuy nhiên, giá trị số không được kèm theo trong dấu nháy đơn!


1) Với giá trị chuỗi (text values):


Đúng:

Mã:
SELECT * FROM Persons WHERE FirstName='NGHIA'

Sai:

Mã:
SELECT * FROM Persons WHERE FirstName=NGHIA



2) Với giá trị số (numeric values):


Đúng:

Mã:
SELECT * FROM Persons WHERE Year=1965

Sai:

Mã:
SELECT * FROM Persons WHERE Year='1965'
 
Lần chỉnh sửa cuối:
Update

Đợi đã lâu mà anh HTN không viết tiếp, thôi thì mình viết tiếp cho xong phần dang dỡ này vậy:

*) Mệnh đề SQL UPDATE: Dùng để chỉnh sửa hay cập nhật nội dung vào CSDL
*) Cú Pháp:

[TIP]UPDATE TenBangCanDuocCapNhat
SET TenCot1CanCapNhat=NoiDungCapNhatChoCot1,TenCot2CanCapNhat=NoiDungCapNhatChoCot2,...
WHERE TenCotLamDK=DKDeCapNhat
[/TIP]

*) Ví dụ: Cũng với CSDL ở bài 2 mình xin cập nhật cột Supplier = nội dung mới là 'Thu Test Cai coi cap nhat duoc khong?' và cột TP là 'hic hic', với điều kiện cập nhật là ID của dòng cần được cập nhật là 2. Vậy tôi sẽ viết như sau:


[GPECODE=sql]Sub CapNhat()
Dim cnn As Object: Dim rst As Object
Dim lsSQL As String
Set cnn = CreateObject("ADODB.Connection")
Set rst = CreateObject("ADODB.Recordset")
With cnn
.Provider = "Microsoft Jet 4.0 OLE DB Provider"
.ConnectionString = ThisWorkbook.Path & "\CSDL.mdb"
.Properties("Jet OLEDB:Database Password") = "1234"
.Open
End With
lsSQL = "UPDATE tblData " & _
"SET Supplier='Thu Test Cai coi cap nhat duoc khong?', TP='hic hic'" & _
"WHERE [ID]=2"
rst.Open lsSQL, cnn
Set rst = Nothing
cnn.Close
Set cnn = Nothing

End Sub

[/GPECODE]
 
Lần chỉnh sửa cuối:
Select distinct

*) Mệnh đề SQL SELECT DISTINCT: Dùng để lọc duy nhất
*) Cú Pháp:

[TIP]SELECT DISTINCT TenCot1, TenCot2...
FROM TenBang
[/TIP]

*) Ví dụ: Cũng với CSDL ở bài 2 tôi xin lấy dữ liệu duy nhất của cột Supplier và Origin thì tôi sẽ viết như sau:

[GPECODE=sql]Sub LocDuyNhat()
Dim cnn As Object: Dim rst As Object
Dim lsSQL As String
Set cnn = CreateObject("ADODB.Connection")
Set rst = CreateObject("ADODB.Recordset")
With cnn
.Provider = "Microsoft Jet 4.0 OLE DB Provider"
.ConnectionString = ThisWorkbook.Path & "\CSDL.mdb"
.Properties("Jet OLEDB:Database Password") = "1234"
.Open
End With
lsSQL = "SELECT DISTINCT SUPPLIER, ORIGIN " & _
"FROM tblData"
rst.Open lsSQL, cnn
[A2].CopyFromRecordset rst
rst.Close
Set rst = Nothing
cnn.Close
Set cnn = Nothing

End Sub

[/GPECODE]
 
Order by

*) Mệnh đề SQL ORDER BY: Nằm ở cuối câu lệnh, dùng để sắp xếp lại dữ liệu các cột.
*) Cú Pháp:

[TIP]SELECT COT1, COT2...
FROM TENBANG
ORDER BY COT1
ASC|DESC, COT2 ASC|DESC ...[/TIP]

Lưu ý: Sắp xếp tăng dần thì ta thêm ASC, ngược lại muốn sắp xếp theo cách giảm dần thì ta thêm DESC ở sau tên cột cần muốn sắp xếp.
(Nếu không ghi ASC hoặc DESC gì hết thì nó sẽ tự sắp xếp theo cách tăng dần)

*) Ví dụ: Cũng với CSDL ở bài 2 tôi xin sắp xếp lại cột TP tăng dần, ID giảm dần thì tôi sẽ viết như sau:

[GPECODE=sql]Sub SapXep()
Dim cnn As Object: Dim rst As Object
Dim lsSQL As String
Set cnn = CreateObject("ADODB.Connection")
Set rst = CreateObject("ADODB.Recordset")
With cnn
.Provider = "Microsoft Jet 4.0 OLE DB Provider"
.ConnectionString = ThisWorkbook.Path & "\CSDL.mdb"
.Properties("Jet OLEDB:Database Password") = "1234"
.Open
End With
lsSQL = "SELECT * " & _
"FROM tblData " & _
"ORDER BY TP, ID DESC"
rst.Open lsSQL, cnn
[A2].CopyFromRecordset rst
rst.Close
Set rst = Nothing
cnn.Close
Set cnn = Nothing

End Sub[/GPECODE]
 
Insert into

*) Mệnh đề SQL INSERT INTO: Là dùng để thêm mới dữ liệu.
*) Cú Pháp:

Cách 1: Chèn thêm dòng không theo tên cột, dữ liệu sẽ được chèn vào CSDL theo thứ tự của cột.
Lưu ý: Cách này phải chèn toàn bộ cột theo thứ tự cột trong CSDL

[TIP]INSERT INTO TênBảngCầnChèn
VALUES (GiáTrị1,
GiáTrị2, GiáTrị3,...)[/TIP]

Cách 2:
Chèn thêm dòng theo tên cột, dữ liệu sẽ được chèn vào CSDL theo tên cột.

[TIP]INSERT INTO TênBảngCầnChèn (Cột1, Cột2, Cột3,...)
VALUES (
GiáTrị1, GiáTrị2, GiáTrị3,...)[/TIP]

*) Ví dụ: Cũng với CSDL ở bài 2 tôi xin minh họa chèn dữ liệu theo từng cách ở trên như sau:

Cách 1:
Tôi chèn dòng sau vào bảng:

ID | PONO | W_HDATE | TP | MATERIAL NAME | SPEC 2 | COLOR NAME | POQTY | INPUTQTY | BALANCE | UNIT | PRICE | M_UNIT | AMOUNT | ORIGIN | SUPPLIER | REMARK
500​
|DW13GW019|
01/06/2013​
|AA|MESH 192|44|BLACK|
1000​
|
0​
|
-1000​
|YDS|
1.9​
|USD.|
1900​
|VIETNAM|YOO SUNG MESH|

[GPECODE=sql]Sub ChenDong1()
Dim cnn As Object: Dim rst As Object
Dim lsSQL As String
Set cnn = CreateObject("ADODB.Connection")
Set rst = CreateObject("ADODB.Recordset")
With cnn
.Provider = "Microsoft Jet 4.0 OLE DB Provider"
.ConnectionString = ThisWorkbook.Path & "\CSDL.mdb"
.Properties("Jet OLEDB:Database Password") = "1234"
.Open
End With
lsSQL = "INSERT INTO tblData " & _
"VALUES (500,'DW13GW019', #6/1/2013#,'AA','MESH 192','44','BLACK',1000,0,-1000,'YDS',1.9,'USD.',1900,'VIETNAM','YOO SUNG MESH', NULL)"
rst.Open lsSQL, cnn
Set rst = Nothing
cnn.Close
Set cnn = Nothing

End Sub[/GPECODE]

Cách 2: Ví dụ tôi chèn ID=501,W_HDate=30/01/2013,Supplier=YOO SUNG MESH thì tôi sẽ viết như sau:

[GPECODE=sql]Sub ChenDong2()
Dim cnn As Object: Dim rst As Object
Dim lsSQL As String
Set cnn = CreateObject("ADODB.Connection")
Set rst = CreateObject("ADODB.Recordset")
With cnn
.Provider = "Microsoft Jet 4.0 OLE DB Provider"
.ConnectionString = ThisWorkbook.Path & "\CSDL.mdb"
.Properties("Jet OLEDB:Database Password") = "1234"
.Open
End With
lsSQL = "INSERT INTO tblData (ID,W_HDate,Supplier) " & _
"VALUES(501,#01/30/2013#,'YOO SUNG MESH')"
rst.Open lsSQL, cnn
Set rst = Nothing
cnn.Close
Set cnn = Nothing

End Sub

[/GPECODE]

Thì chỉ duy nhất 3 giá trị trên được chèn vào các cột tương ứng với nó, các cột khác sẽ bị trống.
 
Delete

*) Mệnh đề SQL DELETE: Là dùng để xóa dữ liệu.
*) Cú Pháp:

- Xóa toàn bộ bảng dữ liệu:


[TIP]DELETE
FROM TênBảngCầnXóa
[/TIP]

Hoặc:

[TIP]DELETE *
FROM TênBảngCầnXóa
[/TIP]

- Xóa dữ liệu theo điều kiện:

[TIP]DELETE
FROM TênBảngCầnXóa
WHERE ĐiềuKiệnXóa
[/TIP]

Hoặc:

[TIP]
DELETE *
FROM TênBảngCầnXóa
WHERE ĐiềuKiệnXóa
[/TIP]

*) Ví dụ:
Cũng với CSDL ở bài 2 tôi xin xóa dòng dữ liệu có ID=2 thì tôi sẽ viết như sau:


[GPECODE=sql]Sub XoaDong()
Dim cnn As Object: Dim rst As Object
Dim lsSQL As String
Set cnn = CreateObject("ADODB.Connection")
Set rst = CreateObject("ADODB.Recordset")
With cnn
.Provider = "Microsoft Jet 4.0 OLE DB Provider"
.ConnectionString = ThisWorkbook.Path & "\CSDL.mdb"
.Properties("Jet OLEDB:Database Password") = "1234"
.Open
End With
lsSQL = "DELETE * " & _
"FROM tblData " & _
"WHERE ID=2"
rst.Open lsSQL, cnn
Set rst = Nothing
cnn.Close
Set cnn = Nothing

End Sub[/GPECODE]
 
And & Or

*) AND & OR: Là dùng để kết hợp điều kiện truy vấn dữ liệu.

- AND: Là sự kết hợp 1 điều kiện thứ nhất và thứ 2 (Đk n). Dữ liệu sẽ xuất hiện nếu cả 2 (Đk n) điều kiện đều được thỏa mãn.
- OR: Dữ liệu sẽ xuất hiện khi thỏa mãn 1 trong nhiều điều kiện.
*) Ví dụ:
- AND: Cũng với CSDL ở bài 2 tôi lọc ra những mặc hàng có điều kiện cột TP='A' ORIGIN='KOREA' thì tôi sẽ viết như sau:

[GPECODE=sql]Sub Dk_And()
Dim cnn As Object: Dim rst As Object
Dim lsSQL As String
Set cnn = CreateObject("ADODB.Connection")
Set rst = CreateObject("ADODB.Recordset")
With cnn
.Provider = "Microsoft Jet 4.0 OLE DB Provider"
.ConnectionString = ThisWorkbook.Path & "\CSDL.mdb"
.Properties("Jet OLEDB:Database Password") = "1234"
.Open
End With
lsSQL = "SELECT * " & _
"FROM tblData " & _
"WHERE TP='A' AND ORIGIN='KOREA'"
rst.Open lsSQL, cnn
Cells.ClearContents
[A2].CopyFromRecordset rst
rst.Close
Set rst = Nothing
cnn.Close
Set cnn = Nothing

End Sub

[/GPECODE]

==> Dữ liệu sẽ được xuất hiện 7 dòng với cột TP=A và ORIGIN=KOREA

- OR: Cũng với CSDL ở bài 2 tôi lọc ra những mặc hàng có điều kiện cột TP='A' hoặc ORIGIN='KOREA' thì tôi sẽ viết như sau:

[GPECODE=sql]Sub Dk_Or()
Dim cnn As Object: Dim rst As Object
Dim lsSQL As String
Set cnn = CreateObject("ADODB.Connection")
Set rst = CreateObject("ADODB.Recordset")
With cnn
.Provider = "Microsoft Jet 4.0 OLE DB Provider"
.ConnectionString = ThisWorkbook.Path & "\CSDL.mdb"
.Properties("Jet OLEDB:Database Password") = "1234"
.Open
End With
lsSQL = "SELECT * " & _
"FROM tblData " & _
"WHERE TP='A' OR ORIGIN='KOREA'"
rst.Open lsSQL, cnn
Cells.ClearContents
[A2].CopyFromRecordset rst
rst.Close
Set rst = Nothing
cnn.Close
Set cnn = Nothing

End Sub

[/GPECODE]

==> Dữ liệu sẽ được xuất hiện 188 dòng với điều kiện dòng dữ liệu cột thỏa mãn 1 trong 2 điều kiện TP=A hoặc ORIGIN=KOREA.
 
Hai Lúa Miền Tây ơi cho mình hỏi tí.

ADO có toán tử LIKE để so sánh

VBA của Excel cũng có LIKE

Nếu VBA dùng LIKE, trong cấu trúc của LIKE có một thủ tục mà ít ai dùng đến đó là so sánh không phân biệt hoa thường đó là đặt thủ tục "Option Compare Text" trên cùng của Module (nếu không có thủ tục đó, mặc nhiên nó là "Option Compare Binary").

Nhưng khi dùng trong ADO vì mọi câu lệnh nó là dạng chuỗi nên không thể thực hiện được như trong VBA để chuyển hóa thuộc tính toán tử LIKE, vì thế, có đặt "Option Compare Text" đi chăng nữa nó cũng không có tác dụng gì!

Vậy câu lệnh nào có tác dụng như "Option Compare Text" trong ADO?

Cám ơn rất nhiều!

------------------------------------------------------
P/s: Mặc dù có thể ta chữa cháy bằng UCase hoặc LCase cho 2 vế, nhưng cứ tìm hiểu xem có hay không cái đã hen!
 
Lần chỉnh sửa cuối:
Anh thử dùng = thay vì dùng like.
 
Không biết anh test sao trên máy em vẫn là phân biệt được cho dù dùng like hoặc dùng =, đây là file em kiểm đã thử trên máy em
Không hiểu anh hỏi gì hả nmhung49, anh cần cái sự so sánh không phân biệt chữ hoa và chữ thường đấy mà, chứ ai chẳng biết "a" = "a" là True, nhưng "a" = "A" chắc chắn sẽ cho ra False rồi.

Thí dụ nè:

Mã:
Sub test()
    Dim DK As String
    Dim Arr(), ftrArr
    
[B]    DK = [COLOR=#ff0000]"a"[/COLOR][/B]
    Arr = Array([COLOR=#ff0000][B]"A"[/B][/COLOR], "B", "C")
    
[COLOR=#008000]    ''Buoc 1: Không phân biệt chữ hoa chữ thường[/COLOR]
    ftrArr = Filter(Arr, DK, True, [COLOR=#0000ff]vbTextCompare[/COLOR])
    MsgBox ftrArr(0)
    
[COLOR=#008000]    ''Buoc 2: Có phân biệt chữ hoa chữ thường:[/COLOR]
    ftrArr = Filter(Arr, DK, True, [COLOR=#ff0000]vbBinaryCompare[/COLOR])
    MsgBox ftrArr(0)
End Sub
 
Code kết nối với CSDL ví dụ file Access có tên là CSDL.mdb với Pass là 1234 , code kết nối sẽ như sau:

Mã:
Public cnn As New ADODB.Connection
Sub Moketnoi()
Set cnn = New ADODB.Connection
Dim strCNString As String
strCNString = "Data Source=" & ThisWorkbook.Path & "\CSDL.mdb"
With cnn
    .Provider = "Microsoft Jet 4.0 OLE DB Provider"
    .ConnectionString = strCNString
    .Properties("Jet OLEDB:Database Password") = "1234"
    .CursorLocation = adUseClient
    .Open

End With

End Sub

[video=youtube;JicwsL8zrGY]http://www.youtube.com/watch?v=JicwsL8zrGY&amp;feature=youtu.be[/video]


Mình xin gửi Data mẫu để các bạn tiện thực hành.
Lưu ý các bạn chép file này vào chung với folder file excel truy vấn của các bạn nhé.
Chưa đọc hết topic không biết phía sau có cau trả lời của mình không? Nhưng mình cũng xin hỏi luôn
muốn kết nối tới access 2007 viết sao vay?. Mong sơm nhận được trả lời!
 
ACE cho mình hỏi, nếu lọc từ ngày tháng này đến ngày tháng khác thì cấu trúc như thế nào ạ. Thanks!
 
Lần chỉnh sửa cuối:
Web KT
Back
Top Bottom