lỗi khi xuất dữ liệu từ sql sang sheet của excel (1 người xem)

  • Thread starter Thread starter nvk_hy
  • Ngày gửi Ngày gửi
Liên hệ QC

Người dùng đang xem chủ đề này

nvk_hy

Thành viên mới
Tham gia
24/9/09
Bài viết
21
Được thích
0
Chào các bạn.
Mình có sử dụng đoạn code ở dưới để xuất dữ liệu từ sql sang sheet của excel nhưng khi xuất thì tại trường là dữ liệu kiểu số có giá trị đúng là: 4.998.000.000đ; nhưng khi xuất ra excel thì kết quả là: 4.998.000.128đ;
Rất mong các bạn xem giúp.
Mình xin cảm ơn!

'Khai bao cho ket noi voi CSDL SQL

Public cnn As New ADODB.Connection

Public rs As ADODB.recordset

Const connstr = "Driver=SQL Server;SERVER=240786-WS128169994;UID=sa;PWD=1234fgt56a@00000;DATABASE=QLTS000"

Sub tim_kiem(malcp)

'vo hieu hoa

Application.ScreenUpdating = False

Application.EnableEvents = False

Dim fld As ADODB.Field

Sheet6.Cells.Clear

cnn.Open connstr

Set rs = New ADODB.recordset

rs.Open "SELECT * FROM th_lnlr14_glst12 where plgno = '" & malcp & "'", cnn

'dien tieu de

r = 1

c = 1

For Each fld In rs.Fields

Sheet6.Cells(r, c).Value = fld.Name

c = c + 1

Next

'xuat du lieu ra sheet temp

On Error Resume Next

r = r + 1

Do While Not rs.EOF

c = 1

For Each fld In rs.Fields

Sheet6.Cells(r, c) = fld

c = c + 1

Next

rs.MoveNext

Loop

On Error GoTo 0

rs.Close

cnn.Close

Set rs = Nothing

Set cnn = Nothing

'Tu dong can chinh cot

Sheet6.Cells.EntireColumn.AutoFit

'xoa du lieu

Sheet4.Cells(2, 2).Select

'tai khoan

Sheet4.Cells(3, 2).Value = ""

'dien phong giao dich

Sheet4.Cells(4, 2).Value = ""

'dien ma chu so huu

Sheet4.Cells(5, 2).Value = ""

'dien ten chu so huu

Sheet4.Cells(6, 2).Value = ""

'ma khach hang vay

Sheet4.Cells(7, 2).Value = ""

'ten khach hang vay

Sheet4.Cells(8, 2).Value = ""

'loai tien

Sheet4.Cells(9, 2).Value = ""

'gia tri tai san

Sheet4.Cells(10, 2).Value = ""

'dien so sezi

Sheet4.Cells(11, 2).Value = ""

'dien ghi chu

Sheet4.Cells(12, 2).Value = ""

'xuat du lieu thoa man dieu khien

For i = 2 To r

If Trim(Sheet6.Cells(i, 1).Value) = malcp Then

'dien tai khoan

Sheet4.Cells(3, 2).Value = Sheet6.Cells(i, 3)

'dien phong giao dich

Sheet4.Cells(4, 2).Value = Sheet6.Cells(i, 4)

'dien ma chu so huu

Sheet4.Cells(5, 2).Value = Sheet6.Cells(i, 8)

'dien ten chu so huu

Sheet4.Cells(6, 2).Value = Sheet6.Cells(i, 9)

'ma khach hang vay

Sheet4.Cells(7, 2).Value = Sheet6.Cells(i, 6)

'ten khach hang vay

Sheet4.Cells(8, 2).Value = Sheet6.Cells(i, 7)

'loai tien

Sheet4.Cells(9, 2).Value = Sheet6.Cells(i, 5)

'gia tri tai san

Sheet4.Cells(10, 2).Value = Sheet6.Cells(i, 15)

'dien so sezi

Sheet4.Cells(11, 2).Value = Sheet6.Cells(i, 13)

'dien ghi chu

Sheet4.Cells(12, 2).Value = Trim(Sheet6.Cells(i, 10)) & ", " & Trim(Sheet6.Cells(i, 11))

Exit Sub

End If

Next i

'==================================================

Application.ScreenUpdating = True

Application.EnableEvents = True

Application.Calculation = xlCalculationAutomatic

End Sub
 
1. Vào SSMS chạy thử câu lệnh, và xuất ra csv xem kết quả là gì.
2. kiểu dữ liệu của trường số ấy trên SQL Server là gì?
 
