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
一直坐等..... 把mdb文件发下。。 看看帮助里的_GUICtrlListView_AddArray Edit取值可以用GUICtrlSetData($Edit, $youvalue) 回复 4# lpxx
我那个不是listview啊..
是mdb 回复 3# yeqing880
mdb就是图片上的那几行. cpu名称,对应的价格.就两样. 回复 5# lpxx
我知道guictrlsetdata可以赋值 , ,我不会的的是如何在mdb中取出与CPU型号对应的价格 本帖最后由 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
這樣說不知道是否了解 回复 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
把数据库中的品名改成字母也一样.. 你打錯了品名那個位置是不可以加上' 者個符號的
而且品名 必須要是你的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&"'")
這樣的語法才是對的喔 回复 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
其他地方就不用重複下了 回复 12# kk_lee69
按照你的语句改了还是不行,我上传脚本与mdb,麻烦请再帮我看看. 老大你的CPU 表裡面的欄位根本沒有品名
是 NAME 跟 PRICE 所以語法當然會有問題呀
晚上在幫你改吧現在上班 不方便 回复 14# kk_lee69
谢了老兄.
我是怕不支持汉字所以才又改成了name /price,结果也一样不行.
你先忙吧,我再找找资料看.
页:
[1]
2