Bài tập về ADO căn bản.

Liên hệ QC
Đại khái thì lý thuyết nó như thế này, cũng chưa thử

Mã:
select * from Bang B1 where 
 (N - 1) = (select count(distinct(Qty)) 
            from Bang B2 
            where B2.ID = B1.ID 
            and B2.Qty > B1.Qty )
-- muốn số lớn thứ mấy thì thay vào N. Trong đề bài này, muốn số lớn thứ 2 nên N=2
-- đối với loại truy vấn này, câu truy vấn con đề cập đến phần tử (bảng) của câu bọc ngoài nó
-- nên được gọi là correlated subquery

=== chỉnh sửa
where B2.ID > B1.ID ) ===> sửa thành where B2.ID = B1.ID

Đã thử, kết quả chính xác với mọi giá trị của N
 
Lần chỉnh sửa cuối:
Mọi người xem giúp mình câu lệnh dùng UNION ALL sai ở chổ nào mà khi thực hiện riêng lẽ từng câu lệnh thì ra kết quả còn khi kết hợp với UNION ALL thì chỉ ra kết quả của câu lệnh thứ 2 thôi. Xin cám ơn rất nhiều.

mySql = "SELECT NHT, SH, NCT, NDTH, TST, 0 AS TT, 0 As NT FROM [DL] "
 
Lần chỉnh sửa cuối:
Mọi người xem giúp mình câu lệnh dùng UNION ALL sai ở chổ nào mà khi thực hiện riêng lẽ từng câu lệnh thì ra kết quả còn khi kết hợp với UNION ALL thì chỉ ra kết quả của câu lệnh thứ 2 thôi. Xin cám ơn rất nhiều.

mySql = "SELECT NHT, SH, NCT, NDTH, TST, 0 AS TT, 0 As NT FROM [DL] " & Chr(10)
mySql = mySql & "WHERE (MK='" & Kh & "') And (TKC='" & TK & "') And (MNV='" & LTU & "') And TST Is not null And (NHT BETWEEN " & Date1 & " And " & Date2 & ")"
mySql = mySql & "UNION ALL" & Chr(10)
mySql = "SELECT NHT, SH, NCT, NDTH, 0, TST, 0 FROM [DL] " & Chr(10)
mySql = mySql & "WHERE (MK='" & Kh & "') And (MNV='" & NV & "') And TST Is not null And (NHT BETWEEN " & Date1 & " And " & Date2 & ");"
Đưa dữ liệu lên test thử nha bạn.
 
Bạn chưa biết luật debug câu SQL trong code à? Đưa code như vậy lấy gì thử?
Dùng debug in giá trị cuối cùng của mySQL của cả hai trường hợp riêng lẻ và union hai khối đưa lên đây. Đọc code cộng tới cộng lui mỏi mắt quá. Thông số tùm lum, biết đâu mà mò.
Phần lớn trường hợp là sau khi in ra mySQL thì bạn sẽ tự nhìn thấy chỗ sai.
 
Vâng! em đưa file lên mấy anh xem giúp dùm em. Nó chỉ ra kết quả của câu lệnh cuối cùng thôi.
Cho em hỏi thêm mệnh đề COMPUTE BY có sử dụng được trong ADO không? Sao em đưa vào nó cứ báo lỗi? Cám ơn các anh rất nhiều.
 

File đính kèm

  • Ke toan GPE.rar
    91.3 KB · Đọc: 21
Lần chỉnh sửa cuối:
Vâng! em đưa file lên mấy anh xem giúp dùm em. Nó chỉ ra kết quả của câu lệnh cuối cùng thôi.
Cho em hỏi thêm mệnh đề COMPUTE BY có sử dụng được trong ADO không? Sao em đưa vào nó cứ báo lỗi? Cám ơn các anh rất nhiều.

