2013-04-03 84 views
0

我正在使用cxGrid,其中有兩個日期字段(start_date和end_date),它們從查詢中獲取其結果。我試圖阻止用戶在網格中輸入數據時輸入錯誤的日期範圍。我試圖阻止用戶輸入比start_date低的end_date。我試過了:防止日期不匹配

procedure TForm1.ABSQuery1BeforePost(DataSet: TDataSet); 
begin 
if (ABSQuery1.FieldByName('end_DATE').AsDateTime < ABSQuery1.FieldByName('start_DATE').AsDateTime) then 
showmessage('end date cant be lower than start date '); 
ABSQuery1.Cancel; 
end; 

我得到的錯誤:dataset沒有處於插入或編輯模式。我該如何解決這個問題,還是有更好的方法來做到這一點?

回答

3

你的代碼是錯誤的:你打電話取消了你,如果建設的,所以你怎麼稱呼它爲有效記錄還可以,但不打電話給你的驗證程序內取消方法。

在這種情況下,cxGrid負責DataSet中編輯的,所以如果你真的想阻止你的用戶輸入錯誤的日期:

的合同,如果你找到的東西,沒有按」引發異常牛逼驗證,所以你可以更改您的代碼是這樣的:

procedure TForm1.ABSQuery1BeforePost(DataSet: TDataSet); 
begin 
if (ABSQuery1.FieldByName('end_DATE').AsDateTime < ABSQuery1.FieldByName('start_DATE').AsDateTime) then 
    raise Exception.Create('end date can''t be lower than start date'); 
end; 

,如果你定義自己的異常類,以避免引發的(太)通用的異常情況,例如,它會更好:

type 
    EInputValidationError = class(Exception) 
    end; 

procedure TForm1.ABSQuery1BeforePost(DataSet: TDataSet); 
begin 
if (ABSQuery1.FieldByName('end_DATE').AsDateTime < ABSQuery1.FieldByName('start_DATE').AsDateTime) then 
    raise EInputValidationError.Create('end date can''t be lower than start date'); 
end; 

這樣,將來您可以將輸入驗證錯誤與程序中引發的其他類型的異常區分開來。

+0

沒有那麼好編程寫我自己的例外...... :) – user763539

1

我會推薦使用字段end_datestart_date的OnValidate,因爲這會在設置字段值時發生,這會在發佈之前很久纔會發生。如果許多字段必須輸入並且例如用戶在發佈時在第三個選項卡上進行編輯,而日期的輸入位於第一個選項卡上。

procedure TForm5.DateSpanValidateValidate(Sender: TField); 
begin 
    if not Sender.DataSet.FieldByName('end_DATE') 
    .IsNull and not Sender.DataSet.FieldByName('start_DATE').IsNull then 
    if (Sender.DataSet.FieldByName('end_DATE') 
     .AsDateTime < Sender.DataSet.FieldByName('start_DATE').AsDateTime) then 
     raise EYourValidationError.Create(
     'end date can''t be lower than start date'); 
end;