• Dsum có điều kiện ngày?
  • Dsum có điều kiện ngày?

    ungthienhai > 01-09-22, 10:14 PM

    Hiện mình sử dụng:
    Mã:
    a = DCount("[tongthanhtoan]", "[tb_donhang]", _

    "[ngaythem] Between #" & Me.time_start.Value & "# And #" & Me.time_end.Value & "#")

    Nhưng lỗi, lỗi ở chỗ rất kì lạ: 

    ví du mình có record ở ngày 20/8. Mình lọc đầu tháng 1/8 đến 31/8 ra kết quả, lọc thêm 1/8 và 1/9 ko ra kết quả record 20/8.
    Lọc thêm 1/8 và 11/9 thì ra kết quả 20/8. ?? Mình cũng thử lùi lại tháng 7 đến tháng 10, lúc ra lúc ko, sửa ngày tới lui.

    Các bác giúp e nhé, em xin cảm ơn.
  • RE: Dsum có điều kiện ngày?

    ungthienhai > 01-09-22, 10:28 PM

    Mình bổ sung thêm là mình thử từ 1/8 đến ngày 8/9 thì ko có kết quả nhưng ngày 09/09 thì lại có kêt quả??
    Các bác có thể cho em biết lỗi chỗ nào ko ?
  • RE: Dsum có điều kiện ngày?

    tranthanhan1962 > 02-09-22, 12:41 AM

    Cặp #Date# chỉ xác định biểu thức ngày khi nó được viết với dạng #dd/mm/yyyy#, #mm/dd/yyyy# ... Tùy theo format regional trong windows trong đoạn mã SQL. Vì vậy khi sử dụng giá trị control textbox của bạn bạn chỉ cần Me.time_start.Value hay Me.time_end.Value mà không cần phải viết "#" & Me.time_start.Value & "#", với điều kiện bạn phải thiết đặt format data type của các textbox time_start và time_end theo kiểu date. Bởi vì khi bạn viết "#" & Me.time_start.Value & "#" access có thể hiểu "#Me.time_start.Value#" hoặc "#" & [đoạn text thể hiện giá trị textbox time_start trên form]#". Ví dụ: giá trị của textbox time_start là 20/8/2022 access có thể dịch là "#Me.time_start.Value#" hoặc "# 20/8/2022 #". Tất nhiên khi nó dịch "#Me.time_start.Value#" chắc chắn sẽ gây lỗi. Bạn cần phải sửa lại:

    Mã PHP:
    DCount("[tongthanhtoan]""[tb_donhang]"_

    "[ngaythem] Between " Me.time_start.Value " And " Me.time_end.Value 

    Và để chắc chắn hơn bạn sử dụng function CDate() để ép kiểu dữ liệu cho giá trị của 2 textbox này thì access không hiểu nhầm kiểu dữ liệu nữa.

    Mã PHP:
    DCount("[tongthanhtoan]""[tb_donhang]"_

    "[ngaythem] Between " CDate(Me.time_start.Value) & " And " CDate(Me.time_end.Value) ) 
  • RE: Dsum có điều kiện ngày?

    ungthienhai > 02-09-22, 03:43 PM

    (02-09-22, 12:41 AM)tranthanhan1962 Đã viết: Cặp #Date# chỉ xác định biểu thức ngày khi nó được viết với dạng #dd/mm/yyyy#, #mm/dd/yyyy# ... Tùy theo format regional trong windows trong đoạn mã SQL. Vì vậy khi sử dụng giá trị control textbox của bạn bạn chỉ cần Me.time_start.Value hay Me.time_end.Value mà không cần phải viết "#" & Me.time_start.Value & "#", với điều kiện bạn phải thiết đặt format data type của các textbox time_start và time_end theo kiểu date. Bởi vì khi bạn viết "#" & Me.time_start.Value & "#" access có thể hiểu "#Me.time_start.Value#" hoặc "#" & [đoạn text thể hiện giá trị textbox time_start trên form]#". Ví dụ: giá trị của textbox time_start là 20/8/2022 access có thể dịch là "#Me.time_start.Value#" hoặc "# 20/8/2022 #". Tất nhiên khi nó dịch "#Me.time_start.Value#" chắc chắn sẽ gây lỗi. Bạn cần phải sửa lại:

    Mã PHP:
    DCount("[tongthanhtoan]""[tb_donhang]"_

    "[ngaythem] Between " Me.time_start.Value " And " Me.time_end.Value 

    Và để chắc chắn hơn bạn sử dụng function CDate() để ép kiểu dữ liệu cho giá trị của 2 textbox này thì access không hiểu nhầm kiểu dữ liệu nữa.

    Mã PHP:
    DCount("[tongthanhtoan]""[tb_donhang]"_

    "[ngaythem] Between " CDate(Me.time_start.Value) & " And " CDate(Me.time_end.Value) ) 

    Mình cảm ơn bác rất nhiều, hiện mình đã dùng queri gọi nó ra theo thời gian và dsum nó lại. 
    Vậy cách của mình khi dùng thêm between và cách dùng queri có khác nhau hay ảnh hưởng gì không  bác?
  • RE: Dsum có điều kiện ngày?

    ongke0711 > 02-09-22, 04:25 PM

    (02-09-22, 03:43 PM)ungthienhai Đã viết: ...
    Vậy cách của mình khi dùng thêm between và cách dùng queri có khác nhau hay ảnh hưởng gì không  bác?

    Đối với code liên quan đến dạng Date Time trong VBA thì nó mặc định hiểu ra dạng #mm/dd/yyyy#. Do đó trong code VBA, muốn chắc ăn là chuyển nó về dạng mm/dd/yyyy hết (dùng hàm Format). Còn trong Query thì Access sẽ tự động hiểu Date theo ngày của hệ thống máy tính đó đã thiết lập (trong Control Panel).
    Đối với người dùng thì cứ nói họ nhập liệu theo dạng ngày tháng mà máy tính của họ đã thiết lập, đừng ép họ phải nhập kiểu ngày/tháng/năm (lên Form nhập liệu) trong khi máy tính họ thiết lập ngày tháng kiểu US (tháng/ngày/năm). Khi đó Access xử lý sai là chắc chắn. Trường hợp trên của bạn phát sinh sai là do Access hiểu là lọc từ ngày 8 đến ngày 9 tháng 1.
  • RE: Dsum có điều kiện ngày?

    tranthanhan1962 > 02-09-22, 10:12 PM

    (02-09-22, 03:43 PM)ungthienhai Đã viết: Mình cảm ơn bác rất nhiều, hiện mình đã dùng queri gọi nó ra theo thời gian và dsum nó lại. 
    Vậy cách của mình khi dùng thêm between và cách dùng queri có khác nhau hay ảnh hưởng gì không  bác?

    Bạn đã quen dùng query thì cứ thiết kế theo query để sử dụng khi cần chạy code thì chuyển query sang SQL. Between là từ khóa có trong query. Trong đoạn mã Between «Expr» And «Expr» có 2 biểu thức «Expr», «Expr» đầu bạn trỏ vào textbox ngày đầu và «Expr» bạn trỏ vào textbox ngày cuối. Và bạn sẽ thấy nó hoàn toàn không có cặp #. Có lẽ bạn chưa vọc đến chỗ này. Thực ra khi thiết kế query trên QBE bạn có thể hoàn toàn không cần gõ một chữ nào cả. Tất cả đều có sẳn, bạn chỉ cần bấm và chọn
    [Hình: REqJsrt.png]