1 (edited by savage 2014-10-20 15:39:29)

Topic: [Решено] Автоблокировка определенных полей от изменения пользователем

Вечер добрый!

Есть одна не совсем тривиальная задача. Суть:

1. есть ряд пользователей, которым регулярно ставятся задачи на выполнение
2. есть необходимость ,чтобы после согласования дат старта и финиша плановых ,эти поля можно было заблокировать от изменения пользователем
3. изменения можно вносить только после разблокировки конкретной записи администратором
4. желательно, чтобы после согласования всех задач можно было блокировку сделать за 1 раз, а не редактируя каждую запись (ручной режим тоже вариант, но мрачный), временную разблокировку делаем, естественно, вручную

Хотелось бы получить направление/алгоритм решения этой задачи. Код - только, если не справлюсь

пока приходит в голову следующее (не уверен, что прав):
1. завести в таблице учета задач отдельное поле со статусом блокировки "Да/Нет".
2. на форме создания/корректировки записи, сделать соответствующий checkbox
3. Для всех юзеров, кроме админа, сделать этот checkbox недоступным для редактирования (скрывать не надо - пусть видят статус блокировки)
4. Соответственно, после согласования сроков, администратор редактирует записи и проставляет в checkbox статус блокировать (чекит их)
5. после проставления администратором блокировки, соответствующие поля формы становятся недоступными (проверка на статус блокировки в таблице задач)

Вопрос - как 4 и 5 сделать автоматически не могу продумать...

Re: [Решено] Автоблокировка определенных полей от изменения пользователем

4. Думаю можно автоматически, с помощью SQL запроса UPDATE
SQL команда UPDATE позволяет обновить не только одну запись, но и несколько, которые удовлетворяют условию, например

UPDATE task SET isBlock = 1 WHERE (DateStart IS NOT NULL) and (DateFinish IS NOT NULL) 

т.е. блокируем записи, у которых дата старта и дата финиша присутствует.
думаю тут не хватает еще статуса задачи, например чтобы отличать уже выполненную задачу и новую, чтобы данный SQL запрос блокировал только новые задачи


5. В событии OnShow формы для редактирования, проверяем состояние CheckBox, если он True, то просто блокируем кнопку для Сохранения записи на этой форме
например так:

procedure Form2_OnShow (Sender: string; Action: string);
begin
     Form2.ButtonSave.Enabled := not Form2.CheckBox1.Checked;                                                                                                                                                                 
end;
Dmitry.

3 (edited by savage 2014-10-20 15:49:31)

Re: [Решено] Автоблокировка определенных полей от изменения пользователем

DriveSoft, сделал аналогично. Все отрабатывает наура.
Единственное, я привязывался не к состоянию CheckBox , а получал значение поля blockT из таблицы Tasks (если 1 - блокируем, если 0 - разблокируем).
CheckBox я использовал для возможности вручную под admin разблокировать ту-иную запись + для информирования юзеров, что записи заблокированы злобным админом.

DriveSoft, может глянуть на этот код:

//// блокировка всех Задач и Подзадач если даты плановые определены и задачи/подзадачи имеют статус "Активна"
procedure Dicts_bBlock_OnClick (Sender: string; var Cancel: boolean);
begin

 SQLExecute ('UPDATE Tasks SET blockT = (CASE WHEN (start_PF IS NOT NULL) and (finishPL IS NOT NULL) then 1 else 0 end) WHERE (active_task = 1);');
 SQLExecute ('UPDATE SubTasks SET blockST = (CASE WHEN (start_pf IS NOT NULL) and (finish_plan IS NOT NULL) then  1 else 0 end) WHERE (active_st =1) ;');
 Dicts.bBlock.Enabled := False;
 ShowMessage('Записи заблокированы!');
 Dicts.bBlock.Enabled := True;
end;

Все ли здесь гут?

Re: [Решено] Автоблокировка определенных полей от изменения пользователем

Об этом даст знать тестирование )
но думаю верно.

Dmitry.