触发器倒是没用(以前不会),我用的是存储过程检索,因为一般库存表的记录数不会超过20,000个,而且存储过程可以roll back,而触发器不行!
呵呵,一家之言,请高手赐教!

解决方案 »

  1.   

    以下是我的程序中,复核入库单时关于修改库存数部分的代码!
    1.首先在 dw_1 中读入所有未复核的入库单
    2.对本次要复核的入库单作复核标志
    3.对某张要复核的入库单的明细进行处理(思路与楼主相同)long lo_hs,lo_hh, i,j,k
    string ls_hh,ls_kchh,ls_ckbh,ls_dw
    real re_sl,re_rkdj
    integer in_hh
    lo_hs=parent.dw_1.rowcount() //未复核的入库单数for i = 1 to lo_hs 
     if parent.dw_1.getitemstring(i,'hd')='1' then   //判断是否复核该入库单  
    ls_hh  =parent.dw_1.getitemstring(i,'dh')      //读第 i 张入库单单号
    ls_ckbh=parent.dw_1.getitemstring(i,'jxc_ylrkh_ylkbh')   //读入库的仓库编号
    update jxc_ylrkh set hd='1' ,hdr=:gs_work_name where dh=:ls_hh;  //置该入库单为已核并填入复核人
    //select count(dh) into :lo_hh from jxc_ylrkd where dh=:ls_hh;
    select max(hh) into :lo_hh from jxc_ylrkd where dh=:ls_hh ;     //求该入库单明细表(jxc_ylrkd)的总行数
    for j = 1 to lo_hh
    select count(ylbh) into :in_hh from jxc_ylrkd where hh=:j and dh=:ls_hh; //判断该行是否为空行
    if not in_hh=0  then                                                     
    select ylbh,sl into :ls_kchh,:re_sl from jxc_ylrkd where hh=:j and dh=:ls_hh;   //第 j 行的入库原料编号和数量
    select count(ylbh) into :k from jxc_ylkc where ylbh=:ls_kchh and ckbh=:ls_ckbh; //判断某原料在本仓库的库存表中是否有记录,如果无记录,插入该原料的基本资料
    select yl_dw,yl_rkj into :ls_dw,:re_rkdj from jxc_yl where yl_id=:ls_kchh;
    insert into jxc_ylkc(ckbh,ylbh,dw,sl,rkdj) values (:ls_ckbh,:ls_kchh,:ls_dw,0,:re_rkdj );
      end if
    update jxc_ylkc set jxc_ylkc.sl=jxc_ylkc.sl+:re_sl from jxc_ylkc,jxc_ylrkd &
                    where jxc_ylkc.ylbh=:ls_kchh and jxc_ylrkd.hh=:j and ckbh=:ls_ckbh;  //更新库存
    end if
    end for
     end if
    end for commit;