动态修改带提取参数的数据窗口的SQL语句时报错,返回值是-1

flyerlxg 2005-07-27 01:27:24
在通用查询中,可能用户选择了不同的条件,然后将这些条件再附加在原SQL语句后面,从而完成查询动作.具体做法就是:
1.先通过新建存储过程得到原数据窗口对象的Select语句,存于ls_oldselect
2.通过对用户的选择进行分析,产生附加条件ls_sqlwhere
3.将附加条件附加在ls_oldselect尾部形成新的Select语句 ls_newselect
4.然后再更改数据窗口的Select语句为ls_newselect

但有一个问题,那就是如果源数据窗口对象没有提取参数则一切正常,如果有提取参数问题就出来了:在第4步设置Select语句时总是返回-1,具体代码如下:

string ls_sqlwhere,ls_dataobject
string ls_oldselect,ls_newselect
datastore lds

//得到原始SQL语句
ls_dataobject = dw_1.dataobject
lds = create datastore
lds.dataobject = ls_dataobject
lds.settransobject(sqlca)
ls_oldselect = lower(lds.GetSQLSelect())
destroy lds

//得到更改的查询条件
ls_sqlwhere = event ue_getwhere()
if len(ls_sqlwhere) > 0 then
if Pos(ls_oldselect,'where') > 0 then
ls_newselect = ls_oldselect + " and (" + ls_sqlwhere + ")"
else
ls_newselect = ls_oldselect + " where " + ls_sqlwhere
end if
else
ls_newselect = ls_oldselect
end if

//重新设置数据窗口的SQL语句
if dw_1.SetSQLSelect(ls_newselect) < 0 then
Clipboard (ls_newselect)
messagebox('提示','设置查询数据窗口SQL语句时出错!')
return
end if

CloseWithReturn(this,is_showwhere) //返回用于显示的文字

源数据窗口对象的SQL语句为:
SELECT FEntityNo,
FPriceNo,
FOpeDate,
FOpeUserNo,
FStatus,
FAuditDate,
FAuditUserNo,
FRemark
FROM t_ProductPrice
where FEntityNo = :asEntityNo
其中asEntityNo为提取参数.
...全文
254 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
flyerlxg 2005-07-28
  • 打赏
  • 举报
回复
用Modify()来修改数据窗口的属性与用表达式来修改是等同效果,只不过前者可以返回修改是否成功,而后者则没有返回值.
另外,DataWindow对象的数据源如果有提取参数,则不能使用SetSqlSelect()函数来修改Select语句,而只能用修改数据窗口对象属性的方法(有两种,一种是用Modify函数,另外一种是用表达式).如果数据源没有提取参数,则又多了一种方法,那就是用SetSqlSelect函数.
冷箫轻笛 2005-07-27
  • 打赏
  • 举报
回复
还有DataWindow对象的数据源必须是一个不带参数的SELECT语句,如果需要使用检索参数,可以在程序代码中修改SQL Select语句。
luotitan 2005-07-27
  • 打赏
  • 举报
回复
PB帮助里面有答案

Limitations to using SetSQLSelect Use SetSQLSelect only if the data source for the DataWindow object is a SQL SELECT statement without retrieval arguments and you want PowerBuilder to modify the update information for the DataWindow object:

dw_1.Modify("DataWindow.Table.Select='select...'")

Modify will not verify the SELECT statement or change the update information, making it faster but more susceptible to user error. Although you can use Modify when arguments are involved, it is not recommended because of the lack of checking.
冷箫轻笛 2005-07-27
  • 打赏
  • 举报
回复
在执行SetSQLSelect函数之前必须用SetTrans或SetTransObject
函数设置DataWindow控件的内部事务对象
难道是这个原因
楼主加上试试?

---- 这段程序是没有问题的阿
string sql_string,sql_new
long start_pos=1
string old_str //select语句中需要替换的字符串
string new_str //替换字符串,可以是结构相同的表名

dw_1.settransobject(sqlca)
sql_string=dw_1.Describe("DataWindow.Table.Select")

// Find the first occurrence of old_str.
start_pos = Pos(sql_string, old_str, start_pos)

// Only enter the loop if you find old_str.
DO WHILE start_pos > 0

// Replace old_str with new_str.
sql_string = Replace(sql_string, start_pos, &
Len(old_str), new_str)

// Find the next occurrence of old_str.
start_pos = Pos(sql_string, old_str, &
start_pos+Len(new_str))
LOOP

sql_new=sql_string+" where ……" //增加where字句

//判断setsqlselect 函数调用是否成功 ,不成功则返回
if (dw_1.setsqlselect(sql_new)=-1) then
messagebox("错误","不能修改SQL语句!",Exclamation!)
return
end if

dw_1.settransobject(sqlca)
dw_1.retrieve()
flyerlxg 2005-07-27
  • 打赏
  • 举报
回复
原始SQL语句中也可以有Order by及Group by,只不过您不能简单的把条件加在末尾而必须通过POS查找添加的具体位置.
flyerlxg 2005-07-27
  • 打赏
  • 举报
回复
如果直接使用如下方法则可以修改成功:

dw_1.Object.DataWindow.Table.Select = ls_NewSelect

哪怕是有提取参数的也可以解决!这是否是PB的一个BUG呢?版本是9.0
冷箫轻笛 2005-07-27
  • 打赏
  • 举报
回复
还有要注意原始SQL语句不能有order by ,group by等语句
flyerlxg 2005-07-27
  • 打赏
  • 举报
回复
哪怕是用这种方法设置,其返回值同样是-1

dw_1.SetSqlSelect(dw_1.GetSqlSelect())

得到的SQL就是以下语句:
SELECT FEntityNo,
FPriceNo,
FOpeDate,
FOpeUserNo,
FStatus,
FAuditDate,
FAuditUserNo,
FRemark
FROM t_ProductPrice
where FEntityNo = :asEntityNo
flyerlxg 2005-07-27
  • 打赏
  • 举报
回复
参数名根本不能为:asEntityNo,以:打头的是非法命名呀?
现在关键是针对有提取参数时该如何处理?
冷箫轻笛 2005-07-27
  • 打赏
  • 举报
回复
你可以把重新设置好的SQL语句messagebox一下看看有什么问题嘛
highscore2 2005-07-27
  • 打赏
  • 举报
回复
动态修改带参数的DW的SQL时,修改后的SQL要求也带参数的,而且,参数名只能为:asEntityNo, 否则就会出错. 一般如果要动态修改SQL的dw,就不要用参数.

1,108

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder 相关问题讨论
社区管理员
  • 基础类社区
  • WorldMobile
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