-
Ghép chuổi trong điều kiện hàm dcount
mrsiro > 04-04-18, 11:11 AM
Dcount("mahd","hoadon","right(ngaylap,4) & mid(ngaylap,4,2) & left(ngaylap,2) < ' " & me.ngaytim & " ' ")
Các bạn cho mình hỏi làm sao để cú pháp này có thể hoạt động được. -
RE: Ghép chuổi trong điều kiện hàm dcount
ongke0711 > 04-04-18, 11:29 AM
Bạn dùng chuỗi (string) so sánh dạng Date làm sao ra.
Sao không dùng hàm DateSerial()
Vd: DateSerial (right(ngaylap,4),mid(ngaylap,4,2),left(ngaylap,2) <Format (Me.NgayTim,"mmddyyyy") -
RE: Ghép chuổi trong điều kiện hàm dcount
mrsiro > 04-04-18, 03:25 PM
(04-04-18, 11:29 AM)ongke0711 Đã viết: Bạn dùng chuỗi (string) so sánh dạng Date làm sao ra.
Sao không dùng hàm DateSerial()
Vd: DateSerial (right(ngaylap,4),mid(ngaylap,4,2),left(ngaylap,2) <Format (Me.NgayTim,"mmddyyyy")
me.ngaytim cũng theo dạng rightleftmid luôn bạn ơi không phải dd/mm/yyyy. Mình covert những giá trị thành kiểu rightmidleft hết rồi so sánh. Tránh sử dụng mấy cái hàm date để hạn chế phụ thuộc window.
Cái cú pháp ở trên mình muốn hỏi là cấu trúc như thế nào để hoạt động được, ví dụ như sắp xếp dấu " với ' để chạy được ấy. -
RE: Ghép chuổi trong điều kiện hàm dcount
ongke0711 > 04-04-18, 04:16 PM
"cstr(right(ngaylap,4) & mid(ngaylap,4,2) & left(ngaylap,2)) < ' " & me.ngaytim & " ' " -
RE: Ghép chuổi trong điều kiện hàm dcount
ongke0711 > 08-04-18, 06:54 PM
(04-04-18, 03:25 PM)mrsiro Đã viết: me.ngaytim cũng theo dạng rightleftmid luôn bạn ơi không phải dd/mm/yyyy. Mình covert những giá trị thành kiểu rightmidleft hết rồi so sánh. Tránh sử dụng mấy cái hàm date để hạn chế phụ thuộc window.
Tôi cũng khá thắc mắc là bạn gặp vấn đề với dữ liệu dạng DateTime như thế nào mà bạn phải thiết kế CSDL dùng dạng Text thay thế cho DateTime?
- Khi dùng Text để lưu dữ liệu cho Date thì bạn phải tốn thêm một số hàm để chuyển nó về DateTime khi xử lý dữ liệu (tốn thêm tài nguyên hệ thống) mà việc xử lý dữ liệu liên quan đến DateTime thì cực nhiều trong một ứng dụng. Bạn có nghĩ nó hiệu quả không?
- Các hệ quản trị CSDL lớn, chuyên nghiệp như SQL Server vẫn dùng kiểu DateTime để lưu dữ liệu ngày tháng chứ tôi chưa thấy ứng dụng nào dùng Text để lưu ngày tháng. Thường thì SQL Server sẽ lưu theo chuẩn ISO: yyyy-mm-dd hh:nn:ss.
Tôi nghĩ vấn đề bạn gặp nằm ở cách thiết kế Form nhập liệu, code xử lý chứ bao nhiêu ứng dụng (kể cả ứng dụng kế toán) dùng đúng kiểu DateTime để lưu dữ liệu ngày tháng trong table vẫn xử lý tốt.
Trước đây tôi có chia sẻ cái thủ thuật: khi ở ứng dụng Access của bạn trên bất kỳ máy tính nào nó cũng sẽ kiểm tra trong Windows cách thiết lập ngày tháng của máy đó theo kiểu Mỹ (mm/dd/yyyy) hay kiểu Anh (dd/mm/yyyy) rồi tự động đổi lại theo định dạng ứng dụng của bạn yêu cầu. Do vậy bạn chỉ cần thống nhất nhập liệu ngày tháng năm theo kiểu Việt Nam là dd/mm/yyyy và Regional Setting trong Windows cũng theo kiểu đây thì dữ liệu không bị sai gì cả. Tôi cũng đã test chỉnh thiết lập của Windows theo dd/mm/yyyy rồi vào nhập liệu đúng theo kiểu đó, sau đó chỉnh lại mm/dd/yyyy của Windows, khởi động lại ứng dụng thì nó tự đảo và vẫn cho ra dữ liệu đúng ngày/tháng đã nhập.
Một vấn đề trong code VBA là nếu bạn đưa tham số ngày tháng trực tiếp trong code thì phải viết dạng “mm/dd/yyyy” thì nó mới xử lý đúng. Nhưng trong thực tế code thường tham chiếu ngày tháng thông qua textbox nào đó trên Form (Me.txtFromDate) thì nó không bị sai gì cả.
Link code thay đổi ngày giờ hệ thống Windows: Ở đây. -
RE: Ghép chuổi trong điều kiện hàm dcount
mrsiro > 23-05-18, 12:12 AM
(08-04-18, 06:54 PM)ongke0711 Đã viết: Tôi cũng khá thắc mắc là bạn gặp vấn đề với dữ liệu dạng DateTime như thế nào mà bạn phải thiết kế CSDL dùng dạng Text thay thế cho DateTime?
Lỗ hổng ở chổ, sau khi đổi định dạng ngày tháng bằng code thì trong quá trình sử dụng nếu người dùng chỉnh lại định dạng ngày tháng thì toàn bộ xử lí với ngày tháng sai ngay. Bởi vì code hoạt động khi gán vào 1 form khởi động nào đó, khi form này open code chạy thay đổi hệ thống => ok. Nhưng vẫn giữ nguyên không thoát ứng dung, sau đó vào thay đổi định dạng hệ thống, lúc này toàn bộ xử lí ngày tháng sẽ sai lệch.
- Khi dùng Text để lưu dữ liệu cho Date thì bạn phải tốn thêm một số hàm để chuyển nó về DateTime khi xử lý dữ liệu (tốn thêm tài nguyên hệ thống) mà việc xử lý dữ liệu liên quan đến DateTime thì cực nhiều trong một ứng dụng. Bạn có nghĩ nó hiệu quả không?
- Các hệ quản trị CSDL lớn, chuyên nghiệp như SQL Server vẫn dùng kiểu DateTime để lưu dữ liệu ngày tháng chứ tôi chưa thấy ứng dụng nào dùng Text để lưu ngày tháng. Thường thì SQL Server sẽ lưu theo chuẩn ISO: yyyy-mm-dd hh:nn:ss.
Tôi nghĩ vấn đề bạn gặp nằm ở cách thiết kế Form nhập liệu, code xử lý chứ bao nhiêu ứng dụng (kể cả ứng dụng kế toán) dùng đúng kiểu DateTime để lưu dữ liệu ngày tháng trong table vẫn xử lý tốt.
Trước đây tôi có chia sẻ cái thủ thuật: khi ở ứng dụng Access của bạn trên bất kỳ máy tính nào nó cũng sẽ kiểm tra trong Windows cách thiết lập ngày tháng của máy đó theo kiểu Mỹ (mm/dd/yyyy) hay kiểu Anh (dd/mm/yyyy) rồi tự động đổi lại theo định dạng ứng dụng của bạn yêu cầu. Do vậy bạn chỉ cần thống nhất nhập liệu ngày tháng năm theo kiểu Việt Nam là dd/mm/yyyy và Regional Setting trong Windows cũng theo kiểu đây thì dữ liệu không bị sai gì cả. Tôi cũng đã test chỉnh thiết lập của Windows theo dd/mm/yyyy rồi vào nhập liệu đúng theo kiểu đó, sau đó chỉnh lại mm/dd/yyyy của Windows, khởi động lại ứng dụng thì nó tự đảo và vẫn cho ra dữ liệu đúng ngày/tháng đã nhập.
Một vấn đề trong code VBA là nếu bạn đưa tham số ngày tháng trực tiếp trong code thì phải viết dạng “mm/dd/yyyy” thì nó mới xử lý đúng. Nhưng trong thực tế code thường tham chiếu ngày tháng thông qua textbox nào đó trên Form (Me.txtFromDate) thì nó không bị sai gì cả.
Link code thay đổi ngày giờ hệ thống Windows: Ở đây. -
RE: Ghép chuổi trong điều kiện hàm dcount
ongke0711 > 23-05-18, 07:32 AM
Bạn không đọc kỹ bài tôi viết à và tôi đã đính kèm hàm tự khởi động lại ứng dụng để thay đổi có hiệu lực. Bạn không cho khởi động lại thì nó sai là đúng rồi.
Có nguời dùng phổ thông nào khi mở 1 ứng dụng lên lại chịu khó vô đổi ngày hệ thống khi thấy sai dữ liệu không và nếu vậy thì ứng dụng của bạn có vấn đề. Code thay đổi dịnh dạnh trong demo chủ yếu là đối với dịnh dạng số hàng ngàn vì kế toán phải thể hiện đúng kiểu thuần tuý VN, còn đối với dạng ngày/tháng chủ yếu là code xử lý của bạn chứ muốn hiển thị cho nguời dùng xem kiểu gì chả đuợc. Vấn đề quan trọng hơn là code của bạn phải xử lý bẫy lỗi được người dùng để họ phải nhập đúng kiểu ngày tháng mà bạn mong muốn để code của bạn không chạy sai. -
RE: Ghép chuổi trong điều kiện hàm dcount
mrsiro > 23-05-18, 09:22 AM
(23-05-18, 07:32 AM)ongke0711 Đã viết: Bạn không đọc kỹ bài tôi viết à và tôi đã đính kèm hàm tự khởi động lại ứng dụng để thay đổi có hiệu lực. Bạn không cho khởi động lại thì nó sai là đúng rồi.
Có nguời dùng phổ thông nào khi mở 1 ứng dụng lên lại chịu khó vô đổi ngày hệ thống khi thấy sai dữ liệu không và nếu vậy thì ứng dụng của bạn có vấn đề. Code thay đổi dịnh dạnh trong demo chủ yếu là đối với dịnh dạng số hàng ngàn vì kế toán phải thể hiện đúng kiểu thuần tuý VN, còn đối với dạng ngày/tháng chủ yếu là code xử lý của bạn chứ muốn hiển thị cho nguời dùng xem kiểu gì chả đuợc. Vấn đề quan trọng hơn là code của bạn phải xử lý bẫy lỗi được người dùng để họ phải nhập đúng kiểu ngày tháng mà bạn mong muốn để code của bạn không chạy sai.
Ý mình là khi code bạn đã chạy hết, định dạng hệ thống đã đúng hết. Lúc này user đăng nhập vào chương trình, trong quá trình sử dụng nếu user vào thay đổi định dạng hệ thống thì sẽ gây ra lỗi đối với các xử lí ngày tháng. Bởi vì code của bạn được gọi ở form khởi động, nếu chạy qua form khởi động này rồi thì nếu user có vào thay đổi định dạng hệ thống thì xong, đây là lổ hổng đó.
Ví dụ cụ thể cho dễ hiểu: Sau khi định dạng hệ thống dd/mm/yyyyy, user mở phần mềm sử dụng, lúc này định dạng hệ thống đang đúng, thế là vào form làm việc. Tại form làm việc, nếu người dùng vào thay đổi định dạng thành mm/dd/yyyy, thì quay trở lại form làm việc, nếu có vài đoạn code liên quan đến ngày tháng, dateadd chẳng hạn, kết quả ra thành mm/dd/yyyy ngay <= sai. -
RE: Ghép chuổi trong điều kiện hàm dcount
ongke0711 > 23-05-18, 10:51 AM
(23-05-18, 09:22 AM)mrsiro Đã viết: Ví dụ cụ thể cho dễ hiểu: Sau khi định dạng hệ thống dd/mm/yyyyy, user mở phần mềm sử dụng, lúc này định dạng hệ thống đang đúng, thế là vào form làm việc. Tại form làm việc, nếu người dùng vào thay đổi định dạng thành mm/dd/yyyy, thì quay trở lại form làm việc, nếu có vài đoạn code liên quan đến ngày tháng, dateadd chẳng hạn, kết quả ra thành mm/dd/yyyy ngay <= sai.
Nếu người dùng đổi ngày hệ thống thành "mm/dd/yyyy" mà khi nhập liệu họ nhập "dd/mm/yyyy" là do lỗi của họ chứ ko phải do ứng dụng. Nếu họ vẫn nhập đúng "mm/dd/yyyy" mà ứng dụng chạy sai thì xem code lại.
Bạn up file demo bị lỗi tính toán ngày tháng của bạn lêm xem như thế nào.