环境: EBS R12, jasperreport, iReport
以资产负债表为例描述下EBS中二次开发FSG报表。
1,定义FSG报表(网上资料很多)
Responsibility: GL
定义Row Set -> 定义Column Set -> 定义FSG Report
Row Set:按顺序定义好各个Row Name(Line Items),可以使用Account Assignments或者Caculations;一般Account Assignment在Account段变化,其最小值和最大值的变化会关联到GL_COMBINATIONS_CODE和GL_BALANCES表中;Caculation会引用序号比自己小的Row,当Low和High相同时指定为当Row。
Column Set:一般可以不定义Caculations和Account Assignments,这些在Row Set中已经定义好;选择合适的Amount Type,比如:年初数(BAL-Actual (FY Start)),期末数(YTD-Actual)。
2,定义一个Package,将report中需要的数据保存到一个临时表里,这里的关键是FSG报表计算的结果数据如何使用SQL实现,这里参考了xiedongwen的帖子,并在R12上通过。
下面给出CURSOR定义,指定了四个参数:ledger, legal entity, period, row set。SQL中使用动态取得的ledger对应的COAt的每个段的最小和最大值,当Row Set中的某个段为空的时候,动态设置为最小和最大值。
CURSOR cur_gl_balance_sheet(v_ledger NUMBER, v_legal_entity VARCHAR2, v_period VARCHAR2, v_row_set_id NUMBER) IS
SELECT ax.axis_seq
,ax.description
,decode(ax.change_sign_flag,
'Y',
-decode(rra4.axis_set_id,
NULL,
b.year_begin_balance,
rra4.year_begin_balance),
decode(rra4.axis_set_id,
NULL,
b.year_begin_balance,
rra4.year_begin_balance)) year_begin_balance
,decode(ax.change_sign_flag,
'Y',
-decode(rra4.axis_set_id,
NULL,
b.period_end_balance,
rra4.period_end_balance),
decode(rra4.axis_set_id,
NULL,
b.period_end_balance,
rra4.period_end_balance)) period_end_balance
FROM (SELECT a.axis_set_id
,a.axis_seq
,SUM(decode(a.operator,
'-',
-a.year_begin_balance,
a.year_begin_balance)) year_begin_balance
,SUM(decode(a.operator,
'-',
-a.period_end_balance,
a.period_end_balance)) period_end_balance
FROM (SELECT rrc6.axis_set_id
,rrc6.axis_seq
,rrc6.calculation_seq
,rrc6.operator
,rra3.year_begin_balance
,rra3.period_end_balance
FROM (SELECT a.axis_set_id
,a.axis_seq
,SUM(decode(a.operation_sign,
'+',
a.year_begin_balance,
'-',
-a.year_begin_balance,
a.year_begin_balance)) year_begin_balance
,SUM(decode(a.operation_sign,
'+',
a.period_end_balance,
'-',
-a.period_end_balance,
a.period_end_balance)) period_end_balance
FROM (SELECT gcc.code_combination_id account_id
,gcc.summary_flag summary_flag
,rra2.range_mode summary
,rra2.axis_set_id
,rra2.axis_seq
,rra2.sign operation_sign
,gcc.segment1 || '.' || gcc.segment2 || '.' ||
gcc.segment3 || '.' || gcc.segment4 || '.' ||
gcc.segment5 || '.' || gcc.segment6 user_account
,gb.period_name period_name
,nvl(gb.begin_balance_dr,
0) + nvl(gb.period_net_dr,
0) -
nvl(gb.begin_balance_cr,
0) - nvl(gb.period_net_cr,
0) period_end_balance
,(SELECT SUM(nvl(gb1.begin_balance_dr,
0) - nvl(gb1.begin_balance_cr,
0)) year_begin_balance
FROM gl.gl_balances gb1
WHERE gb1.period_year = gb.period_year
AND gb1.period_num = 1
AND gb1.currency_code =
gb.currency_code
AND gb1.code_combination_id =
gb.code_combination_id) year_begin_balance
FROM gl.gl_balances gb
,gl.gl_code_combinations gcc
,(SELECT rra.axis_set_id
,rra.axis_seq
,rra.sign
,rra.range_mode
,rra.segment1_low
,rra.segment1_high
,rra.segment2_low
,rra.segment2_high
,rra.segment3_low
,rra.segment3_high
,rra.segment4_low
,rra.segment4_high
,rra.segment5_low
,rra.segment5_high
,rra.segment6_low
,rra.segment6_high
,rra.segment7_low
,rra.segment7_high
,rra.segment8_low
,rra.segment8_high
,rra.segment9_low
,rra.segment9_high
FROM rg.rg_report_axis_contents rra
WHERE rra.axis_set_id = v_row_set_id) rra2
WHERE gb.code_combination_id =
gcc.code_combination_id
--and gb.currency_code = 'CNY'
AND gb.actual_flag = 'A'
AND gb.period_name = v_period_name
AND gb.ledger_id = v_ledger_id
AND gcc.segment1 = v_legal_entity
AND gcc.segment2 BETWEEN
nvl(rra2.segment2_low,
wk_segment2_min) AND
nvl(rra2.segment2_high,
wk_segment2_max)
AND gcc.segment3 BETWEEN
nvl(rra2.segment3_low,
wk_segment3_min) AND
nvl(rra2.segment3_high,
wk_segment3_max)
AND gcc.segment4 BETWEEN
nvl(rra2.segment4_low,
wk_segment4_min) AND
nvl(rra2.segment4_high,
wk_segment4_max)
AND gcc.segment5 BETWEEN
nvl(rra2.segment5_low,
wk_segment5_min) AND
nvl(rra2.segment5_high,
wk_segment5_max)
AND gcc.segment6 BETWEEN
nvl(rra2.segment6_low,
wk_segment6_min) AND
nvl(rra2.segment6_high,
wk_segment6_max)
AND gcc.segment7 BETWEEN
nvl(rra2.segment7_low,
wk_segment7_min) AND
nvl(rra2.segment7_high,
wk_segment7_max)
AND gcc.segment8 BETWEEN
nvl(rra2.segment8_low,
wk_segment8_min) AND
nvl(rra2.segment8_high,
wk_segment8_max)
AND gcc.segment9 BETWEEN
nvl(rra2.segment9_low,
wk_segment9_min) AND
nvl(rra2.segment9_high,
wk_segment9_max)
AND gcc.summary_flag = rra2.range_mode) a
GROUP BY a.axis_set_id
,a.axis_seq) rra3
,(SELECT rrc4.axis_set_id
,rrc4.axis_seq
,rrc4.calculation_seq
,rrc4.operator
,decode(rrc5.axis_seq_low,
NULL,
rrc4.axis_seq_low,
rrc5.axis_seq_low) axis_seq_low
FROM (SELECT rrc2.axis_set_id
,rrc2.axis_seq
,rrc2.calculation_seq
,rrc2.operator
,decode(rrc3.axis_seq_low,
NULL,
rrc2.axis_seq_low,
rrc3.axis_seq_low) axis_seq_low
FROM (SELECT rrc0.axis_set_id
,rrc0.axis_seq
,rrc0.calculation_seq
,rrc0.operator
,ax3.axis_seq axis_seq_low
FROM (SELECT rrc.axis_set_id
,rrc.axis_seq
,rrc.calculation_seq
,rrc.operator
,decode(rrc.axis_seq_low,
NULL,
ax2.axis_seq,
rrc.axis_seq_low) axis_seq_low
,rrc.axis_seq_high
FROM rg.rg_report_calculations rrc
,rg.rg_report_axes ax2
WHERE rrc.axis_set_id =
ax2.axis_set_id(+)
AND rrc.axis_name_low =
ax2.axis_name(+)) rrc0
,rg.rg_report_axes ax3
WHERE ax3.axis_set_id =
rrc0.axis_set_id
AND ax3.axis_seq BETWEEN
rrc0.axis_seq_low AND
rrc0.axis_seq_high) rrc2
,(SELECT rrc0.axis_set_id
,rrc0.axis_seq
,rrc0.calculation_seq
,rrc0.operator
,ax3.axis_seq axis_seq_low
FROM (SELECT rrc.axis_set_id
,rrc.axis_seq
,rrc.calculation_seq
,rrc.operator
,decode(rrc.axis_seq_low,
NULL,
ax2.axis_seq,
rrc.axis_seq_low) axis_seq_low
,rrc.axis_seq_high
FROM rg.rg_report_calculations rrc
,rg.rg_report_axes ax2
WHERE rrc.axis_set_id =
ax2.axis_set_id(+)
AND rrc.axis_name_low =
ax2.axis_name(+)) rrc0
,rg.rg_report_axes ax3
WHERE ax3.axis_set_id =
rrc0.axis_set_id
AND ax3.axis_seq BETWEEN
rrc0.axis_seq_low AND
rrc0.axis_seq_high) rrc3
WHERE rrc2.axis_set_id = rrc3.axis_set_id(+)
AND rrc2.axis_seq_low = rrc3.axis_seq(+)) rrc4
,(SELECT rrc2.axis_set_id
,rrc2.axis_seq
,rrc2.calculation_seq
,rrc2.operator
,decode(rrc3.axis_seq_low,
NULL,
rrc2.axis_seq_low,
rrc3.axis_seq_low) axis_seq_low
FROM (SELECT rrc0.axis_set_id
,rrc0.axis_seq
,rrc0.calculation_seq
,rrc0.operator
,ax3.axis_seq axis_seq_low
FROM (SELECT rrc.axis_set_id
,rrc.axis_seq
,rrc.calculation_seq
,rrc.operator
,decode(rrc.axis_seq_low,
NULL,
ax2.axis_seq,
rrc.axis_seq_low) axis_seq_low
,rrc.axis_seq_high
FROM rg.rg_report_calculations rrc
,rg.rg_report_axes ax2
WHERE rrc.axis_set_id =
ax2.axis_set_id(+)
AND rrc.axis_name_low =
ax2.axis_name(+)) rrc0
,rg.rg_report_axes ax3
WHERE ax3.axis_set_id =
rrc0.axis_set_id
AND ax3.axis_seq BETWEEN
rrc0.axis_seq_low AND
rrc0.axis_seq_high) rrc2
,(SELECT rrc0.axis_set_id
,rrc0.axis_seq
,rrc0.calculation_seq
,rrc0.operator
,ax3.axis_seq axis_seq_low
FROM (SELECT rrc.axis_set_id
,rrc.axis_seq
,rrc.calculation_seq
,rrc.operator
,decode(rrc.axis_seq_low,
NULL,
ax2.axis_seq,
rrc.axis_seq_low) axis_seq_low
,rrc.axis_seq_high
FROM rg.rg_report_calculations rrc
,rg.rg_report_axes ax2
WHERE rrc.axis_set_id =
ax2.axis_set_id(+)
AND rrc.axis_name_low =
ax2.axis_name(+)) rrc0
,rg.rg_report_axes ax3
WHERE ax3.axis_set_id =
rrc0.axis_set_id
AND ax3.axis_seq BETWEEN
rrc0.axis_seq_low AND
rrc0.axis_seq_high) rrc3
WHERE rrc2.axis_set_id = rrc3.axis_set_id(+)
AND rrc2.axis_seq_low = rrc3.axis_seq(+)) rrc5
WHERE rrc4.axis_set_id = rrc5.axis_set_id(+)
AND rrc4.axis_seq_low = rrc5.axis_seq(+)) rrc6
WHERE rrc6.axis_set_id = rra3.axis_set_id(+)
AND rrc6.axis_seq_low = rra3.axis_seq(+)) a
GROUP BY a.axis_set_id
,a.axis_seq) b
,(SELECT a.axis_set_id
,a.axis_seq
,SUM(decode(a.operation_sign,
'+',
a.year_begin_balance,
'-',
-a.year_begin_balance,
a.year_begin_balance)) year_begin_balance
,SUM(decode(a.operation_sign,
'+',
a.period_end_balance,
'-',
-a.period_end_balance,
a.period_end_balance)) period_end_balance
FROM (SELECT gcc.code_combination_id account_id
,gcc.summary_flag summary_flag
,rra2.range_mode summary
,rra2.axis_set_id
,rra2.axis_seq
,rra2.sign operation_sign
,gcc.segment1 || '.' || gcc.segment2 || '.' ||
gcc.segment3 || '.' || gcc.segment4 || '.' ||
gcc.segment5 || '.' || gcc.segment6 user_account
,gb.period_name period_name
,nvl(gb.begin_balance_dr,
0) + nvl(gb.period_net_dr,
0) - nvl(gb.begin_balance_cr,
0) -
nvl(gb.period_net_cr,
0) period_end_balance
,(SELECT SUM(nvl(gb1.begin_balance_dr,
0) - nvl(gb1.begin_balance_cr,
0)) year_begin_balance
FROM gl.gl_balances gb1
WHERE gb1.period_year = gb.period_year
AND gb1.period_num = 1
AND gb1.currency_code = gb.currency_code
AND gb1.code_combination_id =
gb.code_combination_id) year_begin_balance
FROM gl.gl_balances gb
,gl.gl_code_combinations gcc
,(SELECT rra.axis_set_id
,rra.axis_seq
,rra.sign
,rra.range_mode
,rra.segment1_low
,rra.segment1_high
,rra.segment2_low
,rra.segment2_high
,rra.segment3_low
,rra.segment3_high
,rra.segment4_low
,rra.segment4_high
,rra.segment5_low
,rra.segment5_high
,rra.segment6_low
,rra.segment6_high
,rra.segment7_low
,rra.segment7_high
,rra.segment8_low
,rra.segment8_high
,rra.segment9_low
,rra.segment9_high
FROM rg.rg_report_axis_contents rra
WHERE rra.axis_set_id = v_row_set_id) rra2
WHERE gb.code_combination_id = gcc.code_combination_id
--and gb.currency_code = 'CNY'
AND gb.actual_flag = 'A'
AND gb.period_name = v_period_name
AND gb.ledger_id = v_ledger_id
AND gcc.segment1 = v_legal_entity
AND gcc.segment2 BETWEEN
nvl(rra2.segment2_low,
wk_segment2_min) AND
nvl(rra2.segment2_high,
wk_segment2_max)
AND gcc.segment3 BETWEEN
nvl(rra2.segment3_low,
wk_segment3_min) AND
nvl(rra2.segment3_high,
wk_segment3_max)
AND gcc.segment4 BETWEEN
nvl(rra2.segment4_low,
wk_segment4_min) AND
nvl(rra2.segment4_high,
wk_segment4_max)
AND gcc.segment5 BETWEEN
nvl(rra2.segment5_low,
wk_segment5_min) AND
nvl(rra2.segment5_high,
wk_segment5_max)
AND gcc.segment6 BETWEEN
nvl(rra2.segment6_low,
wk_segment6_min) AND
nvl(rra2.segment6_high,
wk_segment6_max)
AND gcc.segment7 BETWEEN
nvl(rra2.segment7_low,
wk_segment7_min) AND
nvl(rra2.segment7_high,
wk_segment7_max)
AND gcc.segment8 BETWEEN
nvl(rra2.segment8_low,
wk_segment8_min) AND
nvl(rra2.segment8_high,
wk_segment8_max)
AND gcc.segment9 BETWEEN
nvl(rra2.segment9_low,
wk_segment9_min) AND
nvl(rra2.segment9_high,
wk_segment9_max)
AND gcc.summary_flag = rra2.range_mode) a
GROUP BY a.axis_set_id
,a.axis_seq) rra4
,rg.rg_report_axes ax
,rg.rg_report_axis_sets axs
WHERE ax.axis_set_id = rra4.axis_set_id(+)
AND ax.axis_seq = rra4.axis_seq(+)
AND ax.axis_set_id = b.axis_set_id(+)
AND ax.axis_seq = b.axis_seq(+)
AND ax.axis_set_id = axs.axis_set_id
AND axs.axis_set_type = 'R'
AND axs.axis_set_id = v_row_set_id
ORDER BY ax.axis_seq ASC;
Ledger的COA定义:
CURSOR cur_segment_low_high(v_ledger_id NUMBER) IS
SELECT fifs.application_column_name
,MIN(a.flex_value) AS min_value
,MAX(a.flex_value) AS max_value
FROM gl_ledgers led
,fnd_id_flex_structures fifs2
,fnd_id_flex_segments fifs
,fnd_flex_values a
WHERE led.ledger_id = v_ledger_id
AND led.chart_of_accounts_id = fifs2.id_flex_num
AND fifs2.application_id = 101
AND fifs2.id_flex_code = 'GL#'
AND fifs2.application_id = fifs.application_id
AND fifs2.id_flex_code = fifs.id_flex_code
AND fifs2.id_flex_num = fifs.id_flex_num
AND fifs.flex_value_set_id = a.flex_value_set_id
GROUP BY led.chart_of_accounts_id
,fifs.application_column_name;
3,关于年初数,期末数等Column的计算
FSG报表中的数据来源是GL_BALANCES表,这个表中begin_balance_dr和begin_balance_cr表示期初值,而period_net_dr和period_net_cr是期间发生的值。period_year是会计期间所在年,period_num可表示所在月份。
1) 年初数对应的正是会计期间所在年份的period_num=1的时候,begin_balance_dr-begin_balance_cr的合计值。
2) 期末数就是begin_balance_dr+begin_balance_dr-begin_balance_cr-begin_balance_cr的合计值。
其它Column,像期初数的计算方法类似推就可以了。
4,iReport开发报表
在数据库中定义好临时表,分成两部分,左边是资产,右边是负债,这样SQL取出来的一条数据正好和资产负债表的一行对应。
表中数据Sample如下:
ROW_NAME1 | LINE_NO1 | FY_START_ACTUAL1 | YTD_ACTUAL1 | ROW_NAME2 | LINE_NO2 | FY_START_ACTUAL2 | YTD_ACTUAL2 | CORPARATION | ROW_SEQ | REPORT_DATE | REQUEST_ID | CREATED_BY | CREATION_DATE |
流动资产: | 1 | 流动负债: | 36 | 有限公司 | 1 | 2012年12月31日 | 608047 | 1931 | 1/28/2013 12:15 | ||||
货币资金 | 2 | 1000000 | 21010000 | 短期借款 | 37 | -210000 | 有限公司 | 2 | 2012年12月31日 | 608047 | 1931 | 1/28/2013 12:15 | |
3 | 38 | 有限公司 | 3 | 2012年12月31日 | 608047 | 1931 | 1/28/2013 12:15 | ||||||
应收票据 | 4 | 10000000 | 应付票据 | 39 | 30000 | 有限公司 | 4 | 2012年12月31日 | 608047 | 1931 | 1/28/2013 12:15 |
这样表中已经将数据保存好,iReport中的工作就非常简单了,下面就不介绍了。
资产负债表:
http://baike.baidu.com/view/16173.htm
http://www.dongao.com/zjzcgl/fdzl/201210/86836.shtml
http://www.itpub.net/thread-1163664-1-1.html