HFM深入技术学习系列之二--规则
学习的路线
学习如何写规则,从技术的角度看,从以下几点入手:
0 HFM合并报表的基本业务功能
1 规则的入口,即HFM是从哪里调用我们写的规则。
2 规则的基本语法,规则是用VBSCRIPT写的,这里所说的基本语法不是指的VBSCRIPT的语法,其实更多地是说规则里HS这个OBJECT和相关函数如何使用。
3 规则的深入应用
HFM合并报表的基本业务功能
HFM是一个专业性很强的软件,技术人员如果对其涉及到的财务-合并报表的相关知识毫无了解的话,会出现理解不了业务需求的问题,所以对合并报表和HFM软件的功能有个大概了解是十分有必要的。
财务合并报表简介
财务上的合并报表针对的是控制多家公司的集团性质的企业,完成的工作是将财务的相关科目进行合并,抵消,输出合并主表(合并资产负债表,现金流量表等),附表,浮动表。完成合并财务报表要做的工作如下:
1 收集各子公司的财务数据
2 对子公司的个别财务报表进行调整
3 按权益法调整对子公司的长期股权投
资
4 母公司长期股权投资与子公司所有者权益的抵销
5 母公司投资收益与子公司利润分配的抵销
6 内部债权债务的抵销
7 内部存货交易的抵销
8 内部固定资产交易的抵销
9 内部无形资产交易的抵销
10 合并现金流量表的抵销
HFM合并报表计算过程
HFM的合并过程可以参考官方文档中的这个图。
主要的过程下:
0 选择了要参加计算的实体的父实体后,开始以下过程
1 所有子实体运行calculation规则
2 如果子实体和父实体的币种不一样,运行折算规则
3 用户可以录入相关的调整分录
4 运行合并功能
规则的入口
规则的入口是几个有名称的子程序,HFM在执行不同的功能时调用这些子程序。下面这个表列出了这些子程序名和HFM在和何时调用,我们要写的规则就是客制化这些子程序,加入自己想要的逻辑。
子程序 | 执行点 | 备注 |
---|---|---|
calculate(),dynamic() | 执行计算或者合并功能时 | |
translate() | 执行折算功能时 | |
allocate() | 数据网格中使用分摊选项时 | |
input() | 应用被打开时 | |
noinput() | 应用被打开时,自动将某些cells设置为不能输入数据 | |
transaciton() | 应用被打开时 | |
consolidation() | 执行合并功能时 |
规则的基本语法
HS.Clear"A#Sales"
Financial Management 中的顶层对象是 HS 对象。这意味着在使用 Financial Management 函数时,前三个字符必须是字母 HS 后跟随一个句点.
A# 字符表示帐户维度,A是维度简称,单词 Sales 是帐户维度的成员名称.
维度编码 | 维度短名称 | 说明 |
---|---|---|
Account | A | 科目维度 |
Entity | E | 组织维度 |
Year | Y | 年维度 |
Period | P | 期间维度 |
View | W | 视图维度,由于View和Value维度首字母都是V,为了区分使用W |
Value | V | 值维度 |
ICP | I | 往来单位 |
Scenario | S | 情景维度 |
Custom1-CustomN | C1-Cn | 2.1 版本以后,自定义维度支持给自定维度重命名,并且可以大于4个自定维度,比如Custom 1 设置为Report,更加直观 |
HS.Clear “A#Sales.I#Hardware”
行清除 Sales 帐户和 Hardware ICP 的交叉
这里的’.'表示的两个维度的组交叉(intersection),关于交叉的理解可以参考学习系列之一中的说明,或者理解成一般意义上的组合(combination)也是可以的。
if else
对这段规则解析:
if HS.Year.member()=2020 then
Hs.Exp(“A#N01_90=Y#Prior.P#Last.A#N01_90+A#N01_90CH”)
else
Hs.Exp(“A#N01_90=P#December.Y#Prior.A#N01_90+A#N01_90CH”)
end if
Member 获取以下维度的当前成员名
Y#Prior.P#Last 表示上一年的最后一个期间
关于当前维度成员
可以看出当我们要引用某个cell时,并不是把所有维度都用.连接,这是为什么?因为在HFM规则的语法里,没有用.连接显式写出来的维度实际上取值是当前维度成员的值,在官方文档说明中,当前维度成员指的是
1 点击计算功能时当前鼠标停留的cell对应的维度成员
2 POV中指定的成员
3 合并过程中每次执行CALCULATE时对应的ENTITY和VALUE
关于HS.EXP
HS.EXP相当于赋值,语法如下:
HS.Exp “Destination=Source”,一般都认为这里的destination和source指的是科目表达式(Account Expression),那么问题是科目表达式是什么呢?
Account Expression
Account Expression是指用一个或者多个维度关键字(Dimension KeyWord )表示的数据库中的Cell(这里需要用多维数据库的概念去理解,而不是关系数据库)。
Dimension Keyword
Dimension Keyword就是我们常见到的,例如A#NetIncome,多个维度关键字用’.'分隔,
Destination expression
Exp表达式中的目标表达式(Destination expression)一般是由ACCOUNT,CUSTOM和ICP维度指定,而ENTITY,PERIOD,YEAR,VALUE是由当前的POV或者当前选择的CELL对应的维度决定,
VIEW维度是由当前SCENARIO的缺省VIEW决定,而不是POV里的VIEW
Source Expression
源表达式(Source Expression)可以是任意维度的组合,如果不指定ENTITY,PERIOD,YEAR或者VALUE这几个维度的值,就用当前POV的值或者当前cell的维度值,如果不指定VIEW的值,就用当前SCENARIO的缺省VIEW决定,而不是POV里的VIEW
HFM深入技术学习系列之二--规则相关推荐
- Java命令学习系列(二)——Jstack
转载自 Java命令学习系列(二)--Jstack jstack是java虚拟机自带的一种堆栈跟踪工具. 功能 jstack用于生成java虚拟机当前时刻的线程快照.线程快照是当前java虚拟机内每一 ...
- oracle用dual创建临时表,Oracle 学习系列之二(会话与事务级临时表和dual表 )
一. 会话临时表 --创建会话临时表 create global temporary table tmp_user_session(user_id int, user_name varchar2(20 ...
- libev学习系列之二:libev下载
libev学习系列之二:libev下载 版本说明 版本 作者 日期 备注 0.1 ZY 2019.5.31 初稿 目录 文章目录 libev学习系列之二:libev下载 版本说明 目录 官网 GitH ...
- 强化学习系列文章(二十七):VPG+Beta分布在CartPoleContinuous环境中的应用
强化学习系列文章(二十七):VPG+Beta分布在CartPoleContinuous环境中的应用 在第七篇笔记(https://blog.csdn.net/hhy_csdn/article/deta ...
- 强化学习系列文章(二十三):AirSim Python API图像与图像处理
强化学习系列文章(二十三):AirSim Python API图像与图像处理 参考网址:https://microsoft.github.io/AirSim/image_apis/#segmentat ...
- 强化学习系列文章(二十八):进化强化学习EvoRL的预实验
强化学习系列文章(二十八):进化强化学习EvoRL的预实验 最近在研究强化学习解决离散空间的组合优化问题时,接触到了很多进化算法,实际体验也是与RL算法不相上下.进化算法也常用于优化神经网络的参数,C ...
- 【Silverlight】Bing Maps学习系列(二):通过Bing Maps Silverlight Control如何显示地图...
如本系列第一篇你所介绍的,开发基于Silverlight的Bing Maps除了开发环境还需要一个开发Key,这个Key是用来做什么的呢?Silverlight控件在做地图呈现的时候它是一个必不可少的 ...
- C#学习系列之二:变量
1.什么叫变量:变量是指在程序的运行过程中随时可以发生变化的量. 要使用变量,需要申明他们,所谓申明就是给变量指定类型和名称.变量申明后就可以用它们做存储单元,存放申明的数据类型的数据. 变量名定义规 ...
- WPF学习系列之二 (依赖项属性)
依赖属性;(dependency property) 它是专门针对WPF创建的,但是WPF库中的依赖项属性都使用普通的.NET属性过程进行了包装.从而可能通过常规的方式使用它们,即使使用他们的代码 ...
最新文章
- php购物车源码免费下载,php购物车源码
- gin post 数据参数_Gin 使用示例(四):绑定查询字符串或 POST 数据
- ApacheTomcat解析请求参数的过程
- RabbitMq--4--集群(转载)
- testng接口自动化测试_Java+Maven+TestNG接口(API)自动化测试教程(10) 使用 Jenkins 构建自动化测试持续集成...
- android sd卡挂载广播,Android--检测内置/外置SD卡存储卡,枚举所有挂载点(通过反射实现),监听SD卡广播...
- 【LeetCode】剑指 Offer 65. 不用加减乘除做加法
- mds算法python函数_分享python mds,sha256加密算法,c#对应sha256加密算法
- springboot 主键重复导致数据重复_程序员:MySQL处理插入过程中主键或唯一键重复值的解决办法
- JQuery获取当前屏幕的高度宽度
- EIGRP区域注入静态路由的三种方法--CCNP学习笔记
- php中多重继承,PHP如何使用接口实现多重继承?(代码示例)
- python处理nc气象数据_气象数据处理——nc文件
- 哪个pdf打印机可以设置双面打印啊
- 项目合同管理:合同分类、费用支付方式、违约责任承担方式、签订注意事项、合同索赔流程
- 使用github搭建网站
- JavaScript调用C#办法-转帖
- 关于数字转换成人民币大写的问题
- Android 高德地图黑屏定位,Android Fragment集成高德地图黑屏的问题解决方案
- 使用cv2在图片上绘制点
热门文章
- Conflux项目进度报告 十月第一期
- JavaWeb技术之JSP
- oracle runInstaller报错SEVERE: Remote ‘AttachHome‘ on node ‘rac102‘ failed
- php 打开ppt,怎么播放ppt
- XML文档定义有几种方式?它们之间有何本质区别?解析XML文档有哪几种方式?
- JVM:并发的可达性分析
- 性能测试指南 | 一些实用的排查命令(未完待续)
- 计算机组成原理(8)CPU——基本结构
- 大数据经典学习路线(及供参考)资料群:905572354(新群)
- C++函数之递归调用