账户余额查询SQL(分类帐)

/* 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的数据.由三部分的本币借贷方金额计算得出帐户余额;计算公式为:上期余额+借方-贷方=本期余额。
(上期余额由开帐金额得出)
*/


-- 创建临时表
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 ;

    
-- 调用方法





转载于:https://www.cnblogs.com/benio/archive/2010/12/31/1923540.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值