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

Liên hệ QC
Vậy HLMT làm thử
PHP:
SELECT ORIGIN, Sum(AMOUNT) AS SumOfAMOUNT, TP
 FROM tblData
 WHERE ORIGIN Like 'KOREA' AND TP Like 'A'
 GROUP BY ORIGIN, TP;
Lọc sum(Amount) > 1000 thì phải dùng having , dùng where hình như kg OK
PHP:
SELECT ORIGIN, Sum(AMOUNT) AS SumOfAMOUNT, TP
 FROM tblData
 WHERE ORIGIN Like 'KOREA' AND TP Like 'A' and sum(AMOUNT) > 1000
 GROUP BY ORIGIN, TP;
Hoàn toàn đúng thế anh à, do HLMT không chịu kiểm tra kỹ trước khi viết. Anh muốn lọc theo điều kiện sau khi tính toán? Cột Sum(AMOUNT) là sau khi tính toán, do vậy nó phải nằm sau cái GroupBy, mà nằm sau Group By thì phải dùng Having.
P/S: HLMT nên kiểm tra kỹ trước khi viết nhé.
 
Bay giờ em muốn tính tổng số lượng của các mục B4; III; V; VII; VIII của hồ sơ có maHS là T10 với điều kiện là Dottrinh=2. thì câu lệnh viết như thế nào. mong các anh chị hướng dẫn giúp.
MaHS​
|
Mamuc​
|
SoLuong​
|
Dottrinh​
|
T10|A2|
300​
|
1​
|
T10|B4|
3666​
|
1​
|
T10|B4|
4082​
|
1​
|
T10|IV|
1​
|
1​
|
T10|VII|
1​
|
1​
|
T10|VII|
3​
|
1​
|
T12|B3|
2400​
|
1​
|
T12|B4|
4733​
|
1​
|
T12|B4|
1529​
|
1​
|
T12|III|
63,75​
|
1​
|
T12|IV|
0,785​
|
1​
|
T12|IV|
61​
|
1​
|
T12|IV|
16,96​
|
1​
|
T12|V|
1​
|
1​
|
T12|V|
3​
|
1​
|
T12|VII|
2400​
|
1​
|
T12|VII|
4​
|
1​
|
T10|B4|
1030​
|
2​
|
T10|III|
55,83​
|
2​
|
T10|V|
30​
|
2​
|
T10|V|
25​
|
2​
|
T10|VII|
3190​
|
2​
|
T10|VIII| |
2​
|
 

File đính kèm

  • viduSumSQL.xls
    13.5 KB · Đọc: 31
Lần chỉnh sửa cuối:
Bay giờ em muốn tính tổng số lượng của các mục B4; III; V; VII; VIII của hồ sơ có maHS là T10 với điều kiện là Dottrinh=2. thì câu lệnh viết như thế nào. mong các anh chị hướng dẫn giúp.
2​
Có phải bạn muốn kết quả như bên dưới:

1.jpg
 
Bay giờ em muốn tính tổng số lượng của các mục B4; III; V; VII; VIII của hồ sơ có maHS là T10 với điều kiện là Dottrinh=2. thì câu lệnh viết như thế nào. mong các anh chị hướng dẫn giúp.
Dùng tạm code này thử, đang nghĩ cách rút gọn phần or.
PHP:
Sub SumSQL()
Dim strPath$, mySQL$
Dim Cnn As New ADODB.Connection
Dim Rcs As New ADODB.Recordset
'-------------------------------------------------------------------------
'Tuy chon Loai BC combobox phu hop SQL text sau menh de Where
strPath = ThisWorkbook.FullName
Set Cnn = New ADODB.Connection
'Tao Ket noi voi file du lieu nguon:
Cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strPath & _
                            ";Persist Security Info=False; Extended Properties=Excel 8.0;"
'---------------------------------------------------------------------------
mySQL = "SELECT * FROM [DATA$]" & Chr(10)
mySQL = mySQL & "where MaHS='T10' AND Dottrinh=2 and" & Chr(10)
mySQL = mySQL & "(Mamuc='B4' or Mamuc='III' or Mamuc='V' or Mamuc='VII' or Mamuc='VIII')" & Chr(10)
'B4; III; V; VII; VIII
Rcs.Open mySQL, Cnn, adOpenKeyset, adLockOptimistic
'---------------------------------------------------------------------------
With Sheets("Report")
  .Range("A2:D100").ClearContents
  .[A2].CopyFromRecordset Rcs
End With
'Refresh lai hai bien cnEx va Rcs:
Rcs.Close: Set Rcs = Nothing
Cnn.Close: Set Cnn = Nothing
End Sub
Thay thế câu
PHP:
mySQL = mySQL & "(Mamuc='B4' or Mamuc='III' or Mamuc='V' or Mamuc='VII' or Mamuc='VIII')" & Chr(10)
Thành
PHP:
mySQL = mySQL & "instr('B4; III; V; VII; VIII',Mamuc)"
 

