Đánh giá chủ đề:
  • 0 Votes - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
[Lỗi] Không lọc đúng khoảng ngày bằng ADODB
#1
Chào cả nhà !
Tiên đang nghiên cứu ADODB và gặp tình trạng thế này:
Tiên dùng câu Select để lấy các thông tin khoản ngày.

Kết quả:
-   Nếu lọc từ ngày 13/05/2015 đến ngày 30/05/2015 thì KQ đúng;
-   Nếu lọc từ ngày 01/05/2015 đến ngày 30/05/2015 thì kết quả sai. Hiển thị lọc từ ngày 05/01/2015 đến 30/05/2015.
(Bị hiểu nhầm ngày thành tháng và tháng thành ngày).
Tiên khắc phục dTungay thành format(dTungay,"dd/mm/yyyy") nhưng vẫn ko được.
Nhờ các Pro chỉ giáo cách khắc phục lỗi này !
Câu Tiên dùng:
"Select * from table Where "NgayTim between #" & dTungay & "# And #" & dDenngay & "#"
Cảm ơn nhiều !
Chữ ký của Minh Tiên -----------------------------------------------
Đường tuy ngắn, không đi không đến
Việc tuy nhỏ, không làm không nên.
                                           Tuân Tử
-----------------------------------------------
Reply
Những người đã cảm ơn
#2
Câu hỏi trên không liên quan gì đến code đâu Tiên ơi. và hamf ỏmat của bạnc ũng không sai gì cả.

Tất cả đều do khâu mình nhập liệu thôi. Đối với Access khi nhập dữ liệu bắt buộc phải nhập : Tháng/ngày/năm ( còn khi thi hành để chạy ta có thể bắt nó hiển thị theo kiểu "dd/mm/yyyy")

Nếu ban đầu không nhập đúng như vậy thì có viết code đến vài ngìn trang cũng như không, nhất là việc chúng ta thường import từ excel vào access càng cần kiểm tra lại bằng Query bằng hàm month hoặc day.

Nêu không kiểm tra chắc chắn sẽ ra kết quả sai.

Vì thế, làm một cái query quan sát xem dữ liệu là ngày hay tháng có nhầm lẫn không để giải quyết câu hỏi của bạn.

Không có dữ liệu để xem nên có nhiêu phán đoán thôi.

Thân mến!
Chữ ký của maidinhdan * Để được hỗ trợ tốt nhất, nhấn vào link dưới đây để xem.
1. [Hướng dẫn] Kiểu file gửi lên để được giúp đỡ
2. [Hướng dẫn] Nội quy diễn đàn
3. [Hướng dẫn] Cách Đưa file và hình vào diễn đàn
4.[Hướng dẫn] Để xây dựng một ứng dụng hoàn hảo và lời cảm tạ
5. Cần tìm Demo hay ứng dụng sử dụng thanh tìm kiếm phía trên cùng, bên phải của diễn đàn.
* Nếu muốn cảm ơn, hãy nhấn nút thank, không cần viết thêm bài nào nửa.



ღღღღღTài sản của maidinhdan (View All Items) ღღღღღ
Reply
Những người đã cảm ơn Minh Tiên
#3
Hình như khi chạy ADO còn thiếu gì đó thì phải ! Vì khi chạy trực tiếp hoặc dùng DAO thì lọc OK. Nhưng khi chuyển sanh dùng ADO thì mới bị tình trạng này.

Lâu nay khi nhập dữ liệu từ Excel vào hoặc nhập trực tiếp mình đều định dạng là Short Date (dd/mm/yyyy). Khi chuyển sang ADO mình dùng lại data cũ.
"maidinhdan" nói giúp sơ bộ cách kiểm soát ngày tháng bằng query nhé !
Các pro xem giúp có cách nào khắc phục không ?
Thanks !
Chữ ký của Minh Tiên -----------------------------------------------
Đường tuy ngắn, không đi không đến
Việc tuy nhỏ, không làm không nên.
                                           Tuân Tử
-----------------------------------------------
Reply
Những người đã cảm ơn
#4
Gửi file lên để có nhận xét tốt nhất, riêng đối với mình khi có tính toán đến ngày tháng thì mình thường làm 1 trong 2 việc như sau:

1. Khi nhập liệu: Không nhập bằng tay, mà click chọn ngày tháng nó tự điền
2. Nhập bằng cú pháp:
+ Tháng/ngày/năm
+ Hoặc Năm/tháng/ngày  ( cái này sau này hữu ít khi triển khai SQL Server)

* Nhưng tốt nhất vẫn thực hiện theo cách số 1.