Chỉnh lại như sau, bạn biết sai chổ nào rồi chứ?
mySql = "SELECT NHT, SH, NCT, NDTH, TST, 0 As TT, 0 As NT FROM [DL] " & Chr(10)
mySql = mySql & "WHERE (MK='" & Kh & "') And (TKC='" & TK & "') And (MNV='" & LTU & "') And TST Is not null And (NHT BETWEEN " & Date1 & " And " & Date2 & ")"
mySql = mySql & "UNION ALL" & Chr(10)
mySql = mySql & "SELECT NHT, SH, NCT, NDTH, 0, TST, 0 FROM [DL] " & Chr(10)
mySql = mySql & "WHERE (MK='" & Kh & "') And (MNV='" & NV & "') And TST Is not null And (NHT BETWEEN " & Date1 & " And " & Date2 & ");"
mySql = mySql & "UNION ALL" & Chr(10)
mySql = mySql & "SELECT NHT, SH, NCT, NDTH, 0, 0, TST FROM [DL] " & Chr(10)
mySql = mySql & "WHERE (MK='" & Kh & "') And (TKN='" & TK & "') And (MNV='NTU') And TST Is not null And (NHT BETWEEN " & Date1 & " And " & Date2 & ")"
COMPUTE là lệnh thực hiện ở SQL Server, trên Excel bạn không thực hiện được lệnh này.
 
Lần chỉnh sửa cuối:
Cám ơn Anh rất nhiều. Em hiện đang áp dụng ODA vào trong công tác kế toán thay thế cho các công thức phải chạy ì ạch khi dử liệu nhiều để lập các BC tài chính và Sổ sách kế toán. Nhưng em còn nhiều chổ "bí" quá anh có thể gíup em k?
Anh làm ơn xem giúp Câu lệnh của Báo cáo tài chính giúp em, xem coi có thể rút gọn lại đc k hay dùng câu lệnh khác hay hơn không. Với lại em muốn nó chỉ ra kết quả của những dòng có dử liệu thôi nhưng em dùng HAVING mà nó cứ báo lỗi.
Anh xem giúp em nhé. Cám ơn anh rất nhiều!
 

File đính kèm

  • Ke toan GPE.rar
    138 KB · Đọc: 19
Lần chỉnh sửa cuối:

File đính kèm

  • SQL.rar
    120.9 KB · Đọc: 11
Lần chỉnh sửa cuối:
Mọi người xem dùng mình mệnh đề HAVING sai chổ nào mà nó báo lỗi. Mình cám ơn rất nhiều.

Tạo thêm 1 sub query nữa xem sao bạn:
mySql = "SELECT MK, M, TM, " & Chr(10)
mySql = mySql & "SUM(IIf(((TKC = '" & TK4 & "') And MCP = 'DT' And(NHT>=" & Date1 & ")) Or ((TKN = '" & TK6 & "') And MNKP = 'PLP' And (NTT>=" & Date1 & ")), [ST],0)) AS KPKN, " & Chr(10)
mySql = mySql & "SUM(IIf(((TKC = '" & TK4 & "') And MCP = 'DT') Or ((TKN = '" & TK6 & "') And MNKP = 'PLP' And NTT > 0), [ST],0)) AS KPLK, " & Chr(10)
mySql = mySql & "SUM(IIf(((TKN = '" & TK6 & "') And (MNKP = 'NS' Or (MNKP = 'PLP' And (NTT>=" & Date1 & "))) And (NHT>=" & Date1 & ")) Or ((TKC = '" & TK4 & "') And (TKN Like '33%') And MNKP = 'NS' And MNV = 'TC' And (NHT>=" & Date1 & ")), [ST],0)) AS QTKN, " & Chr(10)
mySql = mySql & "SUM(IIf((TKN = '" & TK6 & "') And (MNKP = 'NS' Or (MNKP = 'PLP' And NTT > 0)) Or ((TKC = '" & TK4 & "') And (TKN Like '33%') And MNKP = 'NS' And MNV = 'TC'), [ST],0)) AS QTLK, " & Chr(10)
mySql = mySql & "SUM(IIf((TKN = '" & TK4 & "') And (NHT>=" & Date1 & "), [ST],0)) AS NopKN, " & Chr(10)
mySql = mySql & "SUM(IIf((TKN = '" & TK4 & "'), [ST],0)) AS NopLK" & Chr(10)
mySql = mySql & "FROM [DL] " & Chr(10)
mySql = mySql & "WHERE (MK = '" & Kh & "') And (NHT<=" & Date2 & ") And TM > 6000 " & Chr(10)
mySql = mySql & "GROUP BY MK, M, TM " & Chr(10)
mySql = mySql & "Order by MK, M, TM"
Recex.Open "select * from ( " & mySql & ") where ([KPKN] + [KPLK] + [QTKN] + [QTLK])>0", Cnex, adOpenKeyset, adLockOptimistic
 
