procedure TMainFrm.ExcuteQueryBtnClick(Sender: TObject);
var
condition:String;
begin
{ MergeConditionDlg就是上图所示的对话框}
if MergeConditionDlg.ShowModal = mrOK then
begin
{ MainCondition.Text为上图“编辑主设限条件”显示的内容}
if MergeConditionDlg.MainCondition.Text = '' then
begin
{ SubCondition.Text为上图进入“子条件构造”对话框生成的内容 }
if MergeConditionDlg.SubCondition.Text = '' then
condition := ''
else
condition := '身份证 IN (SELECT 身份证 FROM 人员基本情况 WHERE '+ MergeConditionDlg.SubCondition.Text+') ';
end
else
begin
if MergeConditionDlg.SubCondition.Text = '' then
condition := MergeConditionDlg.MainCondition.Text
else
condition := '('+MergeConditionDlg.MainCondition.Text+') AND (身份证 IN (SELECT 身份证 FROM 人员基本情况 WHERE '+ MergeConditionDlg.SubCondition.Text+')) ';
end;
with DataFrm do
begin
DynamicQuery.Close;
DynamicQuery.SQL.Clear;
DynamicQuery.SQL.Add('SELECT * FROM gzdaView ');
if (condition〈〉 '') then
DynamicQuery.SQL.Add('WHERE 身份证 IN (SELECT 身份证 FROM 人员基本情况 WHERE '+condition+') ');
DynamicQuery.SQL.Add(' ORDER BY 单位编号,部门编号,行政级别编号,工作时间,出生日期,发放日期');
DynamicQuery.Open;
{DbgridDlg对话框根据DBGrid数据源的不同显示不同的结果}
DBgridDlg.DBGrid.DataSource := DataFrm.DynamicSource;
if DBgridDlg.ShowModal = mrOK then
begin
Tryjbqk.DisableControls;
Tryjbqk.Locate('身份证',DynamicQuery.FieldByName('身份证').Value,[]);
Tryjbqk.EnableControls;
end;
end;
end;
end;
procedure TGzxFzjsDlg.GeneratingComplexBtnClick(Sender: TObject);
begin
{ 调用生成复杂表达式的对话框,即(一)图 所示的对话框 }
if MergeConditionDlg.ShowModal = mrOK then
begin
{ Tgzxjs 为 Class(Ttable),是一个存放工资项字段计算表达式的表,它由 gzx(对应工资表中的工资项)、bh(计算定义的编号,同时也决定批量计算的顺序)、isCurrent(在批量处理时是否被计算)、SingleExp(简单的计算表达式,实际的表达式由于在该版本的Delphi中不能正常处理Text字段,而以文件形式被存放在硬盘上)、 SubQuery(执行的限制条件,即该项定义的计算只对符合条件的工资表记录进行计算)等5字段组成,该表的SubQuery字段被修改后,自动调用一个过程,将对应的计算表达式删除 }
DataFrm.Tgzxjs.Edit;
if MergeConditionDlg.MainCondition.Text = '' then
begin
if MergeConditionDlg.SubCondition.Text = '' then
DataFrm.TgzxjsSubQuery.AsString := ''
else
DataFrm.TgzxjsSubQuery.AsString := '身份证 IN (SELECT 身份证 FROM 人员基本情况 WHERE '+ MergeConditionDlg.SubCondition.Text+') ';
end
else
begin
if MergeConditionDlg.SubCondition.Text = '' then
DataFrm.TgzxjsSubQuery.AsString := MergeConditionDlg.MainCondition.Text
else
DataFrm.TgzxjsSubQuery.AsString := '('+MergeConditionDlg.MainCondition.Text+') AND (身份证 IN (SELECT 身份证 FROM 人员基本情况 WHERE '+ MergeConditionDlg.SubCondition.Text+')) ';
end;
end;
end;
{下面的过程是在用户按下“加单一工资项值表达式”按钮后执行的,它的任务是调用标准的输入的对话框,并将用户输入的简单算术表达式加到工资项计算表达式上}
procedure TGzxFzjsDlg.AddSingleExpClick(Sender: TObject);
var
InputValue :String;
begin
InputValue := InputBox('工资项值运算表达式输入框','#1,#2--#40、数字、运算符组成,如#3、(#3+#8)*0.15、#4-#6+#40+18等等:','');
{下面的过程是在用户按下“加合计函数表达式”按钮后执行的,它的任务是调用生成合计函数表达式的的SUMExpressionDlg对话框,这里使用的合计函数有合计值(SUM)、平均值(AVG)、最大值(MAX)、最小值(MIN)、记录数(COUNT)等5种,并将结果加到计算表达式}
procedure TGzxFzjsDlg.AddSumExpClick(Sender: TObject);
begin
with SUMExpressionDlg do
begin
if ShowModal = mrOK then
begin
DataFrm.Tgzxjs.Edit;
case CalStyle.ItemIndex of {CalStyle是包括上述5种合计表达式的选项控件}
0: //即SUM
begin
GzxFzjsDlg.Expression.Text := GzxFzjsDlg.Expression.Text + '(SELECT SUM('+SumExpression.Text+') FROM 工资表 WHERE '+DataFrm.TgzxjsSubQuery.AsString+')';
DataFrm.TgzxjsSingleExp.AsString := DataFrm.TgzxjsSingleExp.AsString + 'SUM('+SumExpression.Text+')';
end;
1: //即AVG
begin
GzxFzjsDlg.Expression.Text := GzxFzjsDlg.Expression.Text + '(SELECT AVG('+SumExpression.Text+') FROM 工资表 WHERE '+DataFrm.TgzxjsSubQuery.AsString+')';
DataFrm.TgzxjsSingleExp.AsString := DataFrm.TgzxjsSingleExp.AsString + 'AVG('+SumExpression.Text+')';
end;
2: //即MAX
begin
GzxFzjsDlg.Expression.Text := GzxFzjsDlg.Expression.Text + '(SELECT MAX('+SumExpression.Text+') FROM 工资表 WHERE '+DataFrm.TgzxjsSubQuery.AsString+')';
DataFrm.TgzxjsSingleExp.AsString := DataFrm.TgzxjsSingleExp.AsString + 'MAX('+SumExpression.Text+')';
end;
3: //即MIN
begin
GzxFzjsDlg.Expression.Text := GzxFzjsDlg.Expression.Text + '(SELECT MIN('+SumExpression.Text+') FROM 工资表 WHERE '+DataFrm.TgzxjsSubQuery.AsString+')';
DataFrm.TgzxjsSingleExp.AsString := DataFrm.TgzxjsSingleExp.AsString + 'MIN('+SumExpression.Text+')';
end;
4: //即COUNT
begin
GzxFzjsDlg.Expression.Text := GzxFzjsDlg.Expression.Text + '(SELECT COUNT('+SumExpression.Text+') FROM 工资表 WHERE '+DataFrm.TgzxjsSubQuery.AsString+')';
DataFrm.TgzxjsSingleExp.AsString := DataFrm.TgzxjsSingleExp.AsString + 'COUNT('+SumExpression.Text+')';
end;
end;
DataFrm.Tgzxjs.Post;
end;
end;
end;
procedure TGzxFzjsDlg.OKBtnClick(Sender: TObject);
begin
if DataFrm.Sgzxjs.State IN [dsEdit,dsInsert] then
ShowMessage('记录正在编辑或插入状态,现退回!')
else
begin
if Data.Confirm('真的需要根据条件和表达式对工资项 '+DataFrm.TgzxjsGzx.Value+' 执行工资项赋值吗?') then
begin
MyPromptFrm.Show; //显示进度和图片
MyPromptFrm.Update;
try
DataFrm.DynamicQuery.Close;
DataFrm.DynamicQuery.SQL.Clear;
DataFrm.DynamicQuery.SQL.Add('UPDATE 工资表 SET '+DataFrm.TgzxjsGzx.Value+' = '+GzxFzjsDlg.Expression.Text);
if DataFrm.TgzxjsSubQuery.AsString 〈〉 '' then
DataFrm.DynamicQuery.SQL.Add(' Where '+DataFrm.TgzxjsSubQuery.AsString) ;
DataFrm.DynamicQuery.ExecSQL;
finally
MyPromptFrm.Close;
end;
DataFrm.Tgz.Refresh;
end;
end;
end;
procedure TGzxFzjsDlg.Button1Click(Sender: TObject);
begin
if DataFrm.Sgzxjs.State IN [dsEdit,dsInsert] then
ShowMessage('记录正在编辑或插入状态,现退回!')
else
begin
if Data.Confirm('真的需要执行批量工资项赋值吗?') then
begin
MyPromptFrm.Show;
MyPromptFrm.Update;
try
DataFrm.Tgzxjs.First;
while not DataFrm.Tgzxjs.Eof do
begin
if DataFrm.TgzxjsIsCurrent.Value = 1 then
begin
DataFrm.DynamicQuery.Close;
DataFrm.DynamicQuery.SQL.Clear;
DataFrm.DynamicQuery.SQL.Add('UPDATE 工资表 SET '+DataFrm.TgzxjsGzx.Value+' = '+GzxFzjsDlg.Expression.Text);
if DataFrm.TgzxjsSubQuery.AsString 〈〉 '' then
DataFrm.DynamicQuery.SQL.Add(' Where '+DataFrm.TgzxjsSubQuery.AsString) ;
DataFrm.DynamicQuery.ExecSQL;
end;
if DataFrm.TgzxjsGzx.Value = '#37' then
Gz.JsSds;