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?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, 陈格 保留所有权利