找回密码
 加入
搜索
查看: 8338|回复: 25

[原创] 一个用来快速查找mdb数据库中数据的查询工具

 火.. [复制链接]
发表于 2015-11-3 16:52:01 | 显示全部楼层 |阅读模式
本帖最后由 tubaba 于 2018-3-9 15:53 编辑

源码已公布

一个用来快速查找mdb数据库中数据的查询工具.灵感来自于手机通讯录中利用汉字首拼快速定位联系人的原理.可以把它当作是电脑上的智能通讯录.
下面只是一个例子,因通讯录涉及隐私,因此就拿了另一个邮编数据库来举例,但是使用原理是一样的.
使用方法在程序中已有说明.上图,

举例,当输入ffkc或者峰峰矿区都可以快速定位到数据库这一条记录.如果是通讯录中的联系人,比如王二麻,可以直接输入wem或者王二,都可以定位

在参数设置中,需要利用汉字首拼查询功能的字段请在step4中勾选







本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×

评分

参与人数 1金钱 +30 收起 理由
cashiba + 30 赞一个!

查看全部评分

发表于 2015-11-4 07:13:13 | 显示全部楼层
本帖最后由 zhaoyun 于 2015-11-4 07:22 编辑

楼主发下源码学习下。。。。。。。。。。。。。。。。。。。。。
发表于 2015-11-4 10:19:21 | 显示全部楼层
谢谢,这个东西好。
发表于 2015-11-4 10:22:43 | 显示全部楼层
没有源代码  呜呜
发表于 2015-11-6 10:56:23 | 显示全部楼层
没有源代码,可惜了。
发表于 2015-11-6 19:40:26 | 显示全部楼层
謝謝樓主分享。
发表于 2015-11-6 20:56:59 | 显示全部楼层
发布这个,如果没有源码,就没有任何的意义。
这类的数据库开发,很多的语言都可以轻松的做到,在这些语言里都是小儿科的东西。
这到里就是希望学习AUTOIT源码的。
不给源码,楼主的这个东西没有任何价值。我至少可以用其他三种语言,10分钟内做出来的。
发表于 2015-11-8 20:47:26 | 显示全部楼层
我来给出部分吧,简拼搜索 核心代码
发表于 2015-11-8 20:57:47 | 显示全部楼层
建立简拼库函数


Func _PY($PY_IN = "")
        Dim $PY_OUT
        If $PY_IN = "" Then
                $PY_OUT = $PY_IN
        Else
                For $i = 1 To StringLen($PY_IN)
                        Switch Dec(StringTrimLeft(StringToBinary(StringMid($PY_IN, $i, 1)), 2))
                                Case 32 To 127
                                        $PY_OUT &= StringMid($PY_IN, $i, 1)
                                Case 33095 To 62289
                                        $PY_OUT &= Chr(97 + _PY_C(StringMid($PY_IN, $i, 1), 0, 26))
                        EndSwitch
                Next
        EndIf
        Return StringLower($PY_OUT)
EndFunc   ;==>_PY

Func _PY_C($PY_s, $PY_f, $PY_e) ;改进的中值法
        Local $PY_mid = Int(($PY_e - $PY_f) / 2) + $PY_f
        If $PY_mid = $PY_f Then Return $PY_f
        If StringCompare($PY_s, $PY_key[$PY_mid]) = 0 Then
                Return $PY_mid
        ElseIf StringCompare($PY_s, $PY_key[$PY_mid]) > 0 Then
                Return _PY_C($PY_s, $PY_mid, $PY_e)
        ElseIf StringCompare($PY_s, $PY_key[$PY_mid]) < 0 Then
                Return _PY_C($PY_s, $PY_f, $PY_mid)
        EndIf
EndFunc   ;==>_PY_C
发表于 2015-11-8 20:59:43 | 显示全部楼层
搜索部分:


Func _SOKEY()
        If $SOKEY < 1 Then
                AdlibUnRegister("_SOKEY")
                If StringLen($SoItemName) > 0 Then
                        If StringLen($SoItemName) > 0 Then
                                If Not $HGUI_QUICK_ListView_SO_OFF Then
                                        GUICtrlSetState($HGUI_QUICK_ListView_SO, $GUI_SHOW)
                                        GUICtrlSetState($HGUI_QUICK_ListView, $GUI_HIDE)
                                        $HGUI_QUICK_ListView_SO_OFF = True
                                EndIf
                                _SoItemName($SoItemName)
                        EndIf
                Else
                        If $HGUI_QUICK_ListView_SO_OFF Then
                                GUICtrlSetState($HGUI_QUICK_ListView, $GUI_SHOW)
                                GUICtrlSetState($HGUI_QUICK_ListView_SO, $GUI_HIDE)
                                $HGUI_QUICK_ListView_SO_OFF = False
                        EndIf
                EndIf
        EndIf
        $SOKEY -= 1
EndFunc   ;==>_SOKEY

