-
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(1, CauMoi, Space(2))
Do While ViTri > 0
CauMoi = Left(CauMoi, ViTri) & Trim(Mid(CauMoi, ViTri))
ViTri = InStr(1, CauMoi, Space(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(1, Ten, Space(1))
Do While ViTri > 0
TenMoi = Left(Ten, ViTri) & TenMoi
Ten = Mid(Ten, ViTri + 1)
ViTri = InStr(1, Ten, Space(1))
Loop
OldS = Trim(Ten & Space(1) & TenMoi)
NewS = Space(0): LenOf = Len(OldS): ViTri = 1
Do While ViTri <= LenOf
KyTu = Mid(OldS, ViTri, 1)
If KyTu = Space(1) Then
NewS = NewS & KyTu: ViTri = ViTri + 1
Else
LowK = LCase(KyTu): OldP = InStr(1, One, LowK)
If OldP = 0 Then
NewS = NewS & KyTu: ViTri = ViTri + 1
Else
KeTiep = LCase(Mid(OldS, ViTri, 2))
NewP = InStr(1, One, KeTiep)
If NewP = 0 Then
NewS = NewS & Trim(IIf(Asc(KyTu) = Asc(LCase(KyTu)), Mid(Two, OldP, 2), UCase(Mid(Two, OldP, 2))))
ViTri = ViTri + 1
Else
NewS = NewS & Trim(IIf(Asc(KyTu) = Asc(LCase(KyTu)), Mid(Two, NewP, 2), UCase(Mid(Two, NewP, 2))))
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(1, Ten, Space(1))
Do While ViTri > 0
TenMoi = Left(Ten, ViTri) & TenMoi
Ten = Mid(Ten, ViTri + 1)
ViTri = InStr(1, Ten, Space(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, ktdoi, chuv, chkq, kti As String
Dim i, vt, nn3
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 i = 1 To nn3
kti = Mid(HoTen, i, 1)
vt = InStr(chuv, kti)
If vt <> 0 Then
ktdoi = Mid(chmh, 2 * vt - 1, 2)
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 ạ!