Математическая формула в функции Oracle - PullRequest
0 голосов
/ 29 сентября 2018

У меня есть эта математическая формула, которую я пытался преобразовать в функцию Oracle.Вот как это должно работать, taxableIncome проходит по таблице, она выбирает первую строку таблицы и, если она больше CumulativeAmount , вычитает CumulativeAmount из taxableIncome и сохраняет остаток , он умножает CumulativeAmount и Percentage , чтобы получить значение (x), берет остаток и идетСледующая строка в таблице и вычтите CumulativeAmount из остатка. Когда остаток будет меньше, чем CumulativeAmount , он будет применять 17,5 к остатку. Позже я сложу (x) значения, чтобы получить общую стоимость.Значения рассчитываются неправильно.

This is the table I used to write the function

CREATE OR REPLACE function CalculateIncomeTax(periodId NVARCHAR2, 
employeeId NVARCHAR2,paygroupcode PAYROLL_MASTER.PAY_PAY_GROUP_CODE%type,
taxableIncome NUMBER)
return NUMBER 
AS
IncomeTax NUMBER (10,2); 
BEGIN
SELECT 
 coalesce(SUM(                       
  CASE WHEN (taxableIncome > T.TAX_CUMMULATIVE_AMOUNT) THEN (taxableIncome - 
  T.TAX_CUMMULATIVE_AMOUNT)* (T.TAX_PERCENTAGE/ 100)                            
  ELSE 0.00 END
    ) ,0)                       
  INTO IncomeTax    
  FROM TAX_LAW T  JOIN PAY_GROUP P ON P.PAY_FORMULA_ID   =T.TAX_FORMULA_ID                         
  WHERE P.PAY_CODE  = paygroupcode;
return IncomeTax;  
end;
 /

Например:

taxableIncome= 1000,the function must loop on the first line on the 
table CummulativeAmount=261,so 1000-261=739, and 0*739=0,0 is 
value(x), 
next loop 739>70,739 is the remainder,so 739-70=669, and (5/100)*70 
=3.5,3.5 is value(x),   
next loop 669>100,669-100=569, (10/100)*100=10,10 is value(x),
now 569 < 2810, so (17.5/100)*569=99.575,99.575 is value(x).
so we sum all x  =0+3.5+10+99.575= 113.075

, если taxableIncome = 300,300 больше, чем261 в таблице, поэтому мы будем использовать процент 0 для нее, но мы получим 0.now (300-261) меньше 70, поэтому процент 5 не может быть использован для него, поэтому Incometax равен 0. Но 17,5 будетприменить к (300-261), чтобы получить 6,825, Total IncomeTax - 6,825. Это логика расчетов. Я хочу использовать это в то время, когда выписка о расчете.

1 Ответ

0 голосов
/ 03 октября 2018
CREATE OR REPLACE function CalculateIncomeTax2(taxableIncome NUMBER)
return NUMBER 
AS
IncomeTax NUMBER (10,2) := 0;
TaxableRemainder NUMBER := taxableIncome;
BEGIN
for r in (select tax_id, tax_percentage, tax_cummulative_amount
          from incometax
          order by tax_id)
loop
    if TaxableRemainder > r.tax_cummulative_amount then
        TaxableRemainder := TaxableRemainder - r.tax_cummulative_amount;
        incometax := incometax + (r.tax_cummulative_amount * r.tax_percentage / 100);
    else
        incometax := incometax + (TaxableRemainder * r.tax_percentage / 100);
        exit; 
    end if;
end loop;

return IncomeTax;
end; 
/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...