pb 想在datawindow里使用数组插入数据库中,用循环来代替游标,但是有时插入的数据不完整。请各位大佬帮忙看看

qq_43589674 2019-05-17 01:31:29
decimal r_jfje[10],r_dfje[10],r_jfje2,r_dfje2
integer i=1
do

r_zy[i] =string(dw_zw_pzmxb_grid.object.zy.current)
r_km_code[i] =string(dw_zw_pzmxb_grid.object.km_code.current)
r_jfje[i] =dec(dw_zw_pzmxb_grid.object.jfje.current)
r_dfje[i] =dec(dw_zw_pzmxb_grid.object.dfje.current)

messagebox('','1')

if isnull(r_zy[i]) or isnull(r_km_code[i]) or (r_jfje[i]=0 and r_dfje[i]=0) then
messagebox('','2')
messagebox('提示','请将凭证明细表第【' +string(i)+'】排填制完整')
delete from zw_pzmxb where zth=:r_zth and ykjqj=:r_ykjqj and nkjqj=:r_nkjqj and pzh=:r_pzh;
exit
end if
insert into zw_pzmxb (zth,nkjqj,ykjqj,pzh,km_code,zy,jfje,dfje)
values (:r_zth,:r_nkjqj,:r_ykjqj,:r_pzh,:r_km_code[i],:r_zy[i],:r_jfje[i],:r_dfje[i]);
i=i+1
loop until i>r_row



if i>r_row then
declare C_cur cursor for
select zth,nkjqj,ykjqj,pzh,km_code,zy,jfje,dfje
from zw_pzmxb where zth=:r_zth and ykjqj=:r_ykjqj and nkjqj=:r_nkjqj and km_code like:r_km_code[i - 1]
and pzh=:r_pzh;
open C_cur;
do while r_flag=true
fetch C_cur into :r_zth2,:r_nkjqj2,:r_ykjqj2,:r_pzh2,:r_km_code2,:r_zy2,:r_jfje2,:r_dfje2;
...全文
294 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
DYFDWX 2019-06-05
  • 打赏
  • 举报
回复
这样做风险大,建议用datastore来做,删除与新增,这样好处理是做到事务处理
whb00120012 2019-06-04
  • 打赏
  • 举报
回复
一是表应该为一对多的;
二是
r_zy[i] =string(dw_zw_pzmxb_grid.object.zy.current)
r_km_code[i] =string(dw_zw_pzmxb_grid.object.km_code.current)
r_jfje[i] =dec(dw_zw_pzmxb_grid.object.jfje.current)
r_dfje[i] =dec(dw_zw_pzmxb_grid.object.dfje.current)

current传的是一个数组
三是 循环应在messagebox('','1') 后面。
qq_43589674 2019-05-26
  • 打赏
  • 举报
回复
引用 1 楼 WMERP 的回复:
你再写这些批量处理的SQL语句最好是批量的提交和回滚,防止错误而造成部分提交:
SQLCA.AUTOcommit=FALSE

do
..........
SQL语句执行
if sqlca.sqlcode<>0 then
messagebox "ERROR"
goto error
end if
........
loop

commit using sqlca;
sqlca.autocommit=true
return 1
:error
rollback using sqlca;
sqlca.autocommit=true
return 0
好的 谢谢
WMERP 2019-05-17
  • 打赏
  • 举报
回复
你再写这些批量处理的SQL语句最好是批量的提交和回滚,防止错误而造成部分提交:
SQLCA.AUTOcommit=FALSE

do
..........
SQL语句执行
if sqlca.sqlcode<>0 then
messagebox "ERROR"
goto error
end if
........
loop

commit using sqlca;
sqlca.autocommit=true
return 1
:error
rollback using sqlca;
sqlca.autocommit=true
return 0
数据存在主次表时,当更新了次表数据后,主表数据在后台有更变时。可利用刷新主表当前行的方法重显主表数据。 /************************************************************ 函数名称: f_refresh_currentrow(adw) 功 能: 刷新DW当前行数据,不可刷新NO update or 带arguments的DW 参数说明: adw 目标DW 返 回 值: integer 成功返回1,失败返回-1 作 者: sean 创建时间: 2010年8月18日 ************************************************************/ string ls_dataobject string ls_keys[] //key Column Name string ls_dbname[] //key field Name string ls_coltype[] //field style string ls_tablenm //table name string ls_condition //sql Condition long ll_currentrow //Current Row numeric long ll_column //Column count integer i datawindow ldw datastore ldatastore ldw=adw if ldw.rowcount( )=0 then return -1 elseif trim(ldw.describe( "datawindow.table.arguments"))<>'?' then messagebox('','刷新数据窗口当前行失败!,数据窗口需要参数',exclamation!) return -1 else ll_currentrow=ldw.getrow( ) FOR ll_column = 1 TO long(ldw.object.datawindow.column.count)//key names If ldw.Describe("#"+string(ll_column)+".key") ='yes' Then i++ ls_keys[i]=ldw.Describe("#"+string(ll_column)+".name") ls_dbname[i]=ldw.Describe("#"+string(ll_column)+".dbname") ls_coltype[i]=ldw.Describe("#"+string(ll_column)+".coltype") End If NEXT if upperbound(ls_keys[])=0 then messagebox('','刷新数据窗口当前行失败!,没有主键',exclamation!) return -1 else ls_tablenm=left(ls_dbname[1],pos(ls_dbname[1],'.') -1) //table name for i=1 to upperbound(ls_keys[]) if pos('numb,deci,long,',LeftA(ls_coltype[i],4) +',')>0 then ls_condition+="and "+ls_dbname[i]+"="+string(f_getitem(ldw,ll_currentrow,ls_keys[i])) else ls_condition+="and "+ls_dbname[i]+"='"+string(f_getitem(ldw,ll_currentrow,ls_keys[i]))+"'" end if next ls_condition=mid(ls_condition,4) //sql Condition ldatastore=create datastore ldatastore.dataobject=ldw.dataobject ldatastore.settransobject( sqlca) if f_addwhere_retrieve(ldatastore,ls_condition)=1 then if ldatastore.rowcount( )=1 then ldw.object.data[ll_currentrow]=ldatastore.object.data[1] ldw.setitemstatus( ll_currentrow, 0, primary!, NotModified!) //if ldw.getrow( )<>ll_currentrow then ldw.scrolltorow( ll_currentrow) end if else messagebox('','刷新数据窗口当前行失败!,条件语法错误',exclamation!) return -1 end if destroy ldatastore end if end if

1,077

社区成员

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

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