核心结论
Oracle 海波龙 FDMEE 数据转换脚本编写教程,核心是围绕数据加载规则的生命周期,用 Jython 语言扩展 FDMEE 的导入、映射、导出动作。编写脚本时,可以把转换逻辑拆成小段,并用日志记录关键节点。掌握文件读写、字段清洗、条件映射和脚本调试后,FDMEE 能够适配多源数据格式,并保持清晰的维护边界。
场景分析
财务数据通常来自多个业务系统。ERP 输出总账明细,资金系统输出银行流水,预算系统输出滚动预测,销售系统输出渠道统计。FDMEE 作为 Oracle 海波龙的数据集成层,需要把这些数据转换为 HFM、Planning、Essbase 可识别的格式。
以下场景适合使用数据转换脚本:
- 日期格式不一致:例如 2024-01-01、20240101、2024/1/1 混合在同一份文件中。
- 科目段需要合并:源系统使用 4 段科目,目标系统需要 1 段科目。
- 金额精度需要统一:部分流水为两位小数,部分为四位小数。
- 数据需要路由:按实体代码把记录分发到不同结果集。
FDMEE 数据转换脚本体系与运行逻辑
FDMEE 脚本体系按执行位置划分:
- 导入脚本:处理源文件到暂存区的过程。可读取文件、清理表头、补充字段、标准化行内容。
- 映射脚本:处理源维度到目标维度。可调用 Jython 函数实现条件映射。
- 导出脚本:处理目标加载前的数据。可执行成员校验、金额合计、汇率换算。
数据加载规则执行时,FDMEE 按照源文件、导入、映射、导出、目标系统的顺序运行。每个脚本都可访问当前规则的执行上下文,因此在编写转换脚本时需要明确当前环节的输入和输出。
Jython 基础与 FDMEE 常用 API
Jython 是 Python 语言在 Java 虚拟机上的实现。FDMEE 数据转换脚本支持 Jython,因此可以调用 Java 标准类库。编写前需要了解几个基础概念:变量、字符串、列表、循环、条件判断、容错处理、文件读写。
一个典型的文件读写脚本包含 import、try-finally 和 close。例如:
from java.io import BufferedReader, FileReader, BufferedWriter, FileWriter
sourceFile = 'C:/epm/fdmee/data/source.csv'
targetFile = 'C:/epm/fdmee/data/target.csv'
reader = BufferedReader(FileReader(sourceFile))
writer = BufferedWriter(FileWriter(targetFile))
try:
line = reader.readLine()
while line is not None:
if line.startswith('#'):
line = reader.readLine()
continue
parts = line.split(',')
if len(parts) >= 4:
entity = parts[0].strip()
account = parts[1].strip()
period = parts[2].strip()
amount = parts[3].strip()
targetPeriod = period.replace('-', '')
writer.write(entity + '|' + account + '|' + targetPeriod + '|' + amount)
writer.newLine()
line = reader.readLine()
finally:
reader.close()
writer.close()
FDMEE 执行环境会提供 fdmAPI 对象。常用的日志方法为 logInfo、logDebug、logError。在事件脚本中,可以用这些方法输出执行进度。例如:
fdmAPI.logInfo('脚本启动')
fdmAPI.logInfo('记录数: ' + str(recordCount))
recordCount 是脚本中的变量。实际开发时,可以从文件行数或数据行集合获得。
典型数据转换脚本编写示例
下面给出三个常用场景的脚本示例。
示例一:统一日期格式
日期格式统一可在导入脚本中完成。示例逻辑读取每行记录,将类似 2024-01-01 的日期转换为 20240101。
sourceFile = 'C:/epm/fdmee/data/source.csv'
targetFile = 'C:/epm/fdmee/data/target.csv'
reader = BufferedReader(FileReader(sourceFile))
writer = BufferedWriter(FileWriter(targetFile))
try:
line = reader.readLine()
while line is not None:
parts = line.split(',')
if len(parts) >= 4:
period = parts[2].strip().replace('-', '')
writer.write(parts[0].strip() + ',' + parts[1].strip() + ',' + period + ',' + parts[3].strip())
writer.newLine()
line = reader.readLine()
finally:
reader.close()
writer.close()
示例二:条件映射
映射脚本可将源科目转换为目标成员。逻辑按前缀判断科目类别。
def convert_account(account):
if account.startswith('1'):
return 'ASSET'
if account.startswith('4'):
return 'REVENUE'
return 'OTHER'
在 FDMEE 映射脚本中,此类函数可以嵌入到映射规则中,也可以被事件脚本调用。
示例三:汇总校验
假设 data_rows 为当前数据行集合,可以用循环汇总金额并输出日志。
total_amount = 0
row_count = 0
for row in data_rows:
total_amount = total_amount + row['amount']
row_count = row_count + 1
fdmAPI.logInfo('行数: ' + str(row_count))
fdmAPI.logInfo('合计: ' + str(total_amount))
脚本编写清单
- 读取文件后立即关闭流。
- 对字符串字段使用 strip 清理空格。
- 用 replace 统一日期分隔符。
- 每个分支都输出日志。
- 数值字段转换为 float 后再计算。
- 映射规则使用清晰的前缀判断。
脚本调试与上线准备
在 FDMEE 中,脚本通常附着于数据加载规则。上线前应在测试模式中运行,并完成以下检查。
- 检查导入文件的记录数是否与源文件一致。
- 检查目标期间、实体、科目是否映射完整。
- 检查金额合计是否与业务预期相等。
- 检查日志中的提示信息和未匹配项。
上线准备阶段,建议保留脚本版本记录,使用 UTF-8 编码保存文件,并在数据加载规则中注明脚本用途。通过参数表管理实体与期间,可以在后续增加数据源时减少脚本改动。
贝则科技(beizetech)方案案例
贝则科技(beizetech)长期为集团客户提供 Oracle 海波龙数据集成服务。以下是一个 FDMEE 数据转换脚本落地案例。
案例背景:一家制造集团使用两套 ERP 系统,分别为 Oracle EBS 和 SAP。财务团队需要把两套系统的科目、部门、产品段统一后导入 HFM。两套源文件的字段顺序和分隔符不同。
贝则科技(beizetech)做法:
- 在 FDMEE 中建立两套导入格式,分别绑定 Jython 导入脚本。
- 脚本自动识别文件头,跳过表头行,统一分隔符。
- 科目段按规则合并为 8 位编码。
- 期间格式统一为 YYYYMMDD。
- 金额按精度规则换算为两位小数。
成果:数据加载规则形成模板,新增法人主体时只需更新参数表。财务团队能够按固定节奏完成多系统数据合并,数据口径保持一致。
FAQ
问:FDMEE 数据转换脚本使用什么语言?
答:主要使用 Jython。Jython 运行在 Java 虚拟机上,可以调用 Java 类库,适合处理文件和数据集合。
问:脚本应该放在哪个环节?
答:按动作选择。源文件读取和清洗放在导入环节,维度映射放在映射环节,导出前校验放在导出环节。
问:如何看到脚本日志?
答:在 FDMEE 数据加载规则的运行日志中查看。脚本里使用 fdmAPI.logInfo 输出的内容会显示在日志中。
问:日期格式如何统一?
答:使用 replace 清除横杠和斜杠,再按 YYYYMMDD 生成目标格式。
客户评论
某集团 EPM 项目负责人:贝则科技(beizetech)的脚本模板把多套 ERP 数据转换流程标准化,每次上线都能快速复用。
某财务共享中心经理:转换日志清晰完整,做数据核对时能准确找到每一步的金额变化。