Func _SoItemName($soname_str = "")
        If $soname_str <> "" Then
                $soname_str = StringLower($soname_str)
                Dim $soname_len = StringLen($soname_str)
                Dim $SO_ERROR = False
                Dim $soname_str_check = $soname_str
                Dim $IsDigit = False
                $soname_str_check = StringLower($soname_str_check)
                Dim $soname_str_type = _checkzw($soname_str_check)
                If $soname_str_type Then
                        If $soname_len > 0 Then $SO_ERROR = True
                Else
                        If $soname_len > 1 Then $SO_ERROR = True
                EndIf
                If $soname_len > 3 And StringIsDigit($soname_str) Then
                        $IsDigit = True
                        $SO_ERROR = True
                EndIf
                _GUICtrlListView_DeleteAllItems(GUICtrlGetHandle($HGUI_QUICK_ListView_SO))
                If $SO_ERROR Then
                        GUISetState(@SW_LOCK, $HGUI_QUICK)
                        ReDim $SO_QUICK_DB[1][6]
                        Dim $iUBound = 0
                        $SO_QUICK_DB[$iUBound][0] = ""
                        $SO_QUICK_DB[$iUBound][1] = ""
                        $SO_QUICK_DB[$iUBound][2] = ""
                        $SO_QUICK_DB[$iUBound][3] = ""
                        $SO_QUICK_DB[$iUBound][4] = ""
                        $SO_QUICK_DB[$iUBound][5] = ""
                        If IsArray($ITEM_DB) Then
                                If UBound($ITEM_DB) > 1 Then
                                        Dim $Q1 = -1, $Q2 = -1, $Q3 = -1, $Q4 = -1, $Q5 = 0
                                        For $i = 0 To UBound($ITEM_DB) - 1
                                                $Q1 = StringRegExp($ITEM_DB[$i][2], $soname_str)
                                                $Q2 = StringRegExp(StringLower($ITEM_DB[$i][8]), $soname_str)
                                                $Q3 = StringRegExp(StringLower($ITEM_DB[$i][0]), $soname_str)
                                                $Q4 = StringRegExp($ITEM_DB[$i][1], $soname_str)
                                                If $Q1 = 1 Or $Q2 = 1 Or $Q3 = 1 Or $Q4 = 1 Then
                                                        $Q5 += 1
                                                        If $Q4 > 29 Then ExitLoop
                                                        If $SO_QUICK_DB[0][0] = "" Then
                                                                Dim $iUBound = 0
                                                                ReDim $SO_QUICK_DB[$iUBound + 1][6]
                                                                $SO_QUICK_DB[$iUBound][0] = $ITEM_DB[$i][0]
                                                                $SO_QUICK_DB[$iUBound][1] = $ITEM_DB[$i][1]
                                                                $SO_QUICK_DB[$iUBound][2] = $ITEM_DB[$i][2]
                                                                $SO_QUICK_DB[$iUBound][3] = $ITEM_DB[$i][4]
                                                                $SO_QUICK_DB[$iUBound][4] = $ITEM_DB[$i][7]
                                                                $SO_QUICK_DB[$iUBound][5] = 0
                                                        Else
                                                                Dim $iUBound = UBound($SO_QUICK_DB)
                                                                ReDim $SO_QUICK_DB[$iUBound + 1][6]
                                                                $SO_QUICK_DB[$iUBound][0] = $ITEM_DB[$i][0]
                                                                $SO_QUICK_DB[$iUBound][1] = $ITEM_DB[$i][1]
                                                                $SO_QUICK_DB[$iUBound][2] = $ITEM_DB[$i][2]
                                                                $SO_QUICK_DB[$iUBound][3] = $ITEM_DB[$i][4]
                                                                $SO_QUICK_DB[$iUBound][4] = $ITEM_DB[$i][7]
                                                                $SO_QUICK_DB[$iUBound][5] = 0
                                                        EndIf
                                                EndIf
                                        Next
                                        If UBound($SO_QUICK_DB) = 1 And Not StringIsDigit($soname_str) Then
                                                _ADDGUI_POS($SO_QUICK_DB[0][0])
                                                Echo("查询条形码:" & $SO_QUICK_DB[0][0])
                                        EndIf
                                EndIf
                        EndIf
                        If IsArray($SO_QUICK_DB) Then
                                _ArraySort($SO_QUICK_DB, 1, 0, 0, 1)
                                _GUICtrlListView_AddArray($HGUI_QUICK_ListView_SO, $SO_QUICK_DB)
                        EndIf
                        GUISetState(@SW_UNLOCK, $HGUI_QUICK)
                EndIf
        EndIf
EndFunc   ;==>_SoItemName

Func _checkzw($str = "")
        If $str <> "" Then
                Dim $str1 = StringSplit($str, "")
                If IsArray($str1) Then
                        For $i = 1 To UBound($str1) - 1
                                If StringIsASCII($str1[$i]) = 0 Then
                                        Return True
                                EndIf
                        Next
                EndIf
        EndIf
        Return False
EndFunc   ;==>_checkzw

 楼主| 发表于 2015-11-16 10:35:48 | 显示全部楼层
回复 10# tvzml


    对,核心思想就是读取表结构,根据用户选择,建立一个复制的表,并插入新的首拼字段.使用sql查询语句得到结果,我不希望把源代码共享.因为这会让人养成不动脑子拿来就用的习惯.也不见得能让人提高多少的水平.如果有疑问,我可以解答,甚至可以给出部分实现功能的源码
发表于 2015-11-24 09:45:28 | 显示全部楼层
不开源,人家怎么学习!!!太自私了!!!
发表于 2016-12-12 15:47:28 | 显示全部楼层
來學習一下~!!
发表于 2016-12-12 23:05:15 | 显示全部楼层
回复 10# tvzml


    谢谢,这个东西好。
发表于 2016-12-13 10:10:58 | 显示全部楼层
回复 12# zzwwdd

忍不住 要 吐槽一下

誰規定  一定要開源給你學習的....

求學 應該要抱持感恩的心....願意開源的  我們感謝   

不願意開源的  一樣 我們學習觀念 邏輯  與 特點....

就是 你這樣的心態  難怪 樓主 不想開源....
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-4-27 05:53 , Processed in 0.089927 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表