$PBExportHeader$uo_wage_change.sru forward global type uo_wage_change from nonvisualobject end type end forward global type uo_wage_change from nonvisualobject end type global uo_wage_change uo_wage_change type variables long uo_billid string uo_billcode end variables forward prototypes public function integer save (s_wage_change arg_s_wage, string arg_opemp, ref string arg_msg, boolean arg_ifcommit) public function integer p_getflag (long arg_billid, ref long arg_flag, ref string arg_msg) public function integer updatebegin (long arg_billid, ref string arg_msg) public function integer del (long arg_billid, ref string arg_msg, boolean arg_ifcommit) public function integer add_dscrp (long arg_billid, string arg_newdescppart, ref string arg_msg) public function integer getinfo (long arg_billid, ref s_wage_change_mx arg_ref_wagemx[], ref long arg_arr_cnt, ref string arg_msg) public function integer audit (long arg_billid, string arg_opemp, ref string arg_msg, boolean arg_ifcommit) public function integer caudit (long arg_billid, ref string arg_msg, boolean arg_ifcommit) end prototypes public function integer save (s_wage_change arg_s_wage, string arg_opemp, ref string arg_msg, boolean arg_ifcommit);Integer rslt = 1,cnt = 0 DateTime server_dt Long ll_billid,it_mxbt,i String ls_sccode,ls_billcode IF IsNull(arg_s_wage.scid) THEN arg_s_wage.scid = 0 IF IsNull(arg_s_wage.billid) THEN arg_s_wage.billid = 0 IF IsNull(arg_s_wage.wagemth) THEN arg_s_wage.wagemth = 0 IF IsNull(arg_s_wage.rep) THEN arg_s_wage.rep = '' IF IsNull(arg_s_wage.dscrp) THEN arg_s_wage.dscrp = '' IF IsNull(arg_s_wage.wageid) THEN arg_s_wage.wageid = 0 IF IsNull(arg_s_wage.billtype) THEN arg_s_wage.billtype = 0 IF arg_s_wage.rep = '' THEN arg_msg = '请输入经手人' rslt = 0 GOTO ext END IF IF arg_s_wage.wagemth = 0 THEN arg_msg = '请输入工资月份' rslt = 0 GOTO ext END IF IF arg_s_wage.wageid = 0 THEN arg_msg = '请选择工资项目' rslt = 0 GOTO ext END IF SELECT Top 1 getdate() Into :server_dt From u_user; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = "查询操作失败,日期 " GOTO ext END IF it_mxbt = UpperBound(arg_s_wage.arg_s_mx) IF it_mxbt <= 0 THEN rslt = 0 arg_msg = "没有正确明细内容" GOTO ext END IF //一个月份,一个工资项目,同一员工 只能开一张单 Long ll_err_cnt String ls_err IF arg_s_wage.billtype = 0 THEN //工资变更单 FOR i = 1 To it_mxbt cnt = 0 SELECT count(*) INTO :cnt FROM u_wage_change INNER JOIN u_wage_change_mx ON u_wage_change.billid = u_wage_change_mx.billid WHERE u_wage_change.wagemth = :arg_s_wage.wagemth AND u_wage_change.wageid = :arg_s_wage.wageid AND u_wage_change.billtype = :arg_s_wage.billtype AND u_wage_change_mx.empid = :arg_s_wage.arg_s_mx[i].empid And u_wage_change.billid <> :arg_s_wage.billid; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = '查询员工: '+arg_s_wage.arg_s_mx[i].empname+' 该月份该工资项目是否已开单失败'+"~n"+sqlca.SQLErrText GOTO ext END IF IF cnt > 0 THEN ll_err_cnt++ ls_err = ls_err + '第'+String(i)+'行,员工: '+arg_s_wage.arg_s_mx[i].empname+' 该月份该工资项目已开单,不能重复开单' + '~r~n' END IF NEXT IF ll_err_cnt > 0 THEN rslt = 0 arg_msg = ls_err GOTO ext END IF END IF IF arg_s_wage.billid = 0 THEN ll_billid = f_sys_scidentity(0,"u_wage_change","billid",arg_msg,True,id_sqlca) IF ll_billid <= 0 THEN rslt = 0 GOTO ext END IF IF f_get_sccode(arg_s_wage.scid,sqlca,ls_sccode,arg_msg) = 0 THEN rslt = 0 GOTO ext END IF IF arg_s_wage.billtype = 0 THEN //工资变更单 ls_billcode = getid(arg_s_wage.scid,ls_sccode + 'GB',Date(server_dt),False,sqlca) ELSEIF arg_s_wage.billtype = 1 THEN //工资录入单 ls_billcode = getid(arg_s_wage.scid,ls_sccode + 'GI',Date(server_dt),False,sqlca) END IF IF ls_billcode = "err" THEN rslt = 0 arg_msg = "无法获取单据编号"+"~n"+sqlca.SQLErrText GOTO ext END IF INSERT INTO u_wage_change (scid, billid, billcode, billdate, relcode, wagemth, wageid, rep, dscrp, billtype, opdate, opemp) VALUES (:arg_s_wage.scid, :ll_billid, :ls_billcode, :arg_s_wage.billdate, :arg_s_wage.relcode, :arg_s_wage.wagemth, :arg_s_wage.wageid, :arg_s_wage.rep, :arg_s_wage.dscrp, :arg_s_wage.billtype, getdate(), :arg_opemp); IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = "因网络或其它原因导致建立单据操作失败"+"~n"+sqlca.SQLErrText GOTO ext END IF // FOR i = 1 To it_mxbt // INSERT INTO u_wage_change_mx // (billid, // printid, // empid, // wageamt, // wageamt_ori, // dscrp) // VALUES // (:ll_billid, // :arg_s_wage.arg_s_mx[i].printid, // :arg_s_wage.arg_s_mx[i].empid, // :arg_s_wage.arg_s_mx[i].wageamt, // :arg_s_wage.arg_s_mx[i].wageamt_ori, // :arg_s_wage.arg_s_mx[i].dscrp // ); // IF sqlca.SQLCode <> 0 THEN // rslt = 0 // arg_msg = "因网络或其它原因导致插入明细操作失败"+"~n"+sqlca.SQLErrText // GOTO ext // END IF // NEXT uo_billid = ll_billid uo_billcode = ls_billcode ELSE UPDATE u_wage_change SET billdate = :arg_s_wage.billdate, wagemth = :arg_s_wage.wagemth, rep = :arg_s_wage.rep, dscrp = :arg_s_wage.dscrp, relcode = :arg_s_wage.relcode, moddate = getdate(), modemp = :arg_opemp, wageid = :arg_s_wage.wageid WHERE billid = :arg_s_wage.billid And flag = 0 ; IF sqlca.SQLCode <> 0 Or sqlca.SQLNRows <= 0 THEN rslt = 0 arg_msg = "因网络或其它原因导致更新单据操作失败"+"~n"+sqlca.SQLErrText GOTO ext END IF DELETE FROM u_wage_change_mx Where billid = :arg_s_wage.billid; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = "删除旧有明细操作失败"+"~n"+sqlca.SQLErrText GOTO ext END IF uo_billid = arg_s_wage.billid END IF FOR i = 1 To it_mxbt INSERT INTO u_wage_change_mx (billid, printid, empid, wageamt, wageamt_ori, dscrp) VALUES (:uo_billid, :arg_s_wage.arg_s_mx[i].printid, :arg_s_wage.arg_s_mx[i].empid, :arg_s_wage.arg_s_mx[i].wageamt, :arg_s_wage.arg_s_mx[i].wageamt_ori, :arg_s_wage.arg_s_mx[i].dscrp ); IF sqlca.SQLCode <> 0 THEN IF arg_s_wage.billid = 0 THEN uo_billid = 0 rslt = 0 arg_msg = "因网络或其它原因导致插入明细操作失败"+"~n"+sqlca.SQLErrText GOTO ext END IF NEXT ext: IF rslt = 0 THEN ROLLBACK; ELSEIF arg_ifcommit And rslt = 1 THEN COMMIT; END IF RETURN rslt end function public function integer p_getflag (long arg_billid, ref long arg_flag, ref string arg_msg);Int rslt = 1 SELECT flag INTO :arg_flag FROM u_wage_change WHERE billid = :arg_billid; IF sqlca.SQLCode <> 0 THEN ARG_MSG = '查询单据审核标记失败,'+sqlca.SQLErrText rslt = 0 GOTO ext END IF ext: RETURN rslt end function public function integer updatebegin (long arg_billid, ref string arg_msg);Int rslt = 1 long li_flag IF arg_billid <= 0 THEN rslt = 0 arg_msg = '错误单据唯一码' GOTO ext END IF IF p_getflag(arg_billid,li_flag,arg_msg) = 0 THEN rslt = 0 GOTO ext END IF IF li_flag = 1 THEN rslt = 0 arg_msg = '单据已经审核,不可以修改,要修改请先撤销审核' GOTO ext END IF ext: RETURN rslt end function public function integer del (long arg_billid, ref string arg_msg, boolean arg_ifcommit);int rslt = 1 long ll_flag if arg_billid <= 0 then rslt = 0 arg_msg = '错误单据唯一码' GOTO ext END IF IF p_getflag(arg_billid,ll_flag,arg_msg) = 0 THEN rslt = 0 GOTO ext END IF if ll_flag <> 0 then rslt = 0 arg_msg = '单据不是在待审核状态,不能删除' GOTO ext END IF DELETE FROM u_wage_change_mx WHERE billid = :arg_billid; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = "删除单据明细操作失败"+"~n"+sqlca.SQLErrText GOTO ext END IF DELETE FROM u_wage_change WHERE billid = :arg_billid AND flag = 0; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = "删除单据操作失败"+"~n"+sqlca.SQLErrText GOTO ext END IF ext: IF rslt = 0 THEN ROLLBACK; ELSEIF rslt = 1 AND arg_ifcommit THEN COMMIT; END IF RETURN rslt end function public function integer add_dscrp (long arg_billid, string arg_newdescppart, ref string arg_msg); Int rslt = 1 long ll_flag IF arg_newdescppart = '' THEN rslt = 0 arG_MSG = "要添加内容为空,操作取消" GOTO ext END IF IF p_getflag(arg_billid,ll_flag,arg_msg) = 0 THEN rslt = 0 GOTO ext END IF IF ll_flag = 0 THEN rslt = 0 arG_MSG = "待审核状态下不可用" GOTO ext END IF UPDATE u_wage_change SET DSCRP = DSCRP+' '+:arg_newdescppart WHERE u_wage_change.billid = :arg_billid; IF SQLCA.SQLCode <> 0 THEN rslt = 0 arG_MSG = "因网络或其它原因导致添加备注操作失败"+"~n"+SQLCA.SQLErrText GOTO ext END IF ext: IF rslt = 1 THEN COMMIT; ELSE ROLLBACK; END IF Return (rslt) end function public function integer getinfo (long arg_billid, ref s_wage_change_mx arg_ref_wagemx[], ref long arg_arr_cnt, ref string arg_msg);Int rslt = 1 Long i = 1,no_mxcheck = 0 IF arg_billid <= 0 THEN rslt = 0 arg_msg = '错误单据唯一码' GOTO ext END IF //用游标读取明细 DECLARE cur_mx CURSOR FOR SELECT u_wage_change_mx.billid, u_wage_change_mx.printid, u_wage_change_mx.empid, u_wage_change_mx.wageamt, u_wage_change_mx.wageamt_ori, u_wage_change_mx.dscrp FROM u_wage_change_mx WHERE u_wage_change_mx.billid = :arg_billid Order By u_wage_change_mx.printid; OPEN cur_mx; FETCH cur_mx INTO :arg_ref_wagemx[i].billid, :arg_ref_wagemx[i].printid, :arg_ref_wagemx[i].empid,:arg_ref_wagemx[i].wageamt, :arg_ref_wagemx[i].wageamt_ori,:arg_ref_wagemx[i].dscrp; DO WHILE sqlca.SQLCode = 0 i++ FETCH cur_mx INTO :arg_ref_wagemx[i].billid, :arg_ref_wagemx[i].printid, :arg_ref_wagemx[i].empid,:arg_ref_wagemx[i].wageamt, :arg_ref_wagemx[i].wageamt_ori,:arg_ref_wagemx[i].dscrp; LOOP CLOSE cur_mx; //检验明细是否读入完整 SELECT count(*) INTO :no_mxcheck FROM u_wage_change_mx WHERE billid = :arg_billid; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = "查询操作失败,单据明细数量" GOTO ext END IF IF i <> (no_mxcheck + 1) THEN rslt = 0 arg_msg = "查询操作失败,单据明细" GOTO ext END IF arg_arr_cnt = i - 1 ext: RETURN rslt end function public function integer audit (long arg_billid, string arg_opemp, ref string arg_msg, boolean arg_ifcommit);Int rslt = 1 Long ll_flag IF arg_billid <= 0 THEN rslt = 0 ARG_MSG = '错误单据唯一码' GOTO ext END IF IF p_getflag(arg_billid,ll_flag,ARG_MSG) = 0 THEN rslt = 0 GOTO ext END IF IF ll_flag <> 0 THEN rslt = 0 ARG_MSG = '单据不是在待审核状态,不可以再审' GOTO ext END IF Long ll_wagemth,ll_wageid Int li_billtype SELECT wagemth,wageid, billtype INTO :ll_wagemth,:ll_wageid, :li_billtype FROM u_wage_change Where billid = :arg_billid; IF sqlca.SQLCode <> 0 THEN rslt = 0 ARG_MSG = '查询单据信息失败'+sqlca.SQLErrText GOTO ext END IF Long cnt //检查该月工资表是否已审 cnt = 0 SELECT count(*) INTO :cnt FROM u_gz_wage WHERE wagemth = :ll_wagemth And Auditingflag = 1; IF sqlca.SQLCode <> 0 THEN rslt = 0 ARG_MSG = '查询单据信息失败'+sqlca.SQLErrText GOTO ext END IF IF cnt > 0 THEN rslt = 0 ARG_MSG = '该月工资表已经审核,不能更新工资' GOTO ext END IF //检查该月工资表是否含有该工资项目 cnt = 0 SELECT count(*) INTO :cnt FROM u_gz_wagemx WHERE wagemth = :ll_wagemth And wageid = :ll_wageid; IF sqlca.SQLCode <> 0 THEN rslt = 0 ARG_MSG = '查询单据信息失败'+sqlca.SQLErrText GOTO ext END IF IF cnt = 0 THEN rslt = 0 ARG_MSG = '该月工资表不含该工资项目,不能更新该项目的工资' GOTO ext END IF //更新员工工资 s_wage_change_mx arg_s_mx[] Long ll_arr_mx Long ll_i IF getinfo(arg_billid,arg_s_mx,ll_arr_mx,ARG_MSG) = 0 THEN rslt = 0 GOTO ext END IF IF li_billtype = 0 THEN //变更单 FOR ll_i = 1 To ll_arr_mx UPDATE u_gz_wagemx SET wageamt = :arg_s_mx[ll_i].wageamt WHERE empid = :arg_s_mx[ll_i].empid AND wagemth = :ll_wagemth And wageid = :ll_wageid; IF sqlca.SQLCode <> 0 THEN rslt = 0 ARG_MSG = '更新员工工资失败'+sqlca.SQLErrText GOTO ext ELSEIF sqlca.SQLNRows = 0 THEN rslt = 0 ARG_MSG = '行:'+string(ll_i)+',更新员工工资失败,没有找到员工相应月份工资项目的数据,ID:'+string(arg_s_mx[ll_i].empid) GOTO ext END IF NEXT ELSEIF li_billtype = 1 THEN //录入单 FOR ll_i = 1 To ll_arr_mx UPDATE u_gz_wagemx SET wageamt = wageamt + :arg_s_mx[ll_i].wageamt WHERE empid = :arg_s_mx[ll_i].empid AND wagemth = :ll_wagemth And wageid = :ll_wageid; IF sqlca.SQLCode <> 0 THEN rslt = 0 ARG_MSG = '更新员工工资失败'+sqlca.SQLErrText GOTO ext ELSEIF sqlca.SQLNRows = 0 THEN rslt = 0 ARG_MSG = '行:'+string(ll_i)+',更新员工工资失败,没有找到员工相应月份工资项目的数据,ID:'+string(arg_s_mx[ll_i].empid) GOTO ext END IF NEXT END IF //更新审核标记 UPDATE u_wage_change SET auditingrep = :arg_opemp, auditingdate = getdate(), flag = 1 WHERE billid = :arg_billid And flag = 0; IF sqlca.SQLCode <> 0 THEN rslt = 0 ARG_MSG = "单据审核操作失败"+"~n"+sqlca.SQLErrText GOTO ext END IF ext: IF rslt = 0 THEN ROLLBACK; ELSEIF rslt = 1 And arg_ifcommit THEN COMMIT; END IF RETURN rslt end function public function integer caudit (long arg_billid, ref string arg_msg, boolean arg_ifcommit);Int rslt = 1 Long ll_flag DateTime null_dt SetNull(null_dt) IF arg_billid <= 0 THEN rslt = 0 ARG_MSG = '错误单据唯一码' GOTO ext END IF IF p_getflag(arg_billid,ll_flag,ARG_MSG) = 0 THEN rslt = 0 GOTO ext END IF IF ll_flag <> 1 THEN rslt = 0 ARG_MSG = '单据不是在审核状态,不可以撤审' GOTO ext END IF Long ll_wagemth,ll_wageid Int li_billtype SELECT wagemth,wageid, billtype INTO :ll_wagemth,:ll_wageid, :li_billtype FROM u_wage_change Where billid = :arg_billid; IF sqlca.SQLCode <> 0 THEN rslt = 0 ARG_MSG = '查询单据信息失败'+sqlca.SQLErrText GOTO ext END IF Long cnt //检查该月工资表是否已审 cnt = 0 SELECT count(*) INTO :cnt FROM u_gz_wage WHERE wagemth = :ll_wagemth And Auditingflag = 1; IF sqlca.SQLCode <> 0 THEN rslt = 0 ARG_MSG = '查询单据信息失败'+sqlca.SQLErrText GOTO ext END IF IF cnt > 0 THEN rslt = 0 ARG_MSG = '该月工资表已经审核,不能撤审' GOTO ext END IF //更新员工工资 s_wage_change_mx arg_s_mx[] Long ll_arr_mx Long ll_i IF getinfo(arg_billid,arg_s_mx,ll_arr_mx,ARG_MSG) = 0 THEN rslt = 0 GOTO ext END IF IF li_billtype = 0 THEN //变更单 FOR ll_i = 1 To ll_arr_mx UPDATE u_gz_wagemx SET wageamt = :arg_s_mx[ll_i].wageamt_ori WHERE empid = :arg_s_mx[ll_i].empid AND wagemth = :ll_wagemth And wageid = :ll_wageid; IF sqlca.SQLCode <> 0 THEN rslt = 0 ARG_MSG = '更新员工工资失败'+sqlca.SQLErrText GOTO ext ELSEIF sqlca.SQLNRows = 0 THEN rslt = 0 ARG_MSG = '更新员工工资失败,没有找到员工相应月份工资项目的数据' GOTO ext END IF NEXT ELSEIF li_billtype = 1 THEN //录入单 FOR ll_i = 1 To ll_arr_mx UPDATE u_gz_wagemx SET wageamt = wageamt - :arg_s_mx[ll_i].wageamt WHERE empid = :arg_s_mx[ll_i].empid AND wagemth = :ll_wagemth And wageid = :ll_wageid; IF sqlca.SQLCode <> 0 THEN rslt = 0 ARG_MSG = '更新员工工资失败'+sqlca.SQLErrText GOTO ext ELSEIF sqlca.SQLNRows = 0 THEN rslt = 0 ARG_MSG = '更新员工工资失败,没有找到员工相应月份工资项目的数据' GOTO ext END IF NEXT END IF //更新审核标记 UPDATE u_wage_change SET auditingrep = '', auditingdate = :null_dt, flag = 0 Where billid = :arg_billid; IF sqlca.SQLCode <> 0 THEN rslt = 0 ARG_MSG = "因网络或其它原因导致单据撤审操作失败"+"~n"+sqlca.SQLErrText GOTO ext END IF ext: IF rslt = 0 THEN ROLLBACK; ELSEIF rslt = 1 And arg_ifcommit THEN COMMIT; END IF RETURN rslt end function on uo_wage_change.create call super::create TriggerEvent( this, "constructor" ) end on on uo_wage_change.destroy TriggerEvent( this, "destructor" ) call super::destroy end on