mrsiro > 04-04-18, 11:11 AM
ongke0711 > 04-04-18, 11:29 AM
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")
ongke0711 > 04-04-18, 04:16 PM
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.
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.
ongke0711 > 23-05-18, 07:32 AM
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.
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.