发明内容
本发明的技术任务是针对以上不足之处,提供一种实用性强、基于计算顺序处理前置的集团财务报表计算方法。
一种基于计算顺序处理前置的集团财务报表计算方法,其具体实现过程为:
1)在财务报表中定义报表公式,处理该报表公式与其他报表公式的嵌套关系,计算在所有报表公式中的计算顺序,并作为报表公式的属性保存至数据库中,所述报表公式是指在报表某单元格上,由报表函数和常数、数学运算符组成的表达式,一个报表公式包含多个报表函数,该报表函数为取报表某单元格数值的表达式;
2)对财务报表进行计算,按照计算范围取出所有公式,按照已保存的计算顺序排序,逐批计算报表公式。
步骤1)中的计算顺序用Null和整数表示,Null代表公式为独立公式,跟其他报表公式无关;整数为正整数、零或负整数,代表公式的计算顺序,数值越大越优先计算。
步骤2)中的逐批计算报表公式,按照计算顺序由高到低顺序计算,代表计算顺序等整数值相同的可以同批计算。
所述公式计算顺序的计算过程为:
判断当前公式是否被其他公式引用,如果没有被引用,进入分支A;如果被应用进入分支B;
分支A中,判断是否引用其他公式,如果没有引用,进入分支A1:当前公式为独立公式,该公式计算顺序=null,表示任意顺序计算,流程结束;如果有引用,进入分支A2:该公式计算顺序为所有引用公式的计算顺序的最小值-1,流程结束;
分支B中,判断当前公式是否引用其他公式,如果没有引用,进入分支B1:该公式计算顺序为所有被引用公式的计算顺序的最大值+1,流程结束;如果有引用,进入分支B2;
分支B2中,判断最大被引用关系+1是否等于最小引用关系-1:若是,进入分支B1a,该公式计算顺序为所有被引用公式的计算顺序的最大值+1,流程结束;若不是,进入分支B1b;
分支B1b中,判断是否首次引用,若是进入B1b1:该公式计算顺序为所有被引用公式的计算顺序的最大值+1,所有引用公式等于当前公式计算顺序+1,流程结束;若不是,进入分支B1b2;
分支B1b2中,判断是否首次被引用,若是进入B1b2a:该公式计算顺序为所有引用公式的计算顺序的最小值-1,所有被引用公式等于当前公式计算顺序-1,流程结束;若不是,进入分支B1b2b:报异常提示,公式循环引用,修正公式,流程结束。
本发明的一种基于计算顺序处理前置的集团财务报表计算方法,具有以下优点:
本发明提出的一种基于计算顺序处理前置的集团财务报表计算方法,通过将传统的报表公式计算时处理嵌套关系,排列顺序的方式改成报表公式定义时处理嵌套关系,排定计算顺序的处理方式,能够显著的分散报表计算任务,合理延长计算资源有效利用时间,减少月末报表计算压力,有效提升报表处理性能,实用性强,易于推广。
具体实施方式
下面结合附图和具体实施例对本发明作进一步说明。
本发明提供一种基于计算顺序处理前置的集团财务报表计算方法,将传统的报表公式计算时处理嵌套关系,排列顺序的方式改成报表公式定义时处理嵌套关系,排列顺序的处理方式,能够显著的分散报表计算任务,合理延长计算资源有效利用时间,减少月末出表计算压力,有效提升报表性能。报表计算的关键步骤可分为两步:1、识别报表公式的嵌套引用关系,对公式进行计算顺序排列;2,按顺序计算报表公式。通过将步骤1前置至在报表公式定义时,在集团已定义全部报表公式中排列顺序,分散处理,将显著的减少月末出表的计算压力,提升报表计算的性能。
该方法实际操作前,首先定义以下术语:
报表函数:取报表某单元格数值的表达式。
报表公式:定义在报表某单元格上,由报表函数和常数、数学运算符组成的表达式,一个报表公式可能包含多个报表函数。
公式位置:指报表公式所在的单元格。
取数位置:指报表函数要取数据的单元格。
引用公式:指当前公式中报表函数要取数据的单元格上有其他报表公式。
被公式引用:指存在从当前公式所在单元格取数的其他报表公式。
如附图1所示,其具体实现过程为,
1)在财务报表中定义报表公式,处理该报表公式与其他报表公式的嵌套关系,计算在所有报表公式中的计算顺序,并作为报表公式的属性保存至数据库中,所述报表公式是指在报表某单元格上,由报表函数和常数、数学运算符组成的表达式,一个报表公式包含多个报表函数,该报表函数为取报表某单元格数值的表达式;
其中计算报表公式计算顺序方法的核心代码如下:
publicclass BBFormula {
private int? nCalOrder; // 报表公式计算顺序
private int? nRefOrder; // 被引用顺序,根据公式所在单元格是否被其他报表函数取数计算出的顺序
private int? nQuoOrder; // 引用顺序,根据公式报表函数取数位置有无其他公式计算出的顺序
private bool bFirstRefOrder,bFirstQuoOrder;// 首次被引用标志和首次引用别人标志
bFirstRefOrder =False;
bFirstQuoOrder =False;
private int? GetMaxCalOrderByPosFormla();
/* 功能:
获取已存在公式中含有从当前公式所在位置单元格取数报表函数的公式的最大计算顺序。
主要算法:
若有公式从当前公式所在位置取数,且公式计算顺序不都为null,则返回最大值;
若有公式从当前公式所在位置取数,且公式计算顺序都为null,则将相关公式计算顺序设为-1,且返回-1;
若没有公式从当前公式所在位置取数,则返回null;
*/
private int? GetMinCalOrderByPosFunction();
/* 功能:
获取公式报表取数位置上的公式的最小计算顺序。
主要算法:
若有当前公式取数位置上有其他公式,且公式计算顺序不都为null,则返回最小值;
若有当前公式取数位置上有其他公式,且公式计算顺序都为null,则将相关公式计算顺序设为1,且返回1;
若有当前公式取数位置上有其他公式,则返回null;
*/
private int? getBBFormluaRefOrder() //
{
if (GetMaxCalOrderByPosFormla()==null) //
nRefOrder= null;
else
nRefOrder= GetMaxCalOrderByPosFormla()+1; //如果公式被引用,则公式的计算顺序为最大被引用公式顺序+1
};
private int? getBBFormluaQuoOrder()
{
if (GetMinCalOrderByPosFunction()==null) //
nQuoOrder= null;
else
nQuoOrder= GetMinCalOrderByPosFunction()-1; //如果公式引用其他公式,则公式的计算顺序为最小引用公式顺序-1;
};
private int? getBBFormluaCalOrder()
{
if (nQuoOrder==null && nRefOrder==null) // 当前公式跟其他公式无引用被引用关系
nCalOrder = null;
else
{if (nQuoOrder==null && nRefOrde!=null) // 当前公式仅被其他公式引用
nCalOrder = nRefOrder; // 公式计算顺序为由被引用计算得到的顺序
else
{if (nQuoOrder!=null && nRefOrder==null) //当前公式仅引用其他公式
nCalOrder = nQuoOrder; // 公式计算顺序为由引用关系计算得到的顺序
else
{if (nQuoOrder== nRefOrder ) //该公式被引用且引用其他公式,由两方式计算所得顺序一致
nCalOrder = nQuoOrder; //公式计算顺序为 任一方式计算所得顺序;
else
{if (bFirstRefOrder && bFirstQuoOrder )// 该公式是第一次引用和被引用
{
nCalOrder =0; //公式计算顺序为0;
bFirstRefOrder =False;
bFirstQuoOrder =False;
}
else
{if(!bFirstRefOrder) //该公式是第一次引用其他而不是第一次被其他公式引用
{
nCalOrder= nRefOrder; // 公式计算顺序为由被引用计算得到的顺序 DelQuoCalOrder(); //将该公式引用的公式计算顺序由1改为
nCalOrder+1;
bFirstRefOrder=False;
}
Else
{if(!bFirstQuoOrder) //该公式不是第一次引用其他而是第一次被其他公式引用
{
nCalOrder= nQuoOrde; // 公式计算顺序为由引用关系计算得到的顺序
DelQuoCalOrder(); //将引用该公式的公式计算顺序由-1改为nCalOrder-1;
bFirstQufOrder=False;
}
else
Exception(“报表公式存在循环引用,请修改”);
}
}
}
}
}
}
};
2)对财务报表进行计算,按照计算范围取出所有公式,按照已保存的计算顺序排序,逐批计算报表公式。
步骤1)中的计算顺序用Null和整数表示,Null代表公式为独立公式,跟其他报表公式无关;整数为正整数、零或负整数,代表公式的计算顺序,数值越大越优先计算。
步骤2)中的逐批计算报表公式,按照计算顺序由高到低顺序计算,代表计算顺序等整数值相同的可以同批计算。
如附图2所示,所述公式计算顺序的计算过程为:
判断当前公式是否被其他公式引用,如果没有被引用,进入分支A;如果被应用进入分支B;
分支A中,判断是否引用其他公式,如果没有引用,进入分支A1:当前公式为独立公式,该公式计算顺序=null,表示任意顺序计算,流程结束;如果有引用,进入分支A2:该公式计算顺序为所有引用公式的计算顺序的最小值-1,流程结束;
分支B中,判断当前公式是否引用其他公式,如果没有引用,进入分支B1:该公式计算顺序为所有被引用公式的计算顺序的最大值+1,流程结束;如果有引用,进入分支B2;
分支B2中,判断最大被引用关系+1是否等于最小引用关系-1:若是,进入分支B1a,该公式计算顺序为所有被引用公式的计算顺序的最大值+1,流程结束;若不是,进入分支B1b;
分支B1b中,判断是否首次引用,若是进入B1b1:该公式计算顺序为所有被引用公式的计算顺序的最大值+1,所有引用公式等于当前公式计算顺序+1,流程结束;若不是,进入分支B1b2;
分支B1b2中,判断是否首次被引用,若是进入B1b2a:该公式计算顺序为所有引用公式的计算顺序的最小值-1,所有被引用公式等于当前公式计算顺序-1,流程结束;若不是,进入分支B1b2b:报异常提示,公式循环引用,修正公式,流程结束。
上述具体实施方式仅是本发明的具体个案,本发明的专利保护范围包括但不限于上述具体实施方式,任何符合本发明的一种基于计算顺序处理前置的集团财务报表计算方法的权利要求书的且任何所述技术领域的普通技术人员对其所做的适当变化或替换,皆应落入本发明的专利保护范围。