Lỗi khi xuất dữ liệu từ sql sang sheet của excel

Chia sẻ bởi:hands
★★★★★
Quảng cáo

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ì?

(Mình mới tìm hiểu)
1. Bạn hướng dẫn với.
2. Kiểu dữ liệu của trường ấy là kiểu real.
3. cảm ơn ban

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

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

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
mình không sửa được vì thông báo những ô này đã gộp

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.

a mình nhìn thấy mật khẩu sít tâm ạt min rồi nha. :D:D

Ba cái mớ này gặp sí cồ in giét sông là bỏ mạng ngay.
Tôi đâu có khuyến khích để VBA truy cập dữ liệu từ nơi khác, và nhất là lại dùng ADODB để truy cập từ CSDL chính.

www.giaiphapexcel.com/diendan/threads/l%E1%BB%97i-khi-xu%E1%BA%A5t-d%E1%BB%AF-li%E1%BB%87u-t%E1%BB%AB-sql-sang-sheet-c%E1%BB%A7a-excel.128441/

Khóa học Power PI – Ứng dung trong Nhân sự
Khóa học SprinGO phù hợp

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
★★★★★ 5 ★ 1 👤 1 ▥ 0
Quảng cáo

Bạn nên đọc

One Response

  1. hands says:

    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
    [B]    uSQL = "insert into [/B]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
    hic
    Bạn có cách nào để cho câu lệnh insert into đơn giản hoặc dễ nhìn đối với bảng có nhiều trường không?
    ý 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.

    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é
    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

Leave a Reply

Your email address will not be published. Required fields are marked *

Quảng cáo

Cũ vẫn chất

Xem thêm