/*
BEGIN
MO_GLOBAL.INIT('AR');
END; */
select je_line_num,
ae_header_id,
doc_sequence_value,
accounting_date,
description,
accounted_dr,
accounted_cr,
entered_dr,
entered_cr,
currency_code,
code_accounts,
sourcedescription,
startdate,
enddate
from (
select distinct xah.ae_header_id as ae_header_id,
xal.ae_line_num as je_line_num,
xah.doc_sequence_value as doc_sequence_value,
xal.accounting_date as accounting_date,
null as description,
xal.accounted_dr as accounted_dr,
xal.accounted_cr as accounted_cr,
xal.entered_dr as entered_dr,
xal.entered_cr as entered_cr,
xal.currency_code as currency_code,
substr(gcc_ori.concatenated_segments,
instr(gcc_ori.concatenated_segments, ' - ' , 1 , 2 ) + 1 ,
instr(gcc_ori.concatenated_segments, ' - ' , 1 , 2 )) as code_accounts,
substr(fa_rx_flex_pkg.get_description( 101 ,
' GL# ' ,
gcc_ori.chart_of_accounts_id,
' ALL ' ,
gcc_ori.concatenated_segments),
instr(fa_rx_flex_pkg.get_description( 101 ,
' GL# ' ,
gcc_ori.chart_of_accounts_id,
' ALL ' ,
gcc_ori.concatenated_segments),
' - ' ,
1 ,
2 ) + 1 ,
instr(fa_rx_flex_pkg.get_description( 101 ,
' GL# ' ,
gcc_ori.chart_of_accounts_id,
' ALL ' ,
gcc_ori.concatenated_segments),
' - ' ,
3 ,
3 )) as sourcedescription,
to_char(:begindate, ' yyyy-mm-dd ' ) as startdate,
to_char(:enddate, ' yyyy-mm-dd ' ) as enddate
from xla_transaction_entities xte,
xla_entity_types_tl xett,
xle_entity_profiles le,
xla_events xe,
xla_event_types_tl xent,
xla_ae_headers xah,
xla_ae_lines xal,
xla_lookups xlp,
xla_distribution_links xdl,
gl_code_combinations_kfv gcc_ori
where 1 = 1
and xte.entity_id = xe.entity_id
and xte.application_id = xe.application_id
and xte.legal_entity_id = le.legal_entity_id( + )
and xah.event_id = xe.event_id
and xah.application_id = xe.application_id( + )
and xent.event_type_code = xe.event_type_code
and xent.application_id( + ) = xe.application_id
and xent.language = ' ZHS '
and xah.ae_header_id( + ) = xal.ae_header_id
and xlp.lookup_type( + ) = ' XLA_ACCOUNTING_CLASS '
and xlp.lookup_code( + ) = xal.accounting_class_code
and xal.ae_header_id = xdl.ae_header_id
and xal.ae_line_num = xdl.ae_line_num( + )
and xal.application_id = xdl.application_id( + )
and xett.entity_code = xte.entity_code
and xett.application_id = xte.application_id
and xal.code_combination_id = gcc_ori.code_combination_id
and xett.language = ' ZHS '
and substr(gcc_ori.concatenated_segments,
instr(gcc_ori.concatenated_segments, ' - ' , 1 , 2 ) + 1 ,
instr(gcc_ori.concatenated_segments, ' - ' , 1 , 2 )) =
nvl(:bank,
substr(gcc_ori.concatenated_segments,
instr(gcc_ori.concatenated_segments, ' - ' , 1 , 2 ) + 1 ,
instr(gcc_ori.concatenated_segments, ' - ' , 1 , 2 )))
-- and xah.period_name = 'Jul-10'
and to_char(xal.accounting_date, ' yyyy-mm-dd ' ) between
to_char(:begindate, ' yyyy-mm-dd ' ) and
to_char(:enddate, ' yyyy-mm-dd ' )
union all
select headers.je_header_id as ae_header_id,
lines.je_line_num as je_line_num,
headers.doc_sequence_value as doc_sequence_value,
headers.default_effective_date as accounting_date,
lines.description as description,
lines.accounted_dr as accounted_dr,
lines.accounted_cr as accounted_cr,
lines.entered_dr as entered_dr,
lines.entered_cr as entered_cr,
headers.currency_code as currency_code,
lines.segment3 as code_accounts,
substr(fa_rx_flex_pkg.get_description( 101 ,
' GL# ' ,
gcc_ori.chart_of_accounts_id,
' ALL ' ,
gcc_ori.concatenated_segments),
instr(fa_rx_flex_pkg.get_description( 101 ,
' GL# ' ,
gcc_ori.chart_of_accounts_id,
' ALL ' ,
gcc_ori.concatenated_segments),
' - ' ,
1 ,
2 ) + 1 ,
instr(fa_rx_flex_pkg.get_description( 101 ,
' GL# ' ,
gcc_ori.chart_of_accounts_id,
' ALL ' ,
gcc_ori.concatenated_segments),
' - ' ,
3 ,
3 )) as sourcedescription,
to_char(:begindate, ' yyyy-mm-dd ' ) as startdate,
to_char(:enddate, ' yyyy-mm-dd ' ) as enddate
from gl_je_headers_v headers,
gl_je_lines_v lines,
gl_code_combinations_kfv gcc_ori
where headers.je_header_id = lines.je_header_id
-- and headers.batch_period_name_qry = 'Jul-10'
and headers.je_category = ' 1 '
and lines.segment3 = nvl(:bank, lines.segment3)
and lines.code_combination_id = gcc_ori.code_combination_id
and to_char(headers.default_effective_date, ' yyyy-mm-dd ' ) between
to_char(:begindate, ' yyyy-mm-dd ' ) and
to_char(:enddate, ' yyyy-mm-dd ' )
)
order by accounting_date,
doc_sequence_value
/* 账户余额分三部分,一部分是GL的手工帐,另外是由xla表得到的ap和ar的数据.由三部分的本币借贷方金额计算得出帐户余额;计算公式为:上期余额+借方-贷方=本期余额。
(上期余额由开帐金额得出) */
MO_GLOBAL.INIT('AR');
END; */
select je_line_num,
ae_header_id,
doc_sequence_value,
accounting_date,
description,
accounted_dr,
accounted_cr,
entered_dr,
entered_cr,
currency_code,
code_accounts,
sourcedescription,
startdate,
enddate
from (
select distinct xah.ae_header_id as ae_header_id,
xal.ae_line_num as je_line_num,
xah.doc_sequence_value as doc_sequence_value,
xal.accounting_date as accounting_date,
null as description,
xal.accounted_dr as accounted_dr,
xal.accounted_cr as accounted_cr,
xal.entered_dr as entered_dr,
xal.entered_cr as entered_cr,
xal.currency_code as currency_code,
substr(gcc_ori.concatenated_segments,
instr(gcc_ori.concatenated_segments, ' - ' , 1 , 2 ) + 1 ,
instr(gcc_ori.concatenated_segments, ' - ' , 1 , 2 )) as code_accounts,
substr(fa_rx_flex_pkg.get_description( 101 ,
' GL# ' ,
gcc_ori.chart_of_accounts_id,
' ALL ' ,
gcc_ori.concatenated_segments),
instr(fa_rx_flex_pkg.get_description( 101 ,
' GL# ' ,
gcc_ori.chart_of_accounts_id,
' ALL ' ,
gcc_ori.concatenated_segments),
' - ' ,
1 ,
2 ) + 1 ,
instr(fa_rx_flex_pkg.get_description( 101 ,
' GL# ' ,
gcc_ori.chart_of_accounts_id,
' ALL ' ,
gcc_ori.concatenated_segments),
' - ' ,
3 ,
3 )) as sourcedescription,
to_char(:begindate, ' yyyy-mm-dd ' ) as startdate,
to_char(:enddate, ' yyyy-mm-dd ' ) as enddate
from xla_transaction_entities xte,
xla_entity_types_tl xett,
xle_entity_profiles le,
xla_events xe,
xla_event_types_tl xent,
xla_ae_headers xah,
xla_ae_lines xal,
xla_lookups xlp,
xla_distribution_links xdl,
gl_code_combinations_kfv gcc_ori
where 1 = 1
and xte.entity_id = xe.entity_id
and xte.application_id = xe.application_id
and xte.legal_entity_id = le.legal_entity_id( + )
and xah.event_id = xe.event_id
and xah.application_id = xe.application_id( + )
and xent.event_type_code = xe.event_type_code
and xent.application_id( + ) = xe.application_id
and xent.language = ' ZHS '
and xah.ae_header_id( + ) = xal.ae_header_id
and xlp.lookup_type( + ) = ' XLA_ACCOUNTING_CLASS '
and xlp.lookup_code( + ) = xal.accounting_class_code
and xal.ae_header_id = xdl.ae_header_id
and xal.ae_line_num = xdl.ae_line_num( + )
and xal.application_id = xdl.application_id( + )
and xett.entity_code = xte.entity_code
and xett.application_id = xte.application_id
and xal.code_combination_id = gcc_ori.code_combination_id
and xett.language = ' ZHS '
and substr(gcc_ori.concatenated_segments,
instr(gcc_ori.concatenated_segments, ' - ' , 1 , 2 ) + 1 ,
instr(gcc_ori.concatenated_segments, ' - ' , 1 , 2 )) =
nvl(:bank,
substr(gcc_ori.concatenated_segments,
instr(gcc_ori.concatenated_segments, ' - ' , 1 , 2 ) + 1 ,
instr(gcc_ori.concatenated_segments, ' - ' , 1 , 2 )))
-- and xah.period_name = 'Jul-10'
and to_char(xal.accounting_date, ' yyyy-mm-dd ' ) between
to_char(:begindate, ' yyyy-mm-dd ' ) and
to_char(:enddate, ' yyyy-mm-dd ' )
union all
select headers.je_header_id as ae_header_id,
lines.je_line_num as je_line_num,
headers.doc_sequence_value as doc_sequence_value,
headers.default_effective_date as accounting_date,
lines.description as description,
lines.accounted_dr as accounted_dr,
lines.accounted_cr as accounted_cr,
lines.entered_dr as entered_dr,
lines.entered_cr as entered_cr,
headers.currency_code as currency_code,
lines.segment3 as code_accounts,
substr(fa_rx_flex_pkg.get_description( 101 ,
' GL# ' ,
gcc_ori.chart_of_accounts_id,
' ALL ' ,
gcc_ori.concatenated_segments),
instr(fa_rx_flex_pkg.get_description( 101 ,
' GL# ' ,
gcc_ori.chart_of_accounts_id,
' ALL ' ,
gcc_ori.concatenated_segments),
' - ' ,
1 ,
2 ) + 1 ,
instr(fa_rx_flex_pkg.get_description( 101 ,
' GL# ' ,
gcc_ori.chart_of_accounts_id,
' ALL ' ,
gcc_ori.concatenated_segments),
' - ' ,
3 ,
3 )) as sourcedescription,
to_char(:begindate, ' yyyy-mm-dd ' ) as startdate,
to_char(:enddate, ' yyyy-mm-dd ' ) as enddate
from gl_je_headers_v headers,
gl_je_lines_v lines,
gl_code_combinations_kfv gcc_ori
where headers.je_header_id = lines.je_header_id
-- and headers.batch_period_name_qry = 'Jul-10'
and headers.je_category = ' 1 '
and lines.segment3 = nvl(:bank, lines.segment3)
and lines.code_combination_id = gcc_ori.code_combination_id
and to_char(headers.default_effective_date, ' yyyy-mm-dd ' ) between
to_char(:begindate, ' yyyy-mm-dd ' ) and
to_char(:enddate, ' yyyy-mm-dd ' )
)
order by accounting_date,
doc_sequence_value
/* 账户余额分三部分,一部分是GL的手工帐,另外是由xla表得到的ap和ar的数据.由三部分的本币借贷方金额计算得出帐户余额;计算公式为:上期余额+借方-贷方=本期余额。
(上期余额由开帐金额得出) */
-- 创建临时表
create table BALANCESTEMP
(
je_line_num number ,
headerID number ( 38 ),
dr number ,
cr number ,
BALANCE VARCHAR2 ( 4000 ) not null ,
BANKNAME VARCHAR2 ( 4000 ) not null ,
MM DATE not null ,
ID NUMBER not null
)
create or replace function gab_func
(
line_num number ,
ae_header_id number ,
dr number ,
cr number ,
startdate date,
enddate date,
accounting_date date,
brankacct varchar2
) return char is
pragma autonomous_transaction;
bltablecut number ( 38 );
lstablecut number ( 38 );
bl varchar ( 4000 );
str number ;
cf varchar ( 4000 );
x number ;
ct number ;
jishu number : = 0 ;
c number ;
c1 number ;
c2 number ;
enbl number ;
balance number ;
begin
/* *查询余额表 2010-06-01至用户参数开始日期前的所有数据* */
select count ( * )
into bltablecut
from ( select distinct xal.accounting_date as accounting_date,
xal.ae_header_id as a,
xah.doc_sequence_value as doc_sequence_value,
xal.accounted_dr as accounted_dr,
xal.accounted_cr as accounted_cr,
substr(gcc_ori.concatenated_segments,
instr(gcc_ori.concatenated_segments,
' - ' ,
1 ,
2 ) + 1 ,
instr(gcc_ori.concatenated_segments,
' - ' ,
1 ,
2 )) as code_accounts
from xla_transaction_entities xte,
xla_entity_types_tl xett,
xle_entity_profiles le,
xla_events xe,
xla_event_types_tl xent,
xla_ae_headers xah,
xla_ae_lines xal,
xla_lookups xlp,
xla_distribution_links xdl,
gl_code_combinations_kfv gcc_ori
where 1 = 1
and xte.entity_id = xe.entity_id
and xte.application_id = xe.application_id
and xte.legal_entity_id = le.legal_entity_id( + )
and xah.event_id = xe.event_id
and xah.application_id = xe.application_id( + )
and xent.event_type_code = xe.event_type_code
and xent.application_id( + ) = xe.application_id
and xent.language = ' ZHS '
and xah.ae_header_id( + ) = xal.ae_header_id
and xlp.lookup_type( + ) = ' XLA_ACCOUNTING_CLASS '
and xlp.lookup_code( + ) = xal.accounting_class_code
and xal.ae_header_id = xdl.ae_header_id
and xal.ae_line_num = xdl.ae_line_num( + )
and xal.application_id = xdl.application_id( + )
and xett.entity_code = xte.entity_code
and xett.application_id = xte.application_id
and xal.code_combination_id = gcc_ori.code_combination_id
and xett.language = ' ZHS '
and substr(gcc_ori.concatenated_segments,
instr(gcc_ori.concatenated_segments, ' - ' , 1 , 2 ) + 1 ,
instr(gcc_ori.concatenated_segments, ' - ' , 1 , 2 )) =
nvl(brankacct,
substr(gcc_ori.concatenated_segments,
instr(gcc_ori.concatenated_segments, ' - ' , 1 , 2 ) + 1 ,
instr(gcc_ori.concatenated_segments, ' - ' , 1 , 2 )))
and to_char(xal.accounting_date, ' yyyy-mm-dd ' ) between
' 2010-06-30 ' and to_char(startdate - 1 , ' yyyy-mm-dd ' )
union all
select headers.default_effective_date as accounting_date,
headers.je_header_id as a,
headers.doc_sequence_value as doc_sequence_value,
lines.accounted_dr as accounted_dr,
lines.accounted_cr as accounted_cr,
lines.segment3
from gl_je_headers_v headers,
gl_je_lines_v lines,
gl_code_combinations_kfv gcc_ori
where headers.je_header_id = lines.je_header_id
and headers.je_category = ' 1 '
and lines.segment3 = nvl(brankacct, lines.segment3)
and lines.code_combination_id = gcc_ori.code_combination_id
and to_char(headers.default_effective_date, ' yyyy-mm-dd ' ) between
' 2010-06-30 ' and to_char(startdate - 1 , ' yyyy-mm-dd ' ))
order by accounting_date,
doc_sequence_value;
/* *查询2010-06-01至用户参数开始时间之间的数据*判断是否有余额 */
select count ( * )
into lstablecut
from balancestemp b1
where b1.bankname = brankacct
and b1.mm between to_date( ' 2010-6-30 ' , ' yyyy-mm-dd ' ) and
to_date(to_char(startdate - 1 , ' yyyy-mm-dd ' ), ' yyyy-mm-dd ' );
if to_char(startdate - 1 , ' yyyy-mm-dd ' ) = ' 2010-06-30 ' then
-- 判断用户参数开始日期是否为开帐日期
lstablecut : = lstablecut;
end if ;
if to_char(startdate - 1 , ' yyyy-mm-dd ' ) <> ' 2010-06-30 ' then
lstablecut : = lstablecut - 1 ;
end if ;
select count ( * )
into jishu
from balancestemp b
where mm =
to_date(to_char(accounting_date, ' yyyy-mm-dd ' ), ' yyyy-mm-dd ' ) -- 判断是否已经存在
and b.bankname = brankacct
and b.headerid = ae_header_id
and b.je_line_num = line_num;
dbms_output.put_line(lstablecut || ' :LStableCUTLStableCUT ' );
dbms_output.put_line(bltablecut || ' :BLtableCUTBLtableCUT ' );
if lstablecut = bltablecut then
-- 如果临时表科目总记录数与余额表记录数相等;则直接进行余额递减操作
dbms_output.put_line(jishu || ' :jishu ' );
if jishu <= 0 then
select max (id)
into x
from balancestemp
where mm <=
to_date(to_char(enddate, ' yyyy-mm-dd ' ), ' yyyy-mm-dd ' )
and bankname = brankacct;
select bt.balance into bl from balancestemp bt where bt.id = x;
str : = to_number(bl);
cf : = to_char( str + nvl(dr, 0 ) - nvl(cr, 0 ));
select max (id) into c from balancestemp;
c1 : = c + 1 ;
insert into balancestemp
(je_line_num, headerid, dr, cr, balance, mm, bankname, id)
values
(line_num,
ae_header_id,
dr,
cr,
cf,
accounting_date,
brankacct,
c1);
commit ;
return cf;
end if ;
end if ;
if lstablecut <> bltablecut then
-- 如果临时表科目总记录数与余额表记录数 不相等; 则将用户参数开始日期前的所有数据初始化
if jishu <= 0 then
enbl : = startbalance(startdate, brankacct);
select max (id)
into x
from balancestemp
where mm <=
to_date(to_char(enddate, ' yyyy-mm-dd ' ), ' yyyy-mm-dd ' )
and bankname = brankacct;
select bt.balance into bl from balancestemp bt where bt.id = x;
str : = to_number(bl);
cf : = to_char( str + nvl(dr, 0 ) - nvl(cr, 0 ));
select max (id) into c from balancestemp;
c1 : = c + 1 ;
insert into balancestemp
(je_line_num, headerid, dr, cr, balance, mm, bankname, id)
values
(line_num,
ae_header_id,
dr,
cr,
cf,
accounting_date,
brankacct,
c1);
commit ;
return cf;
end if ;
end if ;
return cf;
end ;
create or replace function startbalance
(
startdate date,
brankacct varchar2
) return char is
pragma autonomous_transaction;
bl varchar ( 4000 );
x number ;
str number ;
cf varchar ( 4000 );
c number ;
c1 number ;
c2 number ;
cut number ;
enbl number ;
begin
declare
cursor cc is
select ae_header_id,
doc_sequence_value,
je_line_num,
accounting_date,
accounted_dr,
accounted_cr,
entered_dr,
entered_cr,
code_accounts
from ( select distinct xal.accounting_date as accounting_date,
xah.doc_sequence_value as doc_sequence_value,
xal.ae_line_num as je_line_num,
xal.ae_header_id as ae_header_id,
xal.accounted_dr as accounted_dr,
xal.accounted_cr as accounted_cr,
xal.entered_dr as entered_dr,
xal.entered_cr as entered_cr,
substr(gcc_ori.concatenated_segments,
instr(gcc_ori.concatenated_segments,
' - ' ,
1 ,
2 ) + 1 ,
instr(gcc_ori.concatenated_segments,
' - ' ,
1 ,
2 )) as code_accounts
from xla_transaction_entities xte,
xla_entity_types_tl xett,
xle_entity_profiles le,
xla_events xe,
xla_event_types_tl xent,
xla_ae_headers xah,
xla_ae_lines xal,
xla_lookups xlp,
xla_distribution_links xdl,
gl_code_combinations_kfv gcc_ori
where 1 = 1
and xte.entity_id = xe.entity_id
and xte.application_id = xe.application_id
and xte.legal_entity_id = le.legal_entity_id( + )
and xah.event_id = xe.event_id
and xah.application_id = xe.application_id( + )
and xent.event_type_code = xe.event_type_code
and xent.application_id( + ) = xe.application_id
and xent.language = ' ZHS '
and xah.ae_header_id( + ) = xal.ae_header_id
and xlp.lookup_type( + ) = ' XLA_ACCOUNTING_CLASS '
and xlp.lookup_code( + ) = xal.accounting_class_code
and xal.ae_header_id = xdl.ae_header_id
and xal.ae_line_num = xdl.ae_line_num( + )
and xal.application_id = xdl.application_id( + )
and xett.entity_code = xte.entity_code
and xett.application_id = xte.application_id
and xal.code_combination_id =
gcc_ori.code_combination_id
and xett.language = ' ZHS '
and substr(gcc_ori.concatenated_segments,
instr(gcc_ori.concatenated_segments,
' - ' ,
1 ,
2 ) + 1 ,
instr(gcc_ori.concatenated_segments,
' - ' ,
1 ,
2 )) =
nvl(brankacct,
substr(gcc_ori.concatenated_segments,
instr(gcc_ori.concatenated_segments,
' - ' ,
1 ,
2 ) + 1 ,
instr(gcc_ori.concatenated_segments,
' - ' ,
1 ,
2 )))
and to_char(xal.accounting_date, ' yyyy-mm-dd ' ) between
' 2010-06-30 ' and
to_char(startdate - 1 , ' yyyy-mm-dd ' )
union all
select headers.default_effective_date as accounting_date,
headers.doc_sequence_value as doc_sequence_value,
lines.je_line_num as je_line_num,
headers.je_header_id as ae_header_id,
lines.accounted_dr as accounted_dr,
lines.accounted_cr as accounted_cr,
lines.entered_dr as entered_dr,
lines.entered_cr as entered_cr,
lines.segment3
from gl_je_headers_v headers,
gl_je_lines_v lines,
gl_code_combinations_kfv gcc_ori
where headers.je_header_id = lines.je_header_id
and headers.je_category = ' 1 '
and lines.segment3 = nvl(brankacct, lines.segment3)
and lines.code_combination_id =
gcc_ori.code_combination_id
and to_char(headers.default_effective_date,
' yyyy-mm-dd ' ) between ' 2010-06-30 ' and
to_char(startdate - 1 , ' yyyy-mm-dd ' ))
order by accounting_date,
doc_sequence_value;
begin
for i in cc
loop
select max (id)
into x
from balancestemp
where mm <
to_date(to_char(startdate, ' yyyy-mm-dd ' ), ' yyyy-mm-dd ' )
and bankname = brankacct;
select bt.balance into bl from balancestemp bt where bt.id = x;
str : = to_number(bl);
select count ( * )
into cut
from balancestemp
where mm = to_date(to_char(i.accounting_date, ' yyyy-mm-dd ' ),
' yyyy-mm-dd ' )
and bankname = brankacct
and je_line_num = i.je_line_num
and headerid = i.ae_header_id;
if cut <= 0 then
cf : = to_char( str + nvl(i.accounted_dr, 0 ) -
nvl(i.accounted_cr, 0 ));
select max (id) into c from balancestemp;
c1 : = c + 1 ;
insert into balancestemp
(je_line_num,
headerid,
dr,
cr,
balance,
mm,
bankname,
id)
values
(i.je_line_num,
i.ae_header_id,
i.accounted_dr,
i.accounted_cr,
cf,
i.accounting_date,
brankacct,
c1);
commit ;
end if ;
end loop;
return cf;
end ;
end ;
-- 调用方法