【问题标题】:Prevent posting to the database if the required criteria is not met如果未满足所需条件,则阻止发布到数据库
【发布时间】:2014-09-02 00:45:44
【问题描述】:

这是我的代码:

procedure TDataModule2.MYTABLEBeforePost(DataSet: TDataSet);
begin
if (MYTABLE.FieldByName('DONE').Value = 1) then begin
DataSet.FieldByName('DONE_WHEN').AsDateTime:=Now;
end else  begin
DataSet['DONE_BY'] :='';
DataSet.FieldByName('DONE_WHEN').Clear;
end;
end;

字段“DONE”是布尔字段(在网格中表示为复选框),字段“DONE_BY”是从表中接收数据的查找字段。

如果复选框被选中并且“done_by”字段为空,我想要做的是阻止记录的发布。 和其他方式。如果“done_by”为空且未选中“done”,则阻止发布。

因此,如果用户选中复选框但忘记从查找组合中选择名称,则会显示一条消息。 或者他选择了一个名称但忘记选中复选框。我正在使用 cxGrid。有没有办法我可以做到这一点?

【问题讨论】:

  • Abort; 放入您的BeforePost 以防止更新

标签: delphi delphi-xe6


【解决方案1】:

编辑:我想知道,if..then..else 中使用的MYTABLE 和赋予程序的DataSet 有什么区别? MYTABLE是什么对象?

查看您当前的代码,我假设如下(参见代码中的 cmets)

procedure TDataModule2.MYTABLEBeforePost(DataSet: TDataSet);
begin
  if (MYTABLE.FieldByName('DONE').Value = 1) then //Checkbox checked
  begin
    //Should be done when checkbox checked and DONE_BY is not empty
    DataSet.FieldByName('DONE_WHEN').AsDateTime:=Now; 
  end 
  else  
  begin
    //Should happen if input doesn't meet conditions
    DataSet['DONE_BY'] :='';
    DataSet.FieldByName('DONE_WHEN').Clear;
  end;
end;

如果我的假设是正确的,这应该可以解决它:

procedure TDataModule2.MYTABLEBeforePost(DataSet: TDataSet);
begin
  if (MYTABLE.FieldByName('DONE').Value = 1) and 
     (MYTABLE.FieldByName('DONE_BY').Value <> '') then //Checkbox checked and Done_by not empty
  begin
    //Should be done when checkbox checked and DONE_BY is not empty
    DataSet.FieldByName('DONE_WHEN').AsDateTime:=Now; 
  end 
  else  
  begin
    //Should happen if input doesn't meet conditions
    DataSet['DONE_BY'] :='';
    DataSet.FieldByName('DONE_WHEN').Clear;
    Abort;
  end;
end;

我相信 Abort; 是您在 Else 部分中所需要的,但我对此不是 100% 确定。

我希望这对你有任何帮助,如果我误解了你的问题,请告诉我:)

编辑: 鉴于您的最新评论,我认为以下内容应该可以解决问题。

procedure TDataModule2.MYTABLEBeforePost(DataSet: TDataSet);
begin
  if (MYTABLE.FieldByName('DONE').Value = 1) then //Checkbox checked
  begin
    //Should be done when checkbox checked and DONE_BY is not empty
    If DataSet['DONE_BY'] <> '' then
      DataSet.FieldByName('DONE_WHEN').AsDateTime:=Now
    else
      Raise Exception.Create('Your message') 
  end 
  else  
  begin
    //Should happen if input doesn't meet conditions
    DataSet['DONE_BY'] :='';
    DataSet.FieldByName('DONE_WHEN').Clear;
    Raise Exception.Create('Your message')
  end;
end;

您可以使用中止代替异常。根据自己的喜好编辑:)

【讨论】:

  • 当我取消选中“done”时,“done_by”和“done_when”应该被清除。这样,除非我单击取消,否则我的表会被中止。
  • @user3927897 编辑了答案。这就是你所追求的吗?
  • 在最新编辑中:如果我选中复选框并单击发布,则尽管 DONE_BY 字段为空,但记录会被插入。同样,如果我尝试通过取消选中复选框来编辑记录,则此帖子无法在触发最后一次加薪时发布。我需要能够检查/取消检查记录。当我选中复选框字段 done_by 时,还必须提供,否则显示消息。如果我取消选中该复选框,则字段 done_by 和时间戳将被清除并发布记录。
猜你喜欢
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-15
相关资源
最近更新 更多