Hỏi về cách cách lọc số liệu

Góc trao đổi, hỏi đáp của ngôn ngữ Visual Basic 6 và Visual Basic Script

Moderator: tungblt

Post Reply
cbl07401
Thành viên chính thức
Thành viên chính thức
Posts: 25
Joined: Wed 22/12/2010 3:55 pm
Has thanked: 3 times

Hỏi về cách cách lọc số liệu

Post by cbl07401 »

Có cách nào để lọc lấy số liệu trong cơ sở dữ liệu không. Ví dụ mình muốn lọc trường từ ngày -> đến ngày và trường khoiluong củng phải lọc lấy tổng khối lượng của từ ngày, đến ngày. Mình đã thử câu lệnh

Code: Select all

str = "select sum(khoiluong) as kl, ngay from table1 where ngay Between format(tungay.text, "dd/mm/yyyy") and format(denngay.text, "dd/mm/yyyy")"
  kluong = rs!kl
Nhưng không được nó báo lỗi. Sư huynh nào có cách gì hay chỉ mình với !!!
hahuuhai
Thành viên năng nổ
Thành viên năng nổ
Posts: 61
Joined: Mon 13/04/2009 8:38 am
Location: Thạch Thành, Thanh Hóa

Re: Hỏi về cách cách lọc số liệu

Post by hahuuhai »

Có lẽ bạn phải đưa cả Cơ sở dữ liệu lên chứ thế này hơi khó giải quyết, nhưng xin nhận xét sơ qua về câu lệnh như sau:
str = "select sum(khoiluong) as kl, ngay from table1 where ngay Between format(tungay.text, "dd/mm/yyyy") and format(denngay.text, "dd/mm/yyyy")"
- Câu lệnh này không đúng (còn phải xử lý một số vấn đề liên quan đến dấu nháy (') và ngoặc kép (") nữa.
- Câu lệnh trên có lẽ không khả thi. Đã lấy Sum(khoiluong) mà còn lấy ngay, trong khi chỉ có 1 bảng.

Tóm lại, bạn cứ đưa CSDL lên, nếu cả mã nguồn càng tốt.
User avatar
truongphu
VIP
VIP
Posts: 4781
Joined: Sun 04/11/2007 10:57 am
Location: Cam Đức, Khánh hòa
Has thanked: 14 times
Been thanked: 525 times

Re: Hỏi về cách cách lọc số liệu

Post by truongphu »

Bạn làm lần lượt từng bước:
1- Các control (vd tungay) không thể đưa vào câu truy vấn vì VB6 chả hiểu, (xem như tungay.text là một STRING bình thường). Bạn phải đưa nó ra khỏi dấu "" và nối lại; vd

Code: Select all

Str = "select khoiluong, ngay from table1 where ngay Between " & Format(tungay.Text, "dd/mm/yyyy") & " and " & Format(denngay.Text, "dd/mm/yyyy")
Bảo đảm câu trên chạy tốt (= học cách đưa control ra khỏi dấu ngoặc kép), tiếp theo:

2- Tạo một Recordset truy vấn table trong khoảng thời gian:

Code: Select all

Str = "select khoiluong, ngay from table1 where ngay BETWEEN #" & tungay & "# AND #" & denngay & "#"
Bảo đảm câu trên chạy tốt (không dùng lệnh Format rườm rà)
Như vậy bạn đã có 1 Recordset gồm 2 field khoiluong và ngay trong khoảng thời gian yêu cầu. Bạn đóng ngoặc đơn câu truy vấn trên:

Code: Select all

Str = "(select khoiluong, ngay from table1 where ngay BETWEEN #" & tungay & "# AND #" & denngay & "#)"
3- Cuối cùng, tạo Recordset truy vấn SUM từ RECORDSET trên:

Code: Select all

Str = "SELECT Sum(khoiluong) AS TongKL FROM "
câu trên còn thiếu, FROM ở đâu?
From từ Recordset (chứ không từ Table), bạn bê toàn bộ câu đã đóng ngoặc đơn ở trên, dán vào sau từ FROM:
kết quả thành:

Code: Select all

Str = "SELECT Sum(khoiluong) AS TongKL FROM (select khoiluong, ngay from table1 where ngay BETWEEN #" & tungay & "# AND #" & denngay & "#)"
4- Hay không? hôm nay bạn học được hơi "bị" nhiều đấy :>
o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh
hahuuhai
Thành viên năng nổ
Thành viên năng nổ
Posts: 61
Joined: Mon 13/04/2009 8:38 am
Location: Thạch Thành, Thanh Hóa

Re: Hỏi về cách cách lọc số liệu

Post by hahuuhai »

truongphu wrote:Hay không? hôm nay bạn học được hơi "bị" nhiều đấy :>
Ai chà. Hôm nay Nô-en mà bác Phú đã nhiệt tình vậy thì không có lý do gì bạn lại không có một kỳ Nô-en vui vẻ hi.
Cháu cũng xin gửi lời chúc tới bác Phú nữa. Cảm ơn bác nhiều. =D> =D> :) :)
cbl07401
Thành viên chính thức
Thành viên chính thức
Posts: 25
Joined: Wed 22/12/2010 3:55 pm
Has thanked: 3 times

