合并报表/财务报表模块,常见业务规则处理场景合集

栏目:云星瀚知识作者:金蝶来源:金蝶云社区发布:2024-09-22浏览:1

合并报表/财务报表模块,常见业务规则处理场景合集

合并报表实施和运维过程中,经常需要通过业务规则处理一些特殊场景,因此我们搜集并整理了一些常见场景的规则处理案例,供实施人员参考和使用:


 1 注意事项

  1.  调试时,执行的是调试版的业务规则;如果打开报表检查数据执行业务规则或者智能合并,执行的是运行版的业务规则。

  2. 业务规则不能照搬,维度限定、执行条件等需要根据现场实际使用情况做个性化的修改。如果对业务规则的修改或者调试有疑问,可以提单咨询。

2 常见场景

2.1 公共库

/**************************************常量声明与赋值*****************************************/

const INI_FY_CODE = "FY2021";       // 初始化财年编码

const INI_FY_P_CODE = "202101";     // 初始化财年期间编码

/**************************************全局变量声明与赋值**************************************/

let CTX_S_CODE = ctx.S.number;     // 当前情景编码

let CTX_FY_CODE = ctx.FY.number;   // 当前财年编码

let CTX_P_CODE = ctx.P.number;     // 当前期间编码

let CTX_E_CODE = ctx.E.number;     // 当前组织编码

let CTX_C_CODE = ctx.C.number;     // 当前币别编码

let CTX_BP_CODE = ctx.BP.number;   // 当前过程编码

let CTX_EC_CODE = ctx.E.EC;        // 当前组织本位币

let CTX_PC_CODE = ctx.E.PC;        // 当前组织母公司币别

let CTX_PE_CODE = ctx.E.parent();  //获取当前组织的父级

let CTX_E_ISBASE = ctx.E.isBase(); // 当前组织是否单体公司

// 当前财年期间编码,形如"202001"

let CTX_FY_P_CODE = CTX_FY_CODE.substr(-4) + CTX_P_CODE.substr(-2);

// 当前财年的上一年,初始化财年期间之后有效,否则返回空字符串

let CTX_FY_LAST = (CTX_FY_CODE > INI_FY_CODE) ? ctx.FY.lastYear() : "";

// 当前期间的上期间,需要注意的是如果使用了13期,那么13期的上期是11期,1期的上期还是1期

if (CTX_P_CODE == "M_M01") {

CTX_P_LAST = "M_M01";};

if (CTX_P_CODE == "M_M13") {

CTX_P_LAST = "M_M11";};

// 跨年的上期:获取上期的财年期间维度组合字符串,常用于需要在runs函数中获取上月数的情况,初始财年的第1期的上期返回为空,非初始财年的第1期的上期是上年的12期,其他期的上期逻辑为CTX_P_LAST的逻辑

let CTX_LAST_FYP = "";

if (CTX_FY_LAST == "") {

  CTX_LAST_FYP = (CTX_P_CODE == "M_M01") ? "" : ",P@" + CTX_P_LAST;

}

else {

  CTX_LAST_FYP = (CTX_P_CODE == "M_M01") ? ",FY@" + CTX_FY_LAST + ",P@M_M12" : ",P@" + CTX_P_LAST;

}

//股权相关全局变量声明

//是否参与合并状态

let CTX_CON_STATUS = getConAttr("AS");

//合并方法字段值

let CTX_CON_METHOD = getConAttr("CM");

//合并架构信息设置自定义项1

let CTX_CON_UD1 = getConAttr("UD1");

/**

 * @function ctxIsNewConsol()

 * @returns {boolean} true/false

 * @description 判断当期组织在当前期间是否新设合并

 * @example

 * let isNewConsol = ctxIsNewConsol();

 */

function ctxIsNewConsol() {

  let res = false;

  if (CTX_CON_UD1 == "ud1") {

    if (CTX_P_CODE == "M_M01") {

      res = true;

    }

    else {

      let lastConUD1 = getConAttr("UD1","P@" + CTX_P_LAST);

      if (lastConUD1 != "ud1") {

        res = true;

      }

    }

  }

  return res;

}

 

2.2 录入本年累计计算本期

//1月的本期=1月的本年累计;其他月份的本期=本期的本年累计-上期的本年累计;13期的本期=本期的本年累计-11期的本年累计,包含了12期本期数和13期调整数

//此业务规则需.要分配给EJE等过程成员,这样抵销数等才会参与该计算

let sc = scope(A["R2001"].base(),其他维度).except(A.in("1001"));

