1 工资项目表
字段 :
编号 int
工资名称 str
工资数据 Float
工资公式 str编号 工资名称 工资数据 工资公式
1 基本工资 500
2 奖金 (基本工资 + 岗位工资)*0.5
3 伙食补贴 50
4 住房补贴 50
5 养老保险 80
6 公积金 100
7 岗位工资 100
8 实发工资 基本工资+奖金+伙食补贴+住房补贴-养老保险-公积金+岗位工资现在问题就是如何把工资公式字段里的公式拿出计算,计算完后再把结果保存到本记录的工资数据字段里,请指教。
例子:
比如我现在要计算这个公式,(基本工资 + 岗位工资)*0.5
那我要怎么才能知道或取出基本工资的数据是500,岗位工资的数据是100,
最终显示如下:
编号 工资名称 工资数据 工资公式
1 基本工资 500
2 奖金 300 (基本工资 + 岗位工资)*0.5
3 伙食补贴 50
4 住房补贴 50
5 养老保险 80
6 公积金 100
7 岗位工资 100
8 实发工资 820 基本工资+奖金+伙食补贴+住房补贴-养老保险-公积金+岗位工资
字段 :
编号 int
工资名称 str
工资数据 Float
工资公式 str编号 工资名称 工资数据 工资公式
1 基本工资 500
2 奖金 (基本工资 + 岗位工资)*0.5
3 伙食补贴 50
4 住房补贴 50
5 养老保险 80
6 公积金 100
7 岗位工资 100
8 实发工资 基本工资+奖金+伙食补贴+住房补贴-养老保险-公积金+岗位工资现在问题就是如何把工资公式字段里的公式拿出计算,计算完后再把结果保存到本记录的工资数据字段里,请指教。
例子:
比如我现在要计算这个公式,(基本工资 + 岗位工资)*0.5
那我要怎么才能知道或取出基本工资的数据是500,岗位工资的数据是100,
最终显示如下:
编号 工资名称 工资数据 工资公式
1 基本工资 500
2 奖金 300 (基本工资 + 岗位工资)*0.5
3 伙食补贴 50
4 住房补贴 50
5 养老保险 80
6 公积金 100
7 岗位工资 100
8 实发工资 820 基本工资+奖金+伙食补贴+住房补贴-养老保险-公积金+岗位工资
数据库设计
1.工资表
CREATE TABLE SALARY(基本工资 int,奖金 int ,岗位工资 int)
2.公式表
CREATE TABLE FORMULA(ID INT IDENTITY(1,1) ,FORMULADESC VARCHAR(50),FORMULA VARCHAR(50),A VARCHAR(50),B VARCHAR(50),C VARCHAR(50))
//说明:A,B,C中存放的是SALARY中字段的名称
DELPHI实现
1.
公式:EDIT --公式内容,若实现上述功能,可写为(A+B)*0.5
A:基本工资(一般是Combobox)--Combobox中存放字段名称
B:岗位工资 (一般是Combobox)--Combobox中存放字段名称
等
(即用A与B来代替字段名称,形成AB与字段的映射关系)
2.用间接取数的方式将SALARY中的数据取出,形成字符串'(500+100)*0.5'
3.写一个存储过程,将该字符串为参数,传入即可!
存储过程:
CREATE PROC P_calc
@FORMULA VARCHAR(100)
AS
BEGIN
DECLARE @RESULT INT,
@SQL NVARCHAR(100)
--定义动态SQL语句
SET @SQL=N'SELECT @RESULT='+@FORMULA
--计算
EXEC sp_executesql @SQL,N'@RESULT INT OUTPUT',@RESULT OUTPUT
--将计算结果存入结果表
UPDATE T1
SET SCORE=@RESULT
WHERE ID=1 --将奖金字段更新
END;
间接取数的方式,怎么用呀,不太明白呀,能说清楚点吗?
我现在就是想不通,比如:我把这个公式取出来赋值给这个变量Str:=(基本工资 + 岗位工资)*0.5,我把这个公式取出来当作变量这肯定是一个字符类型的变量,我是想说怎么才能知道基本工资的值是500呢?请指教。
VAR
I:INTEGER;
FORMULASTR,STR1:STRING;
Begin
With Adoquery1 do
begin
close;
sql.clear;
sql.text:='SELECT * FROM Salary';
open;
end;
With adoquery2 do
begin
Close;
Sql.clear;
Sql.text:='SELECT * FROM Formula';
Open
end;
--生成字符串'(500+100)*0.5'
FOR I:=1 TO LENGTH(FORMULASTR) DO
BEGIN
IF FORMULASTR[I] IN ['A'..'Z'] THEN
BEGIN
STR1:=STR1+ADOQUERY2.FieldByName(ADOQUERY1.FIELDBYNAME(FORMULASTR[I]).AsString).AsString;
END;
IF FORMULASTR[I] IN ['+','-','*','/',')','('] THEN
BEGIN
STR1:=STR1+ FORMULASTR[I];
END;
END;
--执行存储过程
WITH ADOQuery2 DO
BEGIN
CLOSE;
SQL.Clear;
SQL.TEXT:=' EXEC TEST :A1';
Parameters.ParamByName('A1').Value:=STR1;
ExecSQL;
END;
SHOWMESSAGE('公式运算成功');
End
说白了是用动态SQL语句实现
您可以这样试一下!
DECLARE @T VARCHAR(20)
SET @T='SELECT (1+2)*4'
EXEC (@T)
存储过程已经写得很详细了!
不过我的数据库是DBISAM不支持存储过程,后来我直接用数字写入就
不过我的数据库是DBISAM不支持存储过程,后来我直接用数字写入就不用转换了,
在此谢谢各位,如果有好的办法也请告诉我,我会另外开贴给分.