• Sắp xếp tiếng Việt trong Access
  • Sắp xếp tiếng Việt trong Access

    Xuân Thanh > 04-08-12, 12:51 PM

    Có nhiếu bạn hỏi về cách sắp xếp tiếng Việt trong Access. Hôm nay tôi xin chia sẻ với các bạn một số thủ thuật này. Trước hết xin lỗi những ai là thầy cô giáo vì cách sắp xếp tiếng Việt được hiểu theo nhiều cách khác nhau. Ở đây tôi xin sắp xếp theo thứ tự sau
    1/ Xếp từ phải sang
    2/ Xếp theo thứ tự của bảng chữ cái tiếng Việt
    3/ Về dấu, thứ tự ưu tiên sẽ là không dấu, huyền, sắc, hỏi, ngã, nặng
    Thủ thuật ở đây là dùng chuỗi mã hóa đễ chuyển về thứ tự như đã nói ở trên
    Chúng ta cùng nghiên cứu nhé

    Bài 1 : Sắp xếp tiếng Việt theo font chử VNIWindows (VNI)
    Các bạn chép hàm sau vào một modul của Access
    Mã PHP:
    Public Function SuaCau(CauVan)
        
    CauMoi Trim(CauVan)
        
    ViTri InStr(1CauMoiSpace(2))
        Do While 
    ViTri 0
            CauMoi 
    Left(CauMoiViTri) & Trim(Mid(CauMoiViTri))
            
    ViTri InStr(1CauMoiSpace(2))
        
    Loop
        SuaCau 
    CauMoi
    End 
    Function 

    Mã PHP:
    Public Function XepABC(HoTen)
        
    Ten SuaCau(Trim(HoTen))
        
    TenMoi Space(0): One Space(0): Two Space(0)
        
    One One "a aùaøaûaõaïaêaéaèaúaüaëaâaáaàaåaãaä"
        
    One One "o oùoøoûoõoïoâoáoàoåoãoäô ôùôøôûôõôï"
        
    One One "e eùeøeûeõeïeâeáeàeåeãeäi í ì æ ó ò "
        
    One One "y yùyøyûyõî u uùuøuûuõuïö öùöøöûöõöïd ñ"
        
    Two Two "aaabacadaeafagahaiajakalamanaoapaqar"
        
    Two Two "oaobocodoeofogohoiojokolomonooopoqor"
        
    Two Two "eaebecedeeefegeheiejekeliaibicidieifyaybycydyeyf"
        
    Two Two "uaubucudueufuguhuiujukuldadb"
        
    ViTri InStr(1TenSpace(1))
        Do While 
    ViTri 0
            TenMoi 
    Left(TenViTri) & TenMoi
            Ten 
    Mid(TenViTri 1)
            
    ViTri InStr(1TenSpace(1))
        
    Loop
        OldS 
    Trim(Ten Space(1) & TenMoi)
        
    NewS Space(0): LenOf Len(OldS): ViTri 1
        
    Do While ViTri <= LenOf
            KyTu 
    Mid(OldSViTri1)
            If 
    KyTu Space(1Then
                NewS 
    NewS KyTuViTri ViTri 1
            
    Else
                
    LowK LCase(KyTu): OldP InStr(1OneLowK)
                If 
    OldP 0 Then
                    NewS 
    NewS KyTuViTri ViTri 1
                
    Else
                    
    KeTiep LCase(Mid(OldSViTri2))
                    
    NewP InStr(1OneKeTiep)
                    If 
    NewP 0 Then
                        NewS 
    NewS Trim(IIf(Asc(KyTu) = Asc(LCase(KyTu)), Mid(TwoOldP2), UCase(Mid(TwoOldP2))))
                        
    ViTri ViTri 1
                    
    Else
                        
    NewS NewS Trim(IIf(Asc(KyTu) = Asc(LCase(KyTu)), Mid(TwoNewP2), UCase(Mid(TwoNewP2))))
                        
    ViTri ViTri Len(Trim(KeTiep))
                    
    End If
                
    End If
            
    End If
        
    Loop
        XepABC 
    Trim(NewS)
    End Function 

    1/ Hàm SuaCau để chuyển câu chữ về đúng cách viết tiếng Việt(giữa hai từ chỉ có 1 khoảng trắng mà thôi)
    2/ Hàm XepABC để sắp xếp theo cách đã trình bày ở trên
    Lưu ý : Khi chép vào modul, các bạn bỏ dòng lệnh Option Explicit ở đầu modul nhé

    Để sử dụng, các bạn đưa vào query. Giả sử ta muốn sắp xếp dữ liệu HotenHs trong table Hocsinh. Trong cửa sổ Queries ta thiết kế một Query và chèn một field với dữ liệu là chuỗi ký tự được mã hoá từ hàm XepABC([Hocsinh]![HotenHs]). Field được chèn chọn Sort là Ascending (Nếu sắp theo chiều giảm chọn Descending), không hiển thị field này nên bỏ chọn CheckBox thuộc tính Show. Khi mở Query này, ta có dữ liệu được sắp xếp theo thứ tự chuẩn tiếng Việt

    Chúc các bạn vui với thủ thuật này

    Tải file Demo kèm theo để tham khảo
  • RE: Sắp xếp tiếng Việt trong Access

    nhunguyet0103 > 04-08-12, 09:46 PM

    Cảm ơn anh đã chia sẻ! và hy vọng Bài 2 sẽ là : Sắp xếp tiếng Việt theo font chữ unicode. Thanks!!!
  • RE: Sắp xếp tiếng Việt trong Access

    Xuân Thanh > 08-08-12, 11:34 AM

    Bài 2 : Sắp xếp tiếng Việt theo font Unicode

    Trong bài viết trên, nếu để ý và tìm hiểu kỹ, các bạn sẽ thấy một số thủ thuật sau
    1/ Đảo ngược tên, ví dụ Nguyễn Văn Hùng thành Hùng Văn Nguyễn. Mục đích là để sắp xếp từ phải qua
    2/ Mã hóa font chữ VNI từ One sang Two, ví dụ a thành aa, à thành ab, á thành ac...Mục đích là để sắp xếp theo thứ tự chữ cái và dấu. Các bạn thấy One chính là font VNI viết trong VBA

    Hôm nay ta cũng dùng thủ thuật này để sắp xếp cho font Uni. Nhưng ngặt một nỗi trong VBA, viết font Uni là điều không thể. Vậy làm sao đây? Có cách nào để thể hiện font gốc là font Uni không? Thủ thuật sau đây sẽ giúp các bạn làm điều đó
  • RE: Sắp xếp tiếng Việt trong Access

    Xuân Thanh > 08-08-12, 11:45 AM

    Các bạn đều biết rằng từ AccessXp trở về sau, việc hỗ trợ font Unicode trong table, form, report là rất tốt. Vì vậy ta sẽ lợi dụng điều này để chứa font gốc Uni làm cơ sở để mã hóa nó
    Các bạn tạo một table có tên là tblChuaMa để chứa font Uni gốc. Table này chỉ có một trường duy nhất là Ma, type là text, length = 255. Sau đó nhập đoạn chứa font Uni sau vào table(lưu ý là nhập bằng font Uni nhé, có thể copy đoạn này dán vào table của bạn)

    AaÀàÁáẢảÃãẠạĂăẰằẮắẲẳẴẵẶặÂâẦầẤấẨẩẪẫẬậBbCcDdĐđEeÈèÉéẺẻẼẽẸẹÊêỀềẾếỂểỄễỆệFfGgHhIiÌìÍíỈỉĨĩỊịJjKkLlMmNnOoÒòÓóỎỏÕõỌọÔôỒồỐốỔổỖỗỘộƠơỜờỚớỞởỠỡỢợPpQqRrSsTtUuÙùÚúỦủŨũỤụƯưỪừỨứỬửỮữỰựVvWwXxYyỲỳÝýỶỷỸỹỴỵZz

    Sau đó ta viết hàm để thực hiện việc sắp xếp. Để tiện cho các bạn theo dõi và vận dụng khi cần thiết, tôi sẽ tách hàm DaoTen thành một hàm riêng biệt và khi cần thì gọi nó phục vụ cho công việc của minh

    1/ Hàm đảo tên

    Mã PHP:
    Public Function DaoTen(Ten As String) As String
        Dim ViTri
    TenMoi As String
        ViTri 
    InStr(1TenSpace(1))
        Do While 
    ViTri 0
            TenMoi 
    Left(TenViTri) & TenMoi
            Ten 
    Mid(TenViTri 1)
            
    ViTri InStr(1TenSpace(1))
        
    Loop
        DaoTen 
    Trim(Ten Space(1) & TenMoi)
    End Function 

    2/ Hàm sắp xếp

    Mã PHP:
    Public Function XepABC(HoTen As String) As String
        Dim chmh
    ktdoichuvchkqkti As String
        Dim i
    vtnn3
        chmh 
    Space(0)
        
    chmh chmh "aaabacadaeafagahaiajakalamanaoapaqarasatauavawaxaybabcbbbdbebfbgb"
        
    chmh chmh "hbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzcacbcccdcecfcgchcicjckclcmcncocpcqcr"
        
    chmh chmh "csctcucvcwcxcyczdadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzeaeb"
        
    chmh chmh "ecedeeefegeheiejekelemeneoepeqereseteuevewexeyezfafbfcfdfefffgfhfifjfkflfmfnfofpfqf"
        
    chmh chmh "rfsftfufvfwfxfyfzgagbgcgdgegfggghgigjgkglgmgngogpgqgrgsgtgugvgwgxgygzhahbhchd"
        
    Dim rs As Recordset
        Set rs 
    CurrentDb.OpenRecordset("tblChuaMa"dbOpenDynaset)
        
    chuv rs!Ma
        HoTen 
    DaoTen(HoTen)
        
    nn3 Len(HoTen)
        
    chkq ""
        
    For 1 To nn3
            kti 
    Mid(HoTeni1)
            
    vt InStr(chuvkti)
            If 
    vt <> 0 Then
                ktdoi 
    Mid(chmhvt 12)
                
    chkq chkq ktdoi
            
    Else
                
    chkq chkq kti
            End 
    If
        
    Next i
        XepABC 
    chkq
    End 
    Function 

    3/ Cách dùng : giống như bài 1

    Chúc các bạn vui
    Thân mến

    File Demo
  • RE: Sắp xếp tiếng Việt trong Access

    nhunguyet0103 > 26-08-12, 11:14 PM

    Cảm ơn anh nhé! Em đã làm được rồi ạ!