Upvote 0
Vào SSMS gõ câu này
SELECT * FROM th_lnlr14_glst12 where [cái trường gì đó] = 4998000000
xem nó ra cái gì.
Nếu nó ra đúng các dòng bạn nghĩ thì trong quá trình import vào Excel có vấn đề. Lúc đó mới cần chỉnh sửa.
Nếu nó khong ra đúng các dòng ấy thì do giá trị thật trong SQL Server là 4998000128 (hoặc con số gần như vậy)
 
Upvote 0
Vào SSMS gõ câu này
SELECT * FROM th_lnlr14_glst12 where [cái trường gì đó] = 4998000000
xem nó ra cái gì.
Nếu nó ra đúng các dòng bạn nghĩ thì trong quá trình import vào Excel có vấn đề. Lúc đó mới cần chỉnh sửa.
Nếu nó khong ra đúng các dòng ấy thì do giá trị thật trong SQL Server là 4998000128 (hoặc con số gần như vậy)
đã hiểu ý bạn.
Mình đã vào trực tiếp CSDL và dùng câu lệnh như bạn thì ra đũng kết quả 4998000000.
vậy mong bạn giúp
 
Upvote 0
1. Dữ liệu sai ở sheet4 hay sheet6 hay cả hai?
2. Code của bạn Exit sub trước khi nó chạy đến các dòng cuối để chỉnh sửa Appication trở về trạng thái ban đầu. (cần sửa Exit Sub thành Exit For)
3. cái chỗ 'xoa du lieu sửa thành
Range(Sheet4.Cells(2,2),Sheet4.Cells(12,2)).ClearContents
 
Lần chỉnh sửa cuối:
Upvote 0
1. Dữ liệu sai ở sheet4 hay sheet6 hay cả hai?
2. Code của bạn Exit sub trước khi nó chạy đến các dòng cuối để chỉnh sửa Appication trở về trạng thái ban đầu. (cần sửa Exit Sub thành Exit For)
1. Mình muốn xuất ra sheet6 trước sau đó đến sheet4.
2. Đã sửa.
3. Minh để ý là đối với những bản ghi có giá trị lớn từ 1 tỷ trở nên thì bị lỗi như vậy
 
Upvote 0
Dữ liệu Real không chính xác 100%. Tõi nghĩ có nhiều khả năng cái trường kia trong th_lnlr14_glst12 là một calculated field. Khi lấy ra, nó tự động đièu chỉnh số lẻ.
Tôi nhớ mang máng là dữ liệu Real trong SQL Server chỉ bảo đảm đến 7 chữ số. Qua hàng tỷ thì 3 chữ số cuối cùng không còn bảo đảm nữa. Lúc bạn làm việc trên SSMS thì nó tự động điều chỉnh số lẻ. Nhưng khi export thì nó thảy cho ADO tự xử.
Nếu có thể, bạn nên sửa dữ liệu bên SQL Server là Float(53), hay Decimal(16).
 
Upvote 0
Dữ liệu Real không chính xác 100%. Tõi nghĩ có nhiều khả năng cái trường kia trong th_lnlr14_glst12 là một calculated field. Khi lấy ra, nó tự động đièu chỉnh số lẻ.
Tôi nhớ mang máng là dữ liệu Real trong SQL Server chỉ bảo đảm đến 7 chữ số. Qua hàng tỷ thì 3 chữ số cuối cùng không còn bảo đảm nữa. Lúc bạn làm việc trên SSMS thì nó tự động điều chỉnh số lẻ. Nhưng khi export thì nó thảy cho ADO tự xử.
Nếu có thể, bạn nên sửa dữ liệu bên SQL Server là Float(53), hay Decimal(16).
cảm ơn bạn nhé
Mình chuyến sang Decimal(16) thì OK luôn.
 
Upvote 0
a mình nhìn thấy mật khẩu sít tâm ạt min rồi nha. :D:D
 
Upvote 0
Dữ liệu Real không chính xác 100%. Tõi nghĩ có nhiều khả năng cái trường kia trong th_lnlr14_glst12 là một calculated field. Khi lấy ra, nó tự động đièu chỉnh số lẻ.
Tôi nhớ mang máng là dữ liệu Real trong SQL Server chỉ bảo đảm đến 7 chữ số. Qua hàng tỷ thì 3 chữ số cuối cùng không còn bảo đảm nữa. Lúc bạn làm việc trên SSMS thì nó tự động điều chỉnh số lẻ. Nhưng khi export thì nó thảy cho ADO tự xử.
Nếu có thể, bạn nên sửa dữ liệu bên SQL Server là Float(53), hay Decimal(16).

