Đánh giá chủ đề:
  • 0 Votes - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
[Help] SQL trong VBA chạy không đúng!
#1
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

[Hình: 44488671001_495506aa9b_b.jpg]a1 by anh nguyễn, trên Flickr
[Hình: 42679534630_00a762f2c2_b.jpg]a2 by anh nguyễn, trên Flickr
[Hình: 44488670611_d81fb45283_b.jpg]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
Chữ ký của NguyenDungAnh Đến với cuộc đời hai tay trắng
Giã từ trần thế trắng hai tay
Bao nhiêu tiếng nói tiếng cười
Sống ở cuộc đời lãi được vậy thôi
ღღღღღTài sản của NguyenDungAnh (View All Items) ღღღღღ
Reply
Những người đã cảm ơn
#2
Để RecordCount chạy đúng thì bạn bên dùng cặp: 
rs.movelast
rs.MoveFirst
rs.RecordCount
Chữ ký của ongke0711 If you BORN poor, it's not your mistake. But if you DIE poor, It's your mistake!
ღღღღღTài sản của ongke0711 (View All Items) ღღღღღ
Reply
Những người đã cảm ơn NguyenDungAnh
#3
Đã dùng biến i sao còn dể rs.MoveFirst và rs.MoveNext? Trùng nhau à? Bỏ cái Move đi xem thử
Chữ ký của Xuân Thanh Trăm năm trước thì ta chưa gặp
Trăm năm sau biết gặp được không?
Cuộc đời sắc sắc không không
Thì thôi ta cứ hết lòng vì nhau
ღღღღღTài sản của Xuân Thanh (View All Items) ღღღღღ
Reply
Những người đã cảm ơn NguyenDungAnh
#4
Bạn sửa lại như sau:

Đoạn này giữ nguyên y bài bạn
Mã PHP:
Dim ss1s2 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;"
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 cuoide dem
 i 
rs.RecordCount
Debug
.Print i       ' Hien thi tong so mau tin
rs.MoveFirst        ' 
Di chuyen ve mau tin dau
    
For 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ì?
Chữ ký của maidinhdan * Để được hỗ trợ tốt nhất, nhấn vào link dưới đây để xem.
1. [Hướng dẫn] Kiểu file gửi lên để được giúp đỡ
2. [Hướng dẫn] Nội quy diễn đàn
3. [Hướng dẫn] Cách Đưa file và hình vào diễn đàn
4.[Hướng dẫn] Để xây dựng một ứng dụng hoàn hảo và lời cảm tạ
5. Cần tìm Demo hay ứng dụng sử dụng thanh tìm kiếm phía trên cùng, bên phải của diễn đàn.
* Nếu muốn cảm ơn, hãy nhấn nút thank, không cần viết thêm bài nào nửa.



ღღღღღTài sản của maidinhdan (View All Items) ღღღღღ
Reply
Những người đã cảm ơn NguyenDungAnh
#5
(06-09-18, 01:44 PM)Xuân Thanh Đã viết: Đã dùng biến i sao còn dể rs.MoveFirst và rs.MoveNext? Trùng nhau à? Bỏ cái Move đi xem thử

Em bỏ đi nó chạy không đúng bác ạ, em tự mò lên cũng chưa thực sự hiểu VBA lắm đọc sách hoài rồi lên cứ thử thực hành xem mắc mớ ở đâu thì lại tham khảo các bác.
Chữ ký của NguyenDungAnh Đến với cuộc đời hai tay trắng
Giã từ trần thế trắng hai tay
Bao nhiêu tiếng nói tiếng cười
Sống ở cuộc đời lãi được vậy thôi
ღღღღღTài sản của NguyenDungAnh (View All Items) ღღღღღ
Reply
Những người đã cảm ơn
#6
(05-09-18, 08:27 PM)ongke0711 Đã viết: Để RecordCount chạy đúng thì bạn bên dùng cặp: 
rs.movelast
rs.MoveFirst
rs.RecordCount

