请各位高手帮我看看,为什么点击“保存”按钮后,会出现这样的错误信息:“由于将在索引、主关键字中创建重复的值,请求对表的改变没有成功。改变该字段中的或包含重复数据的字段中的数据,删除索引或重新定义索引以允许重复的值并再试一次。”我的代码如下:procedure TfmHiddenRecord.fmHRBtnNew26Click(Sender: TObject);
begin
 DMMain.dsHiddenMaster.DataSet.Append;
 DMMain.dsHiddenDetails.DataSet.Append;
 fmHRedCode0.Text := '0000'+ IntToStr(DMMain.dsHiddenMaster.DataSet.RecordCount + 1);
end;procedure TfmHiddenRecord.fmHRBtnSave30Click(Sender: TObject);
var
  HiddenLines, MeasureLines: Integer;
begin
 IF (DMMain.dsHiddenDetails.DataSet.State = dsInsert) And
   (fmHiddenRecord.fmHRreDetails7.Text = '') Then
  begin
   MessageBox(0, '隐患内容不能为空' + #13#10 + #13#10 +
     '本次操作将被取消!', '提示', mb_OK + mb_IconExclaMation);
   fmHiddenRecord.fmHRreDetails7.SetFocus;
   Abort;
  end; IF (DMMain.dsHiddenDetails.DataSet.State = dsInsert) And
   (fmHiddenRecord.fmHRreMeasure8.Text = '') Then
  begin
   MessageBox(0, '整改措施不能为空' + #13#10 + #13#10 +
     '本次操作将被取消!', '提示', mb_OK + mb_IconExclaMation);
   fmHiddenRecord.fmHRreMeasure8.SetFocus;
   Abort;
  end; IF (DMMain.dsHiddenMaster.DataSet.State <> dsInsert) OR (DMMain.dsHiddenDetails.DataSet.State <> dsInsert) Then
  Abort
 Else
  begin
   DMMain.dsHiddenMaster.DataSet.FieldByName('隐患编号').AsInteger :=
          StrToInt(fmHiddenRecord.fmHRedCode0.Text);
   DMMain.dsHiddenMaster.DataSet.FieldByName('检查日期').AsDateTime :=
          fmHiddenRecord.fmHRdtExamine1.Date;
   DMMain.dsHiddenMaster.DataSet.FieldByName('被检单位').AsString :=
          fmHiddenRecord.fmHRcboxUnit2.Text;
   DMMain.dsHiddenMaster.DataSet.FieldByName('负责人').AsString :=
          fmHiddenRecord.fmHRcboxReceived3.Text;
   DMMain.dsHiddenMaster.DataSet.FieldByName('检查人').AsString :=
          fmHiddenRecord.fmHRcboxRummager4.Text;
   DMMain.dsHiddenMaster.DataSet.FieldByName('检查单位意见').AsString :=
          fmHiddenRecord.fmHRedIdea6.Text;
   IF fmHiddenRecord.fmHRcboxDeadline5.Text <> '10天' Then
    begin
     DMMain.dsHiddenMaster.DataSet.FieldByName('整改期限').AsInteger :=
            StrToInt(Copy(fmHiddenRecord.fmHRcboxDeadline5.Text, 1,
                     Pos('天', fmHiddenRecord.fmHRcboxDeadline5.Text) - 1));
    end
   ELSE
    begin
     DMMain.dsHiddenMaster.DataSet.FieldByName('整改期限').AsInteger :=
            StrToInt(Copy(fmHiddenRecord.fmHRcboxDeadline5.Text, 1,
                     Pos('天', fmHiddenRecord.fmHRcboxDeadline5.Text) - 1));
    end;
   For HiddenLines := 0 to fmHiddenRecord.fmHRreDetails7.Lines.Count - 1 Do
   For MeasureLines := 0 to fmHiddenRecord.fmHRreMeasure8.Lines.Count - 1 Do
    begin
     DMMain.dsHiddenDetails.DataSet.Append;
     DMMain.dsHiddenDetails.DataSet.FieldByName('父编号').AsInteger :=
            StrToInt(fmHiddenRecord.fmHRedCode0.Text);
     DMMain.dsHiddenDetails.DataSet.FieldByName('编号').AsString :=
            fmHiddenRecord.fmHRedCode0.Text + '-' + '1';
     DMMain.dsHiddenDetails.DataSet.FieldByName('隐患内容').AsString :=
            fmHiddenRecord.fmHRreDetails7.Lines.Strings[HiddenLines];
     DMMain.dsHiddenDetails.DataSet.FieldByName('整改措施').AsString :=
            fmHiddenRecord.fmHRreMeasure8.Lines.Strings[MeasureLines];
    end;
  end;
 IF (DMMain.dsHiddenMaster.DataSet.State = dsInsert) And
    (DMMain.dsHiddenDetails.DataSet.State = dsInsert) Then
  begin
   DMMain.dsHiddenDetails.DataSet.Post;
   DMMain.dsHiddenMaster.DataSet.Post;
  end;
end;

解决方案 »

  1.   

    由于不清楚你的数据库结构,只能猜测如下:估计 DMMain.dsHiddenDetails.DataSet 的“编号”字段是不许数值重复的字段,因而,......
       DMMain.dsHiddenDetails.DataSet.FieldByName('编号').AsString :=
       fmHiddenRecord.fmHRedCode0.Text + '-' + '1';
    ......这语句在循环中对该字段赋同一个值而引起错误信息。另外,语句“fmHiddenRecord.fmHRedCode0.Text + '-' + '1'”为什么不写成“fmHiddenRecord.fmHRedCode0.Text + '-1'”呢?“fmHiddenRecord.fmHRedCode0.Text”这个值是否随着循环会变?
      

  2.   

    '隐患编号'、'检查日期'、'被检单位'、'负责人'、'检查人'、'检查单位意见'、'整改期限'这些字段都不随循环改变,只有‘隐患内容’、‘整改措施’随循环改变。fmHiddenRecord.fmHRedCode0.Text的值就是‘隐患编号’,不随For循环改变。之所以这样,是因为每次录入时,一个编号代表一天内一个工作面的检查,后面‘检查日期’、‘……’、‘整改期限’这些,都是这样的。但是每次录入时,一天内一个工作面检查的‘隐患内容’绝对会超过1条,甚至有10条或更多。请问,这样的表,‘隐患编号’需不需要随For循环改变?也就是说,这样的表,应不应该是:“有多少隐患,就要有多少个‘编号’”?
      

  3.   

    另外,我到现在也不明白,我到底哪里赋了重复值了?“隐患编号(即:fmHiddenRecord.fmHRedCode0.Text)”确实是不可重复字段。但什么时候赋了重复值了?
      

  4.   

    既然你不允许重复,而循环中的“fmHiddenRecord.fmHRedCode0.Text”这个值不变,那么,当第二次对该字段赋值时,就出问题了,见循环体内的语句:
      DMMain.dsHiddenDetails.DataSet.FieldByName('编号').AsString :=
        fmHiddenRecord.fmHRedCode0.Text + '-' + '1';每次循环都对编号赋值同一个值,就会造成多笔记录重复编号了