let vExp = "v('CT@CurrentPeriod') = v('CT@YTD') - v('CT@YTD,P@" + CTX_P_LAST + "')";

if(CTX_P_CODE == "M_M01"){

vExp = "v('CT@CurrentPeriod') = v('CT@YTD')";

};

runs(sc,vExp);

 

2.3 录入本期计算本年累计

//方式一:本期累计=本期+上期本年累计,依赖上期的本年累计数,即必须逐期依次执行

//此业务规则需要分配给EJE等过程成员,这样抵销数等才会参与该计算

let sc = scope(A["R2001"].base(),其他维度);

let vExp = "v('CT@YTD') = v('CT@CurrentPeriod')  + v('CT@YTD,P@" + CTX_P_LAST + "')";

if(CTX_P_CODE == "M_M01"){

vExp = "v('CT@YTD') = v('CT@CurrentPeriod') "

};

runs(sc,vExp);

//方式二:本期累计=1期本期+2期本期....+当期本期,不依赖先计算出上期累计,但此方式可能会影响性能

//此业务规则需要分配给EJE等过程成员,这样抵销数等才会参与该计算

let sc = scope(A["R6001"].base(),其他维度);

let vExp = "v('CT@YTD') = v('CT@CurrentPeriod')";

let pNum = Number(CTX_P_CODE.substr(-2));

for (let i = 1; i < pNum; i++) {

let pCode = "00" + i;

pCode = "M_M" + pCode.substr(-2);

vExp = vExp + " + v('CT@CurrentPeriod,P@" + pCode + "')";

};

runs(sc,vExp);

 

2.4  获取上年同期累计数

//获取上年同期累计数写到当年的当期的LYYTD上。

//LYYTD是指新的上年同期累计数变动类型成员,其他维度字样那补充其他维度成员scope信息,R2001是指科目成员编码

runs(

scope(A["R2001"].base(),其他维度),

"v('CT@LYYTD') = v('CT@YTD,FY@" + ctx.FY.lastYear() + "')"

);

 

2.5  跨年获取上期数,判断12期和13期是否有数

function getLastPeriod() {

  let sc = scope(A["RPTItem"].base(),FY.in(CTX_FY_LAST),P.in("M_M13"));

  let cs = getCellSet(sc);

  if (cs == null || cs.length == 0) {

    return "M_M12";

  }

  return "M_M13";

}

 

2.6 变动类型成员BFLY按组织层级往上聚合

//entList获取传入组织的所有直接下级。

//Exp将其通过for拼成一个语句:BFLY,当前传入组织=BFLY,第1个下级组织+BFLY,第2个下级组织+。。。

//validChildren是指参与合并的直接下级组织,如同一父级下有相同编码的下级,那么,只会获取生效的直接下级。

let entList = ctx.E.validChildren();

//let entList = ctx.E.children();

let Exp = "v('CT@BFLY') = ";

let i = 0;

if(entList.length>0) {

Exp = Exp + "v('CT@BFLY,E@" + entList[i] + "')";

}

for (i = 1; i < entList.length; i++) {

Exp = Exp + " + v('CT@BFLY,E@" + entList[i] + "')";

}

log(Exp);

if(entList.length>0){

runs(

//scope中确定执行语句的范围,目前限定了RPTItem下的科目成员才会执行,可根据需求自行修改

scope(  

  AT.in("EntityInput"),    

  A["RPTItem"].base(),     

  IC.in("ICNone"), 

  C1.in("C1None")

  ), 

Exp

);

}

2.7 将上年的本期或本年数写到本年的对应变动类型成员中

//本期CurrentPeriod   财年为:上年LastYear  的数据写入到变动类型为上年同期数  014  财年为:本年CurrentYear

//将 变动类型为:本年累计YTD   财年为:上年LastYear  的数据写入到变动类型为上年同期累计数  015  财年为:本年CurrentYear

//scope中没有写A科目维度成员,就代表所有科目成员;BUD["Budget"].base()代表BUD自定义维度的Budget成员的所有明细成员;IC.in("ICNone")表示仅在IC维度的ICNone这个成员上的数据执行

//所有年度上年数据借用组织合并得到合并节点数据,因此CTX_E_ISBASE仅在明细组织成员上执行;

if (CTX_E_ISBASE) {

runs(

  scope(IC.in("ICNone"),

        AT.in("EntityInput"),       

        C1.in("C1None")

       ),

       "v('CT@014')=v('FY@" + CTX_FY_LAST + ",CT@CurrentPeriod')",

    "v('CT@015')=v('FY@" + CTX_FY_LAST + ",CT@YTD')"

);

}

