F
fstao
Unregistered / Unconfirmed
GUEST, unregistred user!
有一表incumbency_per.db,其字段和数据如下:
key1 Field0 Field1 yf_total field3 deduct_tax
1 1200 2000 3000 120 118
这是一个工资的计算,deduct_tax字段是应缴个人所得税,应缴个人所得税的计算公式是:
应纳个人所得税=Yf_total-field3-1260
应缴个人所得税=应纳个人所得税*适用税率-速算扣除数
个人所得税税率表(个人薪金所得税适用):表为Tax_Rate.db,数据如下:
progression Upper_Limit Lower_Limit Tax_Rate decuct
1 0 500 5 0
2 500 2000 10 25
3 2000 5000 15 125
progression是“级数”,Upper_Limit是“上限”,Lower_Limit是“下限”,Tax_Rate是“税率%”,
decuct是“速算扣除”
以上面为例子可知:
yf_total=field0+field1=1000+2000=3000
个人薪金=yf_total-field3=3000-120=2880(用来选择税率和速算扣除)
应纳个人所得税=Yf_total-field3-1260=3000-120-1260=1620
由于3000-120=2880,按照税率表可知是在2000<2880<=5000范围,所以税率为15%,速算扣除为125,所以:
应缴个人所得税=应纳个人所得税*适用税率-速算扣除数=1620*15%-125=118,即Deduct_tax=118。
程序如下:
procedure TDT1.Incumbency_perAfterPost(DataSet: TDataSet);
var
a,b :real;
begin
database1.applyupdates([incumbency_per]);{incumbency_per是TQuery组件,连接incumbency_per.db}
with query4 do
begin
close;
sql.clear;
sql.add('update incumbency_per set yf_total=');
sql.add('field0+field1');
sql.add('where key1=:key1');
ParamByName('key1').AsFloat:=dt1.Incumbency_perKey1.Value;
ExecSQL;
end;
{dt1为Data Module}
with dt1.query1 do
begin
{select_tax_Rate.db和Tax_Rate.db的字段是相同的}
close;
sql.clear;
sql.add('delete from select_Tax_Rate');
ExecSQL;
{个人薪金在什么范围,来选择税率表的税率和速算扣除}
close;
sql.clear;
sql.add('insert into select_Tax_Rate select * from Tax_Rate');
sql.add('where Upper_Limit<:limit1 and Lower_Limit>=:limit1');
{“dt1.Incumbency_peryf_Total.Value-dt1.Incumbency_perField3.Value”是个人薪金}
ParamByName('limit1').AsFloat:=dt1.Incumbency_peryf_Total.Value-dt1.Incumbency_perField3.Value;
ExecSQL;
end;
dt1.Select_Tax_Rate.Active :=False;
dt1.Select_Tax_Rate.Active :=True;
with dt1.query2 do
begin
close;
sql.clear;
sql.add('select count(*) from select_Tax_Rate');
Open;
end;
if dt1.Query2.Fields[0].AsInteger>0 then{如果找到税率和速算扣除}
begin
{a是代表应纳税所得税,b是代表应缴个人所得税}
a:=dt1.Incumbency_peryf_Total.Value-dt1.Incumbency_perField4.Value-1260;
{“dt1.Select_Tax_RateTax_Rate.Value”是税率,“dt1.Select_Tax_RateDeduct.Value”是速算扣除}
b:=a*dt1.Select_Tax_RateTax_Rate.Value/100-dt1.Select_Tax_RateDeduct.Value;
with dt1.query5 do
begin
close;
sql.clear;
sql.add('update Incumbency_per set deduct_tax=:tax where key1=:key1');
ParamByName('tax').AsFloat:=b;
ParamByName('key1').AsFloat:=dt1.Incumbency_perKey1.Value;
ExecSQL;
end;
end;
dt1.Incumbency_per.Refresh;
end;
用DBGrid1连接Incumbency_per.db,并显示数据。
运行出现这样的问题:
添加数据时,在Field0添加1000和field1添加100,用方向键的向上或向下时,则保存数据,但yf_total和
Deduct_tax为空(比如下面),如果在Field0或Field1改变其它数字,则yf_total和deduct_tax才有数据,但是结果有
时对,有时错(也就是yftotal和Deduct_Tax有时是对的,但有是错,我自己算过)。我不断改变field0和field1的
数据,但yf_total和deduct_tax还是有时对,有时是错的。请问如何修改上面的代码呢?我已检查过所选择的
税率和速算扣除都没有错。
DBGrid1
key1 Field0 Field1 yf_total field3 deduct_tax
1 1200 2000 3000 120 118
2 1000 100 110
key1 Field0 Field1 yf_total field3 deduct_tax
1 1200 2000 3000 120 118
这是一个工资的计算,deduct_tax字段是应缴个人所得税,应缴个人所得税的计算公式是:
应纳个人所得税=Yf_total-field3-1260
应缴个人所得税=应纳个人所得税*适用税率-速算扣除数
个人所得税税率表(个人薪金所得税适用):表为Tax_Rate.db,数据如下:
progression Upper_Limit Lower_Limit Tax_Rate decuct
1 0 500 5 0
2 500 2000 10 25
3 2000 5000 15 125
progression是“级数”,Upper_Limit是“上限”,Lower_Limit是“下限”,Tax_Rate是“税率%”,
decuct是“速算扣除”
以上面为例子可知:
yf_total=field0+field1=1000+2000=3000
个人薪金=yf_total-field3=3000-120=2880(用来选择税率和速算扣除)
应纳个人所得税=Yf_total-field3-1260=3000-120-1260=1620
由于3000-120=2880,按照税率表可知是在2000<2880<=5000范围,所以税率为15%,速算扣除为125,所以:
应缴个人所得税=应纳个人所得税*适用税率-速算扣除数=1620*15%-125=118,即Deduct_tax=118。
程序如下:
procedure TDT1.Incumbency_perAfterPost(DataSet: TDataSet);
var
a,b :real;
begin
database1.applyupdates([incumbency_per]);{incumbency_per是TQuery组件,连接incumbency_per.db}
with query4 do
begin
close;
sql.clear;
sql.add('update incumbency_per set yf_total=');
sql.add('field0+field1');
sql.add('where key1=:key1');
ParamByName('key1').AsFloat:=dt1.Incumbency_perKey1.Value;
ExecSQL;
end;
{dt1为Data Module}
with dt1.query1 do
begin
{select_tax_Rate.db和Tax_Rate.db的字段是相同的}
close;
sql.clear;
sql.add('delete from select_Tax_Rate');
ExecSQL;
{个人薪金在什么范围,来选择税率表的税率和速算扣除}
close;
sql.clear;
sql.add('insert into select_Tax_Rate select * from Tax_Rate');
sql.add('where Upper_Limit<:limit1 and Lower_Limit>=:limit1');
{“dt1.Incumbency_peryf_Total.Value-dt1.Incumbency_perField3.Value”是个人薪金}
ParamByName('limit1').AsFloat:=dt1.Incumbency_peryf_Total.Value-dt1.Incumbency_perField3.Value;
ExecSQL;
end;
dt1.Select_Tax_Rate.Active :=False;
dt1.Select_Tax_Rate.Active :=True;
with dt1.query2 do
begin
close;
sql.clear;
sql.add('select count(*) from select_Tax_Rate');
Open;
end;
if dt1.Query2.Fields[0].AsInteger>0 then{如果找到税率和速算扣除}
begin
{a是代表应纳税所得税,b是代表应缴个人所得税}
a:=dt1.Incumbency_peryf_Total.Value-dt1.Incumbency_perField4.Value-1260;
{“dt1.Select_Tax_RateTax_Rate.Value”是税率,“dt1.Select_Tax_RateDeduct.Value”是速算扣除}
b:=a*dt1.Select_Tax_RateTax_Rate.Value/100-dt1.Select_Tax_RateDeduct.Value;
with dt1.query5 do
begin
close;
sql.clear;
sql.add('update Incumbency_per set deduct_tax=:tax where key1=:key1');
ParamByName('tax').AsFloat:=b;
ParamByName('key1').AsFloat:=dt1.Incumbency_perKey1.Value;
ExecSQL;
end;
end;
dt1.Incumbency_per.Refresh;
end;
用DBGrid1连接Incumbency_per.db,并显示数据。
运行出现这样的问题:
添加数据时,在Field0添加1000和field1添加100,用方向键的向上或向下时,则保存数据,但yf_total和
Deduct_tax为空(比如下面),如果在Field0或Field1改变其它数字,则yf_total和deduct_tax才有数据,但是结果有
时对,有时错(也就是yftotal和Deduct_Tax有时是对的,但有是错,我自己算过)。我不断改变field0和field1的
数据,但yf_total和deduct_tax还是有时对,有时是错的。请问如何修改上面的代码呢?我已检查过所选择的
税率和速算扣除都没有错。
DBGrid1
key1 Field0 Field1 yf_total field3 deduct_tax
1 1200 2000 3000 120 118
2 1000 100 110