запрет редактирования

Модераторы: kdv, CyberMax

Ответить
Antarey
Сообщения: 18
Зарегистрирован: 26 ноя 2007, 15:30

запрет редактирования

Сообщение Antarey » 19 июн 2008, 12:35

народ помогите реализовать триггер - надо запретить редактировать
поле NAME если поле ID равно отределенному значению,к примеру 0
и показался месадж типа "низзя"
пасиб

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 19 июн 2008, 12:45

Код: Выделить всё

if (old.ID = 0) then
  if (old.NAME != new.NAME) then
    exception myexcept 'низзя';
Однако, ты не предусматриваешь случай, когда поле ID редактируется, и становится "определённым", либо наоборот, перестаёт быть "определённым".

ИМХО, такие проверки лучше сразу делать на клиенте, просто выключая редактирование соответствующих полей.

Antarey
Сообщения: 18
Зарегистрирован: 26 ноя 2007, 15:30

Сообщение Antarey » 19 июн 2008, 12:57

WildSery
У меня фиксированій справочник и меняться будет токо одно поле и то не для асех записей
пасиб за ответ.
я пока ждал реализовал так
AS
begin
if ((new.KOD_GRYPU=0) or (old.KOD_GRYPU=1) or (old.KOD_GRYPU=4) or (old.KOD_GRYPU=7) or (old.KOD_GRYPU=10)) then
begin
exception ZAPRET_RED;
new.byhchet=old.byhchet; - токо не уверен нужна ли ета строка

end
end

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 19 июн 2008, 13:02

токо не уверен нужна ли ета строка
нет. exception отменит все изменения всех триггеров, которые сработали в этом update (или insert).

Antarey
Сообщения: 18
Зарегистрирован: 26 ноя 2007, 15:30

Сообщение Antarey » 19 июн 2008, 13:46

ясно.Пасиб всем.
Вопрос не по етой теме -
как реализовать прогресс выполнения процедуры - я на коиенте запустил процедуру и хочу видеть сикоко записей отработалось -
самый простой вариант в клиентском приложении показать какой-то
сплаш типа ждите, а вот как получать колво выполненных операций
для цыкла на клиентском приложении или в идеале как реализовать
прогрес на сервере?

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 19 июн 2008, 14:18

процедуру с возвращаемым значением (числом) и suspend.
которая будет периодически запихивать нечто в это число и вызывать suspend. Процедуру надо будет вызывать по select.

Antarey
Сообщения: 18
Зарегистрирован: 26 ноя 2007, 15:30

Сообщение Antarey » 19 июн 2008, 14:25

kdv - а на сервере?, или токо через юдф?
Если не достал :), еще такой вопрос - есть местер-датал табличка,
в детале история изменения по % как выбрать все записи мастера
и одну максимальную запись детайла,
такой запрос выдает две записи детайла - в нем две записи с различными датами

select m.NAME,MAX(d.DATA),d.PROC,m.BYHCHET from grupa m left join proc_grypu d on m.master_id=d.master_grypu
group by m.NAME,d.DATA,d.PROC,m.BYHCHET
Последний раз редактировалось Antarey 19 июн 2008, 14:33, всего редактировалось 1 раз.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 19 июн 2008, 14:31

что, блин, "на сервере"? :) сервер прогресс-бар будет крутить?
Твоя понимай, где сервера, а где клиента? и что "токо через юдф"?
Юдф достанет кочергу и будет бить клиента по заднице?

сервер на запрос клиента может че-то сделать и выдать обратно инфу, клиенту. Также сервер может думать и ничего не выдавать клиенту.
Процедура, которая что-то долго делает - это с точки зрения клиента "серверный думатель". Чтобы клиент не плакал, ожидаючи, можно симулировать вызов процедуры как обычный селект, который что-то периодически возвращает.
Например, как запрос, который мееееедленно возвращает циферки 1, 2, 3, 4...
Я тебе и привел пример - делаешь селективную процедуру, возвращающую числовую переменную. И т.д.

Antarey
Сообщения: 18
Зарегистрирован: 26 ноя 2007, 15:30

Сообщение Antarey » 19 июн 2008, 14:37

kdv,пасиб немного грубо :) но зато понятно
а насчет запроса ?

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 19 июн 2008, 14:41

kdv писал(а):процедуру с возвращаемым значением (числом) и suspend.
которая будет периодически запихивать нечто в это число и вызывать suspend. Процедуру надо будет вызывать по select.
Сдаёццо мне, что сия долгодумающая процедура не мульён записей обрабатывает, а сотни две. И весь резалтсет пульнет бар-художнику в самом конце - сетевого пакета не наберёт :) Такшта не просто по select, а по select for update. И через правильные компоненты, которые его понимают. А лучше поправить консерваторию и пролетать она будет за секунду :)

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 19 июн 2008, 14:44

это не грубо. это так, с прибаутками :)

насчет запроса - запрос неправильный.

Код: Выделить всё

select m.NAME,MAX(d.DATA),d.PROC,m.BYHCHET
...
group by m.NAME,d.DATA,d.PROC,m.BYHCHET
в group by надо убрать d.DATA. И вообще. Для понятности желательно
в селекте указывать сначала столбцы группировки, потом агрегатные функции.
типа

Код: Выделить всё

select a, b, c, max(d), avg(e)
...
group by a, b, c

Antarey
Сообщения: 18
Зарегистрирован: 26 ноя 2007, 15:30

Сообщение Antarey » 19 июн 2008, 15:17

kdv
по твоему совету такой код
select m.NAME,m.BYHCHET,d.proc,MAX(d.DATA) from grupa m
left join proc_grypu d on m.master_id=d.master_grypu
group by m.NAME,m.BYHCHET,d.proc
но он мне показывает две записи из детайла ибо в нем разные даты
и соответственно разые %,если я убираю поле d.proc то да мне показывается одна дата а мне надо один % ну и желательно шоб я увидел дату его изменения

Ответить