2.8 小规模纳税报表

//先将核算数据写到组织(公司)+门店维度(小规模)上(该步骤通过acct取数公式实现),再通过下述业务规则将数据从组织(公司)+门店维度(小规模)写到组织(小规模)+门店指定成员MDGL004上。其中MDGL00302CU门店维度成员门店(仅小规模)合计的编码。

let isBaseCU = CU.isBase(CTX_E_CODE,"MDGL00302");

if (isBaseCU) {

let gongsi = CTX_E_CODE.substr(0,4);

runs(

scope(

AT.in("EntityInput"),

A["RPTItem"].base(),

Mon.in("MonNone"),

IC.in("ICNone")

),

"v('CU@MDGL004') = v('E@" + gongsi + ",CU@" + CTX_E_CODE + "')"

);

}

2.9 只看当月及之前的数据

//月份自定义维度的业务,实现上述逻辑

//报表:房租费用明细表 、五险费用明细表、工资费用明细表、装修费用明细表、汇总销售累计报表、汇总盈亏报表、毛利率汇总表、汇总累计费用报表

//需求:当月只看以前月份及当期的数据

const MONTH_LIST =["M_M01","M_M02","M_M03","M_M04","M_M05","M_M06","M_M07","M_M08","M_M09","M_M10","M_M11","M_M12","M_M13"];

let vExp = new Array();

let idx = MONTH_LIST.indexOf(CTX_P_CODE);

//throw(idx);

for (let i = 0; i <= idx; i++) {

let monCode = MONTH_LIST[i].substr(-3);

vExp.push("v('Mon@" + monCode + "') = v('Mon@MonNone,P@" + MONTH_LIST[i] + "')");

}

//throw(vExp);

runs(

scope(CT.in("YTD"),

IC.in("ICNone"),

AT.in("EntityInput"),

CU["MDGL001"].hierarchy(),

A.in("A10012701")

// A["CustomItems"].hierarchy()

),

vExp

);

 

 2.10 计算到月份的天数,如每天营业额

//A1008月增加及减少=本月营业额-上月营业额

//A1010天增加及减少=本月每天营业额-上月每天营业额

//A1011环比增长率=(本月营业额-上月营业额)/上月营业额

//A1009本月每天营业额=本月营业额/天数

let CTX_P_LAST = ctx.P.lastPeriod();

let CTX_FY_CODE = ctx.FY.number;

let CTX_P_CODE = ctx.P.number;

let dDate = new Date(CTX_FY_CODE.substr(-4),CTX_P_CODE.substr(-2),0);

let days = dDate.getDate();

runs(

scope(CT.in("CurrentPeriod"),

IC.in("ICNone"),

AT.in("EntityInput"),

Mon.in("MonNone"),

CU["MDHJ001"].hierarchy()

),

"v('A@A1008')=v('A@A1002020101')-v('P@" + CTX_P_LAST + ",A@A1002020101')",

"v('A@A1010')=v('A@A1009')-v('P@" + CTX_P_LAST + ",A@A1009')",

"v('A@A1011')=(v('A@A1002020101')-v('P@" + CTX_P_LAST + ",A@A1002020101'))/v('P@" + CTX_P_LAST + ",A@A1002020101')",

"v('A@A1009')=round(v('A@A1002020101')/" + days + ",2)"

);

 

2.11  计算月平均毛利率

//民勤等累计毛利率统计表直接计算得到,集团汇总累计毛利率统计表需要智能合并

//具体毛利率A1003写在各个月份自定义维度Mon成员(如M01等)上,

//需要将月毛利率的合计(月份汇总Mon.YFHJ,A1003中不排除Mon的动态计算)除以有毛利率的期间成员个数,

//得到月平均毛利率A1013excel公式可以写为:=IFERROR(SUM(C4:N4)/COUNT(C4:N4),"")

let expArr = new Array();

let baseSC = scope(

A.in("A1003"),CT.in("CurrentPeriod"),AT.in("EntityInput"),IC.in("ICNone")

);

let sc = scope(

baseSC,Mon.in("YFHJ"),CU["Customize"].hierarchy()

);

let cs = getCellSet(sc);

//debug(cs.length);

cs.forEach(

function (dc) {

let dData = dc.value;

let cuCode = dc.Customize;

if (dData != 0) {

let cuSC = scope(baseSC,CU.in(cuCode),Mon["YFHJ"].base());

let cuCS = getCellSet(cuSC);

let count = cuCS.length;

//debug(count);

if (count != 0) {

expArr.push("v('CU@" + cuCode + "') = " + dData / count);

}}});

