• SQL trong VBA chạy không đúng!
  • 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

    [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
  • 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 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ì?
  • RE: SQL trong VBA chạy không đúng!

    NguyenDungAnh > 06-09-18, 06:06 PM

    (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.
  • RE: SQL trong VBA chạy không đúng!

    NguyenDungAnh > 06-09-18, 06:09 PM

    (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.
  • 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:

    Đ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.
  • 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"