2015-04-27 2 views
0

Когда протокол таблицы утвержден (Timesheet_approved * is Not Null), срабатывает триггер, который рассчитает оплату стандартных часов (Payroll_standard *) и оплату за каждую сверхурочную работу (Payroll_overtime * = стандартные часы X 1.5) за предыдущую неделю в таблице Payroll.Расчеты с использованием триггеров

Необходимо также рассчитать пенсионный взнос (Payroll_pension * = 10% от стандартного + С течением времени) из-за, а затем обновить таблицу расчета заработной платы (разработка, что следующий фонд заработной платы идентификатор будет)

Пожалуйста, обратите внимание * используется указать имена атрибутов таблицы. Таблицы, используемые/затронутые, являются funtom_Timesheet и funtom_Payroll

До сих пор у меня есть код ниже. Тем не менее, я продолжаю получать ошибки вокруг плохой переменной привязки:

LINE/COL ERROR 
-------- ------------------------------------------------------------- 
32/3  PL/SQL: SQL Statement ignored 
33/3  PL/SQL: ORA-01747: invalid user.table.column, table.column, or column specification 

33/3  PLS-00049: bad bind variable 'NEW.PAYROLL_STANDARD' 
34/3  PLS-00049: bad bind variable 'NEW.PAYROLL_OVERTIME' 
35/3  PLS-00049: bad bind variable 'NEW.PAYROLL_PENSION' 
41/1  PLS-00049: bad bind variable 'NEW.PAYROLL_ID' 
SQL> 

Это код Trigger

CREATE OR REPLACE TRIGGER trg_PAYROLLCALC 
After UPDATE 
on funtom_Timesheet FOR EACH ROW 

Declare 
V_TimesheetHRS number; 
V_GRADEHRS number; 
V_TimesheetOT number; 
v_OTGRADEHRS number; 
v_payrollID number; 

BEGIN 

SELECT Grade_rate into V_GRADEHRS 
FROM Grade join Employee on (Emp_grade = grade_id) 
where emp_ID = Timesheet_emp 
; 

SELECT Timesheet_hours into V_TimesheetHRS 
From Funtom_timesheet join Funtom_employee on (emp_ID = Timesheet_emp) 
where emp_ID = Timesheet_emp 
; 

Select Timesheet_OT into V_TimesheetOT 
From Timesheet join Employee on (emp_ID = Timesheet_emp) 
where emp_ID = Timesheet_emp 
; 

select Sum(Grade_rate * 1.5) into v_OTGRADEHRS 
from Grade join Employee on (Emp_grade = grade_id) 
where emp_ID = Timesheet_emp 
; 


IF Timesheet_approved IS NOT NULL then 
Update funtom_Payroll set 
:new.Payroll_standard := V_GRADEHRS * V_TimesheetHRS; 
:new.Payroll_overtime := v_OTGRADEHRS * V_TimesheetOT; 
:new.Payroll_pension := ((V_GRADEHRS * V_TimesheetHRS)+(v_OTGRADEHRS * V_TimesheetOT)); 
END IF; 

Select MAX(Payroll_id)+1 into v_payrollID 
from Payroll; 

:new.Payroll_id := v_payrollID; 

END; 
/
+0

Здравствуйте! Перейдите на страницу http://stackoverflow.com/help/how-to-ask, чтобы узнать, как задать вопрос. –

+0

Пожалуйста, разместите структуру таблицы – anudeepks

+0

И не пишите о * Табличном расписании * сущности (и т. Д.), Не объясняя, какие данные вы фактически говорите. –

ответ

0

Ошибка в том, что :new.<field_name> является читаемой ссылкой на новую строку в funtom_Timesheet которой строка обновляются вызвана этот триггер срабатывает. Команде update funtom_Payroll нужны имена полей из таблицы funtom_Payroll в позиции, на которую вы ссылались :new. Вы можете ссылаться на :new и :old в этом обновлении после :=, но, вероятно, не раньше. Если вы объясните, что должен делать триггер, я могу помочь исправить код запуска.

+0

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

+0

Расписание расписано (Timesheet_approved * is Not Null) рассчитать платеж за стандартные часы (Payroll_standard *) и оплату для любой сверхурочной работы (Payroll_overtime * = стандартные часы X 1.5) за предыдущую неделю в таблице Payroll. Необходимо также рассчитать пенсионный взнос (Payroll_pension * = 10% от стандартного + с течением времени) и затем обновить таблицу расчета заработной платы (что будет следующим идентификатором платежной ведомости) Обратите внимание, что * используется для указания имен атрибутов таблицы. Таблицы, используемые/затронутые, являются funtom_Timesheet и funtom_Payroll –

+0

Есть несколько вещей, которые могут быть неправильными. с первым запросом на выбор. Из-за того, что 'v_gradehrs' был u sed позже, похоже, что вы хотите получить оценку для сотрудника на расписании. 'ВЫБРАТЬ Grade_rate в V_GRADEHRS из класса присоединиться к Employee на (Emp_grade = grade_id) где emp_id = Timesheet_emp ;' Тогда вы можете его посмотреть, как это вместо того, чтобы, хотя и не зная, какие таблицы emp_grade и grade_id находятся, это трудно скажите: 'ВЫБРАТЬ Grade_rate в V_GRADEHRS из класса присоединиться к Employee на (Emp_grade = grade_id) где emp_id =: new.Timesheet_emp ;' –