update 问题(100分)

  • 主题发起人 主题发起人 philips
  • 开始时间 开始时间
P

philips

Unregistered / Unconfirmed
GUEST, unregistred user!
1. 我 用 foxpro 表;
2. 我 要编辑时按某字段有序;
3. 编辑时要能看到计算字段值,且有几个字段要进行校验;
4. 我要用Query控件 (CacheUpdate=true)+ updatesql 控件。
结果: Update Failed!
另:如果没有计算字段,对字段不做校验,则成功。
请问:
1. TQuery(CacheUpdate=true)+updatesql 控件使用的条件怎样?(50)
2. 对于上面的情况大家是怎样作的?有什么好的方法?(50)

 
TQuery CachedUpdates, TUpdateSql, ApplyUpdates
怎样才能保证正常工作?不出“Update Failed”!
我经常 “Update Failed”! 这个问题我问过多次,还没搞清楚,渴望高手sos.


 
1.自己填写TUpdateSQL的InsertSQL,ModifySQL
2.不要为计算字段附值!
3.Local SQL 功能太差.建议使用关系型数据库
 
还没清楚?真是不理解!
 
是不是 TQuery CachedUpdates, TUpdateSql, ApplyUpdates
对单个(多个)表(本地/远程)操作除了不能有重复记录、计算字段之外,
几乎没什么限制?
 
应该没什么限制,并且也应该与计算字段没什么关系。
为什么有计算字段就不能更新呢?具体语句怎么写的?
 
你的 UpdateSql 语句是不是把计算字段放进去了?源表中没有这个字段,当然会
出错。
 
delete from "p.dbf"
where
单位 = :OLD_单位 and
姓名 = :OLD_姓名 and
序号 = :OLD_序号

insert into "p.dbf"
(单位, 姓名, 序号, 参工时间, 级别, 出勤, 病假, 无薪, 公休, 节日, 夜餐,
保健, 驾驶, 技能, 地补, 加班工资, 夜餐费, 岗贴, 工龄, 科贴, 稳贴, 教师,
资料, 洗理, 交通, 驾贴, 附加, 补发, 病事扣款, 公积金, 扣发, 保贴,
房贴, 罐补, 御寒, 页码, 系数)
values
(:单位, :姓名, :序号, :参工时间, :级别, :出勤, :病假, :无薪, :公休, :节日,
:夜餐, :保健, :驾驶, :技能, :地补, :加班工资, :夜餐费, :岗贴, :工龄,
:科贴, :稳贴, :教师, :资料, :洗理, :交通, :驾贴, :附加, :补发,
:病事扣款, :公积金, :扣发, :保贴, :房贴, :罐补, :御寒, :页码, :系数)

update "p.dbf"
set
单位 = :单位,
姓名 = :姓名,
序号 = :序号,
参工时间 = :参工时间,
级别 = :级别,
出勤 = :出勤,
病假 = :病假,
无薪 = :无薪,
公休 = :公休,
节日 = :节日,
夜餐 = :夜餐,
保健 = :保健,
驾驶 = :驾驶,
技能 = :技能,
地补 = :地补,
加班工资 = :加班工资,
夜餐费 = :夜餐费,
岗贴 = :岗贴,
工龄 = :工龄,
科贴 = :科贴,
稳贴 = :稳贴,
教师 = :教师,
资料 = :资料,
洗理 = :洗理,
交通 = :交通,
驾贴 = :驾贴,
附加 = :附加,
补发 = :补发,
病事扣款 = :病事扣款,
公积金 = :公积金,
扣发 = :扣发,
保贴 = :保贴,
房贴 = :房贴,
罐补 = :罐补,
御寒 = :御寒,
页码 = :页码,
系数 = :系数
where
单位 = :OLD_单位 and
姓名 = :OLD_姓名 and
序号 = :OLD_序号

procedure TMDIChild.QueryPCalcFields(DataSet: TDataSet);
begin
QueryP.FieldByName('应发').AsFloat :=
QueryP.FieldByName('技能').AsInteger *
QueryP.FieldByName('系数').AsFloat +
QueryP.FieldByName('地补').AsFloat *
QueryP.FieldByName('系数').AsFloat +
QueryP.FieldByName('加班工资').AsFloat +
QueryP.FieldByName('夜餐费').AsFloat +
QueryP.FieldByName('岗贴').AsFloat *
QueryP.FieldByName('系数').AsFloat +
QueryP.FieldByName('工龄').AsFloat *
QueryP.FieldByName('系数').AsFloat +
QueryP.FieldByName('科贴').AsFloat *
QueryP.FieldByName('系数').AsFloat +
QueryP.FieldByName('稳贴').AsFloat *
QueryP.FieldByName('系数').AsFloat +
QueryP.FieldByName('教师').AsFloat +
QueryP.FieldByName('资料').AsFloat +
QueryP.FieldByName('洗理').AsFloat +
QueryP.FieldByName('交通').AsFloat +
QueryP.FieldByName('驾贴').AsFloat +
QueryP.FieldByName('附加').AsFloat *
QueryP.FieldByName('系数').AsFloat +
QueryP.FieldByName('补发').AsFloat -
QueryP.FieldByName('病事扣款').AsFloat ;