Có gì thiếu sót mọi người góp ý bổ sung.
Chữ ký của maidinhdan * Để được hỗ trợ tốt nhất, nhấn vào link dưới đây để xem.
1. [Hướng dẫn] Kiểu file gửi lên để được giúp đỡ
2. [Hướng dẫn] Nội quy diễn đàn
3. [Hướng dẫn] Cách Đưa file và hình vào diễn đàn
4.[Hướng dẫn] Để xây dựng một ứng dụng hoàn hảo và lời cảm tạ
5. Cần tìm Demo hay ứng dụng sử dụng thanh tìm kiếm phía trên cùng, bên phải của diễn đàn.
* Nếu muốn cảm ơn, hãy nhấn nút thank, không cần viết thêm bài nào nửa.



ღღღღღTài sản của maidinhdan (View All Items) ღღღღღ
Reply
Những người đã cảm ơn Minh Tiên
#5
Ngoài ra, có thể  lọc theo dạng dd/MMM/yyyy sẽ không phải nhầm lẫn.
Ví dụ #01/May/2015# thì chắc chắn không bị nhầm thành #05/Jan/2015#
Chữ ký của Noname 020
ღღღღღTài sản của Noname (View All Items) ღღღღღ
Reply
Những người đã cảm ơn Minh Tiên
#6
(24-06-15, 06:58 PM)Minh Tiên Đã viết: Chào cả nhà !
Tiên đang nghiên cứu ADODB và gặp tình trạng thế này:
Tiên dùng câu Select để lấy các thông tin khoản ngày.

Kết quả:
-   Nếu lọc từ ngày 13/05/2015 đến ngày 30/05/2015 thì KQ đúng;
-   Nếu lọc từ ngày 01/05/2015 đến ngày 30/05/2015 thì kết quả sai. Hiển thị lọc từ ngày 05/01/2015 đến 30/05/2015.
(Bị hiểu nhầm ngày thành tháng và tháng thành ngày).
Tiên khắc phục dTungay thành format(dTungay,"dd/mm/yyyy") nhưng vẫn ko được.
Nhờ các Pro chỉ giáo cách khắc phục lỗi này !
Câu Tiên dùng:
"Select * from table Where "NgayTim between #" & dTungay & "# And #" & dDenngay & "#"
Cảm ơn nhiều !

Do có sự phức tạp trong cách cư xử với kiểu dữ liệu của các quốc gia khác nhau, có nơi dùng tháng, ngày, năm, có nơi lại ngày, tháng, năm làm chuẩn, việc xây dựng được công cụ đáp ứng được các yêu cầu đó quả là khó.
Biết được sự phức tạp sẽ xảy ra nên chuẩn SQL đã có một tiêu chí ngầm định là đối với câu truy vấn có liên quan đến ngày, chuẩn mặc định chấp nhận trong mọi tình huống áp dụng là tháng/ngày/năm. Tham số truyền vào cho câu truy vấn đó cũng như vậy.
Quay lại tình huống của bạn:
·       Nếu bạn để kiểu dữ liệu trường điều kiện là DateTime thì bất kể bạn để định dạng kiểu dd/mm/yyyy máy tính đều hiểu là kiểu DateTime và khi đưa vào truy vấn bạn chỉ cần đặt điều kiện tham số chuẩn DateTime dạng #thang/ngay/năm# là ổn;
·       Nếu bạn để dữ liệu trường điều kiện là Text (nhiều bạn hay làm) với chuẩn dd/mm/yyyy thì khi đưa vào Query bạn cần thêm việc chuyển số liệu sang dạng datetime với các hàm như DateSerial, DateValue .. nhưng lưu ý, nếu bạn không đặc tả đâu là ngày, đâu là tháng thì hệ thống tự làm và thường bị sai:
Ví dụ: 01/5/2014 sẽ được hiểu là ngày 5 tháng 1 năm 2014. Nhưng với 15/5/2014 thì nó vẫn hiểu là ngày 15 tháng 5 năm 2014.
Lời giải cho bài toàn này của bạn như sau:

Bước 1: Chuyển tham số ngày từ textbox sang chuẩn đúng tháng/ngày/năm.
Vì bạn đang dùng chuẩn ngày/tháng/năm cho người dùng thấy quen thuộc nên phải xử lý chuỗi đầu vào bằng một hàm nhỏ StringToDate() trong đó hàm này làm việc tách ngày, tháng, năm ra riêng sau đó chuyển thành dạng số liệu Date.
Code ví dụ như sau:


