Truy vấn trong SQL?

Liên hệ QC
Cảm ơn bạn, OT cũng đã tìm hiểu và sử dụng câu lệnh trên (rs.Recordcount )
kết quả trả về - 1, trong khi dữ liệu trả về rất nhiều dòng. Phiền Bạn có thể hướng dẫn chi tiết hơn được không ạ?

RecordCount trong ADO Recordset chỉ chạy được với 3 loại "CursorType" là: adOpenKeySet (1), adOpenDynamic (2), adOpenStatic (3)
CursorType: adOpenForwardOnly(0) nó không đọc được nên trả về giá trị -1, tức là cho biết có record tồn tại thôi.
Nếu chuỗi kết nối không khai báo thì ADO sẽ sử dụng CursorType mặc định là: adOpenForwardOnly - 0
 
RecordCount trong ADO Recordset chỉ chạy được với 3 loại "CursorType" là: adOpenKeySet (1), adOpenDynamic (2), adOpenStatic (3)
CursorType: adOpenForwardOnly(0) nó không đọc được nên trả về giá trị -1, tức là cho biết có record tồn tại thôi.
Nếu chuỗi kết nối không khai báo thì ADO sẽ sử dụng CursorType mặc định là: adOpenForwardOnly - 0
Hic, cụ thể là thế nào vậy Anh?
OT muốn kiểm tra số dòng dữ liệu lấy từ DB vào Excel, trong trường hợp nếu dữ liệu đến 100,000 dòng thì báo lỗi dữ liệu quá nhiều trước khi đưa xuống bảng tính excel.
 
Hic, cụ thể là thế nào vậy Anh?
OT muốn kiểm tra số dòng dữ liệu lấy từ DB vào Excel, trong trường hợp nếu dữ liệu đến 100,000 dòng thì báo lỗi dữ liệu quá nhiều trước khi đưa xuống bảng tính excel.

:) Em dùng câu lênh như của quanluu1989 đó. Anh chỉ giải thích thêm là phải khai báo Recordset theo kiểu CursorType đó thì RecordCount mới trả về kết quả đúng.

Cách 1: dùng khai báo sớm nhé. (Early Binding)
Dim oRS As ADODB.Recordset
Set oRS = New ADODB.Recordset
With oRS
.CursorType = adOpenKeyset
.CursorLocation = adUseClient
.LockType = adLockBatchOptimistic
.Open strSQL, oCnn
Msgbox "So dong: " & oRS.RecordCount
End With


Cách 2: như của quanluu1989
Dim oRS As ADODB.Recordset
Set oRS = New ADODB.Recordset
oRS.Open strSQL, oCnn, adOpenKeyset, adLockBatchOptimistic
Msgbox "So dong: " & oRS.RecordCount
 
sử dụng rowcount và phần chay truy vấn với tham số

rs.Open strSQL, conn,3,1

Mình k nhớ có chính xác k.

:) Em dùng câu lênh như của quanluu1989 đó. Anh chỉ giải thích thêm là phải khai báo Recordset theo kiểu CursorType đó thì RecordCount mới trả về kết quả đúng.

Cách 1: dùng khai báo sớm nhé. (Early Binding)
Dim oRS As ADODB.Recordset
Set oRS = New ADODB.Recordset
With oRS
.CursorType = adOpenKeyset
.CursorLocation = adUseClient
.LockType = adLockBatchOptimistic
.Open strSQL, oCnn
Msgbox "So dong: " & oRS.RecordCount
End With


Cách 2: như của quanluu1989
Dim oRS As ADODB.Recordset
Set oRS = New ADODB.Recordset
oRS.Open strSQL, oCnn, adOpenKeyset, adLockBatchOptimistic
Msgbox "So dong: " & oRS.RecordCount

Cảm ơn quanluu1989, cảm ơn Anh ongke0711
OT đã thử 2 cách của Anh ongke0711, cả 2 đều OK rồi ạ.
 
Nhờ các A/c xem giúp e lỗi này với ạ. Thank
 

File đính kèm

  • z1615532169924_63869c1fd5948bf4722f2b94b077ba69.png
    z1615532169924_63869c1fd5948bf4722f2b94b077ba69.png
    10 KB · Đọc: 16
  • So A-2018-3.xlsm
    1.6 MB · Đọc: 9
