amxi 发表于 2011-11-20 09:41:22

mdb数据库 查询关联问题 [已解决]

本帖最后由 amxi 于 2011-11-21 20:00 编辑


上图为数据库表.

我想实现的是在combo中选择CPU型号,然后edit控件自动显示对应的价格,这个谁指点一下,我卡住了..谢谢

#cs ----------------------------------------------------------------------------

AutoIt Version: 3.3.6.1
Author:         myName

Script Function:
        Template AutoIt script.

#ce ----------------------------------------------------------------------------

; Script Start - Add your code below here
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <ListViewConstants.au3>
#include <windowsconstants.au3>
#include <comboconstants.au3>

$mdb_path=""
$mdb_name="da.mdb"
$mdb_pwd=""
;$mdb_table_name="MyPC"
$mdb_cpu_table="CPU"
$mdb_hdd_table="硬盘"
$mdb_mb_table="主板"
$mdb_nc_table="内存"


$star="*"

$nform=guicreate("price list of inner market",500,500)
$ListView1 = GUICtrlCreateListView(" 品名 | 价格 | 日期 ", 288, 24, 200, 161)

$nCPU=GUICtrlCreateLabel(" CPU",6,150,50,20)
$CPU_comb=GUICtrlCreateCombo("   CPU",60,150,120,20)
$cpu_price=GUICtrlCreateEdit(" ",190,150,80,20)

$nCPU=GUICtrlCreateLabel(" 主板 ",6,180,50,20)
$MB_comb=GUICtrlCreateCombo("   主板 ",60,180,120,20)

$nCPU=GUICtrlCreateLabel("内存 ",6,210,50,20)
$NC_comb=GUICtrlCreateCombo("   内存",60,210,120,20)

$nCPU=GUICtrlCreateLabel(" 硬盘 ",6,240,50,20)
$HDD_comb=GUICtrlCreateCombo("   ",60,240,120,20)

_getcpu()
_getmb()
_gethdd()

GUISetState(@sw_show)

while 1
        $msg=GUIGetMsg()
        Switch $msg
        case $gui_event_close
                Exit
        case $button1
                _getcpu()
        case $button2
                _read()
        case $cpu_comb
                        $conn=objcreate("ADODB.Connection")
                $rs=ObjCreate("ADODB.Recordset")
                $conn.open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & $mdb_name & ";Jet Oledb:Database Password=" & $mdb_pwd)
                $rs.Activeconnection=$conn
                $rs.Open ("Select "&$star & " From " &$mdb_cpu_table )
               
                while not $rs.eof and not $rs.bof
                        if @error then ExitLoop
                        GUICtrlSetData($cpu_price,$rs.fields(2).value)
                        $rs.movenext
                WEnd
                $rs.close
                $conn.close
                ;MsgBox("",$rs.fields(2).value,$guictrlread($cpu_combo))
        EndSwitch
WEnd

func _read()
        GUICtrlSendMsg($ListView1, $LVM_DELETEALLITEMS, 0, 0)
                $obj=ObjCreate("ADODB.Connection")
          ;连接数据库
      $obj.open("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" &$mdb_name)
                  ;打开数据库
                $rs=ObjCreate("ADODB.Recordset")
                  ; 建立记录
                $rs.ActiveConnection =$obj
         
                $rs.Open ("Select "&$star & " From " &$mdb_cpu_table)

      while Not $RS.eof And Not $RS.bof
            if @error then ExitLoop
                                        ;
                                        GUICtrlCreateListViewItem( $rs.fields(1).value&"|"& $rs.fields(2).value ,$listview1)
                                        $rs.movenext
                                WEnd
                                $rs.close
                                $obj.close
                        EndFunc
                       
       


    Func _GetCPU()
                $conn=objcreate("ADODB.Connection")
                $rs=ObjCreate("ADODB.Recordset")
                $conn.open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & $mdb_name & ";Jet Oledb:Database Password=" & $mdb_pwd)
                $rs.Activeconnection=$conn
                $rs.Open ("Select "&$star & " From " &$mdb_cpu_table )
               
                while not $rs.eof and not $rs.bof
                        if @error then ExitLoop
                        GUICtrlSetData($cpu_comb,$rs.fields(1).value)
                        $rs.movenext
                WEnd
                $rs.close
                $conn.close
        EndFunc

;func _getmb()
;endFunc
       
               

amxi 发表于 2011-11-20 11:02:36

一直坐等.....

yeqing880 发表于 2011-11-20 11:28:28

把mdb文件发下。。

lpxx 发表于 2011-11-20 21:11:04

看看帮助里的_GUICtrlListView_AddArray

lpxx 发表于 2011-11-20 21:14:50

Edit取值可以用GUICtrlSetData($Edit, $youvalue)

amxi 发表于 2011-11-21 09:24:24

回复 4# lpxx


    我那个不是listview啊..
是mdb

amxi 发表于 2011-11-21 09:26:43

回复 3# yeqing880


    mdb就是图片上的那几行. cpu名称,对应的价格.就两样.

amxi 发表于 2011-11-21 09:32:15

回复 5# lpxx


    我知道guictrlsetdata可以赋值 , ,我不会的的是如何在mdb中取出与CPU型号对应的价格

kk_lee69 发表于 2011-11-21 10:03:19

