Технічна частина
Використовуючи АВАР-редактор (рис. 1), розрабити програму, я виводить приватні відпустки до 6 років, для співробітників підприємства «Мотор Січ».
Рис. 1
Рис. 2 Головна форма програми
Рис. 3 Приклад використання програми
Рис. 4 Результат виконання програми
Рис. 5 Результат виконання програми з помилками
В програмі для підприємства «Мотор Січ» я використала повну інформацію про співробітників, але для збереження секретності даних у своєму звіті я використаю лише ініціали.
Для виконання роботи я використала такі таблиці (Рис. 6.1- 6.4):
РА0000 – статус зайнятості співробітника (у працуючих – 3, не працуючих - 0)
РА0001 – організаційне присвоєння (цех, посада, умови праці, все що стосується робочого місця)
РА0002 – персональні дані
РА0218 – накази (01 – прийняття на роботу, 10 – звільнення з роботи, 18 – приватна відпустка)
РА2001 – причини відсутності (відпустка, лікарняний лист, і тд., )
Рис. 6.1
Рис. 6.2
Рис. 6.3
Рис. 6.4
Код програми:
REPORT ZPHR1292_6 NO STANDARD PAGE HEADING LINE-SIZE 150.
* Личные отпуска до 6 лет.
TABLES: PA0001, PA0002, PA0298, PA2001.
DATA: BEGIN OF TAB_1 OCCURS 0,
PERNR LIKE PA0001-PERNR,
BEGDA LIKE PA0001-BEGDA,
ENDDA LIKE PA0001-ENDDA,
DAT_1 LIKE PA0001-ENDDA,
WERKS LIKE PA0001-WERKS,
ORDDT LIKE PA0298-ORDDT,
ORDNU LIKE PA0298-ORDNU,
NAME2 LIKE PA0002-NAME2,
INITS LIKE PA0002-INITS,
* rufnm like pa0002-rufnm,
* cname like pa0002-cname,
PERID LIKE PA0002-PERID,
PRIZN TYPE I,
DNI TYPE I,
TEKST(25) TYPE C,
END OF TAB_1.
DATA TAB_2001 LIKE PA2001 OCCURS 1000 WITH HEADER LINE.
* Входные параметры
SELECTION-SCREEN BEGIN OF BLOCK FRM1 WITH FRAME TITLE TEXT-E01.
SELECT-OPTIONS DAT FOR PA0001-BEGDA OBLIGATORY.
SELECT-OPTIONS CEX FOR PA0001-WERKS OBLIGATORY.
* parameters cex like pa0001-werks obligatory.
SELECTION-SCREEN END OF BLOCK FRM1.
SELECTION-SCREEN BEGIN OF BLOCK 6 WITH FRAME TITLE TEXT-010.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN POSITION 25.
PARAMETERS PECH_1 RADIOBUTTON GROUP R1.
SELECTION-SCREEN: COMMENT 27(44) TEXT-011.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN POSITION 25.
PARAMETERS PECH_2 RADIOBUTTON GROUP R1.
SELECTION-SCREEN: COMMENT 27(54) TEXT-012.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN END OF BLOCK 6.
IF DAT-HIGH EQ 0.
DAT-HIGH = DAT-LOW.
ENDIF.
IF CEX-HIGH EQ 0.
CEX-HIGH = CEX-LOW.
ENDIF.
************************************************************************
* 2001-отсутствия(0121-л/о по уходу до 6 лет)
SELECT * FROM PA2001 INTO TABLE TAB_2001
WHERE SUBTY = '0121'
* and pernr = '01329377'
AND SPRPS = ' '
AND ENDDA >= DAT-LOW
AND BEGDA <= DAT-HIGH.
LOOP AT TAB_2001.
TAB_1-PERNR = TAB_2001-PERNR.
TAB_1-BEGDA = TAB_2001-BEGDA.
TAB_1-ENDDA = TAB_2001-ENDDA.
TAB_1-DNI = TAB_1-ENDDA - TAB_1-BEGDA.
TAB_1-PRIZN = 0.
* Ф.И.О.
SELECT SINGLE * FROM PA0002 WHERE PERNR = TAB_1-PERNR
AND ENDDA = '99991231'.
IF SY-SUBRC = 0.
TAB_1-NAME2 = PA0002-NAME2.
TAB_1-INITS = PA0002-INITS.
* tab_1-rufnm = pa0002-rufnm.
* tab_1-cname = pa0002-cname.
TAB_1-PERID = PA0002-PERID.
ELSE.
TAB_1-NAME2 = ' '.
TAB_1-INITS = ' '.
* tab_1-rufnm = ' '.
* tab_1-cname = ' '.
TAB_1-PERID = ' '.
ENDIF.
* цех
SELECT SINGLE * FROM PA0001 WHERE PERNR = TAB_1-PERNR
AND BEGDA <= DAT-LOW
AND ENDDA >= DAT-LOW.
IF SY-SUBRC = 0.
TAB_1-WERKS = PA0001-WERKS.
ENDIF.
* поиск приказа о предоставлении л/отпуска до 6 лет
TAB_1-PRIZN = 0.
TAB_1-TEKST = ' '.
SELECT * FROM PA0298
WHERE PERNR = TAB_1-PERNR
AND MASSN = '18'
AND SPRPS = ' '
AND BEGDA >= TAB_1-BEGDA
AND ENDDA <= TAB_1-ENDDA.
IF SY-SUBRC = 0.
TAB_1-PRIZN = TAB_1-PRIZN + 1.
TAB_1-ORDNU = PA0298-ORDNU.
TAB_1-ORDDT = PA0298-ORDDT.
IF PA0298-BEGDA <> PA0298-ENDDA.
TAB_1-PRIZN = 9.
TAB_1-TEKST = 'Разные даты приказа. '.
ENDIF.
APPEND TAB_1.
ENDIF.
ENDSELECT.
IF SY-SUBRC <> 0.
TAB_1-ORDNU = ' '.
TAB_1-ORDDT = ' '.
TAB_1-PRIZN = 9.
TAB_1-TEKST = 'Нет приказа (до 6 лет)'.
APPEND TAB_1.
ENDIF.
IF TAB_1-PRIZN >= 2 AND TAB_1-PRIZN < 9.
DELETE TAB_1 WHERE PERNR = TAB_1-PERNR.
TAB_1-ORDNU = '??? '.
TAB_1-ORDDT = ' '.
TAB_1-TEKST = 'Несколько приказов. '.
APPEND TAB_1.
ENDIF.
*****
IF TAB_1-BEGDA < DAT-LOW.
TAB_1-BEGDA = DAT-LOW.
TAB_1-DAT_1 = DAT-LOW.
ENDIF.
IF TAB_1-ENDDA > DAT-HIGH.
TAB_1-ENDDA = DAT-HIGH.
ENDIF.
ENDLOOP.
***
*--------- Проверка полномочий -----------------
PERFORM PRAVA.
***
* вывод данных
SORT TAB_1 BY WERKS PRIZN PERNR BEGDA.
READ TABLE TAB_1 INDEX 1.
ULINE (140).
WRITE:/ 'Цех |Таб.ном.|Фамилия |И.О.|'
NO-GAP,
'Приказ, дата приказа |Даты личного отпуска | Текст ошибки '
NO-GAP,
' |Дни '.
ULINE (140).
LOOP AT TAB_1.
IF TAB_1-WERKS IN CEX.
IF PECH_1 = 'X' OR ( PECH_2 = 'X' AND TAB_1-PRIZN <> 1 ).
IF TAB_1-DNI > 185.
WRITE:/ TAB_1-WERKS,
TAB_1-PERNR,
TAB_1-NAME2(15),
TAB_1-INITS(4),
* tab_1-rufnm(10),
* tab_1-cname(15),
TAB_1-ORDNU(10),
'от',
TAB_1-ORDDT,
TAB_1-BEGDA,
TAB_1-ENDDA,
TAB_1-TEKST,
(3)TAB_1-DNI COLOR 1.
ELSE.
WRITE:/ TAB_1-WERKS,
TAB_1-PERNR,
TAB_1-NAME2(15),
TAB_1-INITS(4),
* tab_1-rufnm(10),
* tab_1-cname(15),
TAB_1-ORDNU(10),
'от',
TAB_1-ORDDT,
TAB_1-BEGDA,
TAB_1-ENDDA,
TAB_1-TEKST,
(3)TAB_1-DNI.
ENDIF.
ENDIF.
ENDIF.
ENDLOOP.
************************************************************************
FORM PRAVA.
DATA: CHECK(3).
*--------- Проверка полномочий -----------------
AUTHORITY-CHECK OBJECT 'P_ORGIN'
ID 'INFTY' DUMMY
ID 'SUBTY' DUMMY
ID 'AUTHC' DUMMY
ID 'PERSA' FIELD '*'
ID 'PERSG' DUMMY
ID 'PERSK' DUMMY
ID 'VDSK1' DUMMY.
IF SY-SUBRC = 0.
CHECK = 'ALL'.
ENDIF.
*--------- Проверка полномочий -----------------
*--- Проверка записей на соответствие полномочий -----
IF CHECK <> 'ALL'.
LOOP AT TAB_1.
AUTHORITY-CHECK OBJECT 'P_ORGIN'
ID 'INFTY' DUMMY
ID 'SUBTY' DUMMY
ID 'AUTHC' DUMMY
ID 'PERSA' FIELD TAB_1-WERKS
ID 'PERSG' DUMMY
ID 'PERSK' DUMMY
ID 'VDSK1' DUMMY.
IF SY-SUBRC <> 0.
DELETE TAB_1.
ENDIF.
ENDLOOP.
ENDIF.
ENDFORM.
************************************************************************
