Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Производственный или рабочий календарь / 25 сообщений из 25, страница 1 из 1
03.09.2013, 15:33
    #38385595
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Производственный или рабочий календарь
Так как возникает иногда потребность, а реализации бывают разные, то предлагаю обсудить частный случай для FB и допилить совместными усилиями до совершенства.

Из таблицы вырезаны названия дней и месяцев, которые генерировались с помощью самописной UDF.

Таблица Calendar:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
/******************************************************************************/
/***               Generated by IBExpert 03.09.2013 15:23:31                ***/
/******************************************************************************/

/******************************************************************************/
/***      Following SET SQL DIALECT is just for the Database Comparer       ***/
/******************************************************************************/
SET SQL DIALECT 3;

CREATE DOMAIN BOOL AS
NUMERIC(1,0)
DEFAULT 0
NOT NULL
CHECK (value in (0, 1));

COMMENT ON DOMAIN BOOL IS 
'Логическое';

CREATE DOMAIN CALENDARITEM AS
SMALLINT
NOT NULL;

CREATE DOMAIN DATEITEM AS
DATE
NOT NULL;

/******************************************************************************/
/***                                 Tables                                 ***/
/******************************************************************************/



CREATE TABLE CALENDAR (
    VAL            DATEITEM /* DATEITEM = DATE NOT NULL */,
    DAY_OF_WEEK    CALENDARITEM /* CALENDARITEM = SMALLINT NOT NULL */,
    DAY_OF_MONTH   CALENDARITEM /* CALENDARITEM = SMALLINT NOT NULL */,
    DAY_OF_YEAR    CALENDARITEM /* CALENDARITEM = SMALLINT NOT NULL */,
    WEEK_OF_MONTH  CALENDARITEM /* CALENDARITEM = SMALLINT NOT NULL */,
    WEEK_OF_YEAR   CALENDARITEM /* CALENDARITEM = SMALLINT NOT NULL */,
    MONTH_OF_YEAR  CALENDARITEM /* CALENDARITEM = SMALLINT NOT NULL */,
    QUARTER        CALENDARITEM /* CALENDARITEM = SMALLINT NOT NULL */,
    YEAR_OF        CALENDARITEM /* CALENDARITEM = SMALLINT NOT NULL */,
    IS_LEAP        BOOL /* BOOL = NUMERIC(1,0) DEFAULT 0 NOT NULL CHECK (value in (0, 1)) */,
    IS_WORK_DAY    BOOL /* BOOL = NUMERIC(1,0) DEFAULT 0 NOT NULL CHECK (value in (0, 1)) */,
    IS_WEEKEND     BOOL /* BOOL = NUMERIC(1,0) DEFAULT 0 NOT NULL CHECK (value in (0, 1)) */,
    IS_HOLIDAY     BOOL /* BOOL = NUMERIC(1,0) DEFAULT 0 NOT NULL CHECK (value in (0, 1)) */
);




/******************************************************************************/
/***                              Primary Keys                              ***/
/******************************************************************************/

ALTER TABLE CALENDAR ADD CONSTRAINT PK_CALENDAR PRIMARY KEY (VAL);


/******************************************************************************/
/***                                Indices                                 ***/
/******************************************************************************/

CREATE INDEX CALENDAR_DOM ON CALENDAR (DAY_OF_MONTH);
CREATE INDEX CALENDAR_DOY ON CALENDAR (DAY_OF_YEAR);
CREATE INDEX CALENDAR_IH ON CALENDAR (IS_HOLIDAY);
CREATE INDEX CALENDAR_IL ON CALENDAR (IS_LEAP);
CREATE INDEX CALENDAR_IW ON CALENDAR (IS_WEEKEND);
CREATE INDEX CALENDAR_IWD ON CALENDAR (IS_WORK_DAY);
CREATE INDEX CALENDAR_MOY ON CALENDAR (MONTH_OF_YEAR);
CREATE INDEX CALENDAR_Q ON CALENDAR (QUARTER);
CREATE INDEX CALENDAR_DOW ON CALENDAR (DAY_OF_WEEK);
CREATE INDEX CALENDAR_WOM ON CALENDAR (WEEK_OF_MONTH);
CREATE INDEX CALENDAR_WOY ON CALENDAR (WEEK_OF_YEAR);
CREATE INDEX CALENDAR_YF ON CALENDAR (YEAR_OF);


