我正在使用power builder版本9.在PB窗口中单击一个按钮时,其抛出错误“无效游标”。调试时发现了点击事件背后的sql查询。手动执行sql查询后,它给我正确的输出。但是在检索功能中,它在调试模式下给出了以下错误
“选择错误:SQLSTATE = 2400 [Microsoft] [ODBC SQL Server驱动程序]无效的游标状态”。任何帮助都非常感谢。感谢
string szPool, szSQL
szPool = Message.StringParm
dw_select.SetTrans(SQLCA)
szSQL = "SELECT gl_year=convert(int,NULL), gl_period=convert(int,NULL), comb=max(convert(decimal(8,2),convert(decimal(8,2),gl_year) + convert(decimal(8,2),gl_period) / 100)), " + &
"fd_changed_hr_id, fd_changed_date, fd_admin_fee_rate " + &
"INTO #temp1 FROM fd_pool_af_history WHERE fd_pool = '" + szPool + "' GROUP BY fd_changed_hr_id, fd_changed_date, fd_admin_fee_rate " + &
"UPDATE #temp1 SET " + &
"gl_year = convert(int,substring(convert(varchar(25), comb),1,4)), " + &
"gl_period = convert(int,substring(convert(varchar(25), comb),6,2)) " + &
"SELECT gl_year, gl_period, 0, fd_changed_hr_id, fd_changed_date, fd_admin_fee_rate " + &
"FROM #temp1 "
dw_select.Object.DataWindow.Table.Select = szSQL
dw_select.Retrieve(szPool)
答案 0 :(得分:0)
数据窗口用于根据select语句查询数据,然后修改它(插入,更新,删除)或使用select返回的结果。
您的SQL字符串中有3个单独的查询,这些查询不是数据窗口的工作原理(也就是为什么它在您手动运行但不在数据窗口内时有效):
(1)将数据提取到临时表
SELECT gl_year=convert(int,NULL),
gl_period=convert(int,NULL),
comb=max(convert(decimal(8,2), convert(decimal(8,2),gl_year) + convert(decimal(8,2),gl_period) / 100)),
fd_changed_hr_id,
fd_changed_date,
fd_admin_fee_rate
INTO #temp1
FROM fd_pool_af_history
WHERE fd_pool = <szPool>
GROUP BY fd_changed_hr_id,
fd_changed_date,
fd_admin_fee_rate;
(2)更新临时表中的值
UPDATE #temp1
SET gl_year = convert(int,substring(convert(varchar(25), comb),1,4)),
gl_period = convert(int,substring(convert(varchar(25), comb),6,2));
(3)查询临时表中的数据
SELECT gl_year,
gl_period,
0,
fd_changed_hr_id,
fd_changed_date,
fd_admin_fee_rate
FROM #temp1;
在你的情况下,你想要做的只是创建一个带有String检索参数(as_szPool)的数据窗口对象,它将(1)和(2)组合在一起并有效地返回(3)的结果。因此,驱动数据窗口的查询将如下所示:
SELECT convert(int,substring(convert(varchar(25), comb),1,4)) gl_year,
convert(int,substring(convert(varchar(25), comb),6,2)) gl_period,
0,
fd_changed_hr_id,
fd_changed_date,
fd_admin_fee_rate
FROM (SELECT max(convert(decimal(8,2), convert(decimal(8,2),gl_year) + convert(decimal(8,2),gl_period) / 100)) comb,
fd_changed_hr_id,
fd_changed_date,
fd_admin_fee_rate
FROM fd_pool_af_history
WHERE fd_pool = :as_szPool
GROUP BY fd_changed_hr_id,
fd_changed_date,
fd_admin_fee_rate
) data
然后,您的dw_select.Retrieve(szPool)
来电将返回您正在寻找的数据。