一个大问题,不知如何解决(100分)

  • 主题发起人 主题发起人 fstao
  • 开始时间 开始时间
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
 
又是代码?晕倒。
 
这个问题我已经解决了,我想问另一个问题:
Delphi的问题:
有一个TComboBox,假如在其属性Items里随便添加(注意,是随便添加,不是
固定的):
May
Here
There
Ok

如果运行时,如何实现当在Combobox1里添加一个“O”时,则Combobox1自动显示
“OK”。如果添加一个“H”时,则Combobox1自动显示“Here”。如何写代码?多谢!
 
这么长,我都看晕了。
 
没看懂
讲清楚些吧
 
一个比较完整的例子,但是没有考虑如果有多个符合条件的选项存在下的处理。

procedure TForm1.ComboBox1KeyPress(Sender: TObject; var Key: Char);
var
i:integer;
sTmp :string;
bAdd:boolean;
begin
if(Key = #13) then
begin
bAdd := true;
for i := 0 to ComboBox1.Items.Count - 1 do
if(ComboBox1.Text = ComboBox1.Items.Strings) then
begin
bAdd := false;
break;
end;

if(bAdd) then ComboBox1.Items.Add(ComboBox1.Text);
Key := chr(0);
exit;
end;

ComboBox1.SelText := '';
sTmp := ComboBox1.Text + Key;
for i := 0 to ComboBox1.Items.Count - 1 do
begin
if(Pos(sTmp,ComboBox1.Items.Strings) <> 0) then
begin
ComboBox1.Text := ComboBox1.Items.Strings;
ComboBox1.SelStart := Length(ComboBox1.Text);
Key := Chr(0);
exit;
end;
end;
end;
 
多谢DreamTiger,刚试,对了。但有一个问题,如何使Combobox1自动下拉,就好象
用鼠标点Combobox1的下向箭头那样。也就是在Combobox1里添加“0”时,则
combobox1自动下拉并选择“OK”。如何做呢?
 
我也不懂怎么做,否则一开始就写上去了。呵呵。
 
>>如何使Combobox1自动下拉
ComboBox.Perform(CB_ShowDropDown,LongInt(True),0);
 
现在可以自动下来乐!!!

var
keyfirst:boolean = true; // 全局变量
procedure TForm1.ComboBox1KeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if keyfirst then
begin
ComboBox1.Perform(WM_LBUTTONDOWN, MK_LBUTTON,
MakeLong(ComboBox1.Width-4,4));
ComboBox1.Perform(WM_LBUTTONUP, MK_LBUTTON,
MakeLong(ComboBox1.Width-4,4));
keyfirst:=false;
end;
if key=13 then
begin
ComboBox1.Perform(WM_LBUTTONDOWN, MK_LBUTTON,
MakeLong(ComboBox1.Width-4,4));
ComboBox1.Perform(WM_LBUTTONUP, MK_LBUTTON,
MakeLong(ComboBox1.Width-4,4));
ComboBox1.Perform(WM_LBUTTONDOWN, MK_LBUTTON,
MakeLong(ComboBox1.Width-4,4));
ComboBox1.Perform(WM_LBUTTONUP, MK_LBUTTON,
MakeLong(ComboBox1.Width-4,4));
end;
end;
 
哦,我的程序有个错误:
for i := 0 to ComboBox1.Items.Count - 1 do
begin
if(Pos(sTmp,ComboBox1.Items.Strings) = 1) then
~~~不应该是<>0
ComboBox1.Perform(CB_ShowDropDown,LongInt(True),0);
~~~加上蚯蚓的就可以了。

ComboBox1.ItemIndex := i;
ComboBox1.Text := sTmp;
ComboBox1.SelStart := Length(sTmp);
Key := Chr(0);
exit;
end;
end;
 
随便翻一下Win32 API就找到了,
同志们居然还模拟鼠标单击??
 
不模拟
procedure TForm1.ComboBox1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
var
a:Longint;
begin
a:=combobox1.Perform(CB_GETDROPPEDSTATE,0,0);
if (a =0 ) then
combobox1.Perform(CB_SHOWDROPDOWN,not a,0);
end;

 
我想不是我错了吧!一句就可以搞定:
combobox1.DroppedDown :=true;
 
>><font color=red>我想不是我错了吧!一句就可以搞定:
>><font color=red>combobox1.DroppedDown :=true;</font>

对的,

惭愧惭愧,我可从来没丢过这么大的人!

哎!前面那些模拟鼠标单击的同志们也看看
 
多人接受答案了。
 
后退
顶部