学习的路线

学习如何写规则,从技术的角度看,从以下几点入手:
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深入技术学习系列之二--规则相关推荐

  1. Java命令学习系列(二)——Jstack

    转载自 Java命令学习系列(二)--Jstack jstack是java虚拟机自带的一种堆栈跟踪工具. 功能 jstack用于生成java虚拟机当前时刻的线程快照.线程快照是当前java虚拟机内每一 ...

  2. oracle用dual创建临时表,Oracle 学习系列之二(会话与事务级临时表和dual表 )

    一. 会话临时表 --创建会话临时表 create global temporary table tmp_user_session(user_id int, user_name varchar2(20 ...

  3. libev学习系列之二:libev下载

    libev学习系列之二:libev下载 版本说明 版本 作者 日期 备注 0.1 ZY 2019.5.31 初稿 目录 文章目录 libev学习系列之二:libev下载 版本说明 目录 官网 GitH ...

  4. 强化学习系列文章(二十七):VPG+Beta分布在CartPoleContinuous环境中的应用

    强化学习系列文章(二十七):VPG+Beta分布在CartPoleContinuous环境中的应用 在第七篇笔记(https://blog.csdn.net/hhy_csdn/article/deta ...

  5. 强化学习系列文章(二十三):AirSim Python API图像与图像处理

    强化学习系列文章(二十三):AirSim Python API图像与图像处理 参考网址:https://microsoft.github.io/AirSim/image_apis/#segmentat ...

  6. 强化学习系列文章(二十八):进化强化学习EvoRL的预实验

    强化学习系列文章(二十八):进化强化学习EvoRL的预实验 最近在研究强化学习解决离散空间的组合优化问题时,接触到了很多进化算法,实际体验也是与RL算法不相上下.进化算法也常用于优化神经网络的参数,C ...

  7. 【Silverlight】Bing Maps学习系列(二):通过Bing Maps Silverlight Control如何显示地图...

    如本系列第一篇你所介绍的,开发基于Silverlight的Bing Maps除了开发环境还需要一个开发Key,这个Key是用来做什么的呢?Silverlight控件在做地图呈现的时候它是一个必不可少的 ...

  8. C#学习系列之二:变量

    1.什么叫变量:变量是指在程序的运行过程中随时可以发生变化的量. 要使用变量,需要申明他们,所谓申明就是给变量指定类型和名称.变量申明后就可以用它们做存储单元,存放申明的数据类型的数据. 变量名定义规 ...

  9. WPF学习系列之二 (依赖项属性)

    依赖属性;(dependency property)   它是专门针对WPF创建的,但是WPF库中的依赖项属性都使用普通的.NET属性过程进行了包装.从而可能通过常规的方式使用它们,即使使用他们的代码 ...

最新文章

  1. php购物车源码免费下载,php购物车源码
  2. gin post 数据参数_Gin 使用示例(四):绑定查询字符串或 POST 数据
  3. ApacheTomcat解析请求参数的过程
  4. RabbitMq--4--集群(转载)
  5. testng接口自动化测试_Java+Maven+TestNG接口(API)自动化测试教程(10) 使用 Jenkins 构建自动化测试持续集成...
  6. android sd卡挂载广播,Android--检测内置/外置SD卡存储卡,枚举所有挂载点(通过反射实现),监听SD卡广播...
  7. 【LeetCode】剑指 Offer 65. 不用加减乘除做加法
  8. mds算法python函数_分享python mds,sha256加密算法,c#对应sha256加密算法
  9. springboot 主键重复导致数据重复_程序员:MySQL处理插入过程中主键或唯一键重复值的解决办法
  10. JQuery获取当前屏幕的高度宽度
  11. EIGRP区域注入静态路由的三种方法--CCNP学习笔记
  12. php中多重继承,PHP如何使用接口实现多重继承?(代码示例)
  13. python处理nc气象数据_气象数据处理——nc文件
  14. 哪个pdf打印机可以设置双面打印啊
  15. 项目合同管理:合同分类、费用支付方式、违约责任承担方式、签订注意事项、合同索赔流程
  16. 使用github搭建网站
  17. JavaScript调用C#办法-转帖
  18. 关于数字转换成人民币大写的问题
  19. Android 高德地图黑屏定位,Android Fragment集成高德地图黑屏的问题解决方案
  20. 使用cv2在图片上绘制点

热门文章

  1. Conflux项目进度报告 十月第一期
  2. JavaWeb技术之JSP
  3. oracle runInstaller报错SEVERE: Remote ‘AttachHome‘ on node ‘rac102‘ failed
  4. php 打开ppt,怎么播放ppt
  5. XML文档定义有几种方式?它们之间有何本质区别?解析XML文档有哪几种方式?
  6. JVM:并发的可达性分析
  7. 性能测试指南 | 一些实用的排查命令(未完待续)
  8. 计算机组成原理(8)CPU——基本结构
  9. 大数据经典学习路线(及供参考)资料群:905572354(新群)
  10. C++函数之递归调用