【问题标题】:Retrieve function in Power Builder throwing errorPower Builder 中的检索函数引发错误
【发布时间】:2015-07-09 20:00:45
【问题描述】:

我使用的是 Power Builder 版本 9。在 PB 窗口中,单击一个按钮时会抛出错误“无效光标”。调试时发现点击事件后面的sql查询。手动执行 sql 查询后,它给了我正确的输出。但是在检索函数中,它在调试模式下给出以下错误

  1. Sqldbcode=999
  2. “选择错误:SQLSTATE = 2400 [Microsoft][ODBC SQL Server Driver] 游标状态无效”。非常感谢任何帮助。谢谢

    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)
    

【问题讨论】:

    标签: powerbuilder


    【解决方案1】:

    数据窗口用于根据 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;
    

    在您的情况下,您想要做的只是创建一个带有字符串检索参数 (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) 调用将返回您正在寻找的数据。

    这里还有一些关于datawindow.table.select property的详细信息

    【讨论】:

    • 感谢您的详细解释。我刚刚通过传递 set nocount 获得了解决方法,它正在应用程序中检索结果。但也会尝试您的解决方案。
    猜你喜欢
    • 2021-09-20
    • 2021-11-04
    • 2021-08-28
    • 1970-01-01
    • 2015-04-26
    • 2019-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多