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

Программирование на Атлантисе (VIP, FCOM, ARD), FastReport

Модераторы: m0p3e, edward_K, Модераторы

Marisha_P
Местный житель
Сообщения: 232
Зарегистрирован: 10 ноя 2010, 13:49

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

Сообщение 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;
Marisha_P
Местный житель
Сообщения: 232
Зарегистрирован: 10 ноя 2010, 13:49

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

Сообщение Marisha_P »

конечно переменной Persons.fio надо присваивать не attrnam.name ( здесь хранистя само наименование внешного атрибута - "Работник"), а значение TAV. Откуда оно берется?
RAJAH
Местный житель
Сообщения: 932
Зарегистрирован: 18 фев 2008, 12:49

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

Сообщение RAJAH »

Значения атрибутов хранятся в таблице ATTRVAL.
Примерно так, наверное, будет:

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

select vstring
from attrval
where
((
<нрек позиции, откуда ссылка на атрибуты> == crec and
<нрек атрибута (attrnam.nrec)> == cattrnam and
<код таблицы, откуда ссылка на атрибут> == wtable
));
n0where
Местный житель
Сообщения: 499
Зарегистрирован: 30 дек 2010, 08:16

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

Сообщение n0where »

RAJAH
Тригер вроде MS SQL, галактические принципы работать не будут.

Наверно лучше докомпиляцией или алгоритмом после/до оприходывания, чем изменением тригеров.
хороший программист — это человек, который переходя улицу с односторонним движением смотрит в обе стороны
Marisha_P
Местный житель
Сообщения: 232
Зарегистрирован: 10 ноя 2010, 13:49

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

Сообщение Marisha_P »

Докомпиляцией не получится, версия Галактики старая:((((
А как этот алгоритм будет отрабатывать в момент выбора атрибута? он же должен при каждом изменении обновлять спецификацию акта...
RAJAH
Местный житель
Сообщения: 932
Зарегистрирован: 18 фев 2008, 12:49

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

Сообщение RAJAH »

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

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

Сообщение oiko »

Марина изложите все-таки задачу поподробней.
Откуда вы хотите брать ФИО сотрудника и куда его записывать.
Сам триггер написать несложно.
И зачем вообще заниматься таким безобразием.
Marisha_P
Местный житель
Сообщения: 232
Зарегистрирован: 10 ноя 2010, 13:49

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

Сообщение Marisha_P »

Мне нужно в акте на списание (модуль "Спецоснастка") обновлять значение поля "Работник" спецификации акта значением поля "Работник" (внешний атрибут позиции спецификации) при каждом изменении значения атрибута....Нужно это дело бухгалтерии :)
n0where
Местный житель
Сообщения: 499
Зарегистрирован: 30 дек 2010, 08:16

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

Сообщение n0where »

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

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

Ещё на заметку.
Модуль спецоснастки советую не использовать, если у вас по документу Накладная МЦ - СпецОснастка, спецодежда, проводки берутся из ордеров и методика списания - средние цены. Т.к. в спецоснастку цена попадает с накладной, а не с ордера.
хороший программист — это человек, который переходя улицу с односторонним движением смотрит в обе стороны
Marisha_P
Местный житель
Сообщения: 232
Зарегистрирован: 10 ноя 2010, 13:49

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

Сообщение Marisha_P »

А я логику понять уже давно и не пытаюсь :) Поставили задачу - хотят, чтобы было так и никак иначе... Надо делать
n0where
Местный житель
Сообщения: 499
Зарегистрирован: 30 дек 2010, 08:16

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

Сообщение n0where »

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

Тем более есть стандартное решение.
хороший программист — это человек, который переходя улицу с односторонним движением смотрит в обе стороны
oiko
Местный житель
Сообщения: 418
Зарегистрирован: 29 мар 2005, 17:49

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

Сообщение oiko »

Тормозни, тебе задачу некорректно поставили.
А то таблицу Persons будешь при помощи attrval апдейтить.
Marisha_P
Местный житель
Сообщения: 232
Зарегистрирован: 10 ноя 2010, 13:49

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

Сообщение 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;
/

вопрос такой - данный триггер изменяет значение поля "Работник" только когда выходишь из акта, перемещаешься на другой акт, возвращаешься и тогда только оно становится видимым в спецификации. Это как то можно изменить?:))
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5187
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

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

Сообщение edward_K »

поскольку снаряды у вас не той системы то никак.
n0where
Местный житель
Сообщения: 499
Зарегистрирован: 30 дек 2010, 08:16

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

Сообщение n0where »

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