Làm hẳn 1 hàm chuyển đổi luôn

Mã:
Function TransArr(sArr As Variant) As Variant
    Dim cllX As Long, cllY As Long, tmpX As Long, tmpY As Long, tmpArr As Variant
    tmpX = UBound(sArr, 2):    tmpY = UBound(sArr, 1)
    ReDim tmpArr(tmpX, tmpY)
    For cllX = 0 To tmpX
        For cllY = 0 To tmpY
            tmpArr(cllX, cllY) = sArr(cllY, cllX)
        Next cllY
    Next cllX
    TransArr = tmpArr

End Function

Chạy thử code sau:

[GPECODE=sql]Sub LayDL_ADO()
Dim lsSQL As String, cnn As Object, lrs As Object, rstArr As Variant, lFields As Long, lRecrds As Long
Set cnn = CreateObject("ADODB.Connection")
Set lrs = CreateObject("ADODB.Recordset")
With cnn
.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;"
 

File đính kèm

  • Tao Array.rar
    48.7 KB · Đọc: 23
Lần chỉnh sửa cuối:
Cách trích dữ liệu từ CSDL bằng ADO.

Chào mọi người!

Mình có file dữ liệu như đính kèm, ID là trường AutoNumber.
Các bạn giúp mình code ADO để lấy dữ liệu của machine SW1 hoặc SW2 v.v...Nói chung là lấy theo machine với điều kiện chỉ cần lấy thêm 7 record trước đó (của máy cần lấy).
Vì hiện tại khi mình cần lấy dữ liệu của máy SW1 mình phải select * from ...rồi mình cho vòng lặp chạy ngược để lấy dữ liệu cần, theo mình nghĩ khi dữ liệu của machine này càng lên thì câu lệnh truy vấn sẽ càng chậm.
Rất mong mọi người giúp đỡ!

Mình cảm ơn.
 

File đính kèm

  • DATABASESAVED.xlsx
    17.7 KB · Đọc: 16
Chào mọi người!

Mình có file dữ liệu như đính kèm, ID là trường AutoNumber.
Các bạn giúp mình code ADO để lấy dữ liệu của machine SW1 hoặc SW2 v.v...Nói chung là lấy theo machine với điều kiện chỉ cần lấy thêm 7 record trước đó (của máy cần lấy).
Vì hiện tại khi mình cần lấy dữ liệu của máy SW1 mình phải select * from ...rồi mình cho vòng lặp chạy ngược để lấy dữ liệu cần, theo mình nghĩ khi dữ liệu của machine này càng lên thì câu lệnh truy vấn sẽ càng chậm.
Rất mong mọi người giúp đỡ!

Mình cảm ơn.
Bạn giải thích rõ hơn phần in đậm được không?
 
Hi Bạn!

Giả sử trong CSDL của mình có 100 dòng của máy SW1 thì khi lấy mình chỉ lấy 7 dòng cuối cùng với câu lệnh SQL mà không phải lặp qua Table.

Thanks!
Bạn thử với Code sau
Mã:
Sub Loc()
    On Error GoTo Handle
    Dim cnn As Object, lsSQL As String, lrs As Object, FileFullName As String
    Set cnn = CreateObject("ADODB.Connection")
    Set lrs = CreateObject("ADODB.Recordset")
    FileFullName = Application.ThisWorkbook.FullName
    With cnn
        If Val(Application.Version) < 12 Then
            .ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & FileFullName & ";Extended Properties=""Excel 8.0;HDR=No"";"
        Else
            .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & FileFullName & ";Extended Properties=""Excel 12.0;HDR=No"";"
        End If
        .Open
    End With
    lsSQL = "Select * From [DATATABLESPC$A2:AL65536] " _
            & " Where f5 ='SW1' " _
            & "And f1 > (Select Max(f1) As Mx From [DATATABLESPC$A2:AL65536]" _
            & "Where F5='SW1')-7"
            
    lrs.Open lsSQL, cnn, 3, 1
    Sheet2.[A2:AL65536].ClearContents
    Sheet2.Range("A2").CopyFromRecordset lrs
    Set lrs = Nothing
    cnn.Close: Set cnn = Nothing
    Exit Sub
