Вот ФМ (на входе правило графика, на выходе сам график), как уже говорилось - навеяно РУГАБ-ом:
Code:
function Z_HR_WORK_SCHEDULE.
*"----------------------------------------------------------------------
*"*"Глобальный интерфейс:
*" IMPORTING
*" REFERENCE(ZEITY) TYPE T503-ZEITY
*" REFERENCE(MOFID) TYPE T001P-MOFID
*" REFERENCE(MOSID) TYPE T001P-MOSID
*" REFERENCE(SCHKZ) TYPE T508A-SCHKZ
*" VALUE(BEGDA) LIKE SY-DATUM
*" VALUE(ENDDA) LIKE SY-DATUM
*" TABLES
*" PERWS STRUCTURE PTPSP
*" EXCEPTIONS
*" ERROR_OCCURED
*" ABORT_OCCURED
*"----------------------------------------------------------------------
data subrc like sy-subrc.
data date like sy-datum.
refresh perws.
date = begda - 1.
while date lt endda.
date = date + 1.
clear perws.
* Правило графика
perform read508a using zeity mofid mosid schkz date.
perws-datum = date.
perws-motpr = t508a-motpr. " группировка подразделов персонала
perws-zmodn = t508a-zmodn. " график на период
* Месячный график
perform read_dws_from_t552a using date
zeity
mofid
mosid
schkz
t508a-motty
changing perws-tprog
perws-varia
perws-ftkla
perws-tagty.
* Однодневный график
perform read550a using perws-motpr
perws-tprog
perws-varia
date.
perws-pamod = t550a-pamod.
perws-stdaz = t550a-sollz.
translate perws-ftkla using ' 0'.
translate perws-tagty using ' 0'.
perform append_perws tables perws
using date.
endwhile.
endfunction.
и то что можно прописать в топ-инклуде функциональной группы (хотя наверное многие процедуры можно вызывать указав существующие стандартные программы):
Code:
tables: t503,
t001p,
t508a,
t550a,
t552a.
types: begin of lptws_day_of_t552a,
tprog type tprog,
tagty type tagty,
ftkla type ftkla,
varia type varia,
konfe type konfe,
end of lptws_day_of_t552a.
types: lptws_552a_dws_tab type standard table of lptws_day_of_t552a
with default key initial size 31.
DATA: t552a_dws_tab TYPE lptws_552a_dws_tab.
data: SPACE06(6) VALUE ' '.
*---------------------------------------------------------------------*
* FORM READ508A *
*---------------------------------------------------------------------*
form read508a using zeity like t508a-zeity
mofid like t508a-mofid
mosid like t508a-mosid
schkz like t508a-schkz
date like t508a-begda.
data: subrc like sy-subrc.
perform re508a using zeity mofid
mosid schkz
date subrc.
if subrc ne 0.
perform append_error_list using 'P2' 'E' '579'
zeity mofid mosid schkz.
message e579(P2) with zeity mosid mofid schkz raising error_occured.
endif.
endform. "READ508A
*----------------------------------------------------------------------*
* Form re508a
*----------------------------------------------------------------------*
form re508a using zeity like t508a-zeity
mofid like t508a-mofid
mosid like t508a-mosid
schkz like t508a-schkz
date like t508a-begda
subrc like sy-subrc.
check zeity ne t508a-zeity or
mofid ne t508a-mofid or
mosid ne t508a-mosid or
schkz ne t508a-schkz or
date gt t508a-endda or
date lt t508a-begda.
clear t508a.
select * from t508a where zeity = zeity
and mofid = mofid
and mosid = mosid
and schkz = schkz
and endda ge date
and begda le date
order by primary key.
exit.
endselect.
subrc = sy-subrc.
endform.
*----------------------------------------------------------------------*
* Form read_dws_from_t552a
*----------------------------------------------------------------------*
form read_dws_from_t552a using date
zeity mofid
mosid schkz
motty
changing tprog varia
ftkla tagty.
data: dws type lptws_day_of_t552a.
data: month like t552a-monat,
year like t552a-kjahr,
day type sytabix.
data: da_date like sy-datum.
move: date(4) to year,
date+4(2) to month,
date+6(2) to day.
perform read552a using zeity mofid
mosid schkz
year month.
read table t552a_dws_tab into dws index day.
tprog = dws-tprog.
varia = dws-varia.
ftkla = dws-ftkla.
tagty = dws-tagty.
endform. " READ_DWS_FROM_T552A
*&---------------------------------------------------------------------*
*& Form READ552A
*&---------------------------------------------------------------------*
form read552a using zeity like t508a-zeity
mofid like t508a-mofid
mosid like t508a-mosid
schkz like t508a-schkz
kjahr like t552a-kjahr
monat like t552a-monat.
data: t508a_subrc like sy-subrc,
first_of_month like t508a-begda,
t508a_backup like t508a,
genws like t508a-genws.
data: period(6).
data: subrc like sy-subrc.
data: groupings(20), monthword(7).
perform re552a using zeity mofid
mosid schkz
kjahr monat
subrc.
if subrc ne 0.
perform append_error_list using 'HRTIM00WS' 'E' '016'
schkz groupings monthword space.
message e016(hrtim00ws)
with schkz groupings monthword raising error_occured.
endif.
endform. " READ552A
*&---------------------------------------------------------------------*
*& Form RE552A
*&---------------------------------------------------------------------*
form re552a using "new XLXK007122
zeity like t508a-zeity
mofid like t508a-mofid
mosid like t508a-mosid
schkz like t508a-schkz
kjahr like t552a-kjahr
monat like t552a-monat
subrc like sy-subrc.
check t552a-zeity ne zeity or
t552a-mofid ne mofid or
t552a-mosid ne mosid or
t552a-schkz ne schkz or
t552a-kjahr ne kjahr or
t552a-monat ne monat.
clear t552a.
select single * from t552a where zeity eq zeity
and mofid eq mofid
and mosid eq mosid
and schkz eq schkz
and kjahr eq kjahr
and monat eq monat.
subrc = sy-subrc.
perform fill_552a_dws_tab.
endform.
*&---------------------------------------------------------------------*
*& Form fill_552a_dws_tab
*&---------------------------------------------------------------------*
form fill_552a_dws_tab.
data: l_dws type lptws_day_of_t552a.
clear: t552a_dws_tab.
do 31 times varying l_dws-tprog from t552a-tpr01 next t552a-tpr02
varying l_dws-tagty from t552a-ttp01 next t552a-ttp02
varying l_dws-ftkla from t552a-ftk01 next t552a-ftk02
varying l_dws-varia from t552a-var01 next t552a-var02
varying l_dws-konfe from t552a-knf01 next t552a-knf02.
append l_dws to t552a_dws_tab.
enddo.
endform. " fill_552a_dws_tab
*&---------------------------------------------------------------------*
*& Form READ550A
*&---------------------------------------------------------------------*
form read550a using motpr like t550a-motpr
tprog like t550a-tprog
varia like t550a-varia
date like sy-datum.
data subrc like sy-subrc.
data seqno like t550a-seqno value '01'.
if motpr ne t550a-motpr or
tprog ne t550a-tprog or
varia ne t550a-varia or
seqno ne t550a-seqno or
date gt t550a-endda or
date lt t550a-begda.
perform re550a_conv using motpr tprog
varia seqno
date subrc.
if subrc ne 0.
perform append_error_list using 'P2' 'E' '581'
motpr tprog varia space.
message e581(P2) with motpr tprog varia raising error_occured.
endif.
endif.
endform.
*&---------------------------------------------------------------------*
*& Form RE550A_CONV
*&---------------------------------------------------------------------*
form re550a_conv using motpr like t550a-motpr
tprog like t550a-tprog
varia like t550a-varia
seqno like t550a-seqno
date like sy-datum
subrc like sy-subrc.
statics: s550a like t550a occurs 50 with header line.
data: sindex like sy-tabix,
slines like sy-tabix.
clear subrc.
check motpr ne t550a-motpr or
tprog ne t550a-tprog or
varia ne t550a-varia or
seqno ne t550a-seqno or
date gt t550a-endda or
date lt t550a-begda.
if motpr ne s550a-motpr or
tprog ne s550a-tprog or
varia ne s550a-varia or
seqno ne s550a-seqno or
date gt s550a-endda or
date lt s550a-begda.
read table s550a with key mandt = sy-mandt
motpr = motpr
tprog = tprog
varia = varia
seqno = seqno binary search.
sindex = sy-tabix.
if sy-subrc = 0.
while ( date > s550a-endda or date < s550a-begda ).
add 1 to sindex.
read table s550a index sindex.
if sy-subrc eq 0.
if s550a-motpr ne motpr or
s550a-tprog ne tprog or
s550a-varia ne varia or
s550a-seqno ne seqno.
sy-subrc = 4.
exit.
endif.
else.
exit.
endif.
endwhile.
endif.
if sy-subrc <> 0.
describe table s550a lines slines.
select * into s550a
from t550a where motpr = motpr
and tprog = tprog
and varia = varia
and seqno = seqno
and endda >= date
and begda <= date.
exit.
endselect.
if sy-subrc = 0.
if s550a-sobeg co ' 0' and
s550a-soend co ' 0'.
s550a-sobeg = space06.
s550a-soend = space06.
s550a-nobeg = space06.
s550a-noend = space06.
s550a-k1beg = space06.
s550a-k1end = space06.
s550a-k2beg = space06.
s550a-k2end = space06.
s550a-btbeg = space06.
s550a-btend = space06.
s550a-etbeg = space06.
s550a-etend = space06.
elseif s550a-nobeg co ' 0' and
s550a-noend co ' 0'.
s550a-nobeg = space06.
s550a-noend = space06.
endif.
perform convert_550a using s550a.
insert s550a index sindex.
else.
subrc = sy-subrc.
endif.
endif.
endif.
move s550a to t550a.
endform. " RE550A
*&---------------------------------------------------------------------*
*& Form CONVERT_550A YMMPH4K006052
*&---------------------------------------------------------------------*
form convert_550a using p_550a like t550a.
translate p_550a-sobeg using ' 0'.
translate p_550a-soend using ' 0'.
translate p_550a-nobeg using ' 0'.
translate p_550a-noend using ' 0'.
translate p_550a-k1beg using ' 0'.
translate p_550a-k1end using ' 0'.
translate p_550a-k2beg using ' 0'.
translate p_550a-k2end using ' 0'.
translate p_550a-btbeg using ' 0'.
translate p_550a-btend using ' 0'.
translate p_550a-etbeg using ' 0'.
translate p_550a-etend using ' 0'.
if p_550a-sobeg ne '000000' and p_550a-sobeg ge p_550a-soend.
perform add24hours_ifnecessary using p_550a-sobeg space
changing p_550a-nobeg p_550a-noend.
perform add24hours_ifnecessary using p_550a-sobeg space
changing p_550a-k1beg p_550a-k1end.
perform add24hours_ifnecessary using p_550a-sobeg space
changing p_550a-k2beg p_550a-k2end.
perform add24hours_ifnecessary using p_550a-sobeg space
changing p_550a-sobeg p_550a-soend.
perform add24hours_ifnecessary using p_550a-sobeg 'B'
changing p_550a-btbeg p_550a-btend.
elseif p_550a-sollz > 0.
perform add24_dueto_wohrs using p_550a-sollz
p_550a-sobeg
p_550a-nobeg
changing p_550a-soend
p_550a-noend.
endif.
perform add24hours_ifnecessary using p_550a-sobeg 'E'
changing p_550a-etbeg p_550a-etend.
endform. " CONVERT_550A
*&---------------------------------------------------------------------*
*& Form ADD24HOURS_IFNECESSARY "YMMPH4K006052
*&---------------------------------------------------------------------*
* -->P_P_550A_SOBEG text
* <--P_P_550A_NOBEG text
* <--P_P_550A_NOEND text
*----------------------------------------------------------------------*
form add24hours_ifnecessary using "YMMPH4K006052
limit like t550a-sobeg
interval_type
changing beguz like t550a-nobeg
enduz like t550a-noend.
data: hlptm(6).
check beguz ne '000000' or enduz ne '000000'.
case interval_type.
when space.
if beguz < limit.
hlptm = beguz.
hlptm = hlptm + 240000.
beguz = hlptm.
endif.
if enduz le limit or enduz le beguz.
hlptm = enduz.
hlptm = hlptm + 240000.
enduz = hlptm.
endif.
when 'E'.
if beguz le limit.
hlptm = beguz.
hlptm = hlptm + 240000.
beguz = hlptm.
endif.
if enduz le limit or enduz le beguz.
hlptm = enduz.
hlptm = hlptm + 240000.
enduz = hlptm.
endif.
when 'B'.
if enduz le beguz.
hlptm = enduz.
hlptm = hlptm + 240000.
enduz = hlptm.
endif.
endcase.
endform. " ADD24HOURS_IFNECESSARY
*&---------------------------------------------------------------------*
*& Form ADD24_DUETO_WOHRS
*&---------------------------------------------------------------------*
* -->P_P_550A_SOLLZ text
* -->P_P_550A_SOBEG text
* -->P_P_550A_NOBEG text
* <--P_P_550A_SOEND text
* <--P_P_550A_NOEND text
*----------------------------------------------------------------------*
form add24_dueto_wohrs using p_sollz like t550a-sollz
p_sobeg like t550a-sobeg
p_nobeg like t550a-sobeg
changing p_soend like t550a-sobeg
p_noend like t550a-sobeg.
data: l_glz,
beguz like t550a-sobeg,
enduz like t550a-sobeg,
duration like t550a-sollz,
hlptm(6).
if p_nobeg cn ' 0' or p_noend cn ' 0'.
l_glz = 'X'.
beguz = p_nobeg.
enduz = p_noend.
else.
l_glz = space.
beguz = p_sobeg.
enduz = p_soend.
endif.
check enduz > beguz.
perform subtract_time_from_time using enduz beguz
changing duration.
duration = duration + '0.5'.
check p_sollz > duration.
if l_glz = 'X'.
hlptm = p_noend.
hlptm = hlptm + 240000.
p_noend = hlptm.
if p_soend < p_noend.
hlptm = p_soend.
hlptm = hlptm + 240000.
p_soend = hlptm.
endif.
else.
hlptm = p_soend.
hlptm = hlptm + 240000.
p_soend = hlptm.
endif.
endform. " ADD24_DUETO_WOHRS
*&---------------------------------------------------------------------*
*& Form SUBTRACT_TIME_FROM_TIME
*&---------------------------------------------------------------------*
* --> ENDUZ text *
* --> BEGUZ text *
* <-- HOURS text *
*----------------------------------------------------------------------*
FORM SUBTRACT_TIME_FROM_TIME USING ENDUZ BEGUZ
CHANGING HOURS.
DATA: DIFFSEC TYPE I.
DIFFSEC = ENDUZ - BEGUZ.
IF DIFFSEC < 0.
DIFFSEC = DIFFSEC + 24 * 3600.
ENDIF.
HOURS = DIFFSEC / 3600.
ENDFORM. " SUBTRACT_TIME_FROM_TIME
*&---------------------------------------------------------------------*
*& Form APPEND_ERROR_LIST
*&---------------------------------------------------------------------*
FORM APPEND_ERROR_LIST USING VALUE(ARBGB)
VALUE(MSGTY)
VALUE(MSGNO)
VAR1 VAR2 VAR3 VAR4.
CALL FUNCTION 'HR_APPEND_ERROR_LIST'
EXPORTING
ARBGB = ARBGB
MSGTY = MSGTY
MSGNO = MSGNO
MSGV1 = VAR1
MSGV2 = VAR2
MSGV3 = VAR3
MSGV4 = VAR4.
ENDFORM. " APPEND_ERROR_LIST
form append_perws tables perws structure ptpsp
using date like sy-datum.
read table perws with key datum = date binary search
transporting no fields.
if sy-subrc = 0.
modify perws index sy-tabix.
else.
insert perws index sy-tabix.
endif.
endform. " APPEND_PERWS