Đánh giá chủ đề:
  • 1 Votes - 4 Average
  • 1
  • 2
  • 3
  • 4
  • 5
[Help] Hàm convert ngày trong SQL VBA
#1
Mình sử dụng đoạn code sau để xem kết quả. rptXemKQKDThang sử dụng nguồn là qryXemKQKD.

Vấn đề xảy ra là :
- khi cboThang = 1 thì mọi thứ ok
- Khi chỉ muốn xem tháng 2, 3, 4, ... (cboThang = 2,3,4, ...) thì query vẫn chọn các hợp đồng trong tháng 1, ,mặc dù đã có điều kiện chặn dưới (tblHopDong.Ngay)>=CDate([Forms]![frmXemKQKD]![cboThang] & '/01/' & [Forms]![frmXemKQKD]![cboNam])
- Điều này không xảy ra khi mình build bằng query design. Nhưng nếu copy đoạn SQL của query các tháng sau vào VBA thì vẫn không sử dụng được điều kiện chặn dưới.

Nhờ các cao thủ xem vấn đề của đoạn code ở đâu.

Sry, do mới tự học Access nên đoạn code hơi gà, rối rắm.

Thx


Trích dẫn:Private Sub cmdXemKQ_Click()

Dim chk As Integer
Dim db As Database
Dim qdf As QueryDef
Dim strSQL As String
Dim strDateFrom As String
Dim strDateTo As String
Dim RevMonth As Double
Dim RevPeriod As Double
Dim ProfitMonth As Double
Dim CostMonth As Double
Dim CostPeriod As Double
Dim ProfitPeriod As Double
Dim dte As Date

Set db = CurrentDb

'Kiem tra loai bao cao

If cboChonBaoCao.Value = "Báo cáo KQKD" Then chk = 1
If cboChon.Value = "Báo cáo l??ng" Then chk = 2
If cboChon.Value = "Báo cáo b?o hi?m" Then chk = 3
If cboChon.Value = "Báo cáo thu? TNCN" Then chk = 4

Select Case chk
Case 1
Set qdf = db.QueryDefs("qryXemKQKD")

'Xem 1 NV theo thang
If cboChon = "Cá nhân" Then
If optGiaiDoan.Value = False Then
If IsNull(cboThang) Or IsNull(cboNam) Or IsNull(txtMaNV) Then
MsgBox "Ban chua chon du thong tin "
Exit Sub
Else
Select Case cboThang
Case "1", "3", "5", "7", "8", "10", "12"
strSQL = "SELECT tblHopDong.MaNV, tblNhanVien.HoTen, tblHopDong.Ngay, tblHopDong.CongTY, tblHopDong.HopDongID, tblHopDong.DoanhThu, tblHopDong.ChiPhi, tblHopDong.LoiNhuan, tblHopDong.ThanhToan, DSum('DoanhThu','tblHopDong','[MaNV] = Forms![frmXemKQKD]![cboMaNV] and [Ngay]>= CDate([Forms]![frmXemKQKD]![cboThang] & '/01/' & [Forms]![frmXemKQKD]![cboNam]) And [Ngay] <=CDate([Forms]![frmXemKQKD]![cboThang] & '/31/' & [Forms]![frmXemKQKD]![cboNam])') AS TongDT, DSum('ChiPhi','tblHopDong','[MaNV] = Forms![frmXemKQKD]![cboMaNV] and [Ngay]>= CDate([Forms]![frmXemKQKD]![cboThang] & '/01/' & [Forms]![frmXemKQKD]![cboNam]) And [Ngay] <=CDate([Forms]![frmXemKQKD]![cboThang] & '/31/' & [Forms]![frmXemKQKD]![cboNam])') AS TongCP, [TongDT]-[TongCP] AS TongLN FROM tblNhanVien INNER JOIN tblHopDong ON tblNhanVien.MaNV = tblHopDong.MaNV WHERE (((tblHopDong.MaNV)=[Forms]![frmXemKQKD]![cboMaNV])" & _
"AND ((tblHopDong.Ngay)>=CDate([Forms]![frmXemKQKD]![cboThang] & '/01/' & [Forms]![frmXemKQKD]![cboNam])) AND ((tblHopDong.Ngay)<=CDate([Forms]![frmXemKQKD]![cboThang] & '/31/' & [Forms]![frmXemKQKD]![cboNam])));"

qdf.SQL = strSQL
DoCmd.OpenReport "rptXemKQKDThang", acViewPreview

Case "2"
strSQL = "SELECT tblHopDong.MaNV, tblNhanVien.HoTen, tblHopDong.Ngay, tblHopDong.HopDongID, tblHopDong.DoanhThu, tblHopDong.ChiPhi, tblHopDong.LoiNhuan, tblHopDong.ThanhToan, DSum('DoanhThu','tblHopDong','[MaNV] = Forms![frmXemKQKD]![cboMaNV] and [Ngay]>= CDate([Forms]![frmXemKQKD]![cboThang] & '/01/' & [Forms]![frmXemKQKD]![cboNam]) And [Ngay] <=CDate([Forms]![frmXemKQKD]![cboThang] & '/28/' & [Forms]![frmXemKQKD]![cboNam])') AS TongDT, DSum('ChiPhi','tblHopDong','[MaNV] = Forms![frmXemKQKD]![cboMaNV] and [Ngay]>= CDate([Forms]![frmXemKQKD]![cboThang] & '/01/' & [Forms]![frmXemKQKD]![cboNam]) And [Ngay] <=CDate([Forms]![frmXemKQKD]![cboThang] & '/28/' & [Forms]![frmXemKQKD]![cboNam])') AS TongCP, [TongDT]-[TongCP] AS TongLN, tblHopDong.CongTy FROM tblNhanVien INNER JOIN tblHopDong ON tblNhanVien.MaNV = tblHopDong.MaNV WHERE (((tblHopDong.MaNV)=[Forms]![frmXemKQKD]![cboMaNV])" & _
"AND ((tblHopDong.Ngay)>=CDate([Forms]![frmXemKQKD]![cboThang] & '/01/' & [Forms]![frmXemKQKD]![cboNam]) And (tblHopDong.Ngay)<=CDate([Forms]![frmXemKQKD]![cboThang] & '/28/' & [Forms]![frmXemKQKD]![cboNam])));"


