为什么会出现“数据集不是新建或编辑状态”这个异常

为什么会出现“数据集不是新建或编辑状态”这个错误
我提个问题,各位高手帮我看看为什么会出现“数据集不是新建或编辑状态”这个错误。

“新建”按钮放在窗体中,数据集组件放在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;

每当点击“保存”,就会出现“从表数据集不是新建或编辑状态”,为什么?应该怎么改?

------解决方案--------------------
建议楼主要多看看书,新建/修改遵循这样的规则,总不会错

append/edit;
赋值
post/cancel;

post/cancel前可以判断是否是在编辑状态,可以这样
if dataset.state in [dsInsert,dsEdit] then

------解决方案--------------------
你的DMADOtbHiddenDetailsBeforePost使用循环了,当循环到最后时,编辑状态会自动变为非编辑状态
所以建议不要在BeforePost里使用循环插入,建议在按保存按钮时使用循环插入数据表的方式比较好!
------解决方案--------------------
procedure TfmHiddenRecord.fmHRBtnSave30Click(Sender: TObject);
begin
IF (主表 = dsInsert) And (从表 = dsInsert) Then
begin
主表.Post;
从表.Post;
end;
end;

——————————————————————————————
问题在这里,从表要先保存,两条语句交换顺序试试:
从表.Post;
主表.Post;

------解决方案--------------------
不能在BeforePost中设置状态...

正确的做法是用TDataSource.AutoEdit := true;
或是在编辑前用TDataSet.Edit方法.