cho mình hỏi?
Mình muốn dùng code để nhập vào csld SQL nhưng không muốn dùng lệnh
'cap nhat vao csdl
cnn.Open connstr
uSQL = "insert into th_lnlr14_glst12(plgno,clno,acctcd,trctcd,ccy,custseq,custnm,clcustno,clcustnm,cltpcd,cldtltpcd,plgtpcd,sezi,ghichu,plgamt,lnofcno,lnofcnm,usrid,usrnm,date_update)" _
& " values('" & plgno & "','" & clno & "','" & acctcd & "','" & trctcd & "','" & ccy & "','" & custseq & "',N'" & custnm & "','" & clcustno & "',N'" & clcustnm & "',N'" & cltpcd & "',N'" & cldtltpcd & "',N'" & plgtpcd & "',N'" & sezi & "',N'" & ghichu & "','" & plgamt & "','" & lnofcno & "',N'" & lnofcnm & "','" & usrid & "',N'" & usrnm & "','" & date_update & "')"
cnn.Execute uSQL
cnn.Close
xin chỉ bảo
 
Upvote 0
Chừng nào bạn tìm ra thì chỉ cho tôi nhé.
 
Upvote 0
ý tôi là sử dụng câu lệnh
rs.AddNew
rs.Fields(0) = Sheet4.Cells(2, 2).Value
rs.Update

để thêm bản ghi mới.
Nhưng mình chưa biết khai báo như thế nào để open được bảng cần thêm.
 
Upvote 0
Theo lý thuyết thì có thể dùng lệnh truy vấn schema để lấy tên trường, cho vào một chuỗi csv, và lập câu SQL động.
Nhưng dân CSDL LH chân chính không ai làm vậy cả. Bởi vì ở dạng lý tưởng CSDL LH thì thứ tự của dòng và cột là vô nghĩa. Tiêu chuẩn SQL định rằng câu lênh insert phải dùng cái name list để đối chiếu với cai value list.
 
Upvote 0
Theo lý thuyết thì có thể dùng lệnh truy vấn schema để lấy tên trường, cho vào một chuỗi csv, và lập câu SQL động.
Nhưng dân CSDL LH chân chính không ai làm vậy cả. Bởi vì ở dạng lý tưởng CSDL LH thì thứ tự của dòng và cột là vô nghĩa. Tiêu chuẩn SQL định rằng câu lênh insert phải dùng cái name list để đối chiếu với cai value list.

cảm ơn bạn
Nhưng nếu bạn biết cứ cho tôi xin đoạn code nhé
 
Upvote 0
He He.
Sau thời gian lang thang trên internet mình đã làm được với code sau:

'Khai bao cho ket noi voi CSDL SQL
Public cnn As New ADODB.Connection
Public rs As ADODB.recordset
Const connstr = "Driver=SQL Server;SERVER=2407-WS128164;UID=sa;PWD=123456a@00000;DATABASE=QLTS000"

cnn.Open connstr
uSQL = "Select * From nhap_ts"
Set rs = New ADODB.Recordset
rs.Open uSQL, cnn, adOpenStatic, adLockOptimistic
rs.AddNew
rs.Fields(0) = Sheet4.Cells(2, 2)
'tai khoan can doi
rs.Fields(1) = Trim(Sheet4.Cells(3, 2))
'phong giao dich
rs.Fields(2) = Sheet4.Cells(4, 2)
'ma chu so huu
rs.Fields(5) = Sheet4.Cells(5, 2)
'ten chu so huu
rs.Fields(6) = Sheet4.Cells(6, 2)
'ma khach hang vay
rs.Fields(7) = Sheet4.Cells(7, 2)
'ten khach hang vay
rs.Fields(8) = Sheet4.Cells(8, 2)
'loai ien
rs.Fields(3) = Sheet4.Cells(9, 2)
'gia tri tai san
'rs.Fields(4) = Sheet4.Cells(10, 2)
'so sezi
rs.Fields(9) = Sheet4.Cells(11, 2)
'ghi chu
rs.Fields(10) = Sheet4.Cells(12, 2)
'ngay cap nhat
rs.Fields(11) = nam1 & th1 & ng1
rs.Update
rs.Close
cnn.Close
Set cnn = Nothing
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom