2014-09-02 24 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