Триггер на обновление данных
Модераторы: m0p3e, edward_K, Модераторы
Триггер на обновление данных
Подскажите, пожалуйста, как правильно написать триггер. Не понимаю связи таблиц Модуль - Спецоснастка- Акт на списание. Мне нужно обновлять значение поля "Работник" значением поля "Работник" из внешнего атрибута позиции спецификации.
СREATE OR REPLACE TRIGGER GAL."MRK_mbpmove_atribut"
after insert, UPDATE,delete
ON GAL.attrnam
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
begin
:NEW.PERSONS.FIO:=gal.attrnam.name;
end;
СREATE OR REPLACE TRIGGER GAL."MRK_mbpmove_atribut"
after insert, UPDATE,delete
ON GAL.attrnam
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
begin
:NEW.PERSONS.FIO:=gal.attrnam.name;
end;
Re: Триггер на обновление данных
конечно переменной Persons.fio надо присваивать не attrnam.name ( здесь хранистя само наименование внешного атрибута - "Работник"), а значение TAV. Откуда оно берется?
Re: Триггер на обновление данных
Значения атрибутов хранятся в таблице ATTRVAL.
Примерно так, наверное, будет:
Примерно так, наверное, будет:
Код: Выделить всё
select vstring
from attrval
where
((
<нрек позиции, откуда ссылка на атрибуты> == crec and
<нрек атрибута (attrnam.nrec)> == cattrnam and
<код таблицы, откуда ссылка на атрибут> == wtable
));
Re: Триггер на обновление данных
RAJAH
Тригер вроде MS SQL, галактические принципы работать не будут.
Наверно лучше докомпиляцией или алгоритмом после/до оприходывания, чем изменением тригеров.
Тригер вроде MS SQL, галактические принципы работать не будут.
Наверно лучше докомпиляцией или алгоритмом после/до оприходывания, чем изменением тригеров.
хороший программист — это человек, который переходя улицу с односторонним движением смотрит в обе стороны
Re: Триггер на обновление данных
Докомпиляцией не получится, версия Галактики старая:((((
А как этот алгоритм будет отрабатывать в момент выбора атрибута? он же должен при каждом изменении обновлять спецификацию акта...
А как этот алгоритм будет отрабатывать в момент выбора атрибута? он же должен при каждом изменении обновлять спецификацию акта...
Re: Триггер на обновление данных
В vipprogr.chm целый подраздел есть - "Триггеры". Там примерно описано, как средствами VIP триггер повесить.n0where писал(а):RAJAH
Тригер вроде MS SQL, галактические принципы работать не будут.
Marisha_P писал(а):А как этот алгоритм будет отрабатывать в момент выбора атрибута?
, т.е., можно применять различные конструкции с использованием before-after и insert-update-deletevipprogr.chm писал(а):Вызовы триггеров осуществляются системой до и после вставки, изменении и удалении записи в БД.
Re: Триггер на обновление данных
Марина изложите все-таки задачу поподробней.
Откуда вы хотите брать ФИО сотрудника и куда его записывать.
Сам триггер написать несложно.
И зачем вообще заниматься таким безобразием.
Откуда вы хотите брать ФИО сотрудника и куда его записывать.
Сам триггер написать несложно.
И зачем вообще заниматься таким безобразием.
Re: Триггер на обновление данных
Мне нужно в акте на списание (модуль "Спецоснастка") обновлять значение поля "Работник" спецификации акта значением поля "Работник" (внешний атрибут позиции спецификации) при каждом изменении значения атрибута....Нужно это дело бухгалтерии
Re: Триггер на обновление данных
А зачем дублирование полей? и заморочка по ним?Marisha_P писал(а):Мне нужно в акте на списание (модуль "Спецоснастка") обновлять значение поля "Работник" спецификации акта значением поля "Работник" (внешний атрибут позиции спецификации) при каждом изменении значения атрибута....Нужно это дело бухгалтерии
даже логику не понимаю.
1. В акте поле работник может быть один, а в спецификации во внешнем атрибуте (или же в стандартном поле) может быть что угодно.
2. В MBPIN есть данные по Работнику, если вы списываете MBPMOVE (MBPOUT), то списываете приходы,
при этом Логичней было бы не заполнять данные по работнику в шапке и брать поле работник со спецификации (MBPIN), т. к. в акте в шапке это поле нужно только для фильтрации в картотеке карточек спецодежы, оснастке.
Ещё на заметку.
Модуль спецоснастки советую не использовать, если у вас по документу Накладная МЦ - СпецОснастка, спецодежда, проводки берутся из ордеров и методика списания - средние цены. Т.к. в спецоснастку цена попадает с накладной, а не с ордера.
хороший программист — это человек, который переходя улицу с односторонним движением смотрит в обе стороны
Re: Триггер на обновление данных
А я логику понять уже давно и не пытаюсь Поставили задачу - хотят, чтобы было так и никак иначе... Надо делать
Re: Триггер на обновление данных
Предполагаю, единственным требованием - настроена проводка так. Её просто надо перенастроить и все. ))) Проблем будет меньше.Marisha_P писал(а):А я логику понять уже давно и не пытаюсь Поставили задачу - хотят, чтобы было так и никак иначе... Надо делать
Наверно нужно объяснить, что делать триггерами не целесообразно, т.к. уменьшится производительность и тп и тп...
Тем более есть стандартное решение.
хороший программист — это человек, который переходя улицу с односторонним движением смотрит в обе стороны
Re: Триггер на обновление данных
Тормозни, тебе задачу некорректно поставили.
А то таблицу Persons будешь при помощи attrval апдейтить.
А то таблицу Persons будешь при помощи attrval апдейтить.
Re: Триггер на обновление данных
C горем пополам написан триггер вот такого вида
CREATE OR REPLACE TRIGGER GAL."MRK_mbpout_rab"
before insert or Update or delete ON "GAL"."ATTRVAL" FOR EACH ROW
WHEN (
(( old.fwtable=2002) or ( 2002 = new.fwtable)) and (new.fcattrnam = '800100000000039D')
)
declare
rabotnik varchar2(16);
old_new_vcomp varchar2(16);
old_new_crec varchar2(16);
BEGIN
begin
select pc.fnrec into rabotnik
from gal.persons PERS, gal.perscard pc, gal.lschet ls
where
(
PC.fCLSCHET = ls.fnrec and
LS.fTPERSON =pers.fnrec and
pers.fnrec = :new.fvcomp);
exception
when others then return;
end;
update gal.mbpin set fcpers = rabotnik
where fnrec in
(select fcmbpin from gal.mbpout where :new.fcrec = fnrec);
END;
/
вопрос такой - данный триггер изменяет значение поля "Работник" только когда выходишь из акта, перемещаешься на другой акт, возвращаешься и тогда только оно становится видимым в спецификации. Это как то можно изменить?:))
CREATE OR REPLACE TRIGGER GAL."MRK_mbpout_rab"
before insert or Update or delete ON "GAL"."ATTRVAL" FOR EACH ROW
WHEN (
(( old.fwtable=2002) or ( 2002 = new.fwtable)) and (new.fcattrnam = '800100000000039D')
)
declare
rabotnik varchar2(16);
old_new_vcomp varchar2(16);
old_new_crec varchar2(16);
BEGIN
begin
select pc.fnrec into rabotnik
from gal.persons PERS, gal.perscard pc, gal.lschet ls
where
(
PC.fCLSCHET = ls.fnrec and
LS.fTPERSON =pers.fnrec and
pers.fnrec = :new.fvcomp);
exception
when others then return;
end;
update gal.mbpin set fcpers = rabotnik
where fnrec in
(select fcmbpin from gal.mbpout where :new.fcrec = fnrec);
END;
/
вопрос такой - данный триггер изменяет значение поля "Работник" только когда выходишь из акта, перемещаешься на другой акт, возвращаешься и тогда только оно становится видимым в спецификации. Это как то можно изменить?:))
-
- Заслуженный деятель интернет-сообщества
- Сообщения: 5187
- Зарегистрирован: 29 мар 2005, 17:49
- Откуда: SPB galaxy spb
Re: Триггер на обновление данных
поскольку снаряды у вас не той системы то никак.
Re: Триггер на обновление данных
Нажимаешь кнопочку обновить экранвопрос такой - данный триггер изменяет значение поля "Работник" только когда выходишь из акта, перемещаешься на другой акт, возвращаешься и тогда только оно становится видимым в спецификации. Это как то можно изменить?:))
хороший программист — это человек, который переходя улицу с односторонним движением смотрит в обе стороны