QueryP.FieldByName('实发').Asfloat :=
QueryP.FieldByName('应发').Asfloat +
QueryP.FieldByName('保贴').Asfloat +
QueryP.FieldByName('房贴').AsFloat +
QueryP.FieldByName('罐补').AsFloat +
QueryP.FieldByName('御寒').AsFloat -
QueryP.FieldByName('扣发').AsFloat -
QueryP.FieldByName('公积金').AsFloat;
end;

procedure TMDIChild.QueryPBDEDesigner9Validate(Sender: TField);
var
rgz : real;
begin
//计算 加班 夜餐费
QueryP.FieldByName('夜餐费').Asfloat := QueryP.FieldByName('夜餐').asfloat*2.4;
rgz := QueryP.FieldByName('技能').AsInteger/21.16;
QueryP.FieldByName('加班工资').Asfloat :=
(QueryP.FieldByName('公休').asfloat*2+QueryP.FieldByName('节日').asfloat*3)*rgz ;
end;

procedure TMDIChild.QueryPBDEDesigner5Validate(Sender: TField);
var
sGzjb : string;
bFound : boolean;
begin
//计算 技能工资
bfound := false;
sGzjb := QueryP.FieldByName('级别').AsString;
TableGZJB.First;
while( (not TableGZJB.eof) and (not bfound) )do
begin
if TableGZJB.FieldByName('工资级别').AsString = sGzjb then
begin
QueryP.FieldByName('技能').AsInteger :=
TableGZJB.FieldByName('技能工资').AsInteger;
bfound := true;
end;
TableGZJB.Next;
end;

if not bfound then
Application.MessageBox('工资级别可能不对!', PChar(Application.Title),16);
end;

//保存修改
procedure TMainForm.FileSave1Execute(Sender: TObject);
begin
if MainForm.ActiveMDIChild is TMDIChild then
begin
(MainForm.ActiveMDIChild as TMDIChild).UpdateSQL1.DeleteSQL.Text :=
'delete from "' + sPName +
'" where ' +
' 单位 = :OLD_单位 and ' +
' 姓名 = :OLD_姓名 and ' +
' 序号 = :OLD_序号';
(MainForm.ActiveMDIChild as TMDIChild).UpdateSQL1.ModifySQL.Text :=
'update "' + sPName +
'" set ' +
' 单位 = :单位,' +
' 姓名 = :姓名,' +
' 序号 = :序号,' +
' 参工时间 = :参工时间,' +
' 级别 = :级别,' +
' 出勤 = :出勤,' +
' 病假 = :病假,' +
' 无薪 = :无薪,' +
' 公休 = :公休,' +
' 节日 = :节日,' +
' 夜餐 = :夜餐,' +
' 保健 = :保健,' +
' 驾驶 = :驾驶,' +
' 技能 = :技能,' +
' 地补 = :地补,' +
' 加班工资 = :加班工资,' +
' 夜餐费 = :夜餐费,' +
' 岗贴 = :岗贴,' +
' 工龄 = :工龄,' +
' 科贴 = :科贴,' +
' 稳贴 = :稳贴,' +
' 教师 = :教师,' +
' 资料 = :资料,' +
' 洗理 = :洗理,' +
' 交通 = :交通,' +
' 驾贴 = :驾贴,' +
' 附加 = :附加,' +
' 补发 = :补发,' +
' 病事扣款 = :病事扣款,' +
' 公积金 = :公积金,' +
' 扣发 = :扣发,' +
' 保贴 = :保贴,' +
' 房贴 = :房贴,' +
' 罐补 = :罐补,' +
' 御寒 = :御寒,' +
' 页码 = :页码,' +
' 系数 = :系数' +
' where ' +
' 单位 = :OLD_单位 and ' +
' 姓名 = :OLD_姓名 and' +
' 序号 = :OLD_序号 ';
(MainForm.ActiveMDIChild as TMDIChild).UpdateSQL1.InsertSQL.Text :=
'insert into "' +sPName + '"' +
'(单位, 姓名, 序号, 参工时间, 级别, 出勤, 病假, 无薪, 公休, 节日, 夜餐,' +
' 保健, 驾驶, 技能, 地补, 加班工资, 夜餐费, 岗贴, 工龄, 科贴, 稳贴, 教师,' +
' 资料, 洗理, 交通, 驾贴, 附加, 补发, 病事扣款, 公积金, 扣发, 保贴,' +
' 房贴, 罐补, 御寒, 页码, 系数)' +
' values '+
'(:单位, :姓名, :序号, :参工时间, :级别, :出勤, :病假, :无薪, :公休, :节日,'+
' :夜餐, :保健, :驾驶, :技能, :地补, :加班工资, :夜餐费, :岗贴, :工龄,'+
' :科贴, :稳贴, :教师, :资料, :洗理, :交通, :驾贴, :附加, :补发,'+
' :病事扣款, :公积金, :扣发, :保贴, :房贴, :罐补, :御寒, :页码, :系数)';

(MainForm.ActiveMDIChild as TMDIChild).QueryP.ApplyUpdates;
(MainForm.ActiveMDIChild as TMDIChild).QueryP.CommitUpdates;
(MainForm.ActiveMDIChild as TMDIChild).QueryP.Close;
(MainForm.ActiveMDIChild as TMDIChild).QueryP.Open;
end;
end;

有点长,主要部分就是这样。
 
多谢各位!
 
后退
顶部