RT,因为比较懒让dbgrid显示的数据直接批处理然后提交,而sql表那里我想实现哪个用户修改的就变更成该用户名字('维护人')。之前想用触发器来实现,因为批处理不是qry.open无法fieldbyname……
CREATE TRIGGER [TRIGGER sales] ON [dbo].[Sales] 
FOR INSERT, UPDATE, DELETE 
AS
var @saleser char(10) 
set  @saleser='张三'        //我想知道这样定义变量究竟是生效了没?
begin
SET NOCOUNT on
update Sales set 维护人=@saleser where 生产订单号 in(select 生产订单号 from inserted)
SET NOCOUNT off
end
但是delphi那里又不知道如何赋值给sql变量……于是寻找方法的时候发现了创建存储过程应该可以实现这个功能
procedure TForm1.Button1Click(Sender: TObject);
begin
with adoquery1 do
begin
close;
sql.Clear;
sql.Add('select * from sales');  //查询到dbgrid
open;
end;
end;procedure TForm1.Button2Click(Sender: TObject);
begin
with ADOStoredProc1 do
begin
close;
ProcedureName:='Updata_sales_1;1';  //想向@saleser 进行赋值,轰出错Parameters'@维护人'not find
Parameters.Refresh;
Parameters.ParamByName('@维护人').Value:=trim(Edit1.Text);
execproc;
end;
adoquery1.UpdateBatch(arAll);//放在with前面会提示sql语句最多只能镶嵌32层;
end;
究竟哪里出错了求各位大大指点

解决方案 »

  1.   

    还是应该用触发器来实现,而且删除时不要真删除,添一个字段,标记上删除,以后的统计查询不要这些记录就可以了,否则无法记录操作人了。这样只要在beforpost前把当前用户和他的动作赋给当前记录的某个字段就可以了,这样做的缺点是,只能记录最后一次改动的用户。或者这个字段比较长或用备注型的,可以记录很多东东,你可以往后追加内容也可以。
    如:
    2011.12.13 15:30 张三 修改
    2011.12.14 13:30 李四 删除
      

  2.   

    批处理能用before post的吗?还有使用触发器实现时delphi应如何向@saleser赋值?
      

  3.   

    什么叫批处理?你是指grid里面的全部数据?
      

  4.   

    create procedure [Updata_sales]
      @PrdID,
      @Saleser
    AS
    update Sales set 维护人=@Saleser where 生产订单号=@PrdID調用:with ADOStoredProc1 do
    begin
        ProcedureName:='Updata_sales';
        Parameters.Clear;
        Parameters.CreateParameter('@PrdId',ftInteger,pdInput,0,100);//这里100是你的订单号    Parameters.CreateParameter('@Saleser',ftstring,pdInput,20,trim(Edit1.Text));
        ExecProc;
    end;
      

  5.   

    调试出错~是delphi这边提示'过程Updata_sales没有参数,但却为该过程提供参数'
    我对sql很白……我是不应该在存储过程里面creat pro还是因为变量没定义好?
      

  6.   

    我随手写的没测试过,这里的变量要加上类型create procedure [Updata_sales]
      @PrdID int,
      @Saleser varchar(20)
    AS
      

  7.   

    是这样的,我打算让用户自由修改dbgrid上显示的数据(修改人 修改时间 除外),然后在发送保存到数据库,所以就把adoqry.Lock Type=ltBatchOptimistic了,之前试过edit post事件都提示adoqry不在edit或updata状态,查了下批处理要用adoquery1.UpdateBatch(arAll)提交,但是就无法像以前那样直接在dbgrid用fieldbyname()写上修改人,修改时间倒是用触发器搞掂了,但是修改人因为有多个,所以想把这个存为变量赋到sql中写入该批被删改的维护人字段中……
      

  8.   

    Del code:
    procedure TForm1.Button2Click(Sender: TObject);
    begin
    with ADOStoredProc1 do
    begin
      ProcedureName:='Updata_sales';
      Parameters.Clear;
      Parameters.CreateParameter('@PrdId',ftstring,pdInput,14,trim(Edit2.Text));
      Parameters.CreateParameter('@Saleser',ftstring,pdInput,20,trim(Edit1.Text));
      ExecProc;
    end;
    end;
    SQL的存储过程:
    CREATE procedure [Updata_sales]
     AS
    declare @PrdId char(14)
    declare @saleser char(10)
    update Sales set 维护人=@saleser where 生产订单号=@PrdId
    GO是一样的提示~调试出错。我还想问下这样设过程会自动找出表里被删改过的行进行维护人字段updata的吗?批量喔~
      

  9.   

    CREATE procedure [Updata_sales]
    declare @PrdId char(14),
    declare @saleser char(10)
    AS
    update Sales set 维护人=@saleser where 生产订单号=@PrdId
      

  10.   

    功能实现了……批处理被删改的记录在adoqry.post之前加上
    procedure TForm1.ADOQuery1BeforePost(DataSet: TDataSet);
    begin
    if adoquery1.UpdateStatus=usUnmodified then
    begin
    adoquery1.FieldByName('维护人').AsString:=saleser;
    end;
    end;
    度娘那里找到的,辛苦了,不过不知道数据量大的时候会不会卡……