Страница 1 из 2

Триггер на обновление данных

Добавлено: 18 апр 2011, 11:12
Marisha_P
Подскажите, пожалуйста, как правильно написать триггер. Не понимаю связи таблиц :( Модуль - Спецоснастка- Акт на списание. Мне нужно обновлять значение поля "Работник" значением поля "Работник" из внешнего атрибута позиции спецификации.

С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: Триггер на обновление данных

Добавлено: 18 апр 2011, 11:28
Marisha_P
конечно переменной Persons.fio надо присваивать не attrnam.name ( здесь хранистя само наименование внешного атрибута - "Работник"), а значение TAV. Откуда оно берется?

Re: Триггер на обновление данных

Добавлено: 18 апр 2011, 12:51
RAJAH
Значения атрибутов хранятся в таблице ATTRVAL.
Примерно так, наверное, будет:

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

select vstring
from attrval
where
((
<нрек позиции, откуда ссылка на атрибуты> == crec and
<нрек атрибута (attrnam.nrec)> == cattrnam and
<код таблицы, откуда ссылка на атрибут> == wtable
));

Re: Триггер на обновление данных

Добавлено: 18 апр 2011, 13:00
n0where
RAJAH
Тригер вроде MS SQL, галактические принципы работать не будут.

Наверно лучше докомпиляцией или алгоритмом после/до оприходывания, чем изменением тригеров.

Re: Триггер на обновление данных

Добавлено: 18 апр 2011, 13:39
Marisha_P
Докомпиляцией не получится, версия Галактики старая:((((
А как этот алгоритм будет отрабатывать в момент выбора атрибута? он же должен при каждом изменении обновлять спецификацию акта...

Re: Триггер на обновление данных

Добавлено: 18 апр 2011, 14:10
RAJAH
n0where писал(а):RAJAH
Тригер вроде MS SQL, галактические принципы работать не будут.
В vipprogr.chm целый подраздел есть - "Триггеры". Там примерно описано, как средствами VIP триггер повесить.
Marisha_P писал(а):А как этот алгоритм будет отрабатывать в момент выбора атрибута?
vipprogr.chm писал(а):Вызовы триггеров осуществляются системой до и после вставки, изменении и удалении записи в БД.
, т.е., можно применять различные конструкции с использованием before-after и insert-update-delete

Re: Триггер на обновление данных

Добавлено: 18 апр 2011, 17:18
oiko
Марина изложите все-таки задачу поподробней.
Откуда вы хотите брать ФИО сотрудника и куда его записывать.
Сам триггер написать несложно.
И зачем вообще заниматься таким безобразием.

Re: Триггер на обновление данных

Добавлено: 19 апр 2011, 07:42
Marisha_P
Мне нужно в акте на списание (модуль "Спецоснастка") обновлять значение поля "Работник" спецификации акта значением поля "Работник" (внешний атрибут позиции спецификации) при каждом изменении значения атрибута....Нужно это дело бухгалтерии :)

Re: Триггер на обновление данных

Добавлено: 19 апр 2011, 09:08
n0where
Marisha_P писал(а):Мне нужно в акте на списание (модуль "Спецоснастка") обновлять значение поля "Работник" спецификации акта значением поля "Работник" (внешний атрибут позиции спецификации) при каждом изменении значения атрибута....Нужно это дело бухгалтерии :)
А зачем дублирование полей? и заморочка по ним?

даже логику не понимаю.
1. В акте поле работник может быть один, а в спецификации во внешнем атрибуте (или же в стандартном поле) может быть что угодно.
2. В MBPIN есть данные по Работнику, если вы списываете MBPMOVE (MBPOUT), то списываете приходы,
при этом Логичней было бы не заполнять данные по работнику в шапке и брать поле работник со спецификации (MBPIN), т. к. в акте в шапке это поле нужно только для фильтрации в картотеке карточек спецодежы, оснастке.

Ещё на заметку.
Модуль спецоснастки советую не использовать, если у вас по документу Накладная МЦ - СпецОснастка, спецодежда, проводки берутся из ордеров и методика списания - средние цены. Т.к. в спецоснастку цена попадает с накладной, а не с ордера.

Re: Триггер на обновление данных

Добавлено: 19 апр 2011, 11:51
Marisha_P
А я логику понять уже давно и не пытаюсь :) Поставили задачу - хотят, чтобы было так и никак иначе... Надо делать

Re: Триггер на обновление данных

Добавлено: 19 апр 2011, 12:27
n0where
Marisha_P писал(а):А я логику понять уже давно и не пытаюсь :) Поставили задачу - хотят, чтобы было так и никак иначе... Надо делать
Предполагаю, единственным требованием - настроена проводка так. Её просто надо перенастроить и все. ))) Проблем будет меньше.
Наверно нужно объяснить, что делать триггерами не целесообразно, т.к. уменьшится производительность и тп и тп...

Тем более есть стандартное решение.

Re: Триггер на обновление данных

Добавлено: 19 апр 2011, 14:33
oiko
Тормозни, тебе задачу некорректно поставили.
А то таблицу Persons будешь при помощи attrval апдейтить.

Re: Триггер на обновление данных

Добавлено: 05 май 2011, 14:04
Marisha_P
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;
/

вопрос такой - данный триггер изменяет значение поля "Работник" только когда выходишь из акта, перемещаешься на другой акт, возвращаешься и тогда только оно становится видимым в спецификации. Это как то можно изменить?:))

Re: Триггер на обновление данных

Добавлено: 05 май 2011, 15:31
edward_K
поскольку снаряды у вас не той системы то никак.

Re: Триггер на обновление данных

Добавлено: 05 май 2011, 16:32
n0where
вопрос такой - данный триггер изменяет значение поля "Работник" только когда выходишь из акта, перемещаешься на другой акт, возвращаешься и тогда только оно становится видимым в спецификации. Это как то можно изменить?:))
Нажимаешь кнопочку обновить экран :-)