tubaba 发表于 2015-11-3 16:52:01

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

本帖最后由 tubaba 于 2018-3-9 15:53 编辑

源码已公布

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

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

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







zhaoyun 发表于 2015-11-4 07:13:13

本帖最后由 zhaoyun 于 2015-11-4 07:22 编辑

楼主发下源码学习下。。。。。。。。。。。。。。。。。。。。。

cfanpc 发表于 2015-11-4 10:19:21

谢谢,这个东西好。

cfanpc 发表于 2015-11-4 10:22:43

没有源代码呜呜

80107671 发表于 2015-11-6 10:56:23

没有源代码,可惜了。

zhongzijie 发表于 2015-11-6 19:40:26

謝謝樓主分享。

xia_xia 发表于 2015-11-6 20:56:59

发布这个,如果没有源码,就没有任何的意义。
这类的数据库开发,很多的语言都可以轻松的做到,在这些语言里都是小儿科的东西。
这到里就是希望学习AUTOIT源码的。
不给源码,楼主的这个东西没有任何价值。我至少可以用其他三种语言,10分钟内做出来的。

tvzml 发表于 2015-11-8 20:47:26

我来给出部分吧,简拼搜索 核心代码

tvzml 发表于 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

tvzml 发表于 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
                        Dim $iUBound = 0
                        $SO_QUICK_DB[$iUBound] = ""
                        $SO_QUICK_DB[$iUBound] = ""
                        $SO_QUICK_DB[$iUBound] = ""
                        $SO_QUICK_DB[$iUBound] = ""
                        $SO_QUICK_DB[$iUBound] = ""
                        $SO_QUICK_DB[$iUBound] = ""
                        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], $soname_str)
                                                $Q2 = StringRegExp(StringLower($ITEM_DB[$i]), $soname_str)
                                                $Q3 = StringRegExp(StringLower($ITEM_DB[$i]), $soname_str)
                                                $Q4 = StringRegExp($ITEM_DB[$i], $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 = "" Then
                                                                Dim $iUBound = 0
                                                                ReDim $SO_QUICK_DB[$iUBound + 1]
                                                                $SO_QUICK_DB[$iUBound] = $ITEM_DB[$i]
                                                                $SO_QUICK_DB[$iUBound] = $ITEM_DB[$i]
                                                                $SO_QUICK_DB[$iUBound] = $ITEM_DB[$i]
                                                                $SO_QUICK_DB[$iUBound] = $ITEM_DB[$i]
                                                                $SO_QUICK_DB[$iUBound] = $ITEM_DB[$i]
                                                                $SO_QUICK_DB[$iUBound] = 0
                                                        Else
                                                                Dim $iUBound = UBound($SO_QUICK_DB)
                                                                ReDim $SO_QUICK_DB[$iUBound + 1]
                                                                $SO_QUICK_DB[$iUBound] = $ITEM_DB[$i]
                                                                $SO_QUICK_DB[$iUBound] = $ITEM_DB[$i]
                                                                $SO_QUICK_DB[$iUBound] = $ITEM_DB[$i]
                                                                $SO_QUICK_DB[$iUBound] = $ITEM_DB[$i]
                                                                $SO_QUICK_DB[$iUBound] = $ITEM_DB[$i]
                                                                $SO_QUICK_DB[$iUBound] = 0
                                                        EndIf
                                                EndIf
                                        Next
                                        If UBound($SO_QUICK_DB) = 1 And Not StringIsDigit($soname_str) Then
                                                _ADDGUI_POS($SO_QUICK_DB)
                                                Echo("查询条形码:" & $SO_QUICK_DB)
                                        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

tubaba 发表于 2015-11-16 10:35:48

回复 10# tvzml


    对,核心思想就是读取表结构,根据用户选择,建立一个复制的表,并插入新的首拼字段.使用sql查询语句得到结果,我不希望把源代码共享.因为这会让人养成不动脑子拿来就用的习惯.也不见得能让人提高多少的水平.如果有疑问,我可以解答,甚至可以给出部分实现功能的源码

zzwwdd 发表于 2015-11-24 09:45:28

不开源,人家怎么学习!!!太自私了!!!

w60711 发表于 2016-12-12 15:47:28

來學習一下~!!

ddrs 发表于 2016-12-12 23:05:15

回复 10# tvzml


    谢谢,这个东西好。

kk_lee69 发表于 2016-12-13 10:10:58

回复 12# zzwwdd

忍不住 要 吐槽一下

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

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

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

就是 你這樣的心態難怪 樓主 不想開源....
页: [1] 2
查看完整版本: 一个用来快速查找mdb数据库中数据的查询工具