Em vừa thêm cái rs.movelast xong print thử thì nó ra đủ 5 loại vật tư

mà em không hiểu sao cái SQL khác em làm thì nó vẫn chạy ngon lành nhưng cái này thì lại bị như vậy.
Chữ ký của NguyenDungAnh Đến với cuộc đời hai tay trắng
Giã từ trần thế trắng hai tay
Bao nhiêu tiếng nói tiếng cười
Sống ở cuộc đời lãi được vậy thôi
ღღღღღTài sản của NguyenDungAnh (View All Items) ღღღღღ
Reply
Những người đã cảm ơn
#7
(06-09-18, 04:02 PM)maidinhdan Đã viết: Bạn sửa lại như sau:

Đoạn này giữ nguyên y bài bạn
Mã PHP:
Dim ss1s2 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;"
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 cuoide dem
 i 
rs.RecordCount
Debug
.Print i       ' Hien thi tong so mau tin
rs.MoveFirst        ' 
Di chuyen ve mau tin dau
    
For 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ì?
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.
Chữ ký của NguyenDungAnh Đến với cuộc đời hai tay trắng
Giã từ trần thế trắng hai tay
Bao nhiêu tiếng nói tiếng cười
Sống ở cuộc đời lãi được vậy thôi
ღღღღღTài sản của NguyenDungAnh (View All Items) ღღღღღ
Reply
Những người đã cảm ơn
#8
Đượ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
Chữ ký của NguyenDungAnh Đến với cuộc đời hai tay trắng
Giã từ trần thế trắng hai tay
Bao nhiêu tiếng nói tiếng cười
Sống ở cuộc đời lãi được vậy thôi
ღღღღღTài sản của NguyenDungAnh (View All Items) ღღღღღ
Reply
Những người đã cảm ơn
#9
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
Chữ ký của NguyenDungAnh Đến với cuộc đời hai tay trắng
Giã từ trần thế trắng hai tay
Bao nhiêu tiếng nói tiếng cười
Sống ở cuộc đời lãi được vậy thôi
ღღღღღTài sản của NguyenDungAnh (View All Items) ღღღღღ
Reply
Những người đã cảm ơn
#10
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"
Chữ ký của ongke0711 If you BORN poor, it's not your mistake. But if you DIE poor, It's your mistake!
ღღღღღTài sản của ongke0711 (View All Items) ღღღღღ
Reply
Những người đã cảm ơn maidinhdan , NguyenDungAnh


Có thể liên quan đến chủ đề
Chủ đề: Tác giả Trả lời: Xem: Bài mới nhất
  [Thủ Thuật] Demo Tổng hợp tất cả các kiểu thông báo tiếng việt trong Access maidinhdan 39 7,727 22-09-18, 12:40 PM
Bài mới nhất: NguyenDungAnh
  [Help] Tự chọn yes or no trong VBA khi chạy SQL NguyenDungAnh 7 272 26-08-18, 03:40 PM
Bài mới nhất: NguyenDungAnh
  Sử dụng Class Module và Kết nối dữ liệu SQL SERVER trong Access VBA lehongduc 62 32,133 03-08-18, 12:41 PM
Bài mới nhất: Cuong Servenet
  [Help] Tham so trong lenh Call Shell vodainhan 9 673 05-07-18, 09:15 PM
Bài mới nhất: MTNQ
  [Thủ Thuật] Demo Hàm report tự canh đều chiều cao ( Không kẻ line)) maidinhdan 76 13,916 05-07-18, 03:42 PM
Bài mới nhất: vodainhan

Chuyển nhanh:


User(s) browsing this thread: 1 Guest(s)
Diễn Đàn Thơ Văn Thi Ẩm Lâu|Nhà Hàng Sông Thơ| PMA Nha Trang| Gỗ Acrylic Không Đường Line