Thắc mắc về sử lý định dạng số khi cập nhật, truy cấn dữ liệu bằng ADO
Xin chào các anh, chị
Tôi có một vấn đề vướng mắc sử lý dữ liệu khi sử dụng ADO cập nhật, truy vấn dữ liệu, cụ thể:
1.Khi thêm dữ liệu vào CSDL (Excel), trường hợp dữ liệu cần cập nhật có nhiều trường (30 Filed) thì cách viết code như thế nào cho gọn.
Xin mượn code của anh Hai Lúa Miền Tây để minh họa :[FONT=Verdana]Public cnn As New ADODB.Connection[/FONT]Sub CapNhat() Dim rs As New ADODB.Recordset Dim i, r As Integer Set cnn = New ADODB.Connection r = Range("A65000").End(xlUp).Row With cnn .ConnectionString = "Provider= Microsoft.Jet.OLEDB.4.0; data source=" & ThisWorkbook.Path & "" & Range("F1").Value & ".xls;Extended Properties=Excel 8.0;" .CursorLocation = adUseClient .Open End With Set rs = Nothing rs.Open "Select * from [UP$]", cnn, 1, 3 For i = 2 To r With rs .AddNew ![MA_SP] = Range("A" & i).Value !TEN_SP = Range("B" & i).Value !SL_SP = Range("C" & i).Value [COLOR=#ff0000] !.......... !.......... !.......... 30 Filed [/COLOR] .Update End With Next Range("A2:C65000").ClearContents Set rs = Nothing cnn.Close Set cnn = Nothing End Sub2. Khi thêm dữ liệu định dạng số vào CSDL (Excel), định dạng này trở thành dạng Text. Khi truy vấn ngược lại (ADO) từ CSDL việc định dạng Text gây khó khăn cho việc tính toán. Như vậy, phải sử lý định dạng Filed của Recordset hoặc sử lý số liệu trong CSDL excel ?
Tôi muốn hỏi cách sử lý dữ liệu này như thế nào?Rất mong nhận được sự giúp đỡ của các anh chị.
Câu 1: Bạn có thể thay thế cách nhập từng field như trên thành nhập nguyên bảng, nếu code gọn thì làm 2 bảng có cùng cấu trúc, mình chỉ cần select * là xong, ngược lại bạn muốn nhập theo từng field theo ý thì chỉ có cách là gõ từng field theo ý thích của bạn.
Câu 2: Vấn đề nằm ở chổ dữ liệu ở record đầu tiên của bạn nó là text thì các dòng sau nó sẽ ngầm hiểu field đó là text, vậy cách khắc phục là khi nhập dữ liệu vào dòng đầu tiên thì phải xác định rõ field nào là dạng nào.
Câu 1: Bạn có thể thay thế cách nhập từng field như trên thành nhập nguyên bảng, nếu code gọn thì làm 2 bảng có cùng cấu trúc, mình chỉ cần select * là xong, ngược lại bạn muốn nhập theo từng field theo ý thì chỉ có cách là gõ từng field theo ý thích của bạn.
Vậy là nếu không có cách nào khác thì chỉ còn cách tổ chức lại cơ sở dữ liệu đầu vào.
Câu 2: Vấn đề nằm ở chổ dữ liệu ở record đầu tiên của bạn nó là text thì các dòng sau nó sẽ ngầm hiểu field đó là text, vậy cách khắc phục là khi nhập dữ liệu vào dòng đầu tiên thì phải xác định rõ field nào là dạng nào.
Anh ơi, hình như tất cả các dòng đầu tiên dạng số khi đưa vào đều bị định dạng Text toàn bộ.
Nếu không có cách nào để sử lý trên Recordset thì có cách nào sử lý tổng hợp để đưa một số Field về dạng số trong CSDL ?
Bạn dùng code như bên dưới nhé.
Dim cnn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Sub CapNhat()
If cnn.State = 1 Then cnn.Close
If rs.State = 1 Then rs.Close
With cnn
.ConnectionString = "Provider= Microsoft.Jet.OLEDB.4.0; data source=" & ThisWorkbook.Path & _
"" & Range("F1").Value & ".xls;Extended Properties=Excel 8.0;"
.CursorLocation = adUseClient
.Open
End With
On Error GoTo loi
Dim strSQL As String
strSQL = "INSERT INTO [up$] SELECT ma_sp, ten_sp,sl_sp FROM " & _
"[EXCEL 8.0;Database=" & ThisWorkbook.FullName & ";HDR=Yes].[data$];"
rs.Open strSQL, cnn, 1, 3
MsgBox "Da nhap xong du lieu !", vbInformation
' Range("A2:C65000").ClearContents
Set rs = Nothing
cnn.Close
Set cnn = Nothing
Exit Sub
loi:
MsgBox Err.Description, vbCritical, "Error"
End Sub
www.giaiphapexcel.com/diendan/threads/th%E1%BA%AFc-m%E1%BA%AFc-v%E1%BB%81-s%E1%BB%AD-l%C3%BD-%C4%91%E1%BB%8Bnh-d%E1%BA%A1ng-s%E1%BB%91-khi-c%E1%BA%ADp-nh%E1%BA%ADt-truy-c%E1%BA%A5n-d%E1%BB%AF-li%E1%BB%87u-b%E1%BA%B1ng-ado.66238/
Khóa học Power PI – Ứng dung trong Nhân sự
TỔNG QUAN KHÓA HỌC: POWER BI CHO NGÀNH NHÂN SỰ Khóa học Power BI cho Nhân sự được thiết kế dành riêng cho các...
Xem khóa học
1.) Các câu lệnh truy vấn căn bản như sau:
2.) Các câu lệnh nâng cao
Tuy nhiên trong Excel ADO có 1 số câu lệnh không được hổ trợ.
Cập nhật, thêm mới hay truy vấn đều được tuy nhiên đối với những record có công thức thì không thể cập nhật và bạn muốn xoá thì lại càng không thể.
Có thể những cột bên file data đã được định dạng là kiểu ngày? Hoặc có thể những dòng dữ liệu đầu tiên là dạng ngày.
Bạn đưa file xem thử nhé.
Bạn dò và xoá chổ màu đỏ như sau thử nhé
Tự xem lại CSDL và tự nghiệm ra đi bạn.