2014-09-02 56 views
0

这是我的代码:防止过账到数据库如果所要求的标准不被满足

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”为空并且“完成”未选中,则防止发布。

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

+0

放弃'中止;'在你的BeforePost,以防止更新 – 2014-09-02 01:11:05

回答

1

编辑:我想知道,在什么这是考虑到该过程的if..then..elseDataSet的二手MYTABLE之间的区别? MYTABLE是什么类型的对象?

看你当前的代码我假定以下(参见代码中的注释)

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; 

您可以使用中止而不是异常。编辑到你自己的口味:)

+0

当我取消选中“done”,“done_by”和“done_when”应该被清除。这样我的表卡住了中止,除非我点击取消。 – user3927897 2014-09-02 21:05:05

+0

@ user3927897编辑答案。那是你的追求? – 2014-09-03 06:48:39

+0

在最新的编辑:如果我选中复选框,然后单击帖子,虽然DONE_BY字段为空,但记录会被插入。同样,如果我尝试通过取消选中复选框来编辑记录,则此帖子无法张贴为最后一次加注触发。我需要能够检查/取消选中记录。当我检查复选框字段done_by时,还必须提供其他显示消息。如果我取消选中复选框,字段done_by和timestamp会被清除,并且记录被发布。 – user3927897 2014-09-03 10:21:34

相关问题