一直用java做开发,公司刚接了个cs的 项目要用delphi ,临时报佛脚,也闻不出香臭,有 几个问题大家帮帮忙看看,
,我用的 adotable ,界面上有两个dbgrid ,关联两个表 一个 主表一个 从表
问题
(1)在主表的 dbgrid中删除一条记录,从表也有相应的记录,就会出现
   ORA-02292 违反完整约束条件 ,我 要怎么截取这个错误 让他出现我自己 的 
   showmessage
(2)新增一条记录 在这个界面中我 用的是RzDBEdit1绑定表里的字段 但是当我 一点新增的时候 就 会出现 (无法插入空行,行必须至少有一个列值集) 出现这个后点确定 后可新增记录 数据库中也 相应增加 让我 很 郁闷 还有新增和修改后怎么让RzDBEdit里的内容为空 RzDBEdit.text;='' 不行
   代码
     begin
if zhcForm.modi then
     begin
         meditForm.Caption:='修改信息';
        DM.mparAT.Edit;
     end
     else
     begin
         meditForm.Caption:='添加信息';
         id:=trim(RzDBEdit1.Text);
         if length(id)<0 then
           begin
             ShowMessage('必须填写编号!');
             exit;
            end;
         Dm.mparAT.Insert;
         DM.mparAT.Append;
         Dm.mparAT.Post;
     end;
end;
(3)当我删DBgrid的记录时 删除到 最后一条记录时 也会出现(无法插入空行,行必须至少有一个列值集)删除代码如下
begin
    if MessageDlg('确认要删除吗',mtConfirmation,[mbYes,mbNo],0)=mrYes then
    begin
     dm.mparAT.Delete;
     dm.mparAT.Edit;
     dm.mparAT.Post;
     dm.mparAT.Refresh;
    end;
end;

