CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  PowerBuilder >  Pb脚本语言

使用游标出错,请PB达人指点指点

楼主cquptlilian()2005-04-19 16:20:22 在 PowerBuilder / Pb脚本语言 提问

源程序如下:  
  declare   c1   cursor   for   select   acct_id,serv_id,bill_item_type_id,charge   from   tmp_gcust_charge;  
  open   c1;  
  if   sqlca.sqlcode<>0   then  
  printmsg("打开取临时表中费用游标出错!错误原因:"+sqlca.sqlerrtext)  
  return  
  end   if  
   
  FETCH   c1   INTO   :ls_acct_id,:ls_serv_id,:ls_item_type_id,:ls_charge;  
   
  do   while   sqlca.sqlcode   =   0    
  CHOOSE   CASE   ls_item_type_id    
              CASE   1001    
              ls_sql="update   "+ls_tab+"   set   basic_charge="+string(ls_charge)+"   where   acct_id="+string(ls_acct_id)+"   AND   SERV_ID="+string(ls_serv_id)    
  EXECUTE   IMMEDIATE   :ls_sql;  
              if   sqlca.sqlcode<>0   then  
                  messagebox("错误!","更新商务客户帐单失败!原因:"+sqlca.sqlerrtext)  
            rollback;  
                  return  
              end   if  
              commit;  
              CASE   1002    
              ls_sql="update   "+ls_tab+"   set   sh_charge="+string(ls_charge)+"   where   acct_id="+string(ls_acct_id)+"   AND   SERV_ID="+string(ls_serv_id)    
  EXECUTE   IMMEDIATE   :ls_sql;  
              if   sqlca.sqlcode<>0   then  
                  messagebox("错误!","更新商务客户帐单失败!原因:"+sqlca.sqlerrtext)  
            rollback;  
                  return  
              end   if  
              commit;  
              CASE   1003  
              ls_sql="update   "+ls_tab+"   set   wh_charge="+string(ls_charge)+"   where   acct_id="+string(ls_acct_id)+"   AND   SERV_ID="+string(ls_serv_id)    
  EXECUTE   IMMEDIATE   :ls_sql;  
              if   sqlca.sqlcode<>0   then  
                  messagebox("错误!","更新商务客户帐单失败!原因:"+sqlca.sqlerrtext)  
            rollback;  
                  return  
              end   if  
              commit;  
              CASE   1006    
              ls_sql="update   "+ls_tab+"   set   gnct_charge="+string(ls_charge)+"   where   acct_id="+string(ls_acct_id)+"   AND   SERV_ID="+string(ls_serv_id)    
  EXECUTE   IMMEDIATE   :ls_sql;  
              if   sqlca.sqlcode<>0   then  
                  messagebox("错误!","更新商务客户帐单失败!原因:"+sqlca.sqlerrtext)  
            rollback;  
                  return  
              end   if  
              commit;  
              CASE   1029      
              ls_sql="update   "+ls_tab+"   set   gjct_charge="+string(ls_charge)+"   where   acct_id="+string(ls_acct_id)+"   AND   SERV_ID="+string(ls_serv_id)    
  EXECUTE   IMMEDIATE   :ls_sql;  
              if   sqlca.sqlcode<>0   then  
                  messagebox("错误!","更新商务客户帐单失败!原因:"+sqlca.sqlerrtext)  
            rollback;  
                  return  
        end   if  
              commit;  
        CASE   1061      
              ls_sql="update   "+ls_tab+"   set   xyw_charge="+string(ls_charge)+"   where   acct_id="+string(ls_acct_id)+"   AND   SERV_ID="+string(ls_serv_id)    
  EXECUTE   IMMEDIATE   :ls_sql;  
              if   sqlca.sqlcode<>0   then  
                  messagebox("错误!","更新商务客户帐单失败!原因:"+sqlca.sqlerrtext)  
            rollback;  
                  return  
              end   if  
              commit;  
        END   CHOOSE  
        FETCH   c1   INTO   :ls_acct_id,:ls_serv_id,:ls_item_type_id,:ls_charge;  
  loop    
  close   c1;  
  if   sqlca.sqlcode   <>   0   then  
  printmsg("关闭取游标错!错误原因:"+sqlca.sqlerrtext)  
  return  
  end   if  
   
   
  结果中只更改了一条记录,提示关闭游标出错,错误原因是procedure   has   not   been   excuted   or   has   no   results.请达人指点 问题点数:20、回复次数:8Top