if (expArr.length > 0) {

// expArr.forEach(function(exp){debug(exp);});

runs(

scope(

A.in("A1013"),

AT.in("EntityInput"),

Mon.in("MonNone"),

IC.in("ICNone"),

CT.in("CurrentPeriod")

),

expArr

);

}

2.12 自定义特殊折算规则

// 如果科目借贷算法=借加贷减,YJF=BBOY折算前数*(期末汇率-年初汇率)+YJF折算前数*期末汇率,YDF=YDF折算前数*期末汇率

// 如果科目借贷算法=借减贷加,YJF=YJF折算前数*期末汇率,YDF=BBOY折算前数*(期末汇率-年初汇率)+YDF原币*期末汇率)

let excpAccs = ["1511","4001"];

let rateEnt = ["ZIHL","ZRAML","WPGL","ZIWML","ZIWML-ZH8","ZRPHZQ","ZRPHCW","ZRPHJR","ZRPHMY","ZRGJZB","ZIB2021L","ZIB2019L","ZKBL","ZRTGIHL","ZRTGIMIL"];  //汇率方案组织编码

ctxTranslate(A["GL01"].base(),rateEnt,excpAccs);

ctxTranslate(A["GL02"].base(),rateEnt,excpAccs);

ctxTranslate(A["GL03"].base(),rateEnt,excpAccs);

ctxTranslate(A["GL04"].base(),rateEnt,excpAccs);

function ctxTranslate(accList,rateEnt,excpAccs) {

  if (rateEnt.includes(CTX_E_CODE) && CTX_BP_CODE == "IRpt" && CTX_EC_CODE != CTX_C_CODE) {

    let cl = getRate(CTX_EC_CODE, CTX_C_CODE, "ClosingRate", "RatePreset")

    let bo = getRate(CTX_EC_CODE, CTX_C_CODE, "BOYRate", "RatePreset");

    if (cl != null && cl > 0 && bo != null && bo > 0) {

        let drAccList = accList.filter(function (acc) { return acc.dcDirect == "1" && (excpAccs == null || !(excpAccs.includes(acc.number))); });

        let crAccList = accList.filter(function (acc) { return acc.dcDirect == "2" && (excpAccs == null || !(excpAccs.includes(acc.number))); });

         if (drAccList.length > 0) {

          runs(

            scope(drAccList),

            "v('CT@YJF') = v('C@" + CTX_EC_CODE + ",BP@ERpt,CT@BBOY') * (" + cl + " - " + bo + " ) + v('C@" + CTX_EC_CODE + ",BP@ERpt,CT@YJF') * " + cl ,

            "v('CT@YDF') = v('C@" + CTX_EC_CODE + ",BP@ERpt,CT@YDF') * " + cl

          );

        }

        if (crAccList.length > 0) {

          runs(

            scope(crAccList),

            "v('CT@YJF') = v('C@" + CTX_EC_CODE + ",BP@ERpt,CT@YJF') * " + cl ,

            "v('CT@YDF') = v('C@" + CTX_EC_CODE + ",BP@ERpt,CT@BBOY') * (" + cl + " - " + bo + ") + v('C@" + CTX_EC_CODE + ",BP@ERpt,CT@YDF') * " + cl

          );

        }

      }

    }

  }

 

2.13 科目指定范围汇总求和函数

/**

 * @function ctxSumByAcc(sumScope,accMember)

 * @param {object} sumScope 需要求和的维度范围,必需

 * @param {string} accMember 需要汇总的科目成员,必需,存储类型为标签的成员不参与求和计算

 * @description 指定科目和维度范围,让科目按维度范围执行单纯的求和计算

 */

function ctxSumByAcc(sumScope,accMember) {

  if (arguments.length != 2) {

    throw("ctxSumByAcc函数参数错误,需指定维度范围和科目成员");

  }

  if (!(A.hasMember(accMember))) {

    throw("ctxSumByAcc函数指定的科目成员编码不存在");

  }

  if (typeof(sumScope) != "object") {

    throw("ctxSumByAcc函数维度范围参数类型错误");

  }

  if (A[accMember].isBase()) {

    debug("明细科目不需要求和");

  }

  else {

    let expList = new Array();

    ctxGetSumByAccExp(accMember,expList);

    if (expList.length > 0) {

      runs(sumScope,expList);

    }

  }

}