解决方案 »

  1.   

    (1)在主表的 dbgrid中删除一条记录,从表也有相应的记录,就会出现
       ORA-02292 违反完整约束条件 ,我 要怎么截取这个错误 让他出现我自己 的 
       showmessageADOTable的OnDeleteError事件!2.
             Dm.mparAT.Insert;              //Insert和Append只需要一个就行了!去掉其中一个
             DM.mparAT.Append;
             Dm.mparAT.Post;3.
         dm.mparAT.Delete;                  //最后一条记录已经删除完了!
         dm.mparAT.Edit;                    //你要干嘛呢?你想EDIT谁
         dm.mparAT.Post;直接写dm.mparAT.Delete;试试吧!
      

  2.   

    chenzhuo(睡到自然醒) 
         dm.mparAT.Delete;                  //最后一条记录已经删除完了!
         dm.mparAT.Edit;                    //你要干嘛呢?你想EDIT谁
         dm.mparAT.Post;
    -------------------------
    不加dm.mparAT.Edit; 每执行一次删除都回出来 moarAT:dataset not in edit or insert mode
      

  3.   

    刚又看了下,弄明白了 。adotable的时候 做删除 直接Delete不 用post 就可以 了
      

  4.   

    Post的时候,如果数据集不处在 dsEdit状态就会出现你说的moarAT:dataset not in edit or insert mode
      

  5.   

    谢谢chenzhuo(睡到自然醒) 的提醒
      

  6.   

    chenzhuo(睡到自然醒) 
    ADOTable的OnDeleteError事件!要怎么用.用异常吗
      

  7.   

    procedure TDM.mparATDeleteError(DataSet: TDataSet; E: EDatabaseError;
      var Action: TDataAction);
    begin
       if Dm.mparAT.RecordCount<1 then
           MessageDlg('表中无记录!',mtError,[mbOK],0);
    end;end.
    这样写吗 怎么有问题
      

  8.   

    DeleteError的问题已经解决 
    现在是
    (2)新增一条记录 在这个界面中我 用的是RzDBEdit1绑定表里的字段 但是当我 一点新增的时候 就 会出现 (无法插入空行,行必须至少有一个列值集) 出现这个后点确定 后可新增记录 数据库中也 相应增加 让我 很 郁闷 还有新增和修改后怎么让RzDBEdit里的内容为空 RzDBEdit.text;='' 不行
    ---------------
    不知道怎么 回这样
      

  9.   

    这个已经不是答你了吗?
    2.
             Dm.mparAT.Insert;              //Insert和Append只需要一个就行了!去掉其中一个
             DM.mparAT.Append;
             Dm.mparAT.Post;Insert和Append都是增加的动作;
    你只要用一个就行了!
      

  10.   

    DM.mparAT.Append;
     DM.mparAT.FieldByName('field1').Value := ....
    这里要赋值啊!
     Dm.mparAT.Post;这里应该没没提交吧!
      

  11.   

    照你的描述,你新增的时候应该只要
    DM.mparAT.Append;  就可以了
    Dm.mparAT.Post;是在确定按钮的时候调用的!
      

  12.   

    还有 就是新增记录点确定 怎么让RzDBEdit1里的内容为空 【zDBEdit1.text:=''这样不行】以便继续添加记录
      

  13.   

    那就
    Dm.mparAT.Post;  完之后再
    Dm.mparAT.Append;了
      

  14.   

    我增加和修改的代码写在TmeditForm.FormShow事件里 前面想写在确定按钮里 不理想 有问题去掉post是可以的 但是每次新增完后 还要点击界面上的 保存按钮 这样感觉不太好
      

  15.   

    你点保存的时候这样子!:Dm.mparAT.Post;     //保存!!
    Dm.mparAT.Append;   //再增加!
      

  16.   

    行了 
    在 确定 按钮里写个Dm.mparAT.Append 就OK了
      

  17.   

    因为我 新增和 修改的 窗体用的是一个 所以点是修改的时候 点击确定,也置空了 ,
    现在想加个 按钮 【下一条】点击这个按钮RzDBEdit里面就会相应出现下一条的内
    Dm.mparAT.Next 不行 还是回到刚修改的地方------------
    chenzhuo(睡到自然醒) 有其他的办法么
      

  18.   

    var
     IsAppend: Boolean;
    begin
      IsAppend := Dm.mparAT.State = dsInsert;  //如果是增加状态
      Dm.mparAT.Post;     //保存!!
      if IsAppend then Dm.mparAT.Append;   //再增加!下一条也可以这样写!
    if Not (Dm.mparAT.State in [dsEdit,dsInsert]) then
      if Not Dm.mparAT.Eof then Dm.mparAT.Next;
      

  19.   

    chenzhuo(睡到自然醒)
    按你的写报错:
    [Error] meditUnit.pas(74): Undeclared identifier: 'dsInsert'
    [Error] meditUnit.pas(82): Undeclared identifier: 'dsEdit'
    [Error] meditUnit.pas(82): Incompatible types: 'TDataSetState' and 'Integer'
    [Fatal Error] zhcUnit.pas(52): Could not compile used unit 'meditUnit.pas'
      

  20.   

    uses DB;
    引用单元DB他的定义是
      TDataSetState = (dsInactive, dsBrowse, dsEdit, dsInsert, dsSetKey,
        dsCalcFields, dsFilter, dsNewValue, dsOldValue, dsCurValue, dsBlockRead,
        dsInternalCalc, dsOpening);
      

  21.   

    汗!今天刚用2天delhpi
    不知道往那加
    DB 是什么
    uses DB;是要加到这个meditForm(添加的窗体)的uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ExtCtrls, RzPanel, Grids, DBGrids, DBCtrls, StdCtrls, RzLstBox,
      RzDBList, RzDBGrid, RzDBNav, RzButton;这吗 他的定义又加到那
    还有[Fatal Error] zhcUnit.pas(52): Could not compile used unit 'meditUnit.pas'双击他会提示到zhcForm(就是包还两个DBGrid的)里的 uses dataUnit, meditUnit, pgxUnit, deditUnit;
      

  22.   

    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ExtCtrls, RzPanel, Grids, DBGrids, DBCtrls, StdCtrls, RzLstBox,
      RzDBList, RzDBGrid, RzDBNav, RzButton, DB;
      

  23.   

    TDataSetState = (dsInactive, dsBrowse, dsEdit, dsInsert, dsSetKey,
        dsCalcFields, dsFilter, dsNewValue, dsOldValue, dsCurValue, dsBlockRead,
        dsInternalCalc, dsOpening);
    这个加到那!
      

  24.   

    TDataSetState = (dsInactive, dsBrowse, dsEdit, dsInsert, dsSetKey,
        dsCalcFields, dsFilter, dsNewValue, dsOldValue, dsCurValue, dsBlockRead,
        dsInternalCalc, dsOpening);
    这个加到那!这个不用加,是我告诉你他是怎么定义的!
      

  25.   

    当我删除主表记录的时候从表有对应的 记录就会有错(两个adotable已经关联关联字段为mpara_Id)
     var mpara_id :string;
     begin
       mpara_id:=DBGrid1.fieldbyname('MPARA_ID')AS.string;
      然后在执行个select语句 判断下就知道了 但是adotable好像不能执行sql语句 该怎么办
      

  26.   

    要执行SQL,不用adotable,用adoquery
      

  27.   

    不用adoquery 还有其他办法么 
      

  28.   

    if adotable2.Locate(MPARA_ID,adotable1.fieldbyname('MPARA_ID').asstring,[]) then
      ShowMessage('存在明细');
      

  29.   

    if MessageDlg('确认要删除吗',mtConfirmation,[mbYes,mbNo],0)=mrYes then
        begin
        
          if dm.mparAT.Locate(MPARA_ID,DM.mparAT.fieldbyname('MPARA_ID').asstring,[]) then
            ShowMessage('存在明细');
           dm.mparAT.Delete;
        end;
    报错:[Error] zhcUnit.pas(71): Undeclared identifier: 'MPARA_ID'
          [Fatal Error] LJYH_PGXT.dpr(11): Could not compile used unit 'zhcUnit.pas'
    这个问题完了就结贴
      

  30.   

    if adotable2.Locate(MPARA_ID,adotable1.fieldbyname('MPARA_ID').asstring,[]) then
      ShowMessage('存在明细');MPARA_ID应该要加引号的if 这里是明细的table.Locate('MPARA_ID',adotable1.fieldbyname('MPARA_ID').asstring,[]) then
      ShowMessage('存在明细');
      

  31.   

    还是会出来 【ORA02292:违反完整约束条件(.....)-已找到子记录日志】
      

  32.   

    if MessageDlg('确认要删除吗',mtConfirmation,[mbYes,mbNo],0)=mrYes then
        begin
        
          if dm.mparAT.Locate(MPARA_ID,DM.mparAT.fieldbyname('MPARA_ID').asstring,[]) then
          begin
            ShowMessage('存在明细');
            Abort;               //既然存在记录了,那就不让它删除了,所以可以用Abort或Exit退出!
          end;
           dm.mparAT.Delete;
        end;
      

  33.   

    非常谢谢你 chenzhuo(睡到自然醒)不耐心 ,你给了我很大的帮助,
    好了 现在就 结贴! 再次感谢chenzhuo(睡到自然醒);
    :)
      

  34.   

    呵呵 不好意思打错字了 
    非常谢谢你 chenzhuo(睡到自然醒)的耐心 ,你给了我很大的帮助,
    好了 现在就 结贴! 再次感谢chenzhuo(睡到自然醒);
    :)