Access911.net   |   a9BBS   |   OTaA System  
  搜索文章︰  
Access911歡迎您光臨  
   主頁      上傳      简体版       論壇     
設為首頁  |  加入收藏   
  
你現在的位置︰文章索引 -> 文章分類 -> 查詢  
 首頁|  近日更新|  下載  |  文章索引  |  搜索|  朮語|  承接工程|  
 
系統正在加載內容,請耐心等待...
 
 查詢
 窗体
 報表
 
 
 VBA
 函數
 ADO/DAO/ADO.NET
 API
 ADP
 安全
 發布
 OA
 ASP/ASP.NET
 其他語言
 控件
 DELPHI
 C#/.Net
 本站
 其他
 小例程
 常用軟件
 參考文檔
 業主作品
 网友大作
 
 
友情鏈接
 access911.net
 
訪問人次
 1701864
 
站長 E-Mail
 net911@sina.com
 access911@gmail.com
 
RSS 訂閱

顯示附加信息 >>>

如何實現單表按筆畫排序?如何實現某表中A字段按筆畫B字段按拼音排序?

作者︰cg1  摘自︰access911.net  ︰cg1  更新日期︰2010-9-1  瀏覽人次︰

 

問題︰

如何實現單表按筆畫排序?如何實現某表中A字段按筆畫B字段按拼音排序?
Access 2003 中用Order By 查詢排序時要么只能按拼音排序,要么只能按筆畫排序,如何實現同一個表中2個字段分別按筆畫和拼音排序?

 


回答︰


如果還不知道如何修改某個數據庫,使其按筆畫排序,請參考以下文章︰

    新手來看︰如何設定按筆畫排序?《其他》
    http://access911.net/index.asp?uec=bg&u1=a&u2=72FAB11E12DCE6F3

ACCESS 2003 的确默認只能用一种方法排序,如果要實現同時按兩种方法排序,只能自己撰寫函數生成排序序號。由于 0-9 A-Z 這几十個ANSI碼的排序方法在拼音和筆畫排序時都相同,所以可以用這几個字符組成排序序號實現同時按筆畫排序。

基本思路及步驟如下︰
1、生成一個包含全部 GB2312 編碼的漢字的字典表
2、按《新手來看︰如何設定按筆畫排序?》中的方法,更改當前數據庫的排序方法為按簡体中文筆畫排序。
3、在筆畫排序的情況下生成對應的數字排序編號,將數字排序編號存放在漢字字典表的一個新的字段中。那么以後即使 ACCESS 的設置為拼音排序,也能用 ORDER BY 數字排序號 的方法實現單個中文字按拼音排序。
4、為了解決多個中文字如何按筆畫排序,先要編寫一個函數,將多個中文字分解為單個中文字,然後查詢其排序編號,再將排序編號轉換為3位的36進制字符串。36進制字符串為0-9 A-Z的字符構成,所以不受當前ACCESS設定的影響。
5、按這個函數的返回值進行排序,就可以實現單表某字段按拼音某字段按筆畫排序。
6、但是用函數一次性生成1万條記錄的排序編號比較慢,因此建議在原始表中新增一個字段,專門用來存放排序編號,每添加一條記錄就生成一個排序編號,這樣速度較快。

示例數據庫下載︰
http://access911.net/down/eg/eg_SingleTableOrderByStroke.rar
(463KB)
包含測試速度的數據。請按 ALT+F11 打開 Visual Basic 編輯器界面,打開 modStroke 參考其中的3個函數。


全部代碼如下︰
Option Compare Database
'===========================================================
' 模塊名      ︰  modStroke
' 版本號      ︰  1.0
' 說明        ︰  本模塊用于演示如何用函數來實現單表按筆畫排
'                 序。默認情況下 ACCESS 2003 只能整個數據庫按
'                 指定的筆畫或者拼音排序,能某個表的某個字段
'                 按拼音排序,令一個字段按筆畫排序。
' 引用        ︰  Microsoft ActiveX Data Objects 2.8 Library
'                 Microsoft ADO Ext. 2.8 for DDL and Security
'                 Microsoft DAO 3.6 Object Library
'                 Microsoft Scripting Runtime
' 調用演示    ︰  直接將光標停留在TestDisplayGetStrokeFunction
'                 函數的標題部分,然後按 F5 鍵,可以在立即窗口
'                 看到排序編號生成的效果。也可以直接雙擊查詢
'                 《查詢_用函數列出筆畫排序》看到單表按筆畫排序
'                 的效果。
' 最後修改日期︰  2010-9-1 17:36:00
' 示例地址    ︰  http://access911.net/?kbid;72FABF1E17DCEEF3
' 作者        ︰  cg1
' 网站        ︰  http://access911.net
' 電子郵件    ︰  access911@gmail.com
' 版權        ︰  作者保留一切權力,
'                 請在公布本代碼時將本段說明一起公布,謝謝﹗
'===========================================================

Dim dicWords As New Dictionary
Function TestDisplayGetStrokeFunction()
    Debug.Print GetStroke("aa 中文數據")
End Function