/******************************************************************************/
/***                              Descriptions                              ***/
/******************************************************************************/

COMMENT ON TABLE CALENDAR IS 
'Календарь';



/******************************************************************************/
/***                          Fields descriptions                           ***/
/******************************************************************************/

COMMENT ON COLUMN CALENDAR.VAL IS 
'Дата';

COMMENT ON COLUMN CALENDAR.DAY_OF_WEEK IS 
'День недели';

COMMENT ON COLUMN CALENDAR.DAY_OF_MONTH IS 
'День месяца';

COMMENT ON COLUMN CALENDAR.DAY_OF_YEAR IS 
'День года';

COMMENT ON COLUMN CALENDAR.WEEK_OF_MONTH IS 
'Неделя месяца';

COMMENT ON COLUMN CALENDAR.WEEK_OF_YEAR IS 
'Неделя года';

COMMENT ON COLUMN CALENDAR.MONTH_OF_YEAR IS 
'Месяц';

COMMENT ON COLUMN CALENDAR.QUARTER IS 
'Квартал';

COMMENT ON COLUMN CALENDAR.YEAR_OF IS 
'Год';

COMMENT ON COLUMN CALENDAR.IS_LEAP IS 
'Високосный год';

COMMENT ON COLUMN CALENDAR.IS_WORK_DAY IS 
'Рабочий день (пн-пт)';

COMMENT ON COLUMN CALENDAR.IS_WEEKEND IS 
'Выходной (сб, вс)';

COMMENT ON COLUMN CALENDAR.IS_HOLIDAY IS 
'Праздничный день';



/******************************************************************************/
/***                               Privileges                               ***/
/******************************************************************************/



Процедура по его заполнению:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
SET TERM ^ ;

create or alter procedure FILL_CALENDAR (
    IFROM DATEITEM,
    ITO DATEITEM)
as
declare variable VAL DATEITEM;
declare variable D DATEITEM;
declare variable DOW CALENDARITEM;
declare variable DOM CALENDARITEM;
declare variable DOY CALENDARITEM;
declare variable WOM CALENDARITEM;
declare variable WOY CALENDARITEM;
declare variable MOY CALENDARITEM;
declare variable Q CALENDARITEM;
declare variable YO CALENDARITEM;
declare variable IWD BOOL;
declare variable IW BOOL;
declare variable IH BOOL;
declare variable IL BOOL;
begin
  val = :ifrom;
  while (:val < :ito) do begin
    il = 0;
    iwd = 0;
    iw = 0;
    ih = 0;
    d = :val - EXTRACT(WEEKDAY FROM :val-1) + 3;
    dow = extract(weekday from :val); -- день недели
    dom = extract(day from :val); -- день месяца
    doy = extract(yearday from :val); -- день года
    wom = EXTRACT(day FROM :val)/7 + 1; -- неделя месяца
    woy = (EXTRACT(YEARDAY FROM :d) - EXTRACT(WEEKDAY FROM :d-1) + 7) / 7e0; -- неделя года
    moy = extract(month from :val); -- месяц
    q = (EXTRACT(MONTH FROM :val)-1)/3+1; -- квартал
    yo = extract(year from :val); -- год
    if ((:dow = 6)or(:dow = 7)) then iw = 1; else iwd = 1; -- выходные или рабочие
    IF ( 2 = EXTRACT(MONTH FROM (:val - EXTRACT(YEARDAY FROM :val) + 59)) ) THEN IL = 1; -- високосный

    -- определим некоторые праздничные дни
    if ((:moy = 1)and(:dow = 1)) then begin
      ih = 1; -- новый год
      iwd = 0; -- не рабочий
      iw = 1; -- выходной
    end
    else if ((:moy = 1)and(:dow = 7)) then begin
      ih = 1; -- рождество христово
      iwd = 0; -- не рабочий
      iw = 1; -- выходной
    end
    else if ((:moy = 2)and(:dow = 23)) then begin
      ih = 1; -- день защитника отечества
      iwd = 0; -- не рабочий
      iw = 1; -- выходной
    end
    else if ((:moy = 3)and(:dow = 8)) then begin
      ih = 1; -- международный женский день
      iwd = 0; -- не рабочий
      iw = 1; -- выходной
    end
    else if ((:moy = 5)and(:dow = 1)) then begin
      ih = 1; -- праздник весны и труда
      iwd = 0; -- не рабочий
      iw = 1; -- выходной
    end
    else if ((:moy = 5)and(:dow = 9)) then begin
      ih = 1; -- день победы
      iwd = 0; -- не рабочий
      iw = 1; -- выходной
    end
    else if ((:moy = 6)and(:dow = 12)) then begin
      ih = 1; -- день россии
      iwd = 0; -- не рабочий
      iw = 1; -- выходной
    end
    else if ((:moy = 11)and(:dow = 4)) then begin
      ih = 1; -- день народного единства
      iwd = 0; -- не рабочий
      iw = 1; -- выходной
    end

    update or insert into calendar(val, day_of_week, day_of_month, day_of_year, week_of_month, week_of_year, month_of_year,
        quarter, year_of, is_leap, is_work_day, is_weekend, is_holiday)
      values (:val, :dow, :dom, :doy, :wom, :woy, :moy, :q, :yo, :il, :iwd, :iw, :ih)
      matching (val);
    val = :val + 1;
  end