File đính kèm

  • viduSumSQL.xls
    29 KB · Đọc: 49
Lần chỉnh sửa cuối:
Cám ơn anh nhiều.

Nhưng sao mục V không có cộng gọp lại anh Tuấn ơi
giống như kết quả của " ExcelCongCuTuyetVoiCuaBan".

Với lại em muốn lấy từng Recordset để đưa số lượng từng mã mục vào từng textbox nên "CopyFromRecordset Rcs" thì chắc không đưa vào được rồi
 
Lần chỉnh sửa cuối:
PHP:
Cám ơn anh nhiều.

Nhưng sao mục V không có cộng gọp lại anh Tuấn ơi
giống như kết quả của " ExcelCongCuTuyetVoiCuaBan".

Với lại em muốn lấy từng Recordset để đưa số lượng từng mã mục vào từng textbox nên "CopyFromRecordset Rcs" thì chắc không đưa vào được rồi
Sửa câu SQL lại
PHP:
mySQL = "SELECT MaHS, Mamuc, sum(Soluong) FROM [DATA$]" & Chr(10)
mySQL = mySQL & "where MaHS='T10' AND Dottrinh=2 and" & Chr(10)
mySQL = mySQL & "instr('B4; III; V; VII; VIII',Mamuc)" & Chr(10)
mySQL = mySQL & "group by MaHs, Mamuc, Dottrinh;"
Còn muốn đưa vào gì thì dùng for i và Arr=rcs.GetRows
 
Cám ơn anh nhiều.

Nhưng sao mục V không có cộng gọp lại anh Tuấn ơi
giống như kết quả của " ExcelCongCuTuyetVoiCuaBan".

Với lại em muốn lấy từng Recordset để đưa số lượng từng mã mục vào từng textbox nên "CopyFromRecordset Rcs" thì chắc không đưa vào được rồi
Câu lệnh:

SELECT MaHS, Mamuc, Sum(SoLuong)
FROM [Sheet1$]
WHERE Dottrinh=2
GROUP BY MaHS, Mamuc;
 
Lần chỉnh sửa cuối:
Hình như còn thiếu 1 DK là T10 anh à.

Vậy sửa lại như vầy (dựa vào file của anh ThuNghi):

Mã:
    mySQL = "SELECT MaHS, Mamuc, Sum(SoLuong) " _
          & "FROM [DATA$] " _
          & "WHERE Dottrinh = 2 AND MaHS='T10' " _
          & "AND (Mamuc='B4' Or Mamuc='III' Or Mamuc='V' " _
          & "Or Mamuc='VII' Or Mamuc='VIII') " _
          & "GROUP BY MaHS, Mamuc"

hoặc:

Mã:
    mySQL = "SELECT MaHS, Mamuc, Sum(SoLuong) " _
          & "FROM [DATA$] " _
          & "WHERE Dottrinh = 2 " _
          & "GROUP BY MaHS, Mamuc " _
          & "HAVING MaHS='T10' AND (Mamuc ='B4' " _
          & "Or Mamuc='III' Or Mamuc='V' " _
          & "Or Mamuc='VII' Or Mamuc='VIII');"

Còn tác giả muốn chuyển giá trị vào TextBox như thế nào thì đưa file mẫu lên nhé!
 
Lần chỉnh sửa cuối:
Với bài vừa rồi có nhiều điều kiện OR và nếu điều kiện nhiều hơn nữa thì mình OR mệt xỉu luôn!

Vì vậy có ý kiến là nên dùng vòng lặp sẽ hay hơn:

Mã:
        Dim arr, str As String, i As Long
        arr = Array("'III'", "'V'", "'VII'", "'VIII'")
        str = "Dottrinh = 2 AND MaHS='T10' AND (Mamuc='B4'"
        
        For i = 0 To UBound(arr)
            str = str & " Or Mamuc=" & arr(i)
        Next
        
        str = str & ") "
    
    