Re: Hỏi về cách cách lọc số liệu

Post by cbl07401 »

Trườc tiên xin cám ơn các bác. Mình đã đưa cả câu lệnh của bác Phú hướng dẫn vào chương trình như khi chạy nó lại báo kluong là null, xin các bác xem giúp em

Code: Select all

Dim kluong As Long
    Set dbs = OpenDatabase(App.Path & "\quanlyxb.mdb")
    str = "SELECT Sum(khoiluong) AS TongKL FROM (select khoiluong, ngay from table1 where ngay BETWEEN #" & tungay & "# AND #" & denngay & "#)"
    Set rs = dbs.OpenRecordset(str, dbOpenDynaset)
    If rs.EOF = False Then
            kluong = rs!TongKL
            rs.MoveNext
    End If
    rs.Close
------ Ghi chú của điều hành viên:
Đã sửa lại: Đưa code vào thẻ
Lần sau: xóa bài
Last edited by cbl07401 on Mon 27/12/2010 11:43 am, edited 2 times in total.
hahuuhai
Thành viên năng nổ
Thành viên năng nổ
Posts: 61
Joined: Mon 13/04/2009 8:38 am
Location: Thạch Thành, Thanh Hóa

Re: Hỏi về cách cách lọc số liệu

Post by hahuuhai »

À, vậy thì dính phải giá trị Null rồi, trên diễn đàn cũng đã nói nhiều tới khoản này.
Thôi thì coi như quà Giáng sinh tặng bạn vậy (giờ vẫn còn ngày 25 mà! :) )
  1. If Not rs.EOF Then
  2.      kluong = rs!TongKL & ""  ' Cái này được dùng để tránh lỗi dữ liệu rỗng
  3.     rs.MoveNext
  4. End If
User avatar
truongphu
VIP
VIP
Posts: 4781
Joined: Sun 04/11/2007 10:57 am
Location: Cam Đức, Khánh hòa
Has thanked: 14 times
Been thanked: 525 times

Re: Hỏi về cách cách lọc số liệu

Post by truongphu »

ghi chú:
* ở trên là trình bày kỹ thuật truy vấn recordset
còn thật ra, trường hợp nầy bạn có thể viết sql trực tiếp:

Code: Select all

Str = "SELECT Sum(khoiluong) AS TongKL FROM table1 where ngay BETWEEN #" & tungay & "# AND #" & denngay & "#"
* Khi thiết kế csdl, nên cho các field có giá trị default
o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh
cbl07401
Thành viên chính thức
Thành viên chính thức
Posts: 25
Joined: Wed 22/12/2010 3:55 pm
Has thanked: 3 times

Re: Hỏi về cách cách lọc số liệu

Post by cbl07401 »

Vẫn là giá trị Null. Bác có cách truy vấn nào khác không. Giúp em với
User avatar
vietteiv
Quản trị
Quản trị
Posts: 1325
Joined: Sat 10/02/2007 12:17 am
Location: Cung cấp giải pháp quản lý doanh nghiệp, dự án, tư vấn xây dựng
Has thanked: 6 times
Been thanked: 70 times
Contact:

Re: Hỏi về cách cách lọc số liệu

Post by vietteiv »

bạn đã set giá trị cho biến tungay, denngay chưa, hay là để nguyên si đoạn code hướng dẫn của bác truongphu rùi chạy?
cbl07401
Thành viên chính thức
Thành viên chính thức
Posts: 25
Joined: Wed 22/12/2010 3:55 pm
Has thanked: 3 times

Re: Hỏi về cách cách lọc số liệu

Post by cbl07401 »

Xin cảm ơn đến tất cả các bác đã hướng dẫn. Cảm ơn bác Phú rất nhiều em đã học hỏi rất nhiều từ bác. Em đã tìm được hướng giải quyết từ hướng dẫn của bác và không còn giá trị Null nửa, số liệu chính xác. Câu lệnh truy vấn dữ liệu của bác là hay và tốt nhất. Sau đây em xin gửi lên câu lệnh này để người quan tâm thì tham khảo.

Code: Select all

 Dim kluong As Double
    Set dbs = OpenDatabase(App.Path & "\quanlyxb.mdb")
    str = "SELECT Sum(khoiluong) AS TongKL FROM (select khoiluong, ngay from table1 where ngay BETWEEN DateSerial(" & Year(tungay) & "," & Month(tungay) & "," & Day(tungay) & ") And DateSerial(" & Year(denngay) & "," & Month(denngay) & "," & Day(denngay) & "))"
    Set rs = dbs.OpenRecordset(str, dbOpenDynaset)
    If rs.EOF = False Then
            kluong = rs!TongKL & ""
            rs.MoveNext
    End If
    rs.Close
Hàm DateSerial nó tuy có hơi dài nhưng nó trả về chính xác ngày/tháng/năm rất hiệu quả. Ai cần xử lý dữ liệu về ngày/tháng/năm và giờ/phút/giây thì dùng câu lệnh cùa bác Phú ở trên là tốt nhất
Post Reply

Return to “Visual Basic 6 và Visual Basic Script (VB & VBS)”