end
^

SET TERM ; ^

/* Following GRANT statetements are generated automatically */

GRANT SELECT,INSERT,UPDATE ON CALENDAR TO PROCEDURE FILL_CALENDAR;

/* Existing privileges on this procedure */

GRANT EXECUTE ON PROCEDURE FILL_CALENDAR TO SYSDBA;


Модератор: Процедура заменена по просьбе автора.
...
Рейтинг: 0 / 0
03.09.2013, 16:33
    #38385671
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Производственный или рабочий календарь
wadman,

Хм... Я храню только праздничные дни (в виде обычной даты) - т.к. они НЕ являются строго регламентируемыми и привязываются к конкретному предприятию. (Ну и также всякие переносы присутствуют). Все остальное считаю "на лету".
...
Рейтинг: 0 / 0
03.09.2013, 16:41
    #38385687
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Производственный или рабочий календарь
DarkMasterВсе остальное считаю "на лету".
Значит у тебя нет потребности посмотреть динамику производства или продаж по дням недели/неделе/кварталу и т.п.
...
Рейтинг: 0 / 0
03.09.2013, 16:43
    #38385692
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Производственный или рабочий календарь
wadman,

Предметная область другая...
...
Рейтинг: 0 / 0
04.09.2013, 06:58
    #38386103
zeon11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Производственный или рабочий календарь
wadman,
1. Добавить первичный ключ
2. Добавить количество рабочих часов, ведь есть сезонные интервалы.
У нас, например, в Кузбассе, в огородный период, с май по сентябрь, для женщин по пятницам рабочий день короче на 1 час, а то и на два.
3. Связать календарь отношением M-to-M cо списком сотрудников, пусть у каждого будет свой календарь, где отмечать особые даты, отпуск, день рождения, дата приёма на работу и т.д.
4. сделать п.3 для отдела
5. Можно прикрутиь и TimeTable, типа ежедневника, тогда уже ТаймМенеджмент можно поднять. Начальство одобрит, а коллеги .... .
...
Рейтинг: 0 / 0
04.09.2013, 09:22
    #38386150
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Производственный или рабочий календарь
zeon111. Добавить первичный ключ
PRIMARY KEY? Чуть кофе не поперхнулся. :)
zeon112. Добавить количество рабочих часов, ведь есть сезонные интервалы.
У нас производство за редким исключением круглосуточное, но в целом согласен в купе с п.4.
zeon113. Связать календарь отношением M-to-M cо списком сотрудников, пусть у каждого будет свой календарь, где отмечать особые даты, отпуск, день рождения, дата приёма на работу и т.д.
Не согласен: свойства элементов (день приема/рождения/увольнения), как и его исторические изменения (штрафы, отпуска, повышения/понижения, прогулы) не стоит пихать в календарь. И касательно моего случая количество календарей вырастет на несколько тысяч - тихий ужас.
zeon114. сделать п.3 для отдела
Предлагай свой вариант таблицы, так будет честно, т.к. у меня only производство и для него большего и не нужно.
zeon115. Можно прикрутиь и TimeTable, типа ежедневника, тогда уже ТаймМенеджмент можно поднять. Начальство одобрит, а коллеги .... .
Так же считаю, что это не для календаря. У нас, к примеру, для этого есть пропускная система на всех дверях.

zeon11, ты теоретизируешь, признайся? :)
...
Рейтинг: 0 / 0
04.09.2013, 10:24
    #38386207
zeon11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Производственный или рабочий календарь
wadmanzeon11, ты теоретизируешь, признайся? :)

Угу, теоретизирую.....
...
Рейтинг: 0 / 0
04.09.2013, 10:35
    #38386220
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Производственный или рабочий календарь
zeon11Угу, теоретизирую.....
Сколько у тебя строк в календаре на один год?
...
Рейтинг: 0 / 0
04.09.2013, 10:38
    #38386222
oleg_m
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Производственный или рабочий календарь
wadman, не парься.
Самый универсальный календарь сделать наверно можно, но он будет излишне сложным для конкретных применений.
...
Рейтинг: 0 / 0
04.09.2013, 11:04
    #38386264
zeon11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Производственный или рабочий календарь
Про первичный ключ:
Я разглядел, что у тебя
ALTER TABLE CALENDAR ADD CONSTRAINT PK_CALENDAR PRIMARY KEY (VAL);
Но! первичный ключ по дате лишает тебя манёвра на случай, если ты захочешь иметь не один, а два или три календаря. Поясняю, например, в твоём предприятии появилась дочерняя контора, которая работает по вечерам и в выходные и праздничные дни. Что будешь делать? только создавать ещё одну аналогичную таблицу со всеми триггерами и прочими причиндалами, поскольку в твоей таблице первичный ключ - дата.
А если суррогатный ключ есть - то никаких проблем, пусть новый календарь живёт в этой-же таблице.

wadmanНе согласен: свойства элементов (день приема/рождения/увольнения), как и его исторические изменения (штрафы, отпуска, повышения/понижения, прогулы) не стоит пихать в календарь. И касательно моего случая количество календарей вырастет на несколько тысяч - тихий ужас

Я-же нигде не говорил, что каждому сотруднику свою таблицу календаря.
Связываем сотрудника отношением М-М с календарём. Например, для твоего случая делаем таблицу
Код: sql
1.
2.
3.
4.
5.
6.
CREATE TABLE CALENDAR_PERSONNEL (
    VAL            DATEITEM /* DATEITEM = DATE NOT NULL */,
    ID_PERSONNEL    INTEGER ,
    SHINE_DAY  BOOL DEFAULT 1,
    EBONY_DAY BOOL DEFAULT 0,
    HUE_OF_DAY VARCHAR(40));



где хранится корректировка календаря для конкретного сотрудника.
...
Рейтинг: 0 / 0
04.09.2013, 11:16
    #38386281
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Производственный или рабочий календарь
zeon11Но! первичный ключ по дате лишает тебя манёвра на случай, если ты захочешь иметь не один, а два или три календаря. Поясняю, например, в твоём предприятии появилась дочерняя контора, которая работает по вечерам и в выходные и праздничные дни.
Как и я говорил ранее, меня волнует только производство - там нет нерабочих дней и нет необходимости считать рабочие часы и посещаемость ибо оно круглосуточное.

Понимаешь, наша дискуссия выглядит так, будто ты навязываешь мне свой вариант не учитывая, что мой календарь живет и выполняет возложенные на него требования на 100%. Попробуй не оспаривать мой вариант, а предложить свой и подчеркни отличия/плюсы.
...
Рейтинг: 0 / 0
04.09.2013, 11:19
    #38386290
zeon11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Производственный или рабочий календарь
wadmanzeon11Угу, теоретизирую.....
Сколько у тебя строк в календаре на один год?

Когда как, в високосный 366, а обычно 365. Это на одно предприятие.
К календарю прикручена таблица расписания, (это то, что показано зелёным),
таблица расписаний генерится в процедуре на сервере на 1 день по шаблону (отдельная таблица) или по дню-образцу.
...
Рейтинг: 0 / 0
04.09.2013, 11:30
    #38386312
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Производственный или рабочий календарь
zeon11Когда как, в високосный 366, а обычно 365. Это на одно предприятие.
К календарю прикручена таблица расписания, (это то, что показано зелёным),
Я-то думал, что ты все это 14792184 предлагаешь ввернуть в календарь. :) Так-то с предложением добавить поле вроде "Тип календаря/отдела" и включить его в ПК в целом согласен, если-бы мне нужно было учитывать работу еще и управления, которое как известно работает как у белых людей заведено.
...
Рейтинг: 0 / 0
04.09.2013, 11:35
    #38386320
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Производственный или рабочий календарь
такое впечатление, что гугл календарем никто не пользуется... Это я хотя бы про имитацию фич.
...
Рейтинг: 0 / 0
04.09.2013, 11:36
    #38386325
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Производственный или рабочий календарь
kdvтакое впечатление, что гугл календарем никто не пользуется...
Правильное впечатление. :)
...
Рейтинг: 0 / 0
04.09.2013, 11:40
    #38386332
zeon11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Производственный или рабочий календарь
wadman,

У меня практически такой-же календарь, как у тебя, только названия полей другие, есть первичный суррогатный ключ, есть поле - FOREIGN KEY предприятия-владельца календаря,
нет индексов по "вычисляемым" полям.
На календарь навешана куча обвязок из таблиц М-М на разные случаи жизни.
...
Рейтинг: 0 / 0
04.09.2013, 12:07
    #38386391
zeon11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Производственный или рабочий календарь
wadman,

В своё время рассматривал вариант построения календаря на ARRAY,
матричные операции и прочие, как-бы плюшки, однако, реляционая модель всё-таки предпочтительнее оказалась.
...
Рейтинг: 0 / 0
04.09.2013, 12:35
    #38386461
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Производственный или рабочий календарь
wadmanПроцедура по его заполнению:
В ней косячек оказался.
Ув. модераторы, поправьте стартовый пост, пожалуйста.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
SET TERM ^ ;

create or alter procedure FILL_CALENDAR (
    IFROM DATEITEM,
    ITO DATEITEM)
as
declare variable VAL DATEITEM;
declare variable D DATEITEM;
declare variable DOW CALENDARITEM;
declare variable DOM CALENDARITEM;
declare variable DOY CALENDARITEM;
declare variable WOM CALENDARITEM;
declare variable WOY CALENDARITEM;
declare variable MOY CALENDARITEM;
declare variable Q CALENDARITEM;
declare variable YO CALENDARITEM;
declare variable IWD BOOL;
declare variable IW BOOL;
declare variable IH BOOL;
declare variable IL BOOL;
begin
  val = :ifrom;
  while (:val < :ito) do begin
    il = 0;
    iwd = 0;
    iw = 0;
    ih = 0;
    d = :val - EXTRACT(WEEKDAY FROM :val-1) + 3;
    dow = extract(weekday from :val); -- день недели
    dom = extract(day from :val); -- день месяца
    doy = extract(yearday from :val); -- день года
    wom = EXTRACT(day FROM :val)/7 + 1; -- неделя месяца
    woy = (EXTRACT(YEARDAY FROM :d) - EXTRACT(WEEKDAY FROM :d-1) + 7) / 7e0; -- неделя года
    moy = extract(month from :val); -- месяц
    q = (EXTRACT(MONTH FROM :val)-1)/3+1; -- квартал
    yo = extract(year from :val); -- год
    if ((:dow = 6)or(:dow = 7)) then iw = 1; else iwd = 1; -- выходные или рабочие
    IF ( 2 = EXTRACT(MONTH FROM (:val - EXTRACT(YEARDAY FROM :val) + 59)) ) THEN IL = 1; -- високосный

    -- определим некоторые праздничные дни
    if ((:moy = 1)and(:dow = 1)) then begin
      ih = 1; -- новый год
      iwd = 0; -- не рабочий
      iw = 1; -- выходной
    end
    else if ((:moy = 1)and(:dow = 7)) then begin
      ih = 1; -- рождество христово
      iwd = 0; -- не рабочий
      iw = 1; -- выходной
    end
    else if ((:moy = 2)and(:dow = 23)) then begin
      ih = 1; -- день защитника отечества
      iwd = 0; -- не рабочий
      iw = 1; -- выходной
    end
    else if ((:moy = 3)and(:dow = 8)) then begin
      ih = 1; -- международный женский день
      iwd = 0; -- не рабочий
      iw = 1; -- выходной
    end
    else if ((:moy = 5)and(:dow = 1)) then begin
      ih = 1; -- праздник весны и труда
      iwd = 0; -- не рабочий
      iw = 1; -- выходной
    end
    else if ((:moy = 5)and(:dow = 9)) then begin
      ih = 1; -- день победы
      iwd = 0; -- не рабочий
      iw = 1; -- выходной
    end
    else if ((:moy = 6)and(:dow = 12)) then begin
      ih = 1; -- день россии
      iwd = 0; -- не рабочий
      iw = 1; -- выходной
    end
    else if ((:moy = 11)and(:dow = 4)) then begin
      ih = 1; -- день народного единства
      iwd = 0; -- не рабочий
      iw = 1; -- выходной
    end

    update or insert into calendar(val, day_of_week, day_of_month, day_of_year, week_of_month, week_of_year, month_of_year,
        quarter, year_of, is_leap, is_work_day, is_weekend, is_holiday)
      values (:val, :dow, :dom, :doy, :wom, :woy, :moy, :q, :yo, :il, :iwd, :iw, :ih)
      matching (val);
    val = :val + 1;
  end
