• Một hàm tự viết thay thế cho DLOOKUP của Access
  • Một hàm tự viết thay thế cho DLOOKUP của Access

    lehongduc > 20-07-12, 04:14 PM

    Chào các Bạn,
    Do nhu cầu công việc, tôi phải viết 1 hàm tìm kiếm để thay thế DLOOKUP, vốn dĩ ít linh hoạt và có phần nặng nề. Tôi đã sử dụng hàm mình tự viết và thấy nó "đa năng" hơn, đồng thời cũng hiệu quả hơn rất nhiều so với DLOOKUP.
    Các Bạn thử sử dụng xem có đúng như thế không nhé.
    Nội dung hàm như sau:

    Mã:
    Function fLookup(WhatField As String, WhatTb As String, sCri As String, Optional SubValue, Optional SubValueVar, Optional ExDb, Optional sUser, Optional Psw)
        'Thay cho Function Dlookup
        'WhatField: cột cần tìm trong bảng WhatTb
        'sCri: biểu thức điều kiện để tìm
        'SubValue: tên của 1 cột khác (ngoài cột cần tìm là WhatField)
        'SubValueVar: tên biến giữ giá trị của SubValue
        'ExDb: tên và đường dẫn (Path) đầy đủ của Database nếu không phải tìm bảng nằm trong Database đang mở
        'sUser: User-Name để mở ExDb
        'Psw: PassWord của sUser

        Dim sqlSt As String
        Dim sqlRec As DAO.Recordset
        Dim MyDb As DAO.Database
        Dim MyWrk As DAO.Workspace
        
        If Not IsMissing(sUser) Then
            Set MyWrk = DBEngine.CreateWorkspace("MyWrk", sUser, Psw)
        Else
            Set MyWrk = DBEngine.Workspaces(0)
        End If
        
        If IsMissing(SubValue) Then
            sqlSt = "SELECT TOP 1 " & WhatValue
        Else
            sqlSt = "SELECT TOP 1 " & WhatValue & "," & SubValue
        End If
        sqlSt = sqlSt & " FROM " & WhatTb
        If Not IsMissing(ExDb) Then sqlSt = sqlSt & " IN '" & ExDb & "'"
        sqlSt = sqlSt & " WHERE("
        sqlSt = sqlSt & sCri
        sqlSt = sqlSt & ")"
        
        If IsMissing(ExDb) Then
            Set MyDb = CurrentDb()
        Else
            Set MyDb = MyWrk.OpenDatabase(ExDb, , True)
        End If
        
        Set sqlRec = MyDb.OpenRecordset(sqlSt)
        
        If sqlRec.RecordCount > 0 Then
            fLookup = sqlRec(WhatValue)
            If Not IsMissing(SubValue) Then SubValueVar = sqlRec(SubValue)
        Else
            fLookup = Null
        End If
        
        Set sqlRec = Nothing
        Set MyDb = Nothing
        Set MyWrk = Nothing
        '
    End Function

    Thí dụ:
    1. Để tìm mã số khách hàng (mskh) xác định được ghi trong bảng đăng ký chứng từ (tblctunx) thỏa điều kiện "soctu = 'X12/0412'", đồng thời lấy luôn giá trị ngày (ngay) của chứng từ này gán cho biến NgayCtu, ta viết dòng lệnh như sau:
    Mã:
    flookup( "mskh", "tblctunx", "soctu = 'X12/0412'", "ngay", NgayCtu)

    2. Nếu bảng cần tìm nằm ở database khác được lưu tại: "D:\MYAPP\MYDATA.MDB"
    dòng lệnh sẽ như sau:
    Mã:
    flookup( "mskh", "tblctunx", "soctu = 'X12/0412'", "ngay", NgayCtu, "D:\MYAPP\MYDATA.MDB")

    3. Nếu database nêu trên đã được bảo mật theo cấp độ người sử dụng, ta phải khai báo 2 thông số sUser và Psw như sau: giả định User-Name là "lehongduc" và Password là "thuThuatAcc"
    Mã:
    flookup( "mskh", "tblctunx", "soctu = 'X12/0412'", "ngay", NgayCtu, "D:\MYAPP\MYDATA.MDB"), "lehongduc", "thuThuatAcc"
  • RE: Một hàm tự viết thay thế cho DLOOKUP của Access

    Noname > 20-07-12, 04:53 PM

    Rất hay, tùy vào nhu cầu của từng người, các bạn có thể ứng dụng, phát triển hàm này để dùng vào nhiều mục đích khác nhau.
    Ví dụ lưu tên đăng nhập/ mậtkhẩu ở một file database khác...
  • RE: Một hàm tự viết thay thế cho DLOOKUP của Access

    nguyenduykhanhpt > 12-08-12, 04:12 PM

    Các anh em giúp mình với!
    Mình muốn tạo bảng lương (RLuong), dữ liệu lấy từ bảng DSLUong(mns,cong,mucluong,...) và bảng DMPhucap(mns,pctn, pcvk..). Vấn đề ở đây là mình muốn lấy dữ liệu từ bảng phụ cấp đưa vào bảng lương (Rluong). Mỗi nhân viên khác nhau có mức phụ cấp tương ứng khác nhau.