EBS中二次開發FSG報表2(SQL)

環境: 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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章