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
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
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
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 ạ.
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 ạ.
@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)
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 ạ.
@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.
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.
@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
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
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.
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.
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