当前位置: 代码迷 >> PB >> 想在一个ddlb中下拉某几项,用cursor时,如用xxx in ('1''2')这类回到不了结果
  详细解决方案

想在一个ddlb中下拉某几项,用cursor时,如用xxx in ('1''2')这类回到不了结果

热度:320   发布时间:2016-04-29 05:12:44.0
想在一个ddlb中下拉某几项,用cursor时,如用xxx in ('1','2')这类返回不了结果
程序如下:
是不是script中,不可用in?

string CDPT
ddlb_type.reset()
Type_item ="('1','2')"
connect using sqlca;
declare cursor1 cursor for select type_item_desc1 from type_setting where Type_item in :Type_item using sqlca;
open cursor1;
fetch cursor1 into :CDPT;
DO WHILE SQLCA.SQLcode=0
ddlb_type.additem(CDPT)
fetch cursor1 into :CDPT;
LOOP
close cursor1;
disconnect using SQLCA;




------解决思路----------------------
引用:
程序如下:
是不是script中,不可用in?

string CDPT
ddlb_type.reset()
Type_item ="('1','2')"
connect using sqlca;
declare cursor1 cursor for select type_item_desc1 from type_setting where Type_item in :Type_item using sqlca;
open cursor1;
fetch cursor1 into :CDPT;
DO WHILE SQLCA.SQLcode=0
ddlb_type.additem(CDPT)
fetch cursor1 into :CDPT;
LOOP
close cursor1;
disconnect using SQLCA;


是的,不可以用in,但你可以参考一下这里


一、首先,你不能像datawindow那样用数组名作为参数进行传值,因为在嵌入式sql语句中不支持只写数组名:
比如:如果是datawindow的话你可以这样写:
string ls_jobids[]
dw_1.retrieve(ls_jobids)
但是,如果是嵌入式sql语句,你如下面写法就是错误的,因为在PB中它不识别数组名:
string  ls_jobids[]
long ll_count
select isnull(count(distinct order_id),0)  into :ll_count  from Order_Main where job_id in ( ls_jobids ) using sqlca;
二、如果第一种方法行不通,你可能会想到动态sql语句,如果是这样那就对了说明你确实思考了这个问题。看到这个要求,我们首先会想到的是第三种动态sql语句,既有参数也有结果值:
//ls_strjobid是用“,”号连接好的字符串
  ls_sql = "select order_id  from Order_Main where job_id in (?)"
  declare cur_order dynamic cursor for sqlsa;
  prepare sqlsa from :ls_sql;
  open dynamic cur_order using :ls_strjobid;
  fetch cur_order into :ll_count;
  close cur_order;
但是,这样写虽然没有语法错误,但还是得不到想要的结果,因为sql会把ls_strjobid作为一个字符串看待。于是呼,你绞尽脑汁经过千思万想,突发奇想一种写法。但是这种写法是否正确,你也不敢肯定,行不行试了才知道:
  ls_sql = "select isnull(count(distinct order_id),0)  from Order_Main where job_id in ("+ls_strjobid+")"
  declare cur_order dynamic cursor for sqlsa;
  prepare sqlsa from :ls_sql;
  open dynamic cur_order ;
  fetch cur_order into :ll_count;
  close cur_order;
首先,你会发现上面的写法,是第三种动态sql语句的写法,但又没有参数,这样到底行不行呢,经过测试可行的。恭喜你成功了!
总结:
(1)数组名不能作为嵌入式sql语句的参数。
(2)连接好的字符串也不能作为参数,否则为认为是一个串,而不是多个串。
(3)动态sql语句的定写法是可以变形的
------解决思路----------------------
另外给你一个思路:使用datastore方法构建ddlb的可选项。首先按你的要求构建一个datawindow,然后将这个datawindow作为一个datastore的dataobject对象。再将检索结果放到ddlb中,这样比使用cursor更方便,可能效率更高。
也可以写个函数,然后在窗口的open或其他脚本中调用即可。以下是一个函数样本
global type uf_datastore_ddlb from function_object
end type

forward prototypes
global function integer uf_datastore_ddlb (string as_datawindow, any aa_argus[], ref dropdownlistbox p_ddlb, integer ai_space)
end prototypes

global function integer uf_datastore_ddlb (string as_datawindow, any aa_argus[], ref dropdownlistbox p_ddlb, integer ai_space);//函数用于将datastore中检索出的数据转到ddlb中
//as_datawindow datastore数据窗口名
//aa_argus[] 检索条件数组
//ai_space 中间加空格数
//p_ddlb ddlb对象

int li_ret,i,li_len
string ls_col1,ls_col2
datastore lds_data

p_ddlb.reset()

p_ddlb.setredraw(false)

lds_data = create datastore

lds_data.dataobject = as_datawindow

lds_data.settransobject(sqlca)

choose case UpperBound(aa_argus)
case 0
li_ret = lds_data.retrieve()
case 1
li_ret = lds_data.retrieve(aa_argus[1])
case 2
li_ret = lds_data.retrieve(aa_argus[1],aa_argus[2])
case 3
li_ret = lds_data.retrieve(aa_argus[1],aa_argus[2],aa_argus[3])
case 4
li_ret = lds_data.retrieve(aa_argus[1],aa_argus[2],aa_argus[3],aa_argus[4])
case else
li_ret = -1
end choose

if li_ret = -1  then return -1

for i = 1 to li_ret
ls_col1 = lds_data.GetItemString(i , 1)
li_len = len(ls_col1)
if (ai_space - li_len) > 0 then
ls_col1 = ls_col1 + space(ai_space - li_len)
end if
ls_col2 = lds_data.GetItemString(i , 2)
p_ddlb.additem ( ls_col1+ ' ' + ls_col2)
next

p_ddlb.setredraw(true)

return 0

end function


  相关解决方案