维修记录详表结构:                           车辆维修记录表结构:
id       int                              id    int
车号      char                             车号      char
日期      smalldatetime                    保修类型  char
维修项目  char                             承修单位  char
配件名称  char                             日期      smalldatetime  
个数      int                              工时费    numeric
单价      numeric                          材料费    numeric 
工时费    numeric                          合计  numeric ([工时费] + [材料费])
材料费    numeric 公式:([单价] * [个数])    里程     int 
                                          年度     int (用公式自动填充)
两个表主键都是id,在同一个窗体用dbgrid显示这两个表,用一个弹出窗体中的edit.text输入表1“维修记录详表”的内容和表2“车辆维修记录表”的保修类型、承修单位、里程,如果把添加到表1同一车号、同一日期,不同维修项目的记录的工时费和材料费各自相加作为表2的工时费和材料费和保修类型、承修单位、里程同时输入到表2成为一条记录,怎样才能实现?
执行SQL语句的函数是DAHelper.pas单元里的一个函数代码如下:
function ExeSqlNoQuery(sql:string):boolean;
var
  query:TADOQuery;
  ref:integer;
begin
  ref:=0;
  //判断连接状态是否关闭, 若关闭则打开
  if stClosed in Config.ADOCon.State then
      Config.ADOCon.Open;
    query:=TADOQuery.Create(nil);
    query.Connection:=Config.ADOCon;
    query.Close;
    Config.ADOCon.BeginTrans;
    try
      query.SQL.Clear;
      query.SQL.Add(sql);
      //query.Open;
    ref:=query.ExecSQL;//影响的行数
      Config.ADOCon.CommitTrans;
    except
      Config.ADOCon.RollbackTrans;
     query:=nil;
      result:=false;
   end;
  if ref>0 then
   result:=true
  else
  result:=false;
end;
添加到表一的函数是Fix_Manage.pas单元FixCostAdd我是这样写的,
unit Fix_Manage;
interface
uses DAHelper,ClassesU,ADODB,SysUtils;
function FixCostAdd(FixCar:TFixInfo):boolean;//TFixInfo类成员对应表一结构
var
 sql:string;
begin
 sql:='insert into 维修记录详表(车号,日期,维修项目,配件名称,个数,单价,工时费)'+
      'values('+''''+FixCar.CarNo+''''+','+''''+FixCar.FixDate+''''+','+''''+FixCar.Fix+''''+','+''''+FixCar.FitName+''''+','+''''+inttostr(FixCar.FitNum)+''''+','+''''+floattostr(FixCar.FitPrice)+''''+','+''''+floattostr(FixCar.FitCost)+''''+')';
 result:=DAHelper.ExeSqlNoQuery(sql);
 end;
想要在执行添加表1的事件里同时添加到表2的函数该怎样写,请高手帮我,急用,多谢!

解决方案 »

  1.   

    存储过程比较好。SQL代码和程序分离
      

  2.   

    直接用DAHelper.ExeSqlNoQuery函数执行T-SQL语句能作到不?
      

  3.   


    有一表   L_DAYLOG 
    字段类型: 
    ID   INT 
    L_XAY   varchar(10)--主键值 
    L_NAME   varchar(5) 要求写一触发器,在用户新增或修改保存时检查L_XAY是否有重复的值,没有时将数据写入表,有时放弃写入数据ID       L_XAY           L_NAME 
    001       FH0024         王五 
    002       FH0142         李四 
    003       AZ0432         王五 
    004       LA0478         李四 
    ------------------------------写个例子create trigger Tr_L_DAYLOG on L_DAYLOG
    instead of insert, update
    asif not update(L_XAY)--没有更新L_XAY列时不触发下面语句
        return 
    if not exists(select 1 from deleted )--判断新增操作
    insert L_DAYLOG 
    select 
        *
    from 
        inserted i
    where
        not exists(select 1 from L_DAYLOG where L_XAY=i.L_XAY)
    else                        --其它更新
    update l
    set L_XAY=i.L_XAY
    from 
        inserted i
    join
        L_DAYLOG l on i.ID=l.ID
    where
        not exists(select 1 from L_DAYLOG where L_XAY=i.L_XAY)--其它的waterflade 你自行领悟一下
      

  4.   

    另提醒一下,在DELPHI中如果对含有触发器的数据表进行操作要在触发器中加入以下语句,否则会易产生错误:
    AS
    SET NOCOUNT ON
    ...这中间是你在tigger中要做的事
    SET NOCOUNT OFF
      

  5.   

    以上的触发器连重复值也进行了检查再写入的,你就无需再在DELPHI中写语句来进行检查重复值了.