环境:pb11.5+oracle11g
需求:如图

实例需求:
输入拼音字头或者汉字时,下拉列表展开,并显示模糊查询出来的数据,如下表记录,在下拉列表的编辑框输入W(无论大小写)或者‘王’,列表显示王五,王文龙,并且可以用键盘上、下方向键选择相应数据后回车执行selectionchanged事件
表 EMPLOEE 字段.E_NAME//姓名,
input_code//拼音字头输入码
记录如下:
王五 WW
王文龙 wWL
赵六 ZL
张三 zs
。。。
数据窗口d_name:
SELECT EMPLOEE.E_NAME
FROM EMPLOEE
WHERE EMPLOEE.input_code like UPPER(:inputcode)||'%'
or EMPLOEE.e_name like :ename||'%'
order by E_NAME
//我的方法,不知失败在哪里?
窗口:
声明shared变量:sele_modi,cx_mc
在所在窗口的Open事件中编写script为:
string inputcode
inputcode=''
datastore db1_ds
db1_ds=create datastore
db1_ds.dataobject='d_name'
db1_ds.settransobject( sqlca)
db1_ds.retrieve(UPPER(ddlb_1.text) )
long ll_row,ll_total
ll_total=db1_ds.rowcount()
if ll_total<=0 then
destroy(db1_ds)
return
end if
for ll_row=1 to ll_total
ddlb_1.additem(db1_ds.getitemstring(ll_row,1))
end for
destroy(db1_ds)
在下拉列表控件ddlb_1的selectonchenge事件中编写script为 :
sele_modi=true
在下拉列表控件ddlb_1的Modified事件中编写script为 :
cx_mc=ddlb_1.text
long in_pos
boolean empty_ddlb=false
if not (sele_modi ) then
string select_str,inputcode
long ad_count
ad_count=totalitems(ddlb_1)
inputcode=trim(ddlb_1.text)
do while ad_count>=0
ddlb_1.selectitem(ad_count)
select_str=ddlb_1.text
in_pos=pos(select_str,inputcode)
if in_pos<>0 then
empty_ddlb=true
else
deleteitem(ddlb_1,ad_count)
end if
//
ad_count=totalitems(ddlb_1)
inputcode=trim(ddlb_1.text)
//
loop
if empty_ddlb=false then
messagebox('提示信息','没有满足条件的数据,请重新输入')
string cx_inputcode,ename
inputcode=UPPER(this.text)
datastore db1_ds
db1_ds=create datastore
db1_ds.dataobject='d_name'
db1_ds.settransobject( sqlca)
db1_ds.retrieve(cx_inputcode,ename)
long ll_row,ll_total
ll_total=db1_ds.rowcount()
if ll_total<=0 then
destroy(db1_ds)
return
end if
for ll_row=1 to ll_total
this.additem(db1_ds.getitemstring(ll_row,1))
end for
destroy(db1_ds)
ddlb_1.text=""
setfocus(ddlb_1)
else
ddlb_1.showlist=true
ddlb_1.text=""
setfocus(ddlb_1)
end if
end if
sele_modi=false
//下拉列表可以显示所有记录,编辑框输入字符脱离焦点就死循环了。
------解决方案--------------------
可以考虑用DDDW+setfilter去实现,这样循环插值删值效率感觉很低啊,呵呵
------解决方案--------------------
如果数据量不太大的话,建议你用setfilter来实现,效果比较好,如果数据量超过10万,建议你用检索来实现