Lỗi này do cái ConnectString của bạn bị sai nên không open được
Xem lại cái Chr(39) trong chuỗi Connect. Nếu nhớ không nhầm thì Chr(39) là dấu nháy đơn (') thì phải
Cảm ơn a đã trợ giúp. e khắc phục được vấn đề của e rồi ạ.
Vấn đề của e là lỗi format định dạng ngày tháng. do lúc trước e để định dạng ngày tháng để so sánh dạng số (long), dữ liệu trong bảng dạng date nên khi so sánh bị ép kiểu dẫn đến chỉ làm được 1 số dòng sau đó báo lỗi runtime .. như trên.
Cách khắc phục của e là chuyển cái ngày tháng so sánh thành 1 string có định dạng theo cú pháp "mm-dd-yyyy". sau khi chuyển định dạng như vậy thì chạy ok rồi ạ.
 

File đính kèm

  • So A-2018.xlsm
    1.1 MB · Đọc: 10
Xin chào các bạn.
Nhờ các bạn giúp tôi một câu lệnh truy vấn lấy ngày gần nhất so với thời điểm hiện tại trong database với ạ.
Cụ thể trong file đính kèm Sheet"Data" là bảng dữ liệu trong CSDL tôi cần truy vấn đến, và sheet KQ là dữ liệu mong muốn tôi cần lấy được từ bảng Data ạ.
 

File đính kèm

  • MAX_DAY.xlsx
    957.7 KB · Đọc: 13
@OT thử, điều kiện là các ngày đều trong quá khứ và hiện tại
Mã:
Option Explicit
Sub a()
    Dim cnn As New ADODB.Connection
    Dim rs As New ADODB.Recordset
    Dim s As String
    s = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & " ;Extended Properties=""Excel 12.0 Xml;HDR=YES"";"
    cnn.Open s
    s = "SELECT * FROM [DATA$] WHERE DATE = (SELECT MAX(DATE) FROM [DATA$])"
    rs.Open s, cnn
    Sheets("KQ").Range("A2").CopyFromRecordset rs
    rs.Close
    Set rs = Nothing
    cnn.Close
    Set cnn = Nothing
End Sub
 
Xin chào các bạn.
Nhờ các bạn giúp tôi một câu lệnh truy vấn lấy ngày gần nhất so với thời điểm hiện tại trong database với ạ.
Cụ thể trong file đính kèm Sheet"Data" là bảng dữ liệu trong CSDL tôi cần truy vấn đến, và sheet KQ là dữ liệu mong muốn tôi cần lấy được từ bảng Data ạ.
Hỏi thêm:
- Data luôn được sắp xếp cột A (Date) từ nhỏ đến lớn?
- Trong Data có khi nào có ngày lớn hơn ngày hiện tại (Today()) không? Nếu có thì trước 1 ngày hoặc sau 1 ngày hiện tại thì lấy ngày nào?
- Số 20200299 thể hiện điều gì (Từ dòng 18594)
 
Lần chỉnh sửa cuối:
Hỏi thêm:
- Data luôn được sắp xếp cột A (Date) từ nhỏ đến lớn?
- Trong Data có khi nào có ngày lớn hơn ngày hiện tại (Today()) không? Nếu có thì trước 1 ngày hoặc sau 1 ngày hiện tại thì lấy ngày nào?
- Số 20200299 thể hiện điều gì (Từ dòng 18594)
Con chào Thầy,
Cảm ơn Thầy đã quan tâm ạ,
"20200299 " là do ngày hệ thống (phần mềm) tự sinh ra do người dùng trong quá trình nhập liệu không nhập ngày (nó sẽ lấy tháng năm của tháng hiện tại, còn ngày mặc định là 99)
Trong data không có ngày lớn hơn hiện tại Thầy ạ.
 
Con chào Thầy,
Cảm ơn Thầy đã quan tâm ạ,
"20200299 " là do ngày hệ thống (phần mềm) tự sinh ra do người dùng trong quá trình nhập liệu không nhập ngày (nó sẽ lấy tháng năm của tháng hiện tại, còn ngày mặc định là 99)
Trong data không có ngày lớn hơn hiện tại Thầy ạ.
Như vậy lúc nào ngày ở dòng cuối luôn là ngày gần nhất.
Cứ Filter ngày này là ra thôi.
 
@OT thử, điều kiện là các ngày đều trong quá khứ và hiện tại
Mã:
Option Explicit
Sub a()
    Dim cnn As New ADODB.Connection
    Dim rs As New ADODB.Recordset
    Dim s As String
    s = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & " ;Extended Properties=""Excel 12.0 Xml;HDR=YES"";"
    cnn.Open s
    s = "SELECT * FROM [DATA$] WHERE DATE = (SELECT MAX(DATE) FROM [DATA$])"
    rs.Open s, cnn
    Sheets("KQ").Range("A2").CopyFromRecordset rs
    rs.Close
    Set rs = Nothing
    cnn.Close
    Set cnn = Nothing
End Sub

Cảm ơn bạn đã giúp đỡ.
Trường hợp này OT hỏi về câu truy vấn trực tiếp trong SQL_Server ạ chứ không phải lấy từ Sheet DATA sang sheet KQ đâu ạ.
Tuy nhiên OT cũng đang cần đoạn code để lọc dạng này từ Sheet này sang Sheet khác, cảm ơn bạn đã cho OT một cách để tham khảo.
Vậy là câu lệnh OT cần để thực hiện trực tiếp trên SQL_Server là: "SELECT MAX(DATE) FROM DATA"
Cảm ơn bạn nhiều.
Chúc bạn nhiều sức khỏe.
Bài đã được tự động gộp:

Như vậy lúc nào ngày ở dòng cuối luôn là ngày gần nhất.
Cứ Filter ngày này là ra thôi.
Con chào Thầy
Con sử dụng câu lệnh "SELECT * FROM DATA" trong hệ thống xuất dữ liệu ra thì dữ liệu trong cột ngày sắp xếp y chang bảng data Thầy ạ (nguyên xi chưa chỉnh sửa gì ạ).
Nhìn vào "20200299" và "20200331" nó khác nhau 6 ký tự đầu về tháng/định dạng hệ thống là "yyymmdd1" có số 1 cuối cùngThầy ạ.
Nếu sử dụng VBA để lọc từ DATA sang sheet KQ giống như bài 74 thì cũng xử lý chuỗi ngày tháng này Thầy ạ.
Con cảm ơn Thầy.
Bài đã được tự động gộp:

@OT thử, điều kiện là các ngày đều trong quá khứ và hiện tại
Mã:
Option Explicit
Sub a()
    Dim cnn As New ADODB.Connection
    Dim rs As New ADODB.Recordset
    Dim s As String
    s = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & " ;Extended Properties=""Excel 12.0 Xml;HDR=YES"";"
    cnn.Open s
    s = "SELECT * FROM [DATA$] WHERE DATE = (SELECT MAX(DATE) FROM [DATA$])"
    rs.Open s, cnn
    Sheets("KQ").Range("A2").CopyFromRecordset rs
    rs.Close
    Set rs = Nothing
    cnn.Close
    Set cnn = Nothing
End Sub

Híc câu lệnh "SELECT MAX(DATE) FROM DATA" nó chỉ trả về duy nhất 1 giá trị của "20200331" trong cột DATE của bảng DATA.
OT muốn truy vân lấy tất cả các cột và dữ liệu là ngày max như bảng kết quả thì câu lệnh viết sao ạ T_T
 
Lần chỉnh sửa cuối:
Câu truy vấn là Select * from data where date=(select....)
Chính là biến s ở bài của mình.
 
Cảm ơn bạn đã giúp đỡ.
Trường hợp này OT hỏi về câu truy vấn trực tiếp trong SQL_Server ạ chứ không phải lấy từ Sheet DATA sang sheet KQ đâu ạ.
Tuy nhiên OT cũng đang cần đoạn code để lọc dạng này từ Sheet này sang Sheet khác, cảm ơn bạn đã cho OT một cách để tham khảo.
Vậy là câu lệnh OT cần để thực hiện trực tiếp trên SQL_Server là: "SELECT MAX(DATE) FROM DATA"
Cảm ơn bạn nhiều.
Chúc bạn nhiều sức khỏe.
Bài đã được tự động gộp:


Con chào Thầy
Con sử dụng câu lệnh "SELECT * FROM DATA" trong hệ thống xuất dữ liệu ra thì dữ liệu trong cột ngày sắp xếp y chang bảng data Thầy ạ (nguyên xi chưa chỉnh sửa gì ạ).
Nhìn vào "20200299" và "20200331" nó khác nhau 6 ký tự đầu về tháng/định dạng hệ thống là "yyymmdd1" có số 1 cuối cùngThầy ạ.
Nếu sử dụng VBA để lọc từ DATA sang sheet KQ giống như bài 74 thì cũng xử lý chuỗi ngày tháng này Thầy ạ.
Con cảm ơn Thầy.
Bài đã được tự động gộp:



Híc câu lệnh "SELECT MAX(DATE) FROM DATA" nó chỉ trả về duy nhất 1 giá trị của "20200331" trong cột DATE của bảng DATA.
OT muốn truy vân lấy tất cả các cột và dữ liệu là ngày max như bảng kết quả thì câu lệnh viết sao ạ T_T
Nếu có "20200331" và "20200399" ngày gần nhất là ngày nào?
 
Câu truy vấn là Select * from data where date=(select....)
Chính là biến s ở bài của mình.
A! Được rồi. Cảm ơn Bạn nhiều ^_^ ,, động đến cái SQL này cũng rắc rối nhỉ hic,,,
Dữ liệu không may có hư chắc mình ốm đòn với các Sếp quá!
Bài đã được tự động gộp:

Nếu có "20200331" và "20200399" ngày gần nhất là ngày nào?
Con chào Bác Hiếu,
Cảm ơn Bác Hiếu đã quan tâm ạ.
Trường hợp này con chưa gặp mà hệ thống cũng chỉ cho phép 1 tháng chỉ có một ngày
Vì đây là số liệu trong bản kiểm kê 1 tháng chỉ sảy ra 1 lần không có 2 ngày như vậy Bác ạ.
Chắc là cứ số nào to hơn thì là gần nhất thôi ạ. Híc.
Bài đã được tự động gộp:

A! Được rồi. Cảm ơn Bạn nhiều ^_^ ,, động đến cái SQL này cũng rắc rối nhỉ hic,,,
Dữ liệu không may có hư chắc mình ốm đòn với các Sếp quá!
Bài đã được tự động gộp:


Con chào Bác Hiếu,
Cảm ơn Bác Hiếu đã quan tâm ạ.
Trường hợp này con chưa gặp mà hệ thống cũng chỉ cho phép 1 tháng chỉ có một ngày
Vì đây là số liệu trong bản kiểm kê 1 tháng chỉ sảy ra 1 lần không có 2 ngày như vậy Bác ạ.
Chắc là cứ số nào to hơn thì là gần nhất thôi ạ. Híc.
Híc tháng 12 nó có 2 ngày luôn,, hình như tháng đó mới đưa data vào phần mềm nên nó vậy ạ T_T
 
Lần chỉnh sửa cuối:
A! Được rồi. Cảm ơn Bạn nhiều ^_^ ,, động đến cái SQL này cũng rắc rối nhỉ hic,,,
Dữ liệu không may có hư chắc mình ốm đòn với các Sếp quá!
Bài đã được tự động gộp:


Con chào Bác Hiếu,
Cảm ơn Bác Hiếu đã quan tâm ạ.
Trường hợp này con chưa gặp mà hệ thống cũng chỉ cho phép 1 tháng chỉ có một ngày
Vì đây là số liệu trong bản kiểm kê 1 tháng chỉ sảy ra 1 lần không có 2 ngày như vậy Bác ạ.
Chắc là cứ số nào to hơn thì là gần nhất thôi ạ. Híc.
Bài đã được tự động gộp:


Híc tháng 12 nó có 2 ngày luôn,, hình như tháng đó mới đưa data vào phần mềm nên nó vậy ạ T_T
Có 2 ngày "20200229" và "20200299"
 
Cái này phải bắt buộc nhập chuẩn dữ liệu từ phần mềm, chứ chẳng ai để như thế này cả, rất khó xử lý sau này.
 
Web KT
Back
Top Bottom