-
SQL trong VBA chạy không đúng!
NguyenDungAnh > 05-09-18, 06:12 PM
Em hì hục làm cả buổi chiều mà không hiểu tại sao.
Cái code của em nó thế này
Private Sub test2()
Dim s, s1, s2 As String
Set db = CurrentDb
s1 = "SELECT chitiet.mavattu, Sum(IIf([ngay]<#" & Format([Forms]![f2]![t2], "mm/dd/yyyy") & "#,0,IIf([loaiphieu]='X',[soluong],0))) AS xuattrongki, Sum(IIf([ngay]>#" & Format([Forms]![f2]![t2], "mm/dd/yyyy") & "#,0,IIf([loaiphieu]='n',[soluong],-[soluong]))) AS tondauki, Sum(IIf([ngay]<#" & Format([Forms]![f2]![t2], "mm/dd/yyyy") & "#,0,IIf([loaiphieu]='N',[soluong],0))) AS nhaptrongki, Sum(IIf([ngay]<#" & Format([Forms]![f2]![t2], "mm/dd/yyyy") & "#,0,IIf([loaiphieu]='X',[soluong],0))+IIf([ngay]>#" & Format([Forms]![f2]![t2], "mm/dd/yyyy") & "#,0,IIf([loaiphieu]='n',[soluong],-[soluong]))+IIf([ngay]<#" & Format([Forms]![f2]![t2], "mm/dd/yyyy") & "#,0,IIf([loaiphieu]='N',[soluong],0))) AS tong FROM nhapxuat INNER JOIN chitiet ON nhapxuat.Maphieu = chitiet.maphieu "
s2 = "WHERE (((nhapxuat.ngay)<=#" & Format([Forms]![f2]![t3], "mm/dd/yyyy") & "#)) GROUP BY chitiet.mavattu HAVING (((Sum(IIf([ngay]<#" & Format([Forms]![f2]![t2], "mm/dd/yyyy") & "#,0,IIf([loaiphieu]='X',[soluong],0))+IIf([ngay]>#" & Format([Forms]![f2]![t2], "mm/dd/yyyy") & "#,0,IIf([loaiphieu]='n',[soluong],-[soluong]))+IIf([ngay]<#" & Format([Forms]![f2]![t2], "mm/dd/yyyy") & "#,0,IIf([loaiphieu]='N',[soluong],0))))>0)) ORDER BY chitiet.mavattu;"
s = s1 + s2 'ghep chuoi
Debug.Print s
Set rs = db.OpenRecordset(s)
Debug.Print rs.RecordCount
rs.MoveFirst
For i = 0 To rs.RecordCount - 1
arr1(i) = 0
arr1(i) = rs.Fields("mavattu")
'Me.Controls("tvt" & i) = DLookup("tenvattu", "dmvattu", "mavattu = " & arr1(i)) ' gan gia tri cho ten vat tu vao tbox
arr1(i) = rs.Fields("tondauki")
'Me.Controls("tb" & i) = arr1(i) 'tinh ton dau ki cac loai vat tu
rs.MoveNext
Next
db.Close
End Sub
a1 by anh nguyễn, trên Flickr
a2 by anh nguyễn, trên Flickr
a3 by anh nguyễn, trên Flickr
Em debugprint Cái biến S rồi copy vào query thì nó chạy ngon lành 5 loại vật tư
Nhưng không hiểu sao chạy trong code nó lại chỉ được một loại đầu tiên
debug.print rs.recordcount nó ra 1 ở immidiate -
RE: SQL trong VBA chạy không đúng!
ongke0711 > 05-09-18, 08:27 PM
Để RecordCount chạy đúng thì bạn bên dùng cặp:
rs.movelast
rs.MoveFirst
rs.RecordCount -
RE: SQL trong VBA chạy không đúng!
Xuân Thanh > 06-09-18, 01:44 PM
Đã dùng biến i sao còn dể rs.MoveFirst và rs.MoveNext? Trùng nhau à? Bỏ cái Move đi xem thử -
RE: SQL trong VBA chạy không đúng!
maidinhdan > 06-09-18, 04:02 PM
Bạn sửa lại như sau:
Đoạn này giữ nguyên y bài bạn
Mã PHP:Dim s, s1, s2 As String
s1 = "SELECT chitiet.mavattu, Sum(IIf([ngay]<#" & Format([Forms]![f2]![t2], "mm/dd/yyyy") & "#,0,IIf([loaiphieu]='X',[soluong],0))) AS xuattrongki, Sum(IIf([ngay]>#" & Format([Forms]![f2]![t2], "mm/dd/yyyy") & "#,0,IIf([loaiphieu]='n',[soluong],-[soluong]))) AS tondauki, Sum(IIf([ngay]<#" & Format([Forms]![f2]![t2], "mm/dd/yyyy") & "#,0,IIf([loaiphieu]='N',[soluong],0))) AS nhaptrongki, Sum(IIf([ngay]<#" & Format([Forms]![f2]![t2], "mm/dd/yyyy") & "#,0,IIf([loaiphieu]='X',[soluong],0))+IIf([ngay]>#" & Format([Forms]![f2]![t2], "mm/dd/yyyy") & "#,0,IIf([loaiphieu]='n',[soluong],-[soluong]))+IIf([ngay]<#" & Format([Forms]![f2]![t2], "mm/dd/yyyy") & "#,0,IIf([loaiphieu]='N',[soluong],0))) AS tong FROM nhapxuat INNER JOIN chitiet ON nhapxuat.Maphieu = chitiet.maphieu "
s2 = "WHERE (((nhapxuat.ngay)<=#" & Format([Forms]![f2]![t3], "mm/dd/yyyy") & "#)) GROUP BY chitiet.mavattu HAVING (((Sum(IIf([ngay]<#" & Format([Forms]![f2]![t2], "mm/dd/yyyy") & "#,0,IIf([loaiphieu]='X',[soluong],0))+IIf([ngay]>#" & Format([Forms]![f2]![t2], "mm/dd/yyyy") & "#,0,IIf([loaiphieu]='n',[soluong],-[soluong]))+IIf([ngay]<#" & Format([Forms]![f2]![t2], "mm/dd/yyyy") & "#,0,IIf([loaiphieu]='N',[soluong],0))))>0)) ORDER BY chitiet.mavattu;"
s = s1 + s2 'ghep chuoi
Phần cần sửa
Mã PHP:Dim i As Double
Set rs = CurrentDb.OpenRecordset(s)
If rs.EOF Then Exit Function ' Neu con tro dnag o vi tri cuoi, tuc la kg co mau tin ra lenh thoat
rs.MoveLast ' Di chuyen den mau tin cuoi, de dem
i = rs.RecordCount
Debug.Print i ' Hien thi tong so mau tin
rs.MoveFirst ' Di chuyen ve mau tin dau
For a = 0 To i
arr1(a) = 0
arr1(a) = rs.Fields("mavattu")
Me.Controls("tvt" & a) = DLookup("tenvattu", "dmvattu", "mavattu = " & arr1(a)) ' gan gia tri cho ten vat tu vao tbox
arr1(a) = rs.Fields("tondauki")
Me.Controls("tb" & a) = arr1(a) 'tinh ton dau ki cac loai vat tu
rs.MoveNext 'Di chuyen den mau tin ke tiep
Next a
rs.Close
* Bạn cũng cần lưu ý khi khai báo mãng arr1(15) không biết để làm cái gì? -
RE: SQL trong VBA chạy không đúng!
NguyenDungAnh > 06-09-18, 06:06 PM
-
RE: SQL trong VBA chạy không đúng!
NguyenDungAnh > 06-09-18, 06:09 PM
-
RE: SQL trong VBA chạy không đúng!
NguyenDungAnh > 06-09-18, 06:12 PM
(06-09-18, 04:02 PM)maidinhdan Đã viết: Bạn sửa lại như sau:
Cám ơn bác An đã quan tâm em thử làm ngay, cái mảng arr1(15) là vì em chưa biết chính xác SQL nó lọc ra bao nhiêu loại vật tư để chạy lên report mà report em chỉ hiển thị được 10 loại vật tư lên em để tạm là 15.
Đoạn này giữ nguyên y bài bạn
Mã PHP:Dim s, s1, s2 As String
s1 = "SELECT chitiet.mavattu, Sum(IIf([ngay]<#" & Format([Forms]![f2]![t2], "mm/dd/yyyy") & "#,0,IIf([loaiphieu]='X',[soluong],0))) AS xuattrongki, Sum(IIf([ngay]>#" & Format([Forms]![f2]![t2], "mm/dd/yyyy") & "#,0,IIf([loaiphieu]='n',[soluong],-[soluong]))) AS tondauki, Sum(IIf([ngay]<#" & Format([Forms]![f2]![t2], "mm/dd/yyyy") & "#,0,IIf([loaiphieu]='N',[soluong],0))) AS nhaptrongki, Sum(IIf([ngay]<#" & Format([Forms]![f2]![t2], "mm/dd/yyyy") & "#,0,IIf([loaiphieu]='X',[soluong],0))+IIf([ngay]>#" & Format([Forms]![f2]![t2], "mm/dd/yyyy") & "#,0,IIf([loaiphieu]='n',[soluong],-[soluong]))+IIf([ngay]<#" & Format([Forms]![f2]![t2], "mm/dd/yyyy") & "#,0,IIf([loaiphieu]='N',[soluong],0))) AS tong FROM nhapxuat INNER JOIN chitiet ON nhapxuat.Maphieu = chitiet.maphieu "
s2 = "WHERE (((nhapxuat.ngay)<=#" & Format([Forms]![f2]![t3], "mm/dd/yyyy") & "#)) GROUP BY chitiet.mavattu HAVING (((Sum(IIf([ngay]<#" & Format([Forms]![f2]![t2], "mm/dd/yyyy") & "#,0,IIf([loaiphieu]='X',[soluong],0))+IIf([ngay]>#" & Format([Forms]![f2]![t2], "mm/dd/yyyy") & "#,0,IIf([loaiphieu]='n',[soluong],-[soluong]))+IIf([ngay]<#" & Format([Forms]![f2]![t2], "mm/dd/yyyy") & "#,0,IIf([loaiphieu]='N',[soluong],0))))>0)) ORDER BY chitiet.mavattu;"
s = s1 + s2 'ghep chuoi
Phần cần sửa
Mã PHP:Dim i As Double
Set rs = CurrentDb.OpenRecordset(s)
If rs.EOF Then Exit Function ' Neu con tro dnag o vi tri cuoi, tuc la kg co mau tin ra lenh thoat
rs.MoveLast ' Di chuyen den mau tin cuoi, de dem
i = rs.RecordCount
Debug.Print i ' Hien thi tong so mau tin
rs.MoveFirst ' Di chuyen ve mau tin dau
For a = 0 To i
arr1(a) = 0
arr1(a) = rs.Fields("mavattu")
Me.Controls("tvt" & a) = DLookup("tenvattu", "dmvattu", "mavattu = " & arr1(a)) ' gan gia tri cho ten vat tu vao tbox
arr1(a) = rs.Fields("tondauki")
Me.Controls("tb" & a) = arr1(a) 'tinh ton dau ki cac loai vat tu
rs.MoveNext 'Di chuyen den mau tin ke tiep
Next a
rs.Close
* Bạn cũng cần lưu ý khi khai báo mãng arr1(15) không biết để làm cái gì? -
RE: SQL trong VBA chạy không đúng!
NguyenDungAnh > 06-09-18, 06:19 PM
Được rồi các bác ạ, em thêm mỗi cái rs.movelast vào trước cái rs.count là ok -
RE: SQL trong VBA chạy không đúng!
NguyenDungAnh > 06-09-18, 06:23 PM
Bác an cho em hỏi cái này với, khi mà chuỗi quá dài làm sao để xuống dòng mà không cần phải dùng 2 biến s1 với s2 ghép lại thành một chuỗi -
RE: SQL trong VBA chạy không đúng!
ongke0711 > 06-09-18, 09:34 PM
Khi khai báo biến mảng không biết trước kích thước bạn có thể khai báo mảng động sau đó sẽ khai báo kích thước cố định sau đó.
Vd:
Dim arr() As Variant
...
Sau khi biết số dòng (RecordCount) thì khai báo lại.
...
Redim arr(số dòng).
....
Lưu ý: sau khi xử lý xong nên giải phóng biến khỏi bộ nhớ
Erase arr
Về việc xuống dòng khi câu lênh dài trong VBA, có 2 kiểu tuỳ thói quen người lập trình:
C1:
sSQL="SELECT * FROM Table1 " & _ --> dấu nháy kép cách ký tự cuối 1 khoảng trắng + dấu cách + & + dấu cách + _
"WHERE Table1.ID = 'NV001' " & _
"GROUP BY Table1.ID"
C2:
sSQL="SELECT * FROM Table1 " _ --> dấu nháy kép cách ký tự cuối 1 khoảng trắng + dấu cách + _
& "WHERE Table1.ID = 'NV001' " _
& "GROUP BY Table1.ID"