小弟我自学Delphi,刚上手,下面的问题我琢磨不出来了。
有两个Table: T_Table1(ADOQuery1)和T_Table2(ADOQuery2),DBGridEh1,btnShow,btnSave
T_Table1的字段:name depart age salary
T_Table2的字段:name depart age salary fee(支出费用,货币格式)
我的目的:点击show按钮,把T_Table1的信息只显示在DBGridEh1中,不保存进T_Table2,
----------------------------------------
|name | depart | age | salary | fee  |
|————————————————————-
|     |        |     |        |      |
然后在fee字段里敲入数据,再点保存按钮,此时再把DBGridEh1中的数据保存进T_Table2中。
我的代码是这样的:
procedure TFrom.btnShowClick(Sender: TObject);
begin
  //打开ADOQuery1(省略);
  //打开ADOQuery2
  with ADOQuery2 do
  begin
    Append;
    FieldByName('name').asstring:=ADOQuery1.FieldByName('name').asstring;
    FieldByName('depart').asstring:=ADOQuery1.FieldByName('depart').asstring;
    FieldByName('age').asstring:=ADOQuery1.FieldByName('age').asstring;
    FieldByName('salary').asstring:=ADOQuery1.FieldByName('salary').asstring;
    Post;
  end;
end;procedure TFrom.btnSaveClick(Sender: TObject);
begin
  //打开ADOQuery1(省略);
  //打开ADOQuery2
  with ADOQuery2 do
  begin
    Append;
    FieldByName('name').asstring:=ADOQuery1.FieldByName('name').asstring;
    FieldByName('depart').asstring:=ADOQuery1.FieldByName('depart').asstring;
    FieldByName('age').asstring:=ADOQuery1.FieldByName('age').asstring;
    FieldByName('salary').asstring:=ADOQuery1.FieldByName('salary').asstring;
    FieldByName('fee').asstring:=DBGridEh1.Columns[4];//把输入的fee存进T_Table2
    Post;
  end;
end;1.结果FieldByName('fee').asstring:=DBGridEh1.Columns[4];报错,
2.屏蔽掉FieldByName('fee').asstring:=DBGridEh1.Columns[4];这句后,程序通过,但保存的时候
  fee字段保存不了,而且在DBGridEh1中出现两行同样的数据。
请问各位师兄,如何解决???是不是我的方法错了??有更优化的代码更好。谢谢
    

解决方案 »

  1.   

    首先楼主希望通过一个DBGrid来实现数据的编辑
    但你的数据来源是表T_Table1,而你希望更新到T_Table2
    这种方式是行不通的除非你不用数据感知控件,也就是说你不要用DBGrid
    改用StringGrid这样,你就可以用一个按钮来实现将T_Table1中的数据填充到
    StringGrid中,然后让用户编辑
    之后,再通过Save按钮来保存用户的编辑数据
      

  2.   

    另外一种方式:就是先将T_Table1中的数据全部增加到T_Table2中
    然后直接用DBGrid来编辑T_Table2即可如:
    with AdoQuery1 do
    begin
      Close;
      SQL.Text := 'Insert into T_Table2(name,depart,age,salary,fee) ' +
                  'select name,depart,age,salary, 0 from T_Table1';
      ExecSQL;
    end;
      

  3.   

    谢谢  duanhai(段海)
    StringGrid我没用过啊,等我试试看
      

  4.   

    将T_Table1中的数据全部增加到T_Table2中
    然后直接用DBGrid来编辑T_Table2s时,fee字段的金额如何保存?
    FieldByName('fee').asstring:=DBGridEh1.Columns[4];这句行吗?
      

  5.   

    结果FieldByName('fee').asstring:=DBGridEh1.Columns[4];报错,
    试:
    FieldByName('fee').asstring:=DBGridEh1.Columns[4].asstring
      

  6.   

    to楼主,如果你用的是C/S结构,且没有用缓存更新的话
    根本不需要你写SQL语句的另外
    FieldByName('fee').asstring:=DBGridEh1.Columns[4].asstring
    这种写法,是有很大的依赖性的
    如:
    select name,fee,depart,age,salary from T_Table2
    将会出错
      

  7.   

    以上的各位谢谢了,
    我先将T_Table1中的数据全部增加到T_Table2中
    然后直接用DBGrid来编辑T_Table2,
    T_Table1的数据的确更新到T_Table2中了,但还有个问题:
    此时,保存在T_Table2中出现了两条记录呀,
      

  8.   

    你的目的:点击show按钮,把T_Table1的信息只显示在DBGridEh1中,不保存进T_Table2
    但你的代码已经把table1的内容保存到table2中了啊,你不是只显示就够了嘛?
      

  9.   

    统计一下以上的问题,归纳如以下:
    我先将T_Table1中的数据全部增加到T_Table2中
    with AdoQuery1 do
    begin
      Close;
      SQL.Text := 'Insert into T_Table2(name,depart,age,salary,fee) ' +
                  'select name,depart,age,salary, 0 from T_Table1';
      ExecSQL;
    end;
    然后直接用DBGrid来显示(此时不保存进Table2中),
    在修改了DBGridEh中的fee字段后,点保存按钮保存将信息存进Table2中。
    (请问是不是要用到缓存更新??我没接触过呀,请高人尽量给点代码参考学习!谢谢!)
      

  10.   

    你是想一下子把table1里面的所有项都显示在DBgrid里,还是每次选择一项显示在里面?
    我倒是作过把所有项都显示在StringGrid里的!