Mã:
Function StringToDate(DateString as String) as Date
'Nhớ dùng chuẩn phân cách là dạng "/" nhé
Dim txtDay as String, txtMonth as string, txtYear as string
Dim xPos1 as long, xPos2 as long
' Lấy vị trí 2 gạch chéo
xPos1=instr(DateString ,"/")
xPos2=instr(DateString ,"/",xPos1+1)
txtDay=Left(DateString,xPos1-1)
txtMonth=Mid(DateString,xPos1+1, xPos2-1)
txtYear=Mid(DateString,xPos2+1)
StringToDate=DateSerial(txtYear,txtMonth,txtDay)
End Function

Bước 2: Sau đó mới gọi đoạn code kêu Query như sau

Mã:
"Select * from table Where "NgayTim between #" & format(StringToDate(dTungay),”mm/dd/yyyy”)
 & "# And #" & Format(StringToDate(dDenngay) ,”mm/dd/yyyy”)  & "#"
 
Bạn có thấy phức tạp không?
Chữ ký của paulsteigel ====================
Quốc gia hưng vong
Thất phu hữu trách
====================
Reply
Những người đã cảm ơn Noname , Minh Tiên , trungn077
#7
Cảm ơn các Pro đã giúp đỡ. Sau khi thử nghiệm trên nguồn dữ liệu cũ của Tiên, Kết quả:
1. Cách của Bác Nome thì đã chạy OK, lọc đúng yêu cầu;
2. Cách của "paulsteigel": Phát sinh lỗi số 13 (Type mismatch).
Thanks./.
Chữ ký của Minh Tiên -----------------------------------------------
Đường tuy ngắn, không đi không đến
Việc tuy nhỏ, không làm không nên.
                                           Tuân Tử
-----------------------------------------------
Reply
Những người đã cảm ơn
#8
bạn đưa file lên mình hỗ trợ cho
Chữ ký của tt1212 Present Nhận viết phần mềm, hỗ trợ viết phần mềm, hợp tác viết phần mềm trên nên Microsoft Access mọi phiên bản Liên hệ: Mr Đức -989276236. Email: Tantriviet.vnn@gmail.com website:http://www.tantrivietsoft.com/
Reply
Những người đã cảm ơn
#9
(26-06-15, 08:51 AM)Minh Tiên Đã viết: Cảm ơn các Pro đã giúp đỡ. Sau khi thử nghiệm trên nguồn dữ liệu cũ của Tiên, Kết quả:
1. Cách của Bác Nome thì đã chạy OK, lọc đúng yêu cầu;
2. Cách của "paulsteigel": Phát sinh lỗi số 13 (Type mismatch).
Thanks./.

Cảm ơn Tiên,
Bài viết của mình chủ yếu là để giải thích tại sao nó thế thôi. Còn code thì mình viết chay (chửa chạy thử). Lỗi 13 là do sai kiểu dữ liệu.
Chắc là sai ở hàm thôi.
Để mình kiểm tra xem!
Đặng Đình Ngọc
Chữ ký của paulsteigel ====================
Quốc gia hưng vong
Thất phu hữu trách
====================
Reply
Những người đã cảm ơn Minh Tiên , Noname
#10
Cảm ơn các Pro nhiều !
1. Mình đã Viết phần lọc dữ liệu theo Hướng dẫn của Bác Noname OK rồi.
2. Mình đang nghiên cứu "bài Viết" và "cách Lọc" của pausteigel để áp dụng vào nhiều công việc sau này, ...
Một lần nữa rất cảm ơn các Pro đã hỗ trợ !
Thân./.
Chữ ký của Minh Tiên -----------------------------------------------
Đường tuy ngắn, không đi không đến
Việc tuy nhỏ, không làm không nên.
                                           Tuân Tử
-----------------------------------------------
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
  [Thủ Thuật] Demo Hàm report tự canh đều chiều cao ( Không kẻ line)) maidinhdan 34 1,488 20-10-16, 11:01 AM
Bài mới nhất: maidinhdan
  [Hỏi] Sử dụng ngày trong truy vấn qua VBA tại sao không đúng? luonguct 5 325 09-06-16, 06:24 PM
Bài mới nhất: maidinhdan
Sad [Help] Không chọn được DAO 3.6 Object conmeocon 3 755 03-07-15, 02:31 PM
Bài mới nhất: paulsteigel
Sad [Help] có bạn nào có soft lấy lại mật khẩu trong vba không? chumap 2 521 05-03-15, 04:35 PM
Bài mới nhất: maidinhdan
  [Hỏi] Không hiển thị tiếng Việt dinhnhieu 4 598 17-12-14, 12:18 AM
Bài mới nhất: quan_pc

Chuyển nhanh:


User(s) browsing this thread: 1 Guest(s)
Diễn Đàn Thơ Văn Thi Ẩm Lâu|Nhà Hàng Sông Thơ