1 楼fibbery(飞)(睡足了才能提高效率)回复于 2005-04-19 19:17:48 得分 0

首先更正你一个问题,你在更新表发生错误的时候,你将执行return,那么你的逻辑将不会走到close   cl;  
  其次,关闭游标会不会影响sqlca.sqlcode?这个我不太清楚。建议检查该值是否为100,如果是100则说明不会影响,这个100是上面检索没有数据时的值。你也可以在刚打开游标时马上关闭再看看sqlca.sqlcode的值来验证一下。Top

2 楼cquptlilian()回复于 2005-04-20 08:41:02 得分 0

我试了一下你说的第二点,打开游标时sqlcode的值是0,在select语句使用时且查询时有记录时才是100吧,其他应该是0或-1吧,不知道我分析的对不对。在同样的环境下我运行下面的代码则是正确的:  
  string   ls_begin_date,ls_end_date,ls_value  
   
  declare   cur_cycle   cursor   for  
  select   billing_cycle_id,cycle_begin_date,cycle_end_date   from   billing_cycle  
  where   billing_cycle_id   between   :pl_cur_cycle   -   12   and   :pl_cur_cycle  
  order   by   billing_cycle_id   desc;  
   
  open   cur_cycle;  
  if   sqlca.sqlcode   <>   0   then  
  printmsg("打开取帐务周期游标错!错误原因:"+sqlca.sqlerrtext)  
  return   false  
  end   if  
   
  fetch   cur_cycle   into   :ll_cycle_id,:ls_begin_date,:ls_end_date;  
   
  do   while   sqlca.sqlcode   =   0  
  ls_value   =   left(ls_begin_date,4)+"/"+mid(ls_begin_date,5,2)+"/"+right(ls_begin_date,2)+&  
  '--'   +   left(ls_end_date,4)+"/"+mid(ls_end_date,5,2)+"/"+right(ls_end_date,2)  
  ls_value   =   ls_value   +   space(30   -   len(ls_value))  
  plb_ddlb.additem(ls_value   +   '|'   +   string(ll_cycle_id))  
  fetch   cur_cycle   into   :ll_cycle_id,:ls_begin_date,:ls_end_date;  
  loop  
   
  close   cur_cycle;  
  if   sqlca.sqlcode   <>   0   then  
  printmsg("关闭取帐务周期游标错!错误原因:"+sqlca.sqlerrtext)  
  return   false  
  end   if  
   
  很奇怪,请各位高手继续帮我分析一下Top

3 楼fibbery(飞)(睡足了才能提高效率)回复于 2005-04-20 08:46:18 得分 5

不对,有数据返回时为0,无数据返回为100,发生错误为-1。Top

4 楼w7a8(阿飞)回复于 2005-04-20 08:52:28 得分 15

在游标中不能commit的Top

5 楼cquptlilian()回复于 2005-04-20 09:15:11 得分 0

w7a8(阿飞)   的指点解决了问题,把commit放在close   c1后面就正确了,谢谢fibbery(飞)(3.20VC++)   和   w7a8(阿飞)   两位大虾的指教了^_^Top

6 楼xyqiqi(琪琪)回复于 2005-04-20 09:23:29 得分 0

那还不赶快结贴Top

7 楼fibbery(飞)(睡足了才能提高效率)回复于 2005-04-20 10:20:05 得分 0

哦,长知识了!Top

8 楼cquptlilian()回复于 2005-04-20 18:13:51 得分 0

怎样结贴啊,我是菜鸟,指点啊Top

相关问题

  • 游标使用出错了
  • 定义游标出错!
  • Help!游标达最大值出错??
  • 创建游标出错了,求助!
  • 移动游标的时候出错
  • pb中游标的使用
  • asp出错,寻高手指点。
  • 登录程序出错 请指点
  • 我出错太多了,请指点
  • SQLCE INSERT出错,请求指点

关键词

  • 客户
  • date
  • ls
  • sqlca
  • 游标
  • sqlcode
  • sqlerrtext
  • acct
  • c1
  • charge

得分解答快速导航

  • 帖主:cquptlilian
  • fibbery
  • w7a8

相关链接

  • PowerBuilder类图书
  • PowerBuilder类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo