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

Поместите 'Abort;' в свой PrePost, чтобы предотвратить обновление –

ответ

1

Edit: Я задаюсь вопросом, в чем разница между MYTABLE используется в if..then..else и DataSet которое дается в порядке? Какой объект 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%.

Я надеюсь, что это помогло вам в любом случае, если я неправильно понял вашу проблему, дайте мне знать :)

Edit: Учитывая ваш последний комментарий, я думаю, следующее должно решить проблему.

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

+0

@ user3927897 Отредактирован ответ. Это то, что вам нужно? –

+0

В последнем отредактировании: если я установил флажок и щелкнул сообщение, запись будет вставлена, хотя поле DONE_BY пусто. Аналогично, если я попытаюсь отредактировать запись, просто сняв флажок, этот пост не может быть опубликован в качестве последнего рейза срабатывает. Мне нужно проверить/снять отметку с записи. Когда я устанавливаю флажок, поле done_by также должно быть указано в противном случае, покажите сообщение. Если я сниму флажок, поле done_by и timestamp будут очищены, и запись будет опубликована. – user3927897

Смежные вопросы