/**

 * @function ctxGetSumByAccExp(accCode,expList)

 * @param {string} accCode 必需,科目成员编码

 * @param {object} expList 必需,存放表达式的数组

 * @description 用于ctxSumByAcc函数调用获取执行求和的计算表达式

 */

function ctxGetSumByAccExp(accCode,expList) {

  let accList = A[accCode].children();

  let exp = "v('A@" + accCode + "') = ";

  let iniLen = exp.length;

  let i = 0;

  accList.forEach(

    function (mem) {

      let memCode = mem.number;

      let storeType = mem.storageType;

      let aggType = mem.aggOprt;

      if (!(A[memCode].isBase())) {

        ctxGetSumByAccExp(memCode,expList);

      }

      if (aggType != "~" && storeType != "LABEL") {

        if (i == 0) {

          exp = exp + "v('A@" + memCode + "')";

        }

        else {

          exp = exp + " + v('A@" + memCode + "')";

        }

        i++;

      }

    }

  );

  let resLen = exp.length;

  if (resLen > iniLen) {

    expList.push(exp);

  }

}

 

// 调用方式示例

let sc = scope(CT.in("EndingBalance","YTD"));

ctxSumByAcc(sc,"R1001");

// 或者 ctxSumByAcc(scope(CT.in("EndingBalance","YTD")),"R1001");

 

 

2.14 大批量IC重分类

 

//优化后的大批量数据,M01,M02合并后的其收其付明细表重分类,写入M03

let ICEntElimIE = IC.ICEntity.base();

let ICList = IC["ICTotal"].base();

let CTX_C_CODE = ctx.C.number;

let recAccList = ["R101301","R105201"];

let dic={};

let IC_youshu=[];

 

if(CTX_E_ISBASE){

//寻找M01/M02需要抵消的往来组织和抵消值

  let Sc_Dixiao = scope(

    A.in(recAccList), CT.in("EndingBalance"), ICList,

    AT.in("EntityInput"), MG.in("PRCGAAP"), ow.in("owNone"),

    M.in("M01","M02"), bk.in("bkNone"), pr.in("prNone")

  );

  let cellSet = getCellSet(Sc_Dixiao);

 

cellSet.forEach(

    function (dc) {

      let dData = dc.value;

      let accCode = dc.Account;

      let icCode = dc.InternalCompany;

      if (dData != null&&dData != 0) {

        if(IC_youshu.indexOf(icCode) == -1) {

          IC_youshu.push(icCode);

        }

      }

    }

  );

  for(let i in IC_youshu){

    let ICAll = IC_youshu[i] + "";        

    //debug("往来组织" + ICAll);

    let Qishou=v("A@R101301,CT@EndingBalance, IC@"+ICAll+", AT@EntityInput, MG@PRCGAAP, ow@owNone, M@M02, bk@bkNone, pr@prNone")+v("A@R101301,CT@EndingBalance, IC@"+ICAll+", AT@EntityInput, MG@PRCGAAP, ow@owNone, M@M01, bk@bkNone, pr@prNone");    //debug(Qishou)

    let Qifu=v("A@R105201,CT@EndingBalance, IC@"+ICAll+", AT@EntityInput, MG@PRCGAAP, ow@owNone, M@M02, bk@bkNone, pr@prNone")+v("A@R105201,CT@EndingBalance, IC@"+ICAll+", AT@EntityInput, MG@PRCGAAP, ow@owNone, M@M01, bk@bkNone, pr@prNone");

    debug(Qifu)

    let Dixiao=-Math.min(Qishou,Qifu);

    if(Dixiao!=0){

      dic[ICAll]=Dixiao;

    }   

    //debug(dic[ICAll]);

  }

 

//将抵消值写入对应的维度组合

for(var key in dic){

    //debug("key: " + key + " ,value: " + dic[key]);

    let value=dic[key];

    runs(

      scope(

        AT.in("EntityInput"),CT.in("EndingBalance"), MG.in("PRCGAAP"), ow.in("owNone"),

        M.in("M04"), bk.in("bkNone"), pr.in("prNone"),IC.in(key)

      ),

      "v('A@R101301')="+value,

      "v('A@R105201')="+value

    );

    }

 

}

2.15 E的A,IC的B=>E的B,IC的A

//src来源:将当前组织作为来源的IC,10010010组织成员下的所有明细成员

let srcSC = scope(E["10010010"].base(),A.in("XS15"),IC.in(CTX_E_CODE),CT.in("YTD"),M.in("MNone"),CC.in("CCNone"),AT.in("EntityInput"),DS.in("Actual"));