Handle:
    MsgBox Err.Description
End Sub
 
Bạn thử với Code sau
Mã:
Sub Loc()
    On Error GoTo Handle
    Dim cnn As Object, lsSQL As String, lrs As Object, FileFullName As String
    Set cnn = CreateObject("ADODB.Connection")
    Set lrs = CreateObject("ADODB.Recordset")
    FileFullName = Application.ThisWorkbook.FullName
    With cnn
        If Val(Application.Version) < 12 Then
            .ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & FileFullName & ";Extended Properties=""Excel 8.0;HDR=No"";"
        Else
            .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & FileFullName & ";Extended Properties=""Excel 12.0;HDR=No"";"
        End If
        .Open
    End With
    lsSQL = "Select * From [DATATABLESPC$A2:AL65536] " _
            & " Where f5 ='SW1' " _
            & "And f1 > (Select Max(f1) As Mx From [DATATABLESPC$A2:AL65536]" _
            & "Where F5='SW1')-7"
            
    lrs.Open lsSQL, cnn, 3, 1
    Sheet2.[A2:AL65536].ClearContents
    Sheet2.Range("A2").CopyFromRecordset lrs
    Set lrs = Nothing
    cnn.Close: Set cnn = Nothing
    Exit Sub
Handle:
    MsgBox Err.Description
End Sub

Dùng câu lệnh select top sẽ nhanh hơn nhiều đó bạn.
 
Em lại học thêm được một cái mới, cảm ơn anh HLMT
Mã:
    lsSQL = "Select Top 7 f1,* from [DATATABLESPC$A2:AL65536] Where f5='SW2' Order By f1 Desc"
Hi 2 Bạn,

Mình cảm ơn nhiều nha, thật ra thì ứng dụng của mình viết trên vb.net nhưng về sql chắc giống nhau. Mình sẽ thử và ứng dụng cho phù hợp.
Bây giờ mình lại có thêm 1 yêu cầu mới: record của mình có các cột như: machine, stock, lot, REV
Khi tìm 1 lot theo REV từ CSDL mình làm như sau:
1/ Chọn dữ liệu theo Lot (để lấy REV)
SELECT DISTINCT [REV] FROM [DATATABLESPC] WHERE [lot] ='" & Trim(Me.tbLotFind.Text.ToUpper) & "'"
REVString = REV cuối cùng trong kết quả của câu lệnh trên.
2/ Tìm dữ liệu liên quan đến lot và REV trên.
SELECT * FROM [DATATABLESPC] WHERE [stock] ='" & Trim(partString) & "' AND [machine] ='" & Trim(machineString) & "' AND [REV] ='" & REVString & "'"

Các bạn giúp mình gộp lại trong 1 câu lệnh truy vấn với nhé!

Thanks!

Em lại học thêm được một cái mới, cảm ơn anh HLMT
Mã:
    lsSQL = "Select Top 7 f1,* from [DATATABLESPC$A2:AL65536] Where f5='SW2' Order By f1 Desc"

Mình vừa thử Code của bạn trên SQL, kết quả trả về đúng số record mình cần nhưng lại sắp xếp theo thứ tự giảm dần mất.
Mình muốn lấy 7 hàng cuối nhưng vẫn theo thứ tự cái nào có trước thì nằm trước được không bạn?

Thanks

Hi

Mình làm lại như thế này không biết có ảnh hưởng đến tốc độ của lệnh truy vấn không các bạn giúp mình kiểm tra với

SELECT * FROM (SELECT TOP 10 * FROM [DATATABLESPC] WHERE [stock] ='" & Trim(partNumberString) & "' AND [machine] = '" & machineName & "' AND [REV] ='" & revPart & "' ORDER BY ID DESC) ORDER BY ID ASC"

Thanks
 
Chỉnh sửa lần cuối bởi điều hành viên:
Hi 2 Bạn,

