我提个问题,各位高手帮我看看为什么会出现“数据集不是新建或编辑状态”这个错误。“新建”按钮放在窗体中,数据集组件放在TDataMoudal,TDataMoudal的名字是:DMMain。我把“字段赋值”的代码放在主、从表的DMMain里主、从表数据集的BeforePost事件里。procedure TfmHiddenRecord.fmHRBtnNew26Click(Sender: TObject);
begin
 DMMain.dsHiddenMaster.DataSet.Append;
 fmHRedCode0.Text := '0000'+ IntToStr(DMMain.dsHiddenMaster.DataSet.RecordCount + 1);
end;procedure TDMMain.DMADOtbHiddenMasterBeforePost(DataSet: TDataSet);
begin
 IF DMMain.dsHiddenMaster.DataSet.State = dsInsert Then
  begin
   隐患编号 := ……;
   检查日期 := ……;
   被检单位 := ……;
   负责人 := ……;
   检查人 := ……;
   检查单位意见 := ……;
   整改期限 := ……;
  end;
end;procedure TDMMain.DMADOtbHiddenDetailsBeforePost(DataSet: TDataSet);
var
  HiddenLines, MeasureLines: Integer;
begin
 IF DMMain.dsHiddenDetails.DataSet.State = dsInsert Then
  begin
   For HiddenLines := 0 to RichEdit1.Lines.Count - 1 Do
    begin
     DMMain.dsHiddenDetails.DataSet.Append;
     父编号 := ……;
     编号 := ……;
     隐患内容 := RichEdit1.Lines.Strings[MeasureLines];
     For MeasureLines := 0 to RichEdit2.Lines.Count - 1 Do
      begin
       整改措施 := RichEdit2.Lines.Strings[MeasureLines];
      end;
    end;
  end;procedure TfmHiddenRecord.fmHRBtnSave30Click(Sender: TObject);
begin
IF (主表 = dsInsert) And (从表 = dsInsert) Then
  begin
   主表.Post;
   从表.Post;
  end;
end;每当点击“保存”,就会出现“从表数据集不是新建或编辑状态”,为什么?应该怎么改?

解决方案 »

  1.   

    没有处在编辑状态,post要出错,你不如判断 if(adoquery1.modified)之类的
      

  2.   

    建议楼主要多看看书,新建/修改遵循这样的规则,总不会错append/edit;
    赋值
    post/cancel;post/cancel前可以判断是否是在编辑状态,可以这样
    if dataset.state in [dsInsert,dsEdit] then
      

  3.   

    你的DMADOtbHiddenDetailsBeforePost使用循环了,当循环到最后时,编辑状态会自动变为非编辑状态
    所以建议不要在BeforePost里使用循环插入,建议在按保存按钮时使用循环插入数据表的方式比较好!
      

  4.   

    procedure TfmHiddenRecord.fmHRBtnSave30Click(Sender: TObject);
    begin
    IF (主表 = dsInsert) And (从表 = dsInsert) Then
      begin
      主表.Post;
      从表.Post;
      end;
    end;——————————————————————————————
    问题在这里,从表要先保存,两条语句交换顺序试试:
      从表.Post;
      主表.Post;
      

  5.   

    不能在BeforePost中设置状态...正确的做法是用TDataSource.AutoEdit := true;
    或是在编辑前用TDataSet.Edit方法.