检查所有资产的剩余折旧年限

本文介绍了一个复杂的Oracle PL/SQL过程,用于计算固定资产的剩余折旧年限及月份。该过程涉及多个表的连接查询以及日期和期间计算逻辑,适用于财务管理系统中资产折旧的精确计算。

DECLARE
  CURSOR c_asset IS
    SELECT fab.asset_id, fab.asset_number, fb.book_type_code
      FROM fa_additions_b fab, fa_books fb
     WHERE fab.asset_id = fb.asset_id
       AND fb.date_ineffective IS NULL
       AND fb.transaction_header_id_out IS NULL
       AND fb.period_counter_fully_retired IS NULL;

  l_prorate_date DATE;
  --l_book_type_code varchar2(20);
  --l_asset_id number;
  l_remaining_life_years  NUMBER;
  l_remaining_life_months NUMBER;
  l_min_cpod              DATE;
  l_num_per_fiscal_year   NUMBER;
  dummy_num               NUMBER;
BEGIN

  FOR i IN c_asset LOOP
 
    --get prorate date
    SELECT /*adjusted_recoverable_cost, */
     prorate_date
      INTO /*:Inquiry_books.adjusted_recoverable_cost, */ l_prorate_date
      FROM fa_books
     WHERE book_type_code = i.book_type_code
       AND asset_id = i.asset_id
       AND date_ineffective IS NULL;
 
    SELECT MIN(calendar_period_open_date)
      INTO l_min_cpod
      FROM fa_deprn_periods
     WHERE book_type_code = i.book_type_code;
 
    --get fiscal year
    SELECT number_per_fiscal_year
      INTO l_num_per_fiscal_year
      FROM fa_calendar_types
     WHERE calendar_type =
           (SELECT decode(fab.conversion_date,
                          NULL,
                          fabc.deprn_calendar,
                          fabc.prorate_calendar)
              FROM fa_book_controls fabc, fa_books fab
             WHERE fabc.book_type_code = i.book_type_code
               AND fab.asset_id = i.asset_id
               AND fab.book_type_code = fabc.book_type_code
               AND fab.transaction_header_id_out IS NULL);
 
    IF (l_num_per_fiscal_year = 12) THEN
   
      IF l_prorate_date < l_min_cpod THEN
        SELECT decode(fab.conversion_date,
                      NULL,
                      fab.life_in_months -
                      ((to_number(to_char(fcp1.end_date, 'YYYY')) * 12 +
                      fcp1.period_num) - (to_number(to_char(fcp2.end_date, 'YYYY')) * 12 +
                      fcp2.period_num)),
                      fab.life_in_months -
                      ((to_number(to_char(fcp1.end_date, 'YYYY')) * 12 +
                      fcp1.period_num) - (to_number(to_char(fcp3.end_date, 'YYYY')) * 12 +
                      fcp3.period_num)))
          INTO dummy_num
          FROM fa_books            fab,
               fa_calendar_periods fcp1, -- open
               fa_calendar_periods fcp2, -- prorate
               fa_calendar_periods fcp3, -- deprn_start
               fa_book_controls    fabc,
               fa_deprn_periods    fdp
         WHERE fab.asset_id = i.asset_id
           AND fab.book_type_code = i.book_type_code
           AND fab.transaction_header_id_out IS NULL
           AND fabc.book_type_code = fab.book_type_code
           AND fdp.period_counter =
               (SELECT MAX(dp.period_counter)
                  FROM fa_deprn_periods dp
                 WHERE dp.book_type_code = i.book_type_code)
           AND fdp.book_type_code = fab.book_type_code
           AND fcp1.calendar_type = decode(fab.conversion_date,
                                           NULL,
                                           fabc.prorate_calendar,
                                           fabc.deprn_calendar)
           AND fcp1.start_date = fdp.calendar_period_open_date
           AND fcp2.calendar_type = fabc.prorate_calendar
           AND fab.prorate_date BETWEEN fcp2.start_date AND fcp2.end_date
           AND fcp3.calendar_type = fabc.deprn_calendar
           AND fab.deprn_start_date BETWEEN fcp3.start_date AND fcp3.end_date;
     
      ELSE
     
        SELECT decode(fab.conversion_date,
                      NULL,
                      fab.life_in_months -
                      (fdp1.period_counter - fdp2.period_counter),
                      fab.life_in_months -
                      (fdp1.period_counter - fdp3.period_counter))
          INTO dummy_num
          FROM fa_books         fab,
               fa_deprn_periods fdp1, -- open
               fa_deprn_periods fdp2, -- prorate
               fa_deprn_periods fdp3 -- deprn_start
         WHERE fab.asset_id = i.asset_id
           AND fab.book_type_code = i.book_type_code
           AND fab.transaction_header_id_out IS NULL
           AND fab.book_type_code = fdp1.book_type_code
           AND fdp1.period_counter =
               (SELECT MAX(dp.period_counter)
                  FROM fa_deprn_periods dp
                 WHERE dp.book_type_code = i.book_type_code)
           AND fab.book_type_code = fdp2.book_type_code
           AND (fab.prorate_date BETWEEN fdp2.calendar_period_open_date AND
               fdp2.calendar_period_close_date OR
               (fab.prorate_date > fdp2.calendar_period_close_date AND
               fdp2.period_close_date IS NULL))
           AND fab.book_type_code = fdp3.book_type_code
           AND fab.deprn_start_date BETWEEN fdp3.calendar_period_open_date AND
               fdp3.calendar_period_close_date;
      END IF;
   
    ELSE
   
      SELECT decode(fab.conversion_date,
                    NULL,
                    fab.life_in_months -
                    floor(months_between(fdp.calendar_period_close_date,
                                         fab.prorate_date)),
                    fab.life_in_months -
                    floor(months_between(fdp.calendar_period_close_date,
                                         fab.deprn_start_date)))
        INTO dummy_num
        FROM fa_books fab, fa_deprn_periods fdp
       WHERE fab.book_type_code = i.book_type_code
         AND fdp.book_type_code = i.book_type_code
         AND fab.asset_id = i.asset_id
         AND fab.date_ineffective IS NULL
         AND fdp.period_close_date IS NULL;
    END IF;
 
    IF (dummy_num < 1) THEN
      l_remaining_life_years  := 0;
      l_remaining_life_months := 0;
      --output
      dbms_output.put_line(i.asset_number || '(' || i.book_type_code || '):' ||
                           ' Remaining years:' || l_remaining_life_years ||
                           ' Remaining months:' || l_remaining_life_months);
    ELSE
      l_remaining_life_years  := floor(dummy_num / 12);
      l_remaining_life_months := MOD(dummy_num, 12);
      --output
      dbms_output.put_line(i.asset_number || '-' || i.book_type_code || ':' ||
                           ' Remaining years:' || l_remaining_life_years ||
                           ' Remaining months:' || l_remaining_life_months);
    END IF;
 
  END LOOP;
END;

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10359218/viewspace-682148/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/10359218/viewspace-682148/

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值