[COLOR=#0000cd]    mySQL = "SELECT MaHS, Mamuc, Sum(SoLuong) " _
          & "FROM [DATA$] " _
          & "WHERE " & [/COLOR][COLOR=#ff0000][B]str [/B][/COLOR][COLOR=#0000cd]_
          & "GROUP BY MaHS, Mamuc"
          [/COLOR]
 
Với bài vừa rồi có nhiều điều kiện OR và nếu điều kiện nhiều hơn nữa thì mình OR mệt xỉu luôn!

Vì vậy có ý kiến là nên dùng vòng lặp sẽ hay hơn:

Mã:
        Dim arr, str As String, i As Long
        arr = Array("'III'", "'V'", "'VII'", "'VIII'")
        str = "Dottrinh = 2 AND MaHS='T10' AND (Mamuc='B4'"
        
        For i = 0 To UBound(arr)
            str = str & " Or Mamuc=" & arr(i)
        Next
        
        str = str & ") "
    
    
[COLOR=#0000cd]    mySQL = "SELECT MaHS, Mamuc, Sum(SoLuong) " _
          & "FROM [DATA$] " _
          & "WHERE " & [/COLOR][COLOR=#ff0000][B]str [/B][/COLOR][COLOR=#0000cd]_
          & "GROUP BY MaHS, Mamuc"
          [/COLOR]
Sao kg dùng Instr cho khỏe
vd
PHP:
sTxt = "B4;III;V;VII;VIII"

PHP:
mySQL = "SELECT MaHS, Mamuc, sum(Soluong) FROM [DATA$]" & Chr(10)
mySQL = mySQL & "where MaHS='T10' AND Dottrinh=2 and" & Chr(10)
mySQL = mySQL & "instr('" & sTxt & "',Mamuc)" & Chr(10)
 
Sao kg dùng Instr cho khỏe
vd
PHP:
sTxt = "B4;III;V;VII;VIII"


Nghĩ cũng lạ, mình để dấu chấm phẩy, hay để dấu phẩy, máy nó hiểu tất tần tật!

PHP:
    sTxt = "B4,III,V,VII,VIII"

Mà Anh ThuNghi có thể giải thích cho em biết hàm InStr này khi ứng dụng với code này được không?
 
Lần chỉnh sửa cuối:
Nghĩ cũng lạ, mình để dấu chấm phẩy, hay để dấu phẩy, máy nó hiểu tất tần tật!

PHP:
    sTxt = "B4,III,V,VII,VIII"

Mà Anh ThuNghi có thể giải thích cho em biết hàm InStr này khi ứng dụng với code này được không?
Khổ ghê, hàm Instr trong VBA chớ gì.
PHP:
    sTxt = "B4,III,V,VII,VIII"
Nếu thay dấu , = " " thì nó cũng OK
Mục địch để phân biệt III hay VIII thôi.
Đúng ra phải có thêm tham số 0,1 hay 2 nữa
Chớ dòng trên nó sẽ tìm thấy III trong VIII nên sẽ sai đó.

Hiện tại chưa biết cách vận dụng thông số compare nên vận dụng như sau thì mới phân biệt III và VIII trong hàm instr.
PHP:
sTxt = "B4;III;V;VII;VIII;"
và câu SQL như sau:
PHP:
MySql = MySql & "instr('" & sTxt & "',Mamuc & ';' )" & Chr(10)
Thêm 1 dấu ; để phân biệt III; và VIII;
 
Lần chỉnh sửa cuối:
Hình như là còn bài số #15 của anh hai lúa chưa được giải đáp.
Nhờ HL giải thích giúp, nếu dùng biến trung gian eD và fD thì OK nhưng dùng thẳng CVDate(fDate) và CVDate(eDate) thì kg được.
PHP:
Sub LayDuLieuDK2()
On Error GoTo loi
Dim lsSQL As String: Dim rst As New ADODB.Recordset
Dim sXuatXu$, fDate$, eDate$
Dim eD&, fD&
sXuatXu = "VietNam"
eDate = "20/07/2012"
fDate = "08/06/2012"
eD = CVDate(eDate): fD = CVDate(fDate)
If cnn.State <> 1 Then Moketnoi
  lsSQL = "SELECT *" & Chr(10)
  lsSQL = lsSQL & "FROM tblData" & Chr(10)
  lsSQL = lsSQL & "Where [origin] LIKE '" & sXuatXu & "'" & Chr(10)
  lsSQL = lsSQL & "and [W_HDATE] >=" & fD & Chr(10)
  lsSQL = lsSQL & "and [W_HDATE] <=" & eD
  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
 
Nhờ HL giải thích giúp, nếu dùng biến trung gian eD và fD thì OK nhưng dùng thẳng CVDate(fDate) và CVDate(eDate) thì kg được.
PHP:
Sub LayDuLieuDK2()
On Error GoTo loi
Dim lsSQL As String: Dim rst As New ADODB.Recordset
Dim sXuatXu$, fDate$, eDate$
Dim eD&, fD&
sXuatXu = "VietNam"
eDate = "20/07/2012"
fDate = "08/06/2012"
eD = CVDate(eDate): fD = CVDate(fDate)
If cnn.State <> 1 Then Moketnoi
  lsSQL = "SELECT *" & Chr(10)
  lsSQL = lsSQL & "FROM tblData" & Chr(10)
  lsSQL = lsSQL & "Where [origin] LIKE '" & sXuatXu & "'" & Chr(10)
  lsSQL = lsSQL & "and [W_HDATE] >=" & fD & Chr(10)
  lsSQL = lsSQL & "and [W_HDATE] <=" & eD
  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

Em nghĩ anh rào 2 dấu # ở hai đầu ngày ( #dd/mm/yyyy# )
 
Đã 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.

Đúng vậy, cấu trúc của nó luôn là #M/D/Y#. Tại quen tay nên đánh nhầm.

(Cấu trúc month/day/year này theo dạng quy chuẩn của Microsoft Jet Database Engine)
 
Lần chỉnh sửa cuối:
Web KT
Back
Top Bottom