• Access+SQL Cách sử lý tìm kiếm trong 1 khoảng thời gian
  • Access+SQL Cách sử lý tìm kiếm trong 1 khoảng thời gian

    Cuong Servenet > 09-08-18, 11:34 AM

    e xin phép chia sẻ 1 cách xử lý tìm kiếm thông tin trong list khách hàng vào khoảng thời gian 
    ※ Nếu anh chị nào có cách nào xử lý hay hơn thì chỉ em với nhé. hiện tại em chỉ nghĩ ra như vậy

    ①Code VBA thì em nghĩ 1 2 dòng là đủ như  Me.requery ....
    ②Code trên Sql như sau :
    CREATE PROCEDURE [dbo].[LIST_KhachHang]
    (
    @TK_TenKH NVARCHAR(30),
    @TK_NgayDatHang01 DATETIME,
    @TK_NgayDatHang02 DATETIME,
    )
    AS

    DECLARE @STRWHERE NVARCHAR(1000)
    DECLARE @CONDATE01 NVARCHAR(10),@CONDATE02 NVARCHAR(10)

    SET @STRWHERE = ''
    SET @CONDATE01 = ''
    SET @CONDATE02 = ''

    IF @TK_NgayDatHang01 IS NOT NULL OR @TK_NgayDatHang02 IS NOT NULL
    BEGIN
    IF @TK_NgayDatHang01 IS NULL
    SET @TK_NgayDatHang01 = '1900-4-1'
    IF @TK_NgayDatHang02 IS NULL
    SET @TK_NgayDatHang02 = '3000-4-1'

    SET @CONDATE01 = DATENAME( yy, @TK_NgayDatHang01 ) + '-' + DATENAME( mm, @TK_NgayDatHang01 ) + '-' + DATENAME( dd, @TK_NgayDatHang01 )
    SET @TK_NgayDatHang02 = DATEADD( D, 1, @TK_NgayDatHang02 )
    SET @CONDATE02 = DATENAME( yy, @TK_NgayDatHang02 ) + '-' + DATENAME( mm, @TK_NgayDatHang02 ) + '-' + DATENAME( dd, @TK_NgayDatHang02)

    IF @STRWHERE <> ''
    SET @STRWHERE = @STRWHERE + ' AND'
    SET @STRWHERE = @STRWHERE + ' ( DBkhachhang.NgayDatHang >=  CONVERT(DATETIME, ''' + @CONDATE01+ 
    ''') AND DBkhachhang.NgayDatHang < CONVERT(DATETIME,''' + @CONDATE02+ ''' ))'
    END

    IF @STRWHERE <> ''
    BEGIN
    SET @STRWHERE = ' WHERE ' + @STRWHERE
    END
    -----------------------------------------------------------------------------------------------------
    EXEC('
    SELECT *
    FROM DBkhachhang
    ' + @STRWHERE + '
    ORDER BY DBkhachhang.NgayDatHang DESC
    ')
    GO
  • RE: Access+SQL Cách sử lý tìm kiếm trong 1 khoảng thời gian

    ongke0711 > 09-08-18, 02:37 PM

    Nói chung tôi không rành Store Proc. nhưng ý kiến về cái logic xử lý của bạn khi kiểm tra tính NULL của NgayDathang 1, 2.
    - Chỉ cần 1 trong 2 cái NULL là không hợp lệ, báo lỗi và thoát luôn chứ xử lý chi cho mất thời gian và kết quả không ra đúng như y/c.
    IF @TK_NgayDatHang01 IS NOT NULL OR @TK_NgayDatHang02 IS NOT NULL --> trường hợp IF này kết quả trả về rộng quá (Nếu NDH1 not Null thì NDH2 có thể Null hoăc Not Null)
    -  Sau đó xử lý tiếp nếu NgayDatHang còn lại là NULL thì gán giá trị 1994 hoặc 3000 => kết quả trả về cả đống Records (từ năm 1994 đến NgayDatHang2 hoặc NgayDatHang 1 - năn 3000), nếu CSDL lớn là mệt à. Hơn nữa dữ liệu có đúng y/c đâu mà lấy về cho tốn tài nguyên hệ thống chạy vậy?

    Tại sao không xử lý là:
    If NDH1 Or NDH 2 Null Then
       => thoát, bắt nhập đầy đủ thông tin NDH
    Else
        SET @CONDATE01...
       .....
    End If
    --> Chỉ cần dùng 1 IF thay vì 3 IF như hiện tại.

    Còn một cái thắc mắc hỏi bạn để tôi học hỏi là: tại sao bạn dùng EXEC (sqlString) mà không dùng EXEC sp_ExecuteSql?
     
  • RE: Access+SQL Cách sử lý tìm kiếm trong 1 khoảng thời gian

    Cường Servenet SE > 10-08-18, 12:38 AM

    (09-08-18, 02:37 PM)ongke0711 Đã viết: Nói chung tôi không rành Store Proc. nhưng ý kiến về cái logic xử lý của bạn khi kiểm tra tính NULL của NgayDathang 1, 2.
    - Chỉ cần 1 trong 2 cái NULL là không hợp lệ, báo lỗi và thoát luôn chứ xử lý chi cho mất thời gian và kết quả không ra đúng như y/c.
    IF @TK_NgayDatHang01 IS NOT NULL OR @TK_NgayDatHang02 IS NOT NULL --> trường hợp IF này kết quả trả về rộng quá (Nếu NDH1 not Null thì NDH2 có thể Null hoăc Not Null)
    -  Sau đó xử lý tiếp nếu NgayDatHang còn lại là NULL thì gán giá trị 1994 hoặc 3000 => kết quả trả về cả đống Records (từ năm 1994 đến NgayDatHang2 hoặc NgayDatHang 1 - năn 3000), nếu CSDL lớn là mệt à. Hơn nữa dữ liệu có đúng y/c đâu mà lấy về cho tốn tài nguyên hệ thống chạy vậy?

    Tại sao không xử lý là:
    If NDH1 Or NDH 2 Null Then
       => thoát, bắt nhập đầy đủ thông tin NDH
    Else
        SET @CONDATE01...
       .....
    End If
    --> Chỉ cần dùng 1 IF thay vì 3 IF như hiện tại.

    Còn một cái thắc mắc hỏi bạn để tôi học hỏi là: tại sao bạn dùng EXEC (sqlString) mà không dùng EXEC sp_ExecuteSql?
     
    Minh thích dùng cái SQL động hơn vì nó dễ tùy chỉnh nhiều điều kiện khác nhau :happy với lại sủ dụng SQL profiler dễ quản lí hoạt động của SQL hơn.
    còn dùng thẳng trực tiếp vào vẫn được .
  • RE: Access+SQL Cách sử lý tìm kiếm trong 1 khoảng thời gian

    Cường Servenet SE > 10-08-18, 12:44 AM

    Mã:
    Nói chung tôi không rành Store Proc. nhưng ý kiến về cái logic xử lý của bạn khi kiểm tra tính NULL của NgayDathang 1, 2.
    - Chỉ cần 1 trong 2 cái NULL là không hợp lệ, báo lỗi và thoát luôn chứ xử lý chi cho mất thời gian và kết quả không ra đúng như y/c.
    [color=#3333cc]IF @TK_NgayDatHang01 IS NOT NULL OR @TK_NgayDatHang02 IS NOT NULL [/color][color=#ff3333]--> trường hợp IF này kết quả trả về rộng quá (Nếu NDH1 not Null thì NDH2 có thể Null hoăc Not Null)[/color]
    -  Sau đó xử lý tiếp nếu NgayDatHang còn lại là NULL thì gán giá trị 1994 hoặc 3000 => kết quả trả về cả đống Records (từ năm 1994 đến NgayDatHang2 hoặc NgayDatHang 1 - năn 3000), [font=Tahoma]nếu CSDL lớn là mệt à. Hơn nữa dữ liệu có đúng y/c đâu mà lấy về cho tốn tài nguyên hệ thống chạy vậy
    [/font]

    cái này mình tùy biến nhiều  kiểu tìm kiếm mà , vd ko thích tìm kiếm trong khoảng thì ta tìm kiếm từ 1 ngày nào đó trở đi , hoặc ngày nào đó trở về trước,

    nhược điểm của nó chính là như cái bạn nói, sau dữ liệu sẽ rất nhiều , chính mình vậy mình mới dùng cái SQL Động, 
    Ví dụ như ta thêm 1 cột nữa "ngày tháng khách yêu cầu nhận hàng" chẳng hạn thì sẽ dễ chỉnh sửa hơn . chứ ốp thẳng trực tiếp vào nhiều SQL rối nắm.
  • RE: Access+SQL Cách sử lý tìm kiếm trong 1 khoảng thời gian

    ongke0711 > 10-08-18, 12:31 PM

    - Nói về thủ thuật tìm kiếm: không ai tự gây khó cho ứng dụng của mình bằng kiểu tìm kiếm không có giới hạn dưới/ trên như vậy. Đã không nhớ thời gian chính xác thì đã giải quyết bằng nhập 1 khoảng thời gian mà cũng không làm được thì tìm bằng tiêu chí khác đi, bỏ tiêu chí thời gian đi. Cái này gọi là chiều người dùng không đúng chỗ.
    - Nói về vụ check NULL, nếu bạn có 4, 5 tiêu chí nữa thì sẽ ra một đống phân nhánh check IF NULL bạn có chắc code không bị sai sót trường hợp nào không? 

    - Tìm kiếm nhiều tiêu chí thì phải dùng SQL động là không cần bàn cãi. Nhưng cái tôi hỏi là cái lệnh thực thi EXEC: bạn dùng EXEC (@chuỗi sql) không sợ bị SQL injection à? Tôi thấy nhiều người đã khuyên dùng EXEC sp_Executesql rồi mà bạn không áp dụng?
  • RE: Access+SQL Cách sử lý tìm kiếm trong 1 khoảng thời gian

    Cuong Servenet > 10-08-18, 03:36 PM

    (10-08-18, 12:31 PM)ongke0711 Đã viết: - Nói về thủ thuật tìm kiếm: không ai tự gây khó cho ứng dụng của mình bằng kiểu tìm kiếm không có giới hạn dưới/ trên như vậy. Đã không nhớ thời gian chính xác thì đã giải quyết bằng nhập 1 khoảng thời gian mà cũng không làm được thì tìm bằng tiêu chí khác đi, bỏ tiêu chí thời gian đi. Cái này gọi là chiều người dùng không đúng chỗ.
    - Nói về vụ check NULL, nếu bạn có 4, 5 tiêu chí nữa thì sẽ ra một đống phân nhánh check IF NULL bạn có chắc code không bị sai sót trường hợp nào không? 

    - Tìm kiếm nhiều tiêu chí thì phải dùng SQL động là không cần bàn cãi. Nhưng cái tôi hỏi là cái lệnh thực thi EXEC: bạn dùng EXEC (@chuỗi sql) không sợ bị SQL injection à? Tôi thấy nhiều người đã khuyên dùng EXEC sp_Executesql rồi mà bạn không áp dụng?

    tại sao mình lai làm ra tiêu chí đó : 
    Thứ nhất : Kiem tra xem xét lai tổng quan chi tiết 1 khoảng thời mà khách hàng yêu cầu . ví dụ như 1 năm ,1 tháng, 1 tuần  ...
    Thứ hai   : khách hàng có thể kiểm tra chi tiết khi biết Ngày khách đặt hàng và ngày khách nhận hàng khi biết cụ thể ngày or ko cụ thể ngày.
    Còn tất nhiên Tiêu chí tìm kiếm mình còn nhiều cái khác kết hơp nữa như tên khách, tên nhân viên bán ..........
    ---> Mục đích đảm bảo cho người quản lí theo dõi dễ dàng ....

    Quay trở lại với đoạn ví dụ trên (đoạn ví dụ trên mình chưa viết điều kiện cho ngày nhận nhưng cũng tương tự như vậy) :
    Tất cả có 2 cột : Cột- Ngày đặt Hàng and Cột - Ngày nhận hàng.

    Khách hàng có thể tìm kiếm theo tiêu chí :
    1 Khi biết chính xác số ngày đặt - ngày Nhận hàng -> oK
    2 Khi Biết chính xác số ngày đặt - ko biết ngày nhận ->ok 
    3 Khi không nhớ rõ ngày đặt và biết Ngày Nhận  -> ok
    4 Khi không nhớ rõ cả 2 -> Tức là ko tìm kiếm -> Hiện thị toàn bộ danh sách trong list (Việc hiển thị ra forms thì mình có thể cài đặt Gọi LIST/Không Gọi LIST)

    [code]Nói về vụ check NULL, nếu bạn có 4, 5 tiêu chí nữa thì sẽ ra một đống phân nhánh check IF NULL bạn có chắc code không bị sai sót trường hợp nào không? 

    -> Thế nên mình mới fai dùng cái sql động . Còn hệ cơ sở của mình nó kết nối lên server nên mình dùng cái EXEC (@chuỗi sql)  .
  • RE: Access+SQL Cách sử lý tìm kiếm trong 1 khoảng thời gian

    ongke0711 > 10-08-18, 04:10 PM

    (10-08-18, 03:36 PM)Cuong Servenet Đã viết: ..
    tại sao mình lai làm ra tiêu chí đó : 
    ..

    [code]Nói về vụ check NULL, nếu bạn có 4, 5 tiêu chí nữa thì sẽ ra một đống phân nhánh check IF NULL bạn có chắc code không bị sai sót trường hợp nào không? 

    -> Thế nên mình mới fai dùng cái sql động . Còn hệ cơ sở của mình nó kết nối lên server nên mình dùng cái EXEC (@chuỗi sql)  .

    Hehe...có lẽ bạn không hiểu những gì tôi hỏi thì phải.
    - SQL động không liên quan gì đế giải thuật IF lồng như tôi hỏi ở trên.
    - Còn bạn đang viết Store Proc. thì ai lại không biết bạn đang dùng SQL server làm Back End Database!!! Việc EXEC (@chuỗi Spl) hay EXEC sp_ExecuteSql đều thực thi câu lệnh SQL của bạn và cho kết quả giống nhau chỉ có khác là tính bảo mật của cách 2 cao hơn cách 1. Cách 1 dễ bị hacker chèn chuỗi sql vô (SQL injection) phá hư dữ liệu khi bạn EXEC @sql vậy thôi.
    Có lẻ cách tôi hiểu SQL Server còn kém quá nên trao đổi không thông được.  007
    Các bạn chuyên viết ứng dụng với SQL Server hỗ trợ giùm nhé.
  • RE: Access+SQL Cách sử lý tìm kiếm trong 1 khoảng thời gian

    Cuong Servenet > 10-08-18, 04:25 PM

    (10-08-18, 04:10 PM)ongke0711 Đã viết:
    (10-08-18, 03:36 PM)Cuong Servenet Đã viết: ..
    tại sao mình lai làm ra tiêu chí đó : 
    ..

    [code]Nói về vụ check NULL, nếu bạn có 4, 5 tiêu chí nữa thì sẽ ra một đống phân nhánh check IF NULL bạn có chắc code không bị sai sót trường hợp nào không? 

    -> Thế nên mình mới fai dùng cái sql động . Còn hệ cơ sở của mình nó kết nối lên server nên mình dùng cái EXEC (@chuỗi sql)  .

    Hehe...có lẽ bạn không hiểu những gì tôi hỏi thì phải.
    - SQL động không liên quan gì đế giải thuật IF lồng như tôi hỏi ở trên.
    - Còn bạn đang viết Store Proc. thì ai lại không biết bạn đang dùng SQL server làm Back End Database!!! Việc EXEC (@chuỗi Spl) hay EXEC sp_ExecuteSql đều thực thi câu lệnh SQL của bạn và cho kết quả giống nhau chỉ có khác là tính bảo mật của cách 2 cao hơn cách 1. Cách 1 dễ bị hacker chèn chuỗi sql vô (SQL injection) phá hư dữ liệu khi bạn EXEC @sql vậy thôi.
    Có lẻ cách tôi hiểu SQL Server còn kém quá nên trao đổi không thông được.  007
    Các bạn chuyên viết ứng dụng với SQL Server hỗ trợ giùm nhé.

    mình cũng đâu có nói cái SQL động kia để giải thuật toán IF lồng ? 
    ①select * from DB where DB.cột1 = @A1   , @A2 @A3 ..... @A5
    ② Select * from DB where '@STRWHERE'       @STRWHERE có thể tùy biến

    nếu là bạn bạn sẽ dùng cái nào ? 
    tất nhiên dù cách nào đi chăng nữa thì kết quả cũng giống nhau. Quan trọng là sau khi làm xong Dễ xem , dễ sửa khi có lỗi, dễ thêm bớt các đk khi muốn ...
    có lẽ trình độ giải thích sql mình còn kém quá, .

    Như mình đã nó Dữ liệu của mình ko dùng kết nối enternet nên mình dùng cái EXEC (@chuỗi sql) happy
  • RE: Access+SQL Cách sử lý tìm kiếm trong 1 khoảng thời gian

    ongke0711 > 10-08-18, 04:36 PM

    Banghead Banghead  007

    Thôi bây giờ bạn thử viết store proc. có thêm 2 3 cái điều kiện tìm kiếm nữa ứng theo CSDL của bạn để tham khảo bạn dùng IF NULL như thế nào nhé. 
    Chắc để ngâm cứu SQL rồi ngồi viết cái Store Proc. nay thử xem sao ntn.