Mình cảm ơn nhiều nha, thật ra thì ứng dụng của mình viết trên vb.net nhưng về sql chắc giống nhau. Mình sẽ thử và ứng dụng cho phù hợp.
Bây giờ mình lại có thêm 1 yêu cầu mới: record của mình có các cột như: machine, stock, lot, REV
Khi tìm 1 lot theo REV từ CSDL mình làm như sau:
1/ Chọn dữ liệu theo Lot (để lấy REV)
SELECT DISTINCT [REV] FROM [DATATABLESPC] WHERE [lot] ='" & Trim(Me.tbLotFind.Text.ToUpper) & "'"
REVString = REV cuối cùng trong kết quả của câu lệnh trên.
2/ Tìm dữ liệu liên quan đến lot và REV trên.
SELECT * FROM [DATATABLESPC] WHERE [stock] ='" & Trim(partString) & "' AND [machine] ='" & Trim(machineString) & "' AND [REV] ='" & REVString & "'"

Các bạn giúp mình gộp lại trong 1 câu lệnh truy vấn với nhé!

Thanks!

Tôi cũng chưa hình dung được chính xác dữ liệu của bạn như thế nào nhưng sau khi dùng SELECT DISTINCT bạn nói:
REVString = REV cuối cùng trong kết quả của câu lệnh trên.
là như thế nào? Bạn dùng vòng lặp để lấy?

Và dường như vấn đề chỉ là lấy dữ liệu dòng cuối cùng REV vậy bạn lại sử dụng câu lệnh Select Top 1 rồi gán vào vị trí của câu lệnh thứ 2.


SELECT * FROM (SELECT TOP 10 * FROM [DATATABLESPC] WHERE [stock] ='" & Trim(partNumberString) & "' AND [machine] = '" & machineName & "' AND [REV] ='" & revPart & "' ORDER BY ID DESC) ORDER BY ID ASC"

Bạn có thể tự test tốc độ nhưng đã có thêm thao tác thì kiểu gì tốc độ cũng ảnh hưởng bạn à.
 
Tôi cũng chưa hình dung được chính xác dữ liệu của bạn như thế nào nhưng sau khi dùng SELECT DISTINCT bạn nói:

là như thế nào? Bạn dùng vòng lặp để lấy?

Và dường như vấn đề chỉ là lấy dữ liệu dòng cuối cùng REV vậy bạn lại sử dụng câu lệnh Select Top 1 rồi gán vào vị trí của câu lệnh thứ 2.




Bạn có thể tự test tốc độ nhưng đã có thêm thao tác thì kiểu gì tốc độ cũng ảnh hưởng bạn à.

Hi Bạn
Cảm ơn nhiều nha!
Không biết như thế nào nhưng sao mình đọc tài liệu thấy khi dùng ORDER BY thì tốc độ chậm vì SQL phải sort trước mới lấy dữ liệu, vậy nên chắc mình sẽ làm theo cách trên chứ lồng vào thì khi CSDL của máy SW1 tăng lên tốc độ sẽ chậm hơn mất.
Nếu lấy theo cách cũ thì câu lệnh đầu tiên của mình chỉ trích tối đa 10 hàng theo lot mà thôi. Sau đó mình lấy REV rồi truy vấn tiếp cũng được.
Hay chắc mình thử dùng Max thử đã, có gì mình nt cho bạn sau nha.

Thân
 
Lần chỉnh sửa cuối:
Tại sao AddIn không hoạt động?

Mình thấy mỗi lần viết code dùng đến ADO thì cứ viết mấy dòng code giống nhau nên mình nghĩ có thể viết 1 hàm này để mở kết nối
PHP:
Public Function MoketNoi(path As String, Optional ByVal Headers As Boolean = True) As Object
    Dim strConn As String, objConn As Object
    Set objConn = CreateObject("ADODB.Connection")
    strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
              "Data Source=" & path & ";" & _
              "Extended Properties=""Excel 8.0;HDR=" & _
              IIf(Headers, "Yes", "No") & """"
    objConn.Open strConn
    Set MoketNoi = objConn
End Function
Khi hàm này nằm trong file thì hoạt động tốt, nhưng khi lưu hàm này thành 1 addin riêng biệt thì hàm không hoạt động.
Các anh chị vui lòng giải thích giúp tại sao và làm sao khắc phục điều này.
 
Web KT
Back
Top Bottom