本帖最后由 kk_lee69 于 2011-11-21 10:14 编辑

回复 8# amxi


   老大 你的語法有錯誤吧你的61行 到74行 意義是指當你 選擇了 其中的一種CPU就要秀出 它的價格對吧....
       case $cpu_comb
                        $conn=objcreate("ADODB.Connection")
                $rs=ObjCreate("ADODB.Recordset")
                $conn.open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & $mdb_name & ";Jet Oledb:Database Password=" & $mdb_pwd)
                $rs.Activeconnection=$conn
                $rs.Open ("Select "&$star & " From " &$mdb_cpu_table )
               
                while not $rs.eof and not $rs.bof
                        if @error then ExitLoop
                        GUICtrlSetData($cpu_price,$rs.fields(2).value)
                        $rs.movenext
                WEnd
                $rs.close
                $conn.close
可是 這行的意思是列出 所有 CUP 資料表裡面的 每個CPU 的價格 也就是說 有一百種CUP 跟 一百種價格 他全部會列出來
$rs.Open ("Select "&$star & " From " &$mdb_cpu_table )
然後你又加上了   GUICtrlSetData($cpu_price,$rs.fields(2).value)這個放在迴圈中.......所以你得到的價格永遠是迴圈的最後一個價格

你的語法應該有點問題的.........你應該是 先取得你 所選的值......先讀取 COMBO 的值 然後
$rs.Open ("Select "&$star & " From " &$mdb_cpu_table&"WHERE CPU='"&$COMBO取回的值&"'" )   
這樣就只會有一個值出現所以 下面    while.....Wend這回圈也不用了
值些 用這行 就可以了
GUICtrlSetData($cpu_price,$rs.fields(2).value)...............
$rs.close

這樣說不知道是否了解

amxi 发表于 2011-11-21 11:47:54

回复 9# kk_lee69

谢谢,大概的理解了您说的意思,
case $cpu_comb
                        $conn=objcreate("ADODB.Connection")
                $rs=ObjCreate("ADODB.Recordset")
                $conn.open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & $mdb_name & ";Jet Oledb:Database Password=" & $mdb_pwd)
                $rs.Activeconnection=$conn
                $type=GUICtrlRead($cpu_comb)
                ;MsgBox('','',$type)
                $rs.Open ("Select"&$star &" From " & $mdb_cpu_table & "where 'cpu'="&$type)
               
                               
                        GUICtrlSetData($cpu_price,$rs.fields(2).value)
               
               
                $rs.close
                $conn.close

但在处理语句时出现错误.这个数据库东西我算是第一次搞,SQL还不太懂.不知道是啥意思.

    D:\Program Files\AutoIt3\work\?????.au3 (116) : ==> The requested action with this object has failed.:
$rs.Open ("Select"&$star &" From " & $mdb_cpu_table & "where '品名'="&$type)
$rs.Open ("Select"&$star &" From " & $mdb_cpu_table & "where '品名'="&$type)^ ERROR

把数据库中的品名改成字母也一样..

kk_lee69 发表于 2011-11-21 13:09:44

你打錯了品名那個位置是不可以加上' 者個符號的
而且品名 必須要是你的CPU表裡面的 代表CPU 的那個欄位名稱

我們先來定義一下你的結構你打開 ACCESS 後如果照你上面的寫法你應該看到的是
CPU
硬盘
主板
内存

然後進入 CPU 這個資料裡面會看到 編號 品名 價格 對吧
所以..... SQL 語法應該是Select價格 FROM CPU WHERE品名='INTEL3.5G'
這樣就 可以抓取到 品名為 INTEL3.5G 的價格

請注意 我上面的語法才是正確的喔其他你多加引號 會有問題的

轉換成 AU3語法
$rs.Open ("Select"&$star &" From " & $mdb_cpu_table & "where 品名='"&$type&"'")
這樣的語法才是對的喔

kk_lee69 发表于 2011-11-21 13:13:34

回复 10# amxi


    你原本的
$rs.Open ("Select"&$star &" From " & $mdb_cpu_table & "where '品名'="&$type)
要改成
$rs.Open ("Select"&$star &" From " & $mdb_cpu_table & "where 品名='"&$type&"'")

這樣才對

而且你上面的語法 也有另外一個錯誤..
                     $conn=objcreate("ADODB.Connection")
                $rs=ObjCreate("ADODB.Recordset")
                $conn.open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & $mdb_name & ";Jet Oledb:Database Password=" & $mdb_pwd)
                $rs.Activeconnection=$conn
這幾行語法放到最前面就可以了只要 不要下$conn.close
其他地方就不用重複下了

amxi 发表于 2011-11-21 13:59:35

回复 12# kk_lee69

按照你的语句改了还是不行,我上传脚本与mdb,麻烦请再帮我看看.

kk_lee69 发表于 2011-11-21 14:12:19

老大你的CPU 表裡面的欄位根本沒有品名

是 NAME 跟 PRICE    所以語法當然會有問題呀

晚上在幫你改吧現在上班 不方便

amxi 发表于 2011-11-21 14:32:19

回复 14# kk_lee69


    谢了老兄.

我是怕不支持汉字所以才又改成了name /price,结果也一样不行.

你先忙吧,我再找找资料看.
页: [1] 2
查看完整版本: mdb数据库 查询关联问题 [已解决]