Đánh giá chủ đề:
  • 0 Votes - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
[Hướng dẫn] Sắp xếp tiếng Việt trong Access
#1
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


File đính kèm
.zip   SapXepTiengVietFontVNI.zip (Kích cỡ: 11.76 KB / Tải về: 50)
Chữ ký của Xuân Thanh Trăm năm trước thì ta chưa gặp
Trăm năm sau biết gặp được không?
Cuộc đời sắc sắc không không
Thì thôi ta cứ hết lòng vì nhau
ღღღღღTài sản của Xuân Thanh (View All Items) ღღღღღ
Reply
Những người đã cảm ơn Noname , nhunguyet0103 , Nguyendinhthanh
#2
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!!!
Reply
Những người đã cảm ơn
#3
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 đó
Chữ ký của Xuân Thanh Trăm năm trước thì ta chưa gặp
Trăm năm sau biết gặp được không?
Cuộc đời sắc sắc không không
Thì thôi ta cứ hết lòng vì nhau
ღღღღღTài sản của Xuân Thanh (View All Items) ღღღღღ
Reply
Những người đã cảm ơn Noname
#4
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


File đính kèm
.zip   SapXepTiengVietFontUNI.zip (Kích cỡ: 14.37 KB / Tải về: 81)
Chữ ký của Xuân Thanh Trăm năm trước thì ta chưa gặp
Trăm năm sau biết gặp được không?
Cuộc đời sắc sắc không không
Thì thôi ta cứ hết lòng vì nhau
ღღღღღTài sản của Xuân Thanh (View All Items) ღღღღღ
Reply
Những người đã cảm ơn Noname , nhunguyet0103 , Nguyendinhthanh , bvchauthanh
#5
Cảm ơn anh nhé! Em đã làm được rồi ạ!
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_Chọn ngày tháng bằng nút (No Calender Tiếng việt) maidinhdan 7 1,400 25-06-16, 12:44 AM
Bài mới nhất: zinzin8x
  Lấy về số seri CPU, ổ cứng MainBoard trong Access Noname 33 12,295 08-06-16, 11:23 PM
Bài mới nhất: maidinhdan
  [Thủ Thuật] Ẩn record trong table theo ngày tháng tvn_hut 6 489 24-04-16, 01:00 AM
Bài mới nhất: tvn_hut
  Thuộc tính Startup MS Access toàn tập với VBA Noname 2 2,736 18-04-16, 04:50 PM
Bài mới nhất: ongke0711
  Hàm đọc số dùng mã Unicode trong Access Noname 28 11,701 23-03-16, 11:45 PM
Bài mới nhất: thiennamlong

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ơ