合并报表/财务报表模块,常见业务规则处理场景合集
合并报表实施和运维过程中,经常需要通过业务规则处理一些特殊场景,因此我们搜集并整理了一些常见场景的规则处理案例,供实施人员参考和使用:
1 注意事项
调试时,执行的是调试版的业务规则;如果打开报表检查数据执行业务规则或者智能合并,执行的是运行版的业务规则。
业务规则不能照搬,维度限定、执行条件等需要根据现场实际使用情况做个性化的修改。如果对业务规则的修改或者调试有疑问,可以提单咨询。
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”上。其中MDGL00302是CU门店维度成员“门店(仅小规模)合计”的编码。
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的动态计算)除以有毛利率的期间成员个数,
//得到月平均毛利率A1013,excel公式可以写为:=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的值分别写在a1和a2中
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()
合并报表/财务报表模块,常见业务规则处理场景合集
本文2024-09-22 23:17:49发表“云星瀚知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-xinghan-132118.html