Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Subprogram or cursor '' reference is out of scope

Tell me how I can refer to the column when processing the current table. I need to do calculations with already calculated fields, referring to a table field through a pseudonym does not help, perhaps I am missing something else, but I will be glad if someone points out my stupidity to me. I don’t see a solution in a simple place 🙁

Many thanks!

The problem lies in this place PLS-00225: subprogram or cursor ‘F’ reference is out of scope:

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

then f.balance_in_rub - f.turn_cre_rub + f.turn_deb_rub

Body pck:

create or replace package body dma.fill_f101_round_f is
  procedure Log
  ( i_message                      in varchar2
  ) 
  is
  begin
    dma.logger.writeLog('[' || c_MartName || '] ' || i_message);
  end;
  ----------------------------------------------------------------------------------------------------

  ----------------------------------------------------------------------------------------------------
  procedure fill
  ( i_OnDate                       in date
  )
  is
  begin

    Log( '[BEGIN] fill(i_OnDate => date ''' 
         || to_char(i_OnDate, 'yyyy-mm-dd') 
         || ''');'
       );
    
    Log( 'delete on_date = ' 
         || to_char(i_OnDate, 'yyyy-mm-dd')
       );

    delete
      from dma.DM_F101_ROUND_F f
     where trunc(i_OnDate, 'mm')  =  from_date
       and last_day(i_OnDate)    =  to_date;
   
    Log('insert');
   
    insert 
      into dma.dm_f101_round_f f
           ( from_date         
           , to_date           
           , chapter           
           , ledger_account    
           , characteristic    
           , balance_in_rub    
           , balance_in_val    
           , balance_in_total  
           , turn_deb_rub      
           , turn_deb_val      
           , turn_deb_total    
           , turn_cre_rub      
           , turn_cre_val      
           , turn_cre_total    
           , balance_out_rub  
           , balance_out_val   
           , balance_out_total 
           )
    select trunc(i_OnDate, 'mm')                 as from_date,
           last_day(i_OnDate)                    as to_date,
           s.chapter                             as chapter,
           substr(acc_d.account_number, 1, 5)    as ledger_account,
           acc_d.char_type                       as characteristic,
           -- RUB balance
           sum( case 
                  when cur.currency_code in ('643', '810')
                  then b.balance_out
                  else 0
                 end
              )                                  as balance_in_rub,
          -- VAL balance converted to rub
          sum( case 
                 when cur.currency_code not in ('643', '810')
                 then b.balance_out * exch_r.reduced_cource
                 else 0
                end
             )                                   as balance_in_val,
          -- Total: RUB balance + VAL converted to rub
          sum(  case 
                 when cur.currency_code in ('643', '810')
                 then b.balance_out
                 else b.balance_out * exch_r.reduced_cource
               end
             )                                   as balance_in_total  ,
           -- RUB debet turnover
           sum(case 
                 when cur.currency_code in ('643', '810')
                 then at.debet_amount_rub
                 else 0
               end
           )                                     as turn_deb_rub,
           -- VAL debet turnover converted
           sum(case 
                 when cur.currency_code not in ('643', '810')
                 then at.debet_amount_rub
                 else 0
               end
           )                                     as turn_deb_val,
           -- SUM = RUB debet turnover + VAL debet turnover converted
           sum(at.debet_amount_rub)              as turn_deb_total,
           -- RUB credit turnover
           sum(case 
                 when cur.currency_code in ('643', '810')
                 then at.credit_amount_rub
                 else 0
               end
              )                                  as turn_cre_rub,
           -- VAL credit turnover converted
           sum(case 
                 when cur.currency_code not in ('643', '810')
                 then at.credit_amount_rub
                 else 0
               end
              )                                  as turn_cre_val,
           -- SUM = RUB credit turnover + VAL credit turnover converted
           sum(at.credit_amount_rub)             as turn_cre_total,
           
           sum( case 
                 when cur.currency_code     in ('643','810') and acc_d.char_type = 'A'
                 then f.balance_in_rub - f.turn_cre_rub + f.turn_deb_rub
                 
                 when cur.currency_code     in ('643','810') and acc_d.char_type = 'P'
                 then f.balance_in_rub - f.turn_cre_rub + f.turn_deb_rub
                 else 0
                end
             )                                                          as balance_out_rub,
          sum(  case 
                 when cur.currency_code not in ('643', '810') and acc_d.char_type = 'A'
                 then f.balance_in_val - f.turn_cre_val + f.turn_deb_val
                 
                 when cur.currency_code not in ('643', '810') and acc_d.char_type = 'P'
                 then f.balance_in_val + f.turn_cre_val - f.turn_deb_val
                 else 0
               end
             )                                                          as balance_out_val,
           sum (f.balance_out_val  + f.balance_out_rub)                 as balance_out_total 
      from ds.md_ledger_account_s s
      join ds.md_account_d acc_d
        on substr(acc_d.account_number, 1, 5) = s.ledger_account
      join ds.md_currency_d cur
        on cur.currency_rk = acc_d.currency_rk
      left 
      join ds.ft_balance_f b
        on b.account_rk = acc_d.account_rk
       and b.on_date  = trunc(i_OnDate, 'mm') - 1
      left 
      join ds.md_exchange_rate_d exch_r
        on exch_r.currency_rk = acc_d.currency_rk
       and i_OnDate between exch_r.data_actual_date and exch_r.data_actual_end_date
      left 
      join dma.dm_account_turnover_f at
        on at.account_rk = acc_d.account_rk
       and at.on_date between trunc(i_OnDate, 'mm') and last_day(i_Ondate)
     where i_OnDate between s.start_date and s.end_date
       and i_OnDate between acc_d.data_actual_date and acc_d.data_actual_end_date
       and i_OnDate between cur.data_actual_date and cur.data_actual_end_date
     group by s.chapter,
           substr(acc_d.account_number, 1, 5),
           acc_d.char_type;

    Log('[END] inserted ' || to_char(sql%rowcount) || ' rows.');

    commit;
    
  end;
  ----------------------------------------------------------------------------------------------------

end fill_f101_round_f;
/ ```

>Solution :

This is f:

into dma.dm_f101_round_f f 
                         ^
                      here it is

f.balance_in_rub is this:

       -- RUB balance
       sum( case 
              when cur.currency_code in ('643', '810')
              then b.balance_out
              else 0
             end
          )                                  as balance_in_rub,
                                                --------------
                                                here it is

You can’t reference a column that’s being inserted simply by naming it; it is unknown in this context. If you want to perform some calculations, you’ll have to do that with the "source" itself, i.e.

then f.balance_in_rub - f.turn_cre_rub + f.turn_deb_rub

would become

then
       sum(case 
              when cur.currency_code in ('643', '810')
              then b.balance_out
              else 0
             end
          ) -
       sum(case 
             when cur.currency_code in ('643', '810')
             then at.credit_amount_rub
             else 0
           end
          ) +
       sum(case 
             when cur.currency_code in ('643', '810')
             then at.debet_amount_rub
             else 0
           end
       )

i.e. you’d re-use all that code. Not too pretty, I’m afraid.

Another option is to do insert first, update next as you’d then just

update dm_f101_round_f f set
  f.balance_out_rub = f.balance_in_rub - f.turn_cre_rub + f.turn_deb_rub
where ...
Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading