может кто реализовывал?

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

Ответить
AndrewVL
Сообщения: 33
Зарегистрирован: 24 авг 2005, 16:14

может кто реализовывал?

Сообщение AndrewVL » 09 янв 2010, 00:48

Здравствуйте.

такой вот вопрос возник.


Есть таблицы, где имеются приказы (например) по контингенту сотрудников.
В шапке номер приказа, идентификатор подразделения.
В теле - ид сотрудника и с какой он даты числится в пожразделении.

далее идут приказы изменения статусов.
Например в первом приказе в подразделении №1 на 01.01.2009 имеется сотрудник №1
Далее идет приказ об увольнении из подразделения №1 с 10.01.2009
потом идет приказ о приеме в подразделение №1 от 20.01.2009.
потом увольнение.
потом идет приказ о приеме в подразделение №2 от 30.01.2009.
Каждый тип приказа имеет свой идентификатор.


хотелось бы как можно проще получать информацию в каком подразделении какой сотрудник находится на определенную дату .

допустим за определенный период сотрудник был уволен и принят 2-4 раза . как получить где он находтся и его статус на определенную дату.



Спасибо

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Re: может кто реализовывал?

Сообщение Dimitry Sibiryakov » 09 янв 2010, 13:27

AndrewVL писал(а):хотелось бы как можно проще получать информацию в каком подразделении какой сотрудник находится на определенную дату .
STFW "Периодические атрибуты".

Заводишь таблицу истории сотрудничества с полями:
ссылка на сотрудника
ссылка на подразделение
дата приёма
ссылка на приказ приёма
дата увольнения (default 9999 год)
ссылка на приказ увольнения

Эта таблица ведётся триггерами на таблице приказов.

Как результат запрос получается очень простым: select подразделение from эта таблица where нужная дата between дата приёма and дата увольнения.

AndrewVL
Сообщения: 33
Зарегистрирован: 24 авг 2005, 16:14

Re: может кто реализовывал?

Сообщение AndrewVL » 11 янв 2010, 18:13

нарисовал такие триггера

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

CREATE OR ALTER trigger table_ai0 for table
active before insert position 1
as
declare variable table_id  integer;
declare variable from_date  date;
begin
  select c from table where table.thing_id = new.thing_id
  and new.from_date between table.from_date and table.to_date into :table_id;
  update table set table.to_date = new.from_date-1 ,table.next_id = new.c
   where c = :table_id;
   if (exists (select c from table where table.thing_id = new.reating_orders_all_id
   and table.to_date <= new.from_date-1 )) then


end

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

CREATE OR ALTER trigger table_bu0 for table
active before update position 0
AS
  declare variable table_id  integer;
begin
  if (new.to_date <> old.to_date) then



begin
  select c from table where table.thing_id = new.thing_id
  and new.to_date+1 between table.from_date and table.to_date into :table_id;


  update table set table.to_date =

  (select from_date-1 from table where from_date < new.to_date)

  where c = :table_id;
end
end

на удаление пока еще не придумал :-)


Что скажете? Мож где косяк?

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Re: может кто реализовывал?

Сообщение Dimitry Sibiryakov » 12 янв 2010, 13:36

На мой взгляд эти триггеры вообще никак с первым постом не стыкуются. И даже компилироваться откажутся из-за отсутствия имени таблицы.

AndrewVL
Сообщения: 33
Зарегистрирован: 24 авг 2005, 16:14

Re: может кто реализовывал?

Сообщение AndrewVL » 16 янв 2010, 16:45

вроде разобрался.

но другой вопрос возникает.

есть таблица движений.
дата начала - дата окончания нахождения человека в определенном подразделении.

но на основании этой таблицы каждый день формируются списки.
т.е.
ИД_ПОДРАЗДЕЛЕНИЯ, ИД_СОТРУДНИКА и прочие атрибуты

вопрос. Как быть если сотрудник был в подразделении №1 на 01.01.2010. списки сформировались.
потом его перевели 10.01.2010 в другое подразделение (№2). но ввели приказ только 01.02.2010. естественно с датой начала действия 10.01.2010
а списки формировались в период с 10.01.2010 по 01.02.2010. т.е. получается на момент формирования списков он числится в подразделении №1.
и на 31.01.2010 он числится в подразделении №1. пока не ввели задним числом приказ.
В общем - как в таком случае списки синхронизируются?
Хотелось бы в таблицах списков в шапке указывать только дату. а в теле - ссылки на таблицы движения.
По если документы вводятся задним числом - так не получится.

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Re: может кто реализовывал?

Сообщение Dimitry Sibiryakov » 17 янв 2010, 13:19

Пару раз лишить премии отдел кадров и ввод приказов задним числом прекратится как по волшебству.

AndrewVL
Сообщения: 33
Зарегистрирован: 24 авг 2005, 16:14

Re: может кто реализовывал?

Сообщение AndrewVL » 17 янв 2010, 13:40

это то понятно :-)

Но все же.:-)

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

Re: может кто реализовывал?

Сообщение kdv » 17 янв 2010, 14:17

попытка автоматизировать хаос? зачем тогда автоматизация...

Ответить