debug(srcSC);

let srcCS = getCellSet(srcSC);

debug(srcCS);

//tar目标:ICEntity内部往来组织成员下的所有明细成员

let tarSC = scope(A.in("XS21"),IC["ICEntity"].base(),CT.in("YTD"),M.in("MNone"),CC.in("CCNone"),AT.in("EntityInput"),DS.in("Actual"));

debug(tarSC);

let icBase = IC["ICEntity"].base(); icBase.forEach( function(a){ debug(a) } )

let tarCS = getCellSet(tarSC);

debug("目标"+tarCS)

//创建v公式数组

let vArr = new Array();

//目标不为空或0时,将来源的组织作为目标的IC,来源的IC作为目标的组织,写入到目标中

srcCS.forEach( function (dc) {

let dData = dc.value;

let eCode = dc.Entity;

debug("dData"+dData);

debug("eCode"+eCode);

debug('IC@' + eCode + ',A@XS15,CT@YTD,M@MNone,CC@CCNone,AT@EntityInput,DS@Actual')

debug(tarCS.get('IC@' + eCode ))

let tarData = tarCS.get('IC@' + eCode );

//debug(tarData)

if (tarData == 0 || tarData == null) {

tarCS.set(dData,'IC@' + eCode ); } } );

tarCS.save();

 //销售毛利率=(主营业务收入-主营业务成本)/主营业务收入

runs("v('A@XS15') = (v('A@XS01')-v('A@XS02'))/v('A@XS01')");

//为实现销售损益=毛利率*购买方存货结余金额

runs("v('A@XS18') = v('A@XS21')*v('A@XS14')")

 

 

2.16 抵销本期数,计算生成抵销的YTD数

 // 计算 ECF过程成员的YTD数据,一月YTD=一月本期,其他月份YTD=上月YTD+本月本期

calculateECFYTD();

function calculateECFYTD() {

let calcScope = new scope( MG.in("PRCGAAP"), IC["ICEntity"].base(), pr.in("prNone"), ow.in("owNone"), bk.in("bkNone"), M.in("M01"), AT.in("AutoJournal", "ManualJournal"), A.in("R3043", "R3065"), A["R3040"].base() );

let runExp01 = (CTX_P_CODE == "M_M01") ? "v('CT@YTD') = v('CT@CurrentPeriod')" : "v('CT@YTD') = v('CT@CurrentPeriod')+v('CT@YTD,P@"+ CTX_P_LAST +"')";

runs( calcScope, "v('CT@YTD') = null", runExp01 ); }

 

2.17 判断多个值

//A001科目1的值大于零且A002科目2的值等于0时,才执行A003科目3的赋值计算

let scope1 = scope(A.in("A001"),其他维度);

let scope2 = scope(A.in("A002"),其他维度);

//获取科目1的所有明细往来组织成员的值

let dc1 = getCellSet(scope1);

//获取科目2的所有明细往来组织成员的值

let dc2 = getCellSet(scope2);

let ob1 = {};

let ob2 = {};

let ics = [];

let ics2 = [];

//将有值的科目1的往来组织成员写到ob1

dc1.forEach( function (dc) {

let dData = dc.InternalCompany;

let dValue = dc.value;

ob1[dData] = dValue; } )

//将有值的科目2的往来组织成员写到ob2

dc2.forEach( function (dc)

{ let dData = dc.InternalCompany;

let dValue = dc.value;

ob2[dData] = dValue; } )

//key为浮动的具体往来组织成员,按往来组织成员将科目1和科目2的值分别写在a1a2

for (let key in ob1){ let a1 = ob1[key];

let a2 = ob2[key];

//科目1的值a1大于0且科目2的值a2等于0,获取满足条件的具体往来组织成员放在ics

if (a1>0 && a2==0){ ics.push(key); }

if (a1<0){ ics2.push(key); } }

//执行科目3的赋值语句,只有满足条件的ics才会执行 runs( scope(AT.in("EntityInput"),CT.in("CurrentPeriod"),IC.in(ics)), "v('A.A003')=0" ) //a1<0时,需要执行的语句 runs( scope(AT.in("EntityInput"),CT.in("CurrentPeriod"),IC.in(ics2)), "赋值语句" )

 

2.18 业务规则执行折算

//以下内容放在IRpt过程节点上

/**

 * @function ctxTranslate()

确认删除?
客服QQ
  • 客服QQ点击这里给我发消息