'獲取某個字符串的筆畫排序碼,每個字符用4位16進制字符串表示。
Function GetStroke(ByVal s As String) As String
    If dicWords.Count = 0 Then
        AddWordsToMemory
    End If
    Dim strReturn As String
    Dim i As Long
    For i = 1 To Len(s)
        If dicWords.Exists("a" & Asc(Mid(s, i, 1))) = True Then
            strReturn = strReturn & dicWords.Item("a" & Asc(Mid(s, i, 1)))
        Else
            
        End If
    Next
    GetStroke = strReturn
End Function

'將筆畫數據字典讀入到內存中加快速度。
'請在 Visual Basic 編輯器界面 -> 菜單 -> 工具 -> 引用 -> 中引用以下几個類庫
'Microsoft Scripting Runtime
'Microsoft ActiveX Data Objects 2.8 Library
'Microsoft ADO Ext. 2.8 for DDL and Security
'Microsoft DAO 3.6 Object Library

Function AddWordsToMemory()
    If dicWords.Count <> 0 Then
        Set dicWords = New Dictionary
    End If
    
    Dim strSql As String
    Dim rs As New ADODB.Recordset
    rs.Open "select * from 表1", CurrentProject.Connection, 1, 1
    Do Until rs.EOF
        '每3位36進制字符串表示一個中文字的筆畫排序編號。這里采用的是簡体中文的筆畫順序。
        dicWords.Add "a" & rs("asccode"), Right("0000" & N10toC62(rs("orderstroke"), 36), 3)
        rs.MoveNext
    Loop
    rs.Close
End Function

'根據要求將數字轉換為指定進制的文字。比如10進制向16進制轉換。
'在本實例中該函數用于生成某個字符的筆畫排序編號。

Function N10toC62(ByVal b As Long, Optional ByVal bt As Byte) As String
'以下函數將10進制數值根據要求轉換為
'2 8 16 36 62 進制字符串
'請注意,本函數的輸出結果是區分大小寫的

    If bt < 2 Or bt > 62 Then
        bt = 16
        '默認為 16 進制
    End If
    '2進制 0-1
    '8進制 0-7          可以用 OCT 函數代替
    '16進制 0-9 A-F     可以用 HEX 函數代替
    '36進制 0-9 A-Z
    '62進制 0-9 A-Z a-z
    '都不對,就用16進制,如果輸入數據不符合要求,則出錯

    
    Dim a As Long
    Dim a1 As String
    Dim s As String
    Do
        a = b Mod bt
        Select Case a
        Case 0 To 9
            a1 = CStr(a)
        Case 10 To 35
            a1 = Chr(a + 55)
        Case 36 To 61
            a1 = Chr(a + 61)
        End Select
        s = a1 & s
        b = b \ bt
    Loop Until b = 0
    N10toC62 = s
End Function


'----------------------------------------------------------
'以下為輔助用函數,可不用在意。


'將制定文字寫入當前目錄的hz.txt文件中。
Function WriteFile(ByVal s As String)
    Const ForReading = 1, ForWriting = 2, ForAppending = 3
    Dim fs, f
    Set fs = CreateObject("Scripting.FileSystemObject")
    Set f = fs.OpenTextFile(CurrentProject.Path & "\hz.txt", 8, True)
    f.Writeline s
    f.Close
End Function


'有人說通過更改 ADODB.CONNECTION 對象的屬性Locale Identifier可以更改某個表的排序次序。
'實際測試後發現不行,因為不能更改已知的某個 MDB 的Locale Identifier。

Function ChangeLocalIdentifierError()
    Dim conn As New ADODB.Connection
    Dim strConn As String
    conn.Properties("Locale Identifier") = &H4 '默認中文拼音是 &H804,按簡体筆畫排序是 &H20804
    '沒有辦法通過直接給connection對象加Locale Identifier屬性來更改當前鏈接的排序方法
    '只能通過ACCESS選項來設置數據庫的排序屬性

    strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & CurrentProject.FullName & ";User Id=admin;Password=;"
    
    Debug.Print strConn
    
    conn.Open strConn
    '當定義 Locale Identifier屬性時提示錯誤︰給定的提供程序与已使用的不同。
    Debug.Print Hex(conn.Properties("Locale Identifier"))
    Dim rs As New ADODB.Recordset
    rs.Open "select * from 表1 order by chsword desc", conn, 1, 1
    Do Until rs.EOF
        Debug.Print rs("chsword")
    Loop
    rs.Close
    conn.Close
End Function

'測試StrComp函數的隱藏參數
Function TestStrCompHiddenFunction()
    Debug.Print StrComp("億", "東", &H804), StrComp("億", "東", &H20804) 'Chinese_PRC_Stroke_CI_AS
End Function


 


本站文章旨在為該問題提供解決思路及關鍵性代碼,并不能完成應該由网友自己完成的所有工作,請网友在仔細看文章并理解思路的基礎上舉一反三、靈活運用。

access911.net 原創文章,作者本人對文章保留一切權利。
如需轉載必須征得作者同意并注明本站鏈接

 

 
相關文章
     沒有手動相關文章
     新手來看︰如何設定按筆畫排序?
 
評論
     查看或發表更多的評論,請單擊這里。
 
 
 
 
 
   
  Access911.net   |   a9BBS   |   OTaA System   |
建站日期︰2000年4月2日  |  設計施工︰陳格 ( access911 & cg1 )
 Copyright © 2000 - 2003 COMET, 陳格 保留所有權利