access字段计算的问题

fine444 2009-02-25 03:13:39
我的表中想添加新的列,该列=列1+列2。请问在ACCESS中能实现吗,不想使用SQL实现,
...全文
966 37 打赏 收藏 转发到动态 举报
写回复
用AI写文章
37 条回复
切换为时间正序
请发表友善的回复…
发表回复
fine444 2009-02-27
  • 打赏
  • 举报
回复
我的全部代码

implementation

{$R *.dfm}



procedure TForm7.bsSkinButton1Click(Sender: TObject);
begin
adoquery1.Close;
adoquery1.SQL.clear;
adoquery1.SQL.Add('select * from 工资管理 where (工号 like '+QuotedStr('%'+edit2.text+'%')+' or 姓名 like '+QuotedStr('%'+edit2.text+'%')+' or 部门 like'+QuotedStr('%'+edit2.text+'%')+') and 月份='''+formatdatetime('yyyy-mm',datetimepicker1.date)+'''');
//adoquery1.SQL.Add('select * from 工资管理,员工基本信息表 where 工资管理.工号=员工基本信息表.工号 and (工资管理.工号 like '+QuotedStr('%'+edit2.text+'%')+' or 工资管理.姓名 like '+QuotedStr('%'+edit2.text+'%')+' or 工资管理.部门 like'+QuotedStr('%'+edit2.text+'%')+' or 员工基本信息表.性别 like '+QuotedStr('%'+edit2.text+'%')+') and 工资管理.月份='''+formatdatetime('yyyy-mm',datetimepicker1.date)+'''');
adoquery1.open;
if adoquery1.Recordset.RecordCount=0 then
begin
edit1.Text:='';
edit4.Text:='';
edit5.Text:='';
edit6.Text:='';
end;




end;

procedure TForm7.bsSkinButton2Click(Sender: TObject);
begin
RvProject3.Execute;
end;









procedure TForm7.ADOQuery1AfterOpen(DataSet: TDataSet);
begin
bsSkinStatusPanel1.Caption:='共'+inttostr(adoquery1.RecordCount)+'条记录'
end;

procedure TForm7.ADOQuery1AfterScroll(DataSet: TDataSet);
begin

sumday:=DaysInMonth(strtodatetime(dbedit17.text+'-01'));




edit1.Text:=FloatToStr(Round((StrToFloat(TRim(dbedit5.Text))/sumday )*StrToFloat(trim(dbedit4.Text))));
edit4.Text:=FloatToStr(StrToFloat(Trim(edit1.Text))+StrToFloat(Trim(DBEdit6.Text))+StrToFloat(Trim(DBEdit7.Text))+ StrToFloat(Trim(DBEdit8.Text))+StrToFloat(Trim(DBEdit9.Text))+StrToFloat(Trim(DBEdit10.Text))+StrToFloat(Trim(DBEdit11.Text))+StrToFloat(Trim(DBEdit12.Text)));
edit5.Text:=FloatToStr(StrToFloat(Trim(DBEdit13.Text))+StrToFloat(Trim(DBEdit14.Text))+StrToFloat(Trim(DBEdit15.Text))+StrToFloat(Trim(DBEdit16.Text)));
edit6.Text:=FloatToStr(StrToFloat(Trim(edit4.Text))-StrToFloat(Trim(edit5.Text)));

end;

procedure TForm7.FormShow(Sender: TObject);
begin
adoquery1.Close;
adoquery1.Active:=false;
adoquery1.Open;
adoquery1.Active:=true;
end;

procedure TForm7.bsSkinDBGrid1TitleClick(Column: TbsColumn);
var i : integer;
begin
for i:= 1 to bsskinDBGrid1.Columns.Count do
begin

bsskinDBGrid1.Columns[i-1].Title.Font.Color := clGreen;
bsskinDBGrid1.Columns[i-1].Title.Font.Style := [];

if (pos( '▲', bsskindbgrid1.Columns[i-1].Title.Caption) <> 0) or (pos( '▼', bsskindbgrid1.Columns[i-1].Title.Caption) <> 0) then
bsskindbgrid1.Columns[i-1].Title.Caption:=copy(bsskindbgrid1.Columns[i-1].Title.Caption,-3,length(bsskindbgrid1.Columns[i-1].Title.Caption)-2);


end;
if ADOQuery1.Sort<>(Column.FieldName+' ASC') then //判断原排序方式
begin
ADOQuery1.Sort := Column.FieldName+' ASC';
Column.Title.Font.Color := clRed; //改变标题行字体为红色,表示当前的排序方式为升序
Column.Title.Font.Style := [fsBold];
Column.Title.Caption:= column.Title.Caption+'▲';
end
else begin
ADOQuery1.Sort:= Column.FieldName+' DESC';
Column.Title.Font.Color := clBlue; //改变标题行字体为红色,表示当前的排序方式为降序
Column.Title.Font.Style := [fsBold];
Column.Title.Caption:= column.Title.Caption+' ▼';
end;
end;



procedure TForm7.ADOQuery1CalcFields(DataSet: TDataSet);
begin

if dbedit17.text<>'' then
begin
sumday:=DaysInMonth(strtodatetime(dbedit17.text+'-01'));
adoquery1.FieldByName('扣发金额').Asfloat:=adoquery1.fieldbyname('扣发工资(其它)').Asfloat+adoquery1.fieldbyname('扣发工资(工装/材料)').Asfloat+adoquery1.fieldbyname('扣发工资(迟到/旷工)').Asfloat+adoquery1.fieldbyname('扣发工资(罚款)').Asfloat;
adoquery1.FieldByName('出勤工资').Value:=Round((adoquery1.fieldbyname('基本工资').Value/sumday)*adoquery1.fieldbyname('出勤天数').Value);
adoquery1.FieldByName('应发工资').Value:=adoquery1.fieldbyname('出勤工资').Value+adoquery1.fieldbyname('效益工资').Value+adoquery1.fieldbyname('上浮工资(含社会保险)').Value+adoquery1.fieldbyname('岗位津贴').Value+adoquery1.fieldbyname('奖金').Value+adoquery1.fieldbyname('值班工资').Value+adoquery1.fieldbyname('生活补助').Value+adoquery1.fieldbyname('出差补助').Value;
adoquery1.FieldByName('实发工资').Value:=adoquery1.fieldbyname('应发工资').Value-adoquery1.fieldbyname('扣发金额').Value;
end;
end;

procedure TForm7.ADOQuery1BeforePost(DataSet: TDataSet);
begin
if dbedit17.text<>'' then
begin
sumday:=DaysInMonth(strtodatetime(dbedit17.text+'-01'));
adoquery1.FieldByName('扣发金额').Asfloat:=adoquery1.fieldbyname('扣发工资(其它)').Asfloat+adoquery1.fieldbyname('扣发工资(工装/材料)').Asfloat+adoquery1.fieldbyname('扣发工资(迟到/旷工)').Asfloat+adoquery1.fieldbyname('扣发工资(罚款)').Asfloat;
adoquery1.FieldByName('出勤工资').Value:=Round((adoquery1.fieldbyname('基本工资').Value/sumday)*adoquery1.fieldbyname('出勤天数').Value);
adoquery1.FieldByName('应发工资').Value:=adoquery1.fieldbyname('出勤工资').Value+adoquery1.fieldbyname('效益工资').Value+adoquery1.fieldbyname('上浮工资(含社会保险)').Value+adoquery1.fieldbyname('岗位津贴').Value+adoquery1.fieldbyname('奖金').Value+adoquery1.fieldbyname('值班工资').Value+adoquery1.fieldbyname('生活补助').Value+adoquery1.fieldbyname('出差补助').Value;
adoquery1.FieldByName('实发工资').Value:=adoquery1.fieldbyname('应发工资').Value-adoquery1.fieldbyname('扣发金额').Value;
end;
end;

end.
fine444 2009-02-27
  • 打赏
  • 举报
回复
wad
byteh 2009-02-27
  • 打赏
  • 举报
回复
Access中写个查询,和存储过程一样,需要的用得时候和数据库一样存取!
starluck 2009-02-27
  • 打赏
  • 举报
回复
上面這段是在數據集滾動的時候賦值應該沒什麼影響的。
fine444 2009-02-26
  • 打赏
  • 举报
回复
我添加了个计算字段 但运行时老提示某某字段未发现
starluck 2009-02-26
  • 打赏
  • 举报
回复
那就需要寫SQL,來實現

avg(T1+t2) ..


個人觀點,我寧願把SQL寫復雜點,剛好這裏又是工資這麼重要的東西,如果出現程序某個地方沒有處理好,出現了這個應付工資字段
與T1+T2不相等,沒有更新到,那後果遠比寫一個復雜點的SQL好。
fine444 2009-02-26
  • 打赏
  • 举报
回复
对了 这个是不是影响了

procedure TForm7.ADOQuery1AfterScroll(DataSet: TDataSet);
begin

sumday:=DaysInMonth(strtodatetime(dbedit17.text+'-01'));




edit1.Text:=FloatToStr(Round((StrToFloat(TRim(dbedit5.Text))/sumday )*StrToFloat(trim(dbedit4.Text))));
edit4.Text:=FloatToStr(StrToFloat(Trim(edit1.Text))+StrToFloat(Trim(DBEdit6.Text))+StrToFloat(Trim(DBEdit7.Text))+ StrToFloat(Trim(DBEdit8.Text))+StrToFloat(Trim(DBEdit9.Text))+StrToFloat(Trim(DBEdit10.Text))+StrToFloat(Trim(DBEdit11.Text))+StrToFloat(Trim(DBEdit12.Text)));
edit5.Text:=FloatToStr(StrToFloat(Trim(DBEdit13.Text))+StrToFloat(Trim(DBEdit14.Text))+StrToFloat(Trim(DBEdit15.Text))+StrToFloat(Trim(DBEdit16.Text)));
edit6.Text:=FloatToStr(StrToFloat(Trim(edit4.Text))-StrToFloat(Trim(edit5.Text)));

end;
fine444 2009-02-26
  • 打赏
  • 举报
回复
那我以后要求avg(應發工資)不是很麻烦吗
starluck 2009-02-26
  • 打赏
  • 举报
回复


應發工資 應該是工資表中的:列1+列2 ?? 對嗎??


哪果是的話,在你的 adoquery1 或 adoDataSet 的 fields 裏面新建一個 calcField 就行了,不需要存到數據庫/。
fine444 2009-02-26
  • 打赏
  • 举报
回复
我的这个表是个工资表,‘应发工资’是根据其它字段计算出来的,我想保存在数据库 中以备以后查询

华哥有更合理的思路吗
starluck 2009-02-26
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 fine444 的回复:]
我让这个计算列能一直存在于原始数据库中 方便以后使用
[/Quote]


數據集有一種計算類型的字段,你 在 onCalc 事件裏將這個新增的字段的值計算成你上面的那二個字段相加的值。

然後在數據集的 BeforePost 中將這個值保存到這個數據集裏面去。


不過有點我不明白,這是計算出來的字段,存到數據庫好像沒什麼必要,查詢的時候完全可以通過SQL或者DELPHI的DATASET的計算字段來體現,你要想想確定需不需要這樣做,數據冗餘了
fine444 2009-02-26
  • 打赏
  • 举报
回复
我让这个计算列能一直存在于原始数据库中 方便以后使用
fine444 2009-02-26
  • 打赏
  • 举报
回复
顶下 吃饭
fine444 2009-02-26
  • 打赏
  • 举报
回复
扣发金额,出勤工资,应发工资,实发工资 是計算字段同时我也把它们加到了数据库字段里

if dbedit17.text <>'' 没有问题
starluck 2009-02-26
  • 打赏
  • 举报
回复
扣发金额,出勤工资,应发工资,实发工资 是計算字段還是數據庫裏存在的字段。

如果的確是數據庫的字段不是計算字段,應該不會有問題,但你的if dbedit17.text<>'' 你要調試下,看是不是空了??

fine444 2009-02-26
  • 打赏
  • 举报
回复

procedure TForm7.ADOQuery1CalcFields(DataSet: TDataSet);
begin

if dbedit17.text<>'' then
begin
sumday:=DaysInMonth(strtodatetime(dbedit17.text+'-01'));
adoquery1.FieldByName('扣发金额').Asfloat:=adoquery1.fieldbyname('扣发工资(其它)').Asfloat+adoquery1.fieldbyname('扣发工资(工装/材料)').Asfloat+adoquery1.fieldbyname('扣发工资(迟到/旷工)').Asfloat+adoquery1.fieldbyname('扣发工资(罚款)').Asfloat;
adoquery1.FieldByName('出勤工资').Value:=Round((adoquery1.fieldbyname('基本工资').Value/sumday)*adoquery1.fieldbyname('出勤天数').Value);
adoquery1.FieldByName('应发工资').Value:=adoquery1.fieldbyname('出勤工资').Value+adoquery1.fieldbyname('效益工资').Value+adoquery1.fieldbyname('上浮工资(含社会保险)').Value+adoquery1.fieldbyname('岗位津贴').Value+adoquery1.fieldbyname('奖金').Value+adoquery1.fieldbyname('值班工资').Value+adoquery1.fieldbyname('生活补助').Value+adoquery1.fieldbyname('出差补助').Value;
adoquery1.FieldByName('实发工资').Value:=adoquery1.fieldbyname('应发工资').Value-adoquery1.fieldbyname('扣发金额').Value;
end;
end;

procedure TForm7.ADOQuery1BeforePost(DataSet: TDataSet);
begin
if dbedit17.text<>'' then
begin
sumday:=DaysInMonth(strtodatetime(dbedit17.text+'-01'));
adoquery1.FieldByName('扣发金额').Asfloat:=adoquery1.fieldbyname('扣发工资(其它)').Asfloat+adoquery1.fieldbyname('扣发工资(工装/材料)').Asfloat+adoquery1.fieldbyname('扣发工资(迟到/旷工)').Asfloat+adoquery1.fieldbyname('扣发工资(罚款)').Asfloat;
adoquery1.FieldByName('出勤工资').Value:=Round((adoquery1.fieldbyname('基本工资').Value/sumday)*adoquery1.fieldbyname('出勤天数').Value);
adoquery1.FieldByName('应发工资').Value:=adoquery1.fieldbyname('出勤工资').Value+adoquery1.fieldbyname('效益工资').Value+adoquery1.fieldbyname('上浮工资(含社会保险)').Value+adoquery1.fieldbyname('岗位津贴').Value+adoquery1.fieldbyname('奖金').Value+adoquery1.fieldbyname('值班工资').Value+adoquery1.fieldbyname('生活补助').Value+adoquery1.fieldbyname('出差补助').Value;
adoquery1.FieldByName('实发工资').Value:=adoquery1.fieldbyname('应发工资').Value-adoquery1.fieldbyname('扣发金额').Value;
end;
end;
starluck 2009-02-26
  • 打赏
  • 举报
回复


應該不會吧,把代碼貼出來看下。
fine444 2009-02-26
  • 打赏
  • 举报
回复
华哥和B仔呢?
fine444 2009-02-26
  • 打赏
  • 举报
回复
不行啊 数据库中什么也没有啊
oushengfen 2009-02-26
  • 打赏
  • 举报
回复
呵呵,先设计计算字段,这个没有问题撒。
然后,在beforepost事件中,加入代码如adoquery1.fieldbyname[實發工資].value := fieldbyname('T1').value + fieldbyname('T2').Value;
加载更多回复(17)

5,499

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