Giúp kiểm tra lệnh MySQL không chạy
Hiện mình đang code làm sổ cái kế toán, trong đó có 3 phần với 3 lệnh MySQL như sau:
1. Phát sinh trong kỳ
2. Số dư cuối kỳ
3. Lũy kế từ đầu năm
Trong 3 lệnh trên thì lệnh MySQL của phần 1 thì chạy ok, còn 2 lệnh còn lại thì không sai nhưng nó không chạy (vì nó không hiện dữ liệu nơi em muốn dán). Mình đã kiểm tra hơn 5 ngày nay mà không ra, Nhờ các bạn kiểm tra xem code mình thiếu điều kiện gì nhé.
Em cũng đã tham khảo rất nhiều tài liệu rồi, kiểm tra lại nhiều lần mà vẫn không hiểu được nguyên nhân mới post bài. Sau khi viết code xong Debug báo ok, khi chạy thì Debug báo vàng ngay chỗ code lrs.Open MySQL, cnn, adOpenKeyset, adLockOptimistic chỗ lệnh Mysql thứ 2 (tính số dư đầu kỳ). Em nghỉ nếu thiếu điều kiện nào đó thì Mysql thứ 1 đã không chạy rồi.
Dạ, tức là trong form So_SC phần Cmd_KTK_Click() có 3 lệnh Mysql chính. Trong đó lệnh Mysql thứ 1 dùng để tính số phát sinh trong kỳ (cái này khi click thì chạy ok, dữ liệu chạy đầy đủ); lệnh Mysql thứ 2 là tính số dư đầu kỳ và lệnh Mysql thứ 3 là tính lũy kế từ đầu năm (lệnh 2 và 3 thì nó không chạy); trong đó lệnh Mysql thứ 2 tính số dư đầu kỳ sau khi chạy em muốn nó dán tại ô H4 sheet So Cai để từ đó ô H5 em có đặt công thức để lấy giá trị số dư đầu kỳ của kỳ sau, tương tự phần lũy kế cũng vậy. Sorry nếu hơi rắc rối (em có thể cho em xin nick face để nói chuyện trực tiếp được không ạ?)Cảm ơn nhiều.
Bạn có thể kiểm tra các việc sau
1. Bạn thử kiểm tra độc lập từng lệnh SQL (có 3 lệnh) xem thế nào? Nếu chạy riêng rẽ mà ok thì có thể sau khi trả recordset về Range thì connection bị mất kết nối, bạn cần kiểm tra State có đang Open không?
2. Kiểu dữ liệu của kết quả. Nếu các trường tính toán là kiểu số thập phân, kết quả tính toán, giá trị của nó có thể vượt quá kiểu dữ liệu mà ADODB quy định, tức là nó không đưa được vào các Field của recordset. Vậy bạn có thể phải dùng hàm ROUND để ép số đơn vị thập phân ở mức phù hợp (ví dụ 2) ( SELECT ROUND(SUM(….),2),….).
Câu lệnh thứ 2 của bạn viết:
var1 = ""
var1 = var1 & "SELECT ( SUM(Iif(( TKN LIKE '1112%' ), [ST], 0)) - " & vbCrLf
var1 = var1 & " SUM(Iif(( TKC LIKE '1112%' ), [ST], 0)) ) AS SDN, " & vbCrLf
var1 = var1 & " ( SUM(Iif(( TKC LIKE '1112%' ), [ST], 0)) - " & vbCrLf
var1 = var1 & " SUM(Iif(( TKN LIKE '1112%' ), [ST], 0)) ) AS SDC " & vbCrLf
var1 = var1 & "FROM [DL] " & vbCrLf
var1 = var1 & "WHERE ( ( TKN LIKE '1112%' ) " & vbCrLf
var1 = var1 & " OR ( TKC LIKE '1112%' ) ) " & vbCrLf
var1 = var1 & " AND ( LK = '461' ) " & vbCrLf
var1 = var1 & " AND ( NCT < 41275 ) "
Câu lệnh thứ 3 bạn viết:
var1 = ""
var1 = var1 & "SELECT SUM(Iif(( TKN LIKE '1112%' ), [ST], 0)), " & vbCrLf
var1 = var1 & " SUM(Iif(( TKC LIKE '1112%' ), [ST], 0)) " & vbCrLf
var1 = var1 & "FROM [DL] " & vbCrLf
var1 = var1 & "WHERE ( ( TKN LIKE '1112%' ) " & vbCrLf
var1 = var1 & " OR ( TKC LIKE '1112%' ) ) " & vbCrLf
var1 = var1 & " AND ( MK LIKE '461' ) " & vbCrLf
var1 = var1 & " AND ( NCT <= 41305 ) "
Có vẻ không ổn, vì đk của bạn đưa ra không thỏa điều kiện với dl của bạn???
Em kiểm tra sáng giờ thấy có chỗ nào không thõa đk đâu anh? Nếu code sai sót thì Debug đã báo rồi, hoặc nếu sai thì ít ra CopyFromRecordset sẽ hiện giá trị sai nơi ô em muốn copy (ô H4 sheet So Cai). Em chỉ không hiểu tại sao lệnh lrs.Open MySQL, cnn, adOpenKeyset, adLockOptimistic nó không chạy, không biết có thiếu điều kiện gì nữa không!?
Tôi tạm chỉnh cho bạn như sau:
'Tinh so du dau
MySQL = ""
MySQL = MySQL & "SELECT ( SUM(Iif(( TKN LIKE '1111%' ), [ST], 0)) - " & vbCrLf
MySQL = MySQL & " SUM(Iif(( TKC LIKE '1111%' ), [ST], 0)) ) AS SDN, " & vbCrLf
MySQL = MySQL & " ( SUM(Iif(( TKC LIKE '1111%' ), [ST], 0)) - " & vbCrLf
MySQL = MySQL & " SUM(Iif(( TKN LIKE '1111%' ), [ST], 0)) ) AS SDC " & vbCrLf
MySQL = MySQL & "FROM DL " & vbCrLf
MySQL = MySQL & "WHERE ( ( ( DL.[TKN] ) LIKE '1111%' ) " & vbCrLf
MySQL = MySQL & " AND ( ( DL.LK ) LIKE '463%' ) " & vbCrLf
MySQL = MySQL & " AND ( ( DL.NCT ) <# 1 / 1 / 2013# ) ) " & vbCrLf
MySQL = MySQL & " OR (( ( DL.[TKC] ) LIKE '1111%' ))"
'Tinh luy ke
MySQL = ""
MySQL = MySQL & "SELECT SUM(( Iif(( [TKN] LIKE '1111%' ), [ST], 0) )), " & vbCrLf
MySQL = MySQL & " SUM(( Iif(( [TKC] LIKE '1111%' ), [ST], 0) )) " & vbCrLf
MySQL = MySQL & "FROM DL " & vbCrLf
MySQL = MySQL & "WHERE (( ( [TKN] ) LIKE '1111%' )) " & vbCrLf
MySQL = MySQL & " OR ( ( ( [TKC] ) LIKE '1111%' ) " & vbCrLf
MySQL = MySQL & " AND ( ( [LK] ) LIKE '463' ) " & vbCrLf
MySQL = MySQL & " AND ( ( [NCT] ) <=# 1 / 31 / 2013# ) )"
Lưu ý: Về cái chuổi để đưa đk lọc bạn tự cho vào ở trên nhé.
Cám ơn các anh đã giúp đỡ em trong bài này, em đã nhờ cao thủ VBA giúp và lệnh lrs.Open MySQL, Cnn, adOpenKeyset, adLockOptimistic phần tính số dư đầu kỳ đã chạy, mặc dù các code và lệnh không thay đổi. Cuối cùng là nó thiếu điều kiện gì để lệnh lrs.Open MySQL, Cnn, adOpenKeyset, adLockOptimistic có thể chạy được vậy các anh?
www.giaiphapexcel.com/diendan/threads/gi%C3%BAp-ki%E1%BB%83m-tra-l%E1%BB%87nh-mysql-kh%C3%B4ng-ch%E1%BA%A1y.92046/
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
Theo như bạn HLMT đã nói, với dữ liệu như thế và câu lệnh truy cập như thế thì sẽ chả ra một record nào cả.
Bạn kiểm tra bằng cách nào vậy?
tb. code của bạn đặt tên biến là MySQL trông nó rợn người quá. MySQL là tên hê thống CSDL của Oracle. Thoạt đầu nhìn thấy cái tiêu đề này, mấy người yếu bóng vía như tôi ngỡ là đồ cao cấp nên không dám vào. Mãi về sau tình cờ trông thấy cái tên biến mới biết.
Úi trời, người giúp bạn cho nó chạy là xem như thắc mắc của bạn đã xong. Hãy dò code ban đầu của bạn + với code mà "người đã làm cho nó chạy" xem koi khác chổ nào thì là chổ đó. Nói cho bạn biết luôn, muốn giúp cũng không biết giúp cái gì nữa trong khi bạn đã có đáp án.