end
^

SET TERM ; ^

/* Following GRANT statetements are generated automatically */

GRANT SELECT,INSERT,UPDATE ON CALENDAR TO PROCEDURE FILL_CALENDAR;

/* Existing privileges on this procedure */

GRANT EXECUTE ON PROCEDURE FILL_CALENDAR TO SYSDBA;



В старой версии current_date затесался вместо val.
...
Рейтинг: 0 / 0
04.09.2013, 14:37
    #38386692
Ivan_Pisarevsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Производственный или рабочий календарь
Исправил.
...
Рейтинг: 0 / 0
04.09.2013, 22:20
    #38387253
__Avenger__
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Производственный или рабочий календарь
У нас в организации проще, нам этот справочник рассылают. Причем в двух вариантах. Первый - без учета регионов, второй - по регионам .
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
10.06.2015, 18:39
    #38981522
iGuest1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Производственный или рабочий календарь
__Avenger__,

для 2015 г. неправильно заполнился
...
Рейтинг: 0 / 0
10.06.2015, 18:41
    #38981524
Поручик ·· Ржевский
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Производственный или рабочий календарь
партизан из лесу вышел, мля!
...
Рейтинг: 0 / 0
10.06.2015, 18:55
    #38981540
iGuest1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Производственный или рабочий календарь
Поручик ·· Ржевский,
Код: sql
1.
2.
    d = :val - EXTRACT(WEEKDAY FROM :val-1) + 3;
    if ((:dow = 6)or(:dow = 7)) then iw = 1; else iwd = 1; -- выходные или рабочие


косяк где-то тут)
...
Рейтинг: 0 / 0
10.06.2015, 18:58
    #38981543
Поручик ·· Ржевский
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Производственный или рабочий календарь
косяк скурили 2 года назад.
ты пришел с опозданием.
...
Рейтинг: 0 / 0
10.06.2015, 19:05
    #38981549
iGuest1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Производственный или рабочий календарь
Поручик ·· Ржевский,

пусть и скурили, но может кому-то пригодится

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
  while (:val < :ito) do begin
    il = 0;
    iwd = 0;
    iw = 0;
    ih = 0;
    d = :val - EXTRACT(WEEKDAY FROM :val-1) + 3;
    dow = extract(weekday from :val); -- день недели
    if (:dow=0) then
    begin
      dow = 7;
    end
    dom = extract(day from :val); -- день месяца
    doy = extract(yearday from :val) + 1; -- день года
    wom = EXTRACT(day FROM :val)/7 + 1; -- неделя месяца
    woy = (EXTRACT(YEARDAY FROM :d) - EXTRACT(WEEKDAY FROM :d-1) + 7) / 7e0; -- неделя года
    moy = extract(month from :val); -- месяц
    q = (EXTRACT(MONTH FROM :val)-1)/3+1; -- квартал
    yo = extract(year from :val); -- год
    if ((:dow = 6)or(:dow = 7)) then iw = 1; else iwd = 1; -- выходные или рабочие
    IF ( 2 = EXTRACT(MONTH FROM (:val - EXTRACT(YEARDAY FROM :val) + 59)) ) THEN IL = 1; -- високосный
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Производственный или рабочий календарь / 25 сообщений из 25, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]