qdf.SQL = strSQL
DoCmd.OpenReport "rptXemKQKDThang", acViewPreview
Case "4", "6", "9", "11"
strSQL = "SELECT tblHopDong.MaNV, tblNhanVien.HoTen, tblHopDong.Ngay, tblHopDong.CongTY, tblHopDong.HopDongID, tblHopDong.DoanhThu, tblHopDong.ChiPhi, tblHopDong.LoiNhuan, tblHopDong.ThanhToan, DSum('DoanhThu','tblHopDong','[MaNV] = Forms![frmXemKQKD]![cboMaNV] and [Ngay]>= CDate([Forms]![frmXemKQKD]![cboThang] & '/01/' & [Forms]![frmXemKQKD]![cboNam]) And [Ngay] <=CDate([Forms]![frmXemKQKD]![cboThang] & '/30/' & [Forms]![frmXemKQKD]![cboNam])') AS TongDT, DSum('ChiPhi','tblHopDong','[MaNV] = Forms![frmXemKQKD]![cboMaNV] and [Ngay]>= CDate([Forms]![frmXemKQKD]![cboThang] & '/01/' & [Forms]![frmXemKQKD]![cboNam]) And [Ngay] <=CDate([Forms]![frmXemKQKD]![cboThang] & '/30/' & [Forms]![frmXemKQKD]![cboNam])') AS TongCP, [TongDT]-[TongCP] AS TongLN FROM tblNhanVien INNER JOIN tblHopDong ON tblNhanVien.MaNV = tblHopDong.MaNV WHERE (((tblHopDong.MaNV)=[Forms]![frmXemKQKD]![cboMaNV])" & _
"AND ((tblHopDong.Ngay)>=CDate([Forms]![frmXemKQKD]![cboThang] & '/01/' & [Forms]![frmXemKQKD]![cboNam])) AND ((tblHopDong.Ngay)<=CDate([Forms]![frmXemKQKD]![cboThang] & '/30/' & [Forms]![frmXemKQKD]![cboNam])));"

qdf.SQL = strSQL
DoCmd.OpenReport "rptXemKQKDThang", acViewPreview
End Select
End If
End If
End If
End Select
End Sub
Chữ ký của 025777 Xin chào, mình là 025777, Tham gia http://thuthuataccess.com/forum từ ngày 29-12 -11.
Reply
Những người đã cảm ơn
#2
Bạn nên dùng chức năng sửa bài viết để đặt lại tiêu đề trước! Đại loại như là "Xem hộ phát biểu hàm convert ngày trong SQL VBA"... hay tương tự! Tiêu đề của bạn quá chung chung và mình hay xóa bỏ những chủ đề như vậy.
Đó là góp ý về cách đặt tiêu đề ở diễn đàn mà mình đã nhắc nhở ở rất nhiều nơi rằng phải đọc nội quy. Mong bạn lưu ý!

----------
Trả lời câu hỏi của bạn.
Để đảm bảo rằng không có nhầm lẫn ngày trước tháng sau hay tháng trước ngày sau. Cách tốt nhất là bạn phát biểu tháng bằng chữ ngày bằng số. Đại loại như là
Mã:
CDate('Jun' & ' 01/' & [Forms]![frmXemKQKD]![cboNam])

Thì mình chắc 100% với bạn sẽ ra ngày 1 tháng 6. Không lẫn vào đâu được.

Hoặc một quy định ít người biết nhưng khả năng thành công cao là bạn phát biểu năm, tháng, ngày với hàm DateSerial(Năm, Tháng, Ngày)
Mã:
Ví dụ: DateSerial('2012','06','01') sẽ trả về ngày 01 tháng 06 năm 2012
Chữ ký của Noname 020
ღღღღღTài sản của Noname (View All Items) ღღღღღ
Reply
Những người đã cảm ơn


Có thể liên quan đến chủ đề
Chủ đề: Tác giả Trả lời: Xem: Bài mới nhất
  [Hỏi] merge cell trong word vuthaiha90 6 331 9 Giờ trước
Bài mới nhất: vuthaiha90
  [Help] Truy vấn ngày phát sinh gần nhất trong access cuuvinh 4 124 21-09-16, 04:01 PM
Bài mới nhất: cuuvinh
  [Thủ Thuật] Sử dụng tiếng Việt unicode trong VBA thiennamlong 8 854 05-07-16, 08:09 PM
Bài mới nhất: thiennamlong
  Sử dụng Class Module và Kết nối dữ liệu SQL SERVER trong Access VBA lehongduc 42 16,362 12-06-16, 11:28 AM
Bài mới nhất: lehongduc
  [Hỏi] Sử dụng ngày trong truy vấn qua VBA tại sao không đúng? luonguct 5 267 09-06-16, 05:24 PM
Bài mới nhất: maidinhdan

Chuyển nhanh:


User(s) browsing this thread: 1 Guest(s)