2014-09-02 3 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_BY "는 테이블에서 데이터를받는 조회 필드입니다.

내가하려는 것은 확인란이 선택되어 있고 "done_by"필드가 비어 있으면 레코드 게시를 막는 것입니다. 그리고 다른 방법 arround. "done_by"가 비어 있고 "done"이 선택되어 있지 않으면 게시하지 마십시오.

사용자가 확인란을 선택했지만 조회 콤보에서 이름을 선택하지 않으면 메시지가 표시됩니다. 또는 그는 이름을 선택하지만 확인란을 선택하지 않습니다. cxGrid를 사용하고 있습니다. 내가 할 수있는 방법이 있니?

+0

"done", "done_by"및 "done_when"의 선택을 취소하면 –

답변

1

편집 : 나는 궁금하네요은 무엇 MYTABLE의 차이는 프로 시저에 주어진 if..then..elseDataSet에 사용되는? 어떤 종류의 물체가 MYTABLE입니까?

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; 모든 당신을 믿습니다 : 나는 다음을 가정하여 현재 코드를 보면

내 가정이 정확하다면이 그것을 수정해야

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; 

(코드에 주석을 참조) 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

업데이트를 막기 위해 BeforePost에'Abort;'를 넣어야합니다. 취소를 클릭하지 않으면 내 테이블이 중단됩니다. – user3927897

+0

@ user3927897 답변을 편집했습니다. 그게 네가 쫓아 온거야? –

+0

최근 수정 : 체크 박스를 선택하고 게시를 클릭하면 DONE_BY 필드가 비어 있지만 레코드가 삽입됩니다. 마찬가지로 체크 박스를 선택 취소하여 레코드를 편집하면이 게시물은 마지막으로 올릴 수 없습니다. 트리거 됨. 나는 기록을 확인/선택 취소 할 수 있어야한다. 체크 박스 필드를 체크했을 때 done_by는 반드시 메시지를 표시해야합니다. 확인란을 선택 취소하면 필드 done_by 및 타임 스탬프가 지워지고 레코드가 게시됩니다. – user3927897