Hier eines Auswertung, wieder mit SALV und OO, die die Urlaubsstände darstellt und per Ampelsystem auf Handlungsbedarf hinweist.
Angezeigt werden Kontingent Anfang und Ende und Anzahl des Kontingents und Beginn und Ende der möglichen Abtragung.
Geplant sind schon eingetragene Urlaube in der Zukunft. Diese sind beim Kontingent unter Abtragung summiert.
Ungeplant sind Urlaube, die nicht eingetragen wurden. Diese summieren sich im Rest des Kontingents, das noch nicht geplant ist. (Kontingent minus Abtragung ist Rest)
Offen ist die Summe von geplant und ungeplant und ist die Anzahl der Tage, die noch nicht konsumiert wurden.
Per Ampelsystem wird beim Überschreiten eines Schwellwerts auf kritische Daten hingewiesen. Ideal für Monatsaufstellungen und im weiteren Entwicklungen der gesamten offenen Urlaube (geplant und nicht geplant).
Nicht geplante Urlaubsstände müssen zumindest geplant bzw. reduziert werden. Offene Urlaubsstände müssen zurückgehen.
REPORT zhr_ausw04.
* HST20190823 Version 003
* Zusatzinfo eingefügt
* 20190807HST Version 002
* Auswertung des Urlaubs geplant, ungeplant, offen
* Absprung in Pflege
* 20190727HST Version 001
TABLES: pa0001, pa0007, pa2001, pa2002.
TYPES: BEGIN OF ty_alv,
ampel(4) TYPE c,
pernr TYPE persno,
nachn TYPE pad_nachn,
vorna TYPE pad_vorna,
begda TYPE begda,
endda TYPE endda,
anzhl TYPE ptm_quonum, „Abtragungskontingent
desta TYPE ptm_dedstart, „Abtragungsbeginn
deend TYPE ptm_dedend, „Abtragungsende
urlgep TYPE p DECIMALS 1, „Geplanter Urlaub
urlugep TYPE p DECIMALS 1, „Ungeplanter offener Urlaub
urloffen TYPE p DECIMALS 1, „Ungeplanter und geplanter Urlaub, nicht genossen
persk TYPE persk,
persg TYPE persg, „Mitarbeitergruppe
abkrs TYPE abkrs, „Abrechnungskreis
btrtl TYPE btrtl, „Teilbereich
teilk TYPE teilk, „Teilzeit
* ausw(6) TYPE c,
* „datvo type
* kunnr TYPE bsad-kunnr,
* name1 TYPE kna1-name1,
* belnr TYPE bsad-belnr,
* gjahr TYPE bsad-gjahr,
* shkzg TYPE bsad-shkzg,
* dmbtr TYPE bsad-dmbtr,
* sknto TYPE bsad-sknto,
* blart TYPE bsad-blart,
* budat TYPE bsad-budat,
* bldat TYPE bsad-bldat,
* „faedt TYPE bsad-faedt,
* augdt TYPE bsad-augdt,
* zfbdt TYPE bsad-zfbdt,
* zbd1t TYPE bsad-zbd1t,
* zbd2t TYPE bsad-zbd2t,
* zbd1p TYPE bsad-zbd1p,
* zbd2p TYPE bsad-zbd2p,
* faed1 TYPE bsad-zfbdt, „FälligSkonto
* faed2 TYPE bsad-zfbdt, „FälligNetto
* meng1 TYPE bsad-zbd1t,
* meng2 TYPE bsad-zbd1t,
* bewer TYPE mseg-menge, „Bewertung
* bemer(30) TYPE c,
END OF ty_alv.
DATA: gt_alv_pers TYPE STANDARD TABLE OF ty_alv,
gt_alv TYPE STANDARD TABLE OF ty_alv,
gs_alv TYPE ty_alv.
SELECTION-SCREEN BEGIN OF BLOCK all WITH FRAME.
SELECTION-SCREEN BEGIN OF BLOCK per WITH FRAME TITLE text-001.
SELECT-OPTIONS: so_pernr FOR pa0001-pernr MATCHCODE OBJECT prem. “ DEFAULT ‚1998‘.
SELECT-OPTIONS: so_persk FOR pa0001-persk.“Mitarbeiterkreis AE Arbeiter AH Angestellte
SELECT-OPTIONS: so_persg FOR pa0001-persg.“Mitarbeitergruppe Aktiv etc.
SELECT-OPTIONS: so_abkrs FOR pa0001-abkrs.“Abrechnungskreis A1, A2
SELECT-OPTIONS: so_zterf FOR pa0007-zterf NO-DISPLAY.“Zeiterfasssungskennzeichen 1 aktiv
PARAMETERS:
p_zterf TYPE xfeld AS CHECKBOX DEFAULT “.
SELECTION-SCREEN SKIP.
„Werden weiter unten ausgeblendet
PARAMETERS :
p_arb RADIOBUTTON GROUP g1,
p_ang RADIOBUTTON GROUP g1,
p_alle RADIOBUTTON GROUP g1 DEFAULT ‚X‘.
„parameters: p_orgeh type orgeh.
SELECTION-SCREEN END OF BLOCK per.
SELECTION-SCREEN BEGIN OF BLOCK dat WITH FRAME TITLE text-002.
SELECT-OPTIONS: so_datum FOR sy-datum OBLIGATORY NO-EXTENSION.
„Ohne Verwendung ????
SELECTION-SCREEN SKIP.
PARAMETERS:
p_anz TYPE p DECIMALS 1 DEFAULT 5.
PARAMETERS :
p_ugep RADIOBUTTON GROUP g3 DEFAULT ‚X‘,
p_offen RADIOBUTTON GROUP g3.
PARAMETERS: p_factid TYPE wfcid DEFAULT ‚AT‘ NO-DISPLAY.
SELECTION-SCREEN END OF BLOCK dat.
SELECTION-SCREEN BEGIN OF BLOCK sort WITH FRAME TITLE text-004.
PARAMETERS:
p_sort0 RADIOBUTTON GROUP g2 DEFAULT ‚X‘, „Nachname sortiert
p_sort1 RADIOBUTTON GROUP g2. „Personalnummer sortiert
SELECTION-SCREEN SKIP.
PARAMETERS:
p_visibl TYPE xfeld AS CHECKBOX DEFAULT abap_false. „0007 Felder sichtbar
SELECTION-SCREEN END OF BLOCK sort.
SELECTION-SCREEN BEGIN OF BLOCK outp WITH FRAME TITLE text-005.
PARAMETERS:
p_out0 RADIOBUTTON GROUP g4 , „DEFAULT ‚X‘, „Dialog Output
p_out1 RADIOBUTTON GROUP g4 DEFAULT ‚X‘. „ALV Output
SELECTION-SCREEN END OF BLOCK outp.
SELECTION-SCREEN END OF BLOCK all.
DATA lt_pa0007 TYPE TABLE OF pa0007.“AZP Aktiv
DATA lt_pa0000 TYPE TABLE OF pa0000.“Maßnahmen (Aktiv)
DATA lt_pa0002 TYPE TABLE OF pa0002.“Namen- und Adressdaten
DATA lt_pa0001 TYPE TABLE OF pa0001.“Orgzugehörigkeit
DATA lt_pa2001 TYPE TABLE OF pa2001.“Abwesenheiten
DATA lt_pa2002 TYPE TABLE OF pa2002.“Anwesenheiten
DATA lt_pa2006 TYPE TABLE OF pa2006.“Urlaubskontingente
DATA ls_pa2006 TYPE pa2006.“Urlaubskontingente
TYPES: BEGIN OF ty_pers,
pernr TYPE persno,
begda TYPE begda,
endda TYPE endda,
END OF ty_pers.
DATA ls_pa TYPE ty_pers.
DATA lt_pa TYPE TABLE OF ty_pers.
CLASS cl_event_handler DEFINITION.
PUBLIC SECTION.
CLASS-METHODS on_before_salv_function “ BEFORE_SALV_FUNCTION
FOR EVENT if_salv_events_functions~before_salv_function
OF cl_salv_events_table
IMPORTING e_salv_function.
CLASS-METHODS on_after_salv_function “ AFTER_SALV_FUNCTION
FOR EVENT if_salv_events_functions~before_salv_function
OF cl_salv_events_table
IMPORTING e_salv_function.
CLASS-METHODS on_added_function “ ADDED_FUNCTION
FOR EVENT if_salv_events_functions~added_function
OF cl_salv_events_table
IMPORTING e_salv_function.
CLASS-METHODS on_top_of_page “ TOP_OF_PAGE
FOR EVENT if_salv_events_list~top_of_page
OF cl_salv_events_table
IMPORTING r_top_of_page
page
table_index.
CLASS-METHODS on_end_of_page “ END_OF_PAGE
FOR EVENT if_salv_events_list~end_of_page
OF cl_salv_events_table
IMPORTING r_end_of_page
page.
CLASS-METHODS on_double_click “ DOUBLE_CLICK
FOR EVENT if_salv_events_actions_table~double_click
OF cl_salv_events_table
IMPORTING row
column.
CLASS-METHODS on_link_click “ LINK_CLICK
FOR EVENT if_salv_events_actions_table~link_click
OF cl_salv_events_table
IMPORTING row
column.
ENDCLASS. „cl_event_handler DEFINITION
*———————————————————————-*
* CLASS cl_event_handler IMPLEMENTATION
*———————————————————————-*
CLASS cl_event_handler IMPLEMENTATION.
METHOD on_before_salv_function.
„BREAK-POINT.
ENDMETHOD. „on_before_salv_function
METHOD on_after_salv_function.
„BREAK-POINT.
ENDMETHOD. „on_after_salv_function
METHOD on_added_function.
„BREAK-POINT.
ENDMETHOD. „on_added_function
METHOD on_top_of_page.
„BREAK-POINT.
ENDMETHOD. „on_top_of_page
METHOD on_end_of_page.
„BREAK-POINT.
ENDMETHOD. „on_end_of_page
METHOD on_double_click.
„PERFORM display_mm03 TABLES gt_alv USING row column.
ENDMETHOD. „on_double_click
METHOD on_link_click.
PERFORM display TABLES gt_alv USING row column.
ENDMETHOD. „on_link_click
ENDCLASS. „cl_event_handler IMPLEMENTATION
INITIALIZATION.
*
CLEAR so_pernr.
so_pernr-sign = ‚I‘.
so_pernr-option = ‚BT‘.
so_pernr-low = ‚3100‘.
so_pernr-high = ‚3200‘.
APPEND so_pernr.
so_datum-sign = ‚I‘.
so_datum-option = ‚BT‘.
„so_datum-low = sy-datum.
CONCATENATE sy-datum(6) ’16‘ INTO so_datum-low.
DATA: lv_date TYPE endda.
lv_date = so_datum-low + 20.
CONCATENATE lv_date(6) ’15‘ INTO so_datum-high.
MOVE ‚20181201‘ TO so_datum-low.
lv_date = so_datum-low + 31.
CONCATENATE lv_date(6) ’01‘ INTO so_datum-high.
so_datum-high = so_datum-high – 1.
MOVE ‚20180101‘ TO so_datum-low.
MOVE ‚20181231‘ TO so_datum-high.
APPEND so_datum.
AT SELECTION-SCREEN OUTPUT.
„Parameter ausblenden
LOOP AT SCREEN.
IF screen-name = ‚P_ALLE‘ OR screen-name = ‚P_ARB‘ OR screen-name = ‚P_ANG‘.
screen-input = 0.
screen-invisible = abap_true.
screen-active = 0.
MODIFY SCREEN.
ENDIF.
ENDLOOP.
START-OF-SELECTION.
PERFORM initial.
PERFORM collect_pers.
PERFORM collect_data.
PERFORM sort_data.
PERFORM show_data.
EXIT.
FORM initial.
CLEAR gt_alv_pers.
„Zeiterfassungscheckbox in Select Option umsetzen
IF p_zterf EQ ‚X‘.
so_zterf-sign = ‚I‘.
so_zterf-option = ‚EQ‘.
so_zterf-low = ‚1‘.
APPEND so_zterf.
ELSE.
CLEAR so_zterf.
ENDIF.
„Parameter Arbeiter oder Angestellte umsetzen
„Derzeit nicht in Verwendung
IF p_arb EQ abap_true.
so_persk-sign = ‚I‘.
so_persk-option = ‚EQ‘.
so_persk-low = ‚AE‘.
APPEND so_persk.
ENDIF.
IF p_ang EQ abap_true.
so_persk-sign = ‚I‘.
so_persk-option = ‚EQ‘.
so_persk-low = ‚AH‘.
APPEND so_persk.
ENDIF.
ENDFORM.
FORM collect_pers.
„Selektion der MA über PA0007
„Begin muss im Selektionszeitraum liegen
„oder
„Ende muss im Selektionszeitraum liegen
„oder
„Selektionszeitraum muss nach Begin und vor Endedatum liegen.
SELECT pernr FROM pa0007 AS a „Sollarbeitszeit
INTO CORRESPONDING FIELDS OF TABLE lt_pa „0007
WHERE a~pernr IN so_pernr
„AND a~begda LT sy-datum
„AND a~endda GT sy-datum
AND a~zterf IN so_zterf „Zeiterfassung aktiv, wenn ausgewählt
AND
(
a~begda IN so_datum
OR
a~endda IN so_datum
OR
(
a~begda LT so_datum-low
AND
a~endda GT so_datum-high
)
)
GROUP BY pernr
.
IF sy-subrc IS INITIAL.
„if lt_pa0007[] is not initial. ist besser.
„lt_pa0007 darf nicht leer sein, sonst werden alle Sätze genommen.
„Auswahl der Maßnahmen 3 Beschäftigt im besagtem Zeitraum
SELECT * FROM pa0000 AS a INTO TABLE lt_pa0000
FOR ALL ENTRIES IN lt_pa
WHERE pernr = lt_pa-pernr
AND stat2 = ‚3‘ „Beschäftigung ist aktiv
AND
(
a~begda IN so_datum
OR
a~endda IN so_datum
OR
(
a~begda LT so_datum-low
AND
a~endda GT so_datum-high
)
).
„Selektion für alle MA
„Selektion für noch aktive MA
„AND begda LT so_datum-high“LE so_datum-low
„AND endda GE so_datum-high.
„Auswahl der Org. Zugehörigkeit im besagtem Zeitraum
SELECT * FROM pa0001 AS b INTO TABLE lt_pa0001
FOR ALL ENTRIES IN lt_pa „Darf ja nicht leer sein.
WHERE pernr = lt_pa-pernr
AND b~persk IN so_persk „Personenkreis Angestelle und Arbeiter
AND b~persg IN so_persg
AND b~abkrs IN so_abkrs
AND b~begda LT so_datum-high“LE so_datum-low
AND b~endda GE so_datum-high.
„Auswahl der Namens- und Adressdaten im besagtem Zeitraum
SELECT * FROM pa0002 INTO TABLE lt_pa0002
FOR ALL ENTRIES IN lt_pa
WHERE pernr = lt_pa-pernr
AND begda LT so_datum-high“LE so_datum-low
AND endda GE so_datum-high.
„Auswahl der Sollarbeitszeit
SELECT * FROM pa0007 INTO TABLE lt_pa0007
FOR ALL ENTRIES IN lt_pa
WHERE pernr = lt_pa-pernr
AND zterf IN so_zterf
AND begda LT so_datum-high“LE so_datum-low
AND endda GE so_datum-high.
ELSE.
EXIT.
ENDIF.
„Durchgehen aller MA
„Ergänzung um Maßnahme
„Ergänzung um Adresse
„Ergänzung um Personalkreis
„Ergänzung um Sollarbeitszeit
„Tabelle gt_alv_pers wird mit einem Satz pro MA gefüllt
DATA: lv_ok0, lv_ok1, lv_ok2, lv_ok7 TYPE c.
LOOP AT lt_pa
ASSIGNING FIELD-SYMBOL(<pa>).
CLEAR gs_alv.
CLEAR lv_ok0.
CLEAR lv_ok1.
CLEAR lv_ok2.
CLEAR lv_ok7.
gs_alv-pernr = <pa>-pernr.
LOOP AT lt_pa0000 ASSIGNING FIELD-SYMBOL(<pa0000>) WHERE pernr = <pa>-pernr.
gs_alv-begda = <pa0000>-begda. „Maßnahme Beginn Datum
gs_alv-endda = <pa0000>-endda. „
<pa>-begda = <pa>-begda.
<pa>-endda = <pa>-endda.
lv_ok0 = ‚X‘.
ENDLOOP.
„Ergänzen der Adress- und Namensinformation
LOOP AT lt_pa0002 ASSIGNING FIELD-SYMBOL(<pa0002>) WHERE pernr = <pa>-pernr.
gs_alv-nachn = <pa0002>-nachn.
gs_alv-vorna = <pa0002>-vorna.
lv_ok2 = ‚X‘.
ENDLOOP.
„Ergänzen der Daten um Personalkreiszugehörigkeit Angestellte und Arbeiter.
LOOP AT lt_pa0001 ASSIGNING FIELD-SYMBOL(<pa0001>) WHERE pernr = <pa>-pernr.
gs_alv-persk = <pa0001>-persk.
gs_alv-persg = <pa0001>-persg.
gs_alv-abkrs = <pa0001>-abkrs.
gs_alv-btrtl = <pa0001>-btrtl.
lv_ok1 = ‚X‘.
ENDLOOP.
„Sollarbeitszeit
LOOP AT lt_pa0007 ASSIGNING FIELD-SYMBOL(<pa0007>) WHERE pernr = <pa>-pernr.
gs_alv-pernr = <pa>-pernr.“Satz ist immer vorhanden
gs_alv-teilk = <pa0007>-teilk.
lv_ok7 = ‚X‘.
ENDLOOP.
IF lv_ok0 = ‚X‘ AND lv_ok1 = ‚X‘ AND lv_ok2 = ‚X‘ AND lv_ok7 = ‚X‘.
APPEND gs_alv TO gt_alv_pers.
ENDIF.
„cl_demo_output=>display( <ls_alv>-pernr ).
ENDLOOP.
ENDFORM.
FORM collect_data.
DATA lv_urlugep TYPE p DECIMALS 1.
DATA lv_urlgep TYPE p DECIMALS 1.
DATA lv_urloffen TYPE p DECIMALS 1.
FIELD-SYMBOLS: <ls_alv> TYPE ty_alv.
CLEAR gt_alv[].
ASSIGN gs_alv TO <ls_alv>.
LOOP AT gt_alv_pers INTO DATA(wa).
„Abwesenheiten
SELECT * FROM pa2006 INTO TABLE lt_pa2006 WHERE pernr = wa-pernr
„AND ( begda IN so_datum OR endda IN so_datum )
ORDER BY begda „Damit letzter Satz im System steht
.
APPEND INITIAL LINE TO gt_alv ASSIGNING <ls_alv>.
MOVE-CORRESPONDING wa TO <ls_alv>.
lv_urlugep = 0. „Ungeplant
lv_urlgep = 0. „Geplant/Eingetragen
LOOP AT lt_pa2006 ASSIGNING FIELD-SYMBOL(<pa2006>).
lv_urlugep = lv_urlugep + <pa2006>-anzhl – <pa2006>-kverb. „Anzahl minus Verbrauch aller Kontingente.
ENDLOOP.
„Alle zukünftigen Abwesenheitseinträge inkl. heute (da noch nicht abgerechnet)
SELECT * FROM pa2001 INTO TABLE lt_pa2001 WHERE pernr = wa-pernr
AND begda GE sy-datum
„and begda ge so_datum-high „Damit funktioniert es auch mit dem Intervall, allerdings für Überschneidungen braucht es noch etwas.
AND ( subty = ‚0100‘ OR subty = ‚0101‘ )
.
LOOP AT lt_pa2001 ASSIGNING FIELD-SYMBOL(<pa2001>).
lv_urlgep = lv_urlgep + <pa2001>-abrtg. „Abrechnungstage
ENDLOOP.
IF lt_pa2006[] IS NOT INITIAL.
MOVE-CORRESPONDING <pa2006> TO <ls_alv>.
ENDIF.
lv_urloffen = lv_urlugep + lv_urlgep. „Offener Urlaub ist der ungeplante Urlaub und der geplante, aber noch nicht genossene Urlaub
<ls_alv>-urlgep = lv_urlgep. „Geplante, aber noch nicht genossen
<ls_alv>-urlugep = lv_urlugep. „Ungeplant
<ls_alv>-urloffen = lv_urloffen. „Geplanter nicht genossener und ungeplanter Urlaub
IF ( lv_urlugep GT p_anz AND p_ugep = ‚X‘) OR ( lv_urloffen GT p_anz AND p_offen = ‚X‘ ). „Mehr als p_anz Tage offen
IF p_out0 = ‚X‘.
<ls_alv>-ampel = ‚ROT‘.
ELSE.
<ls_alv>-ampel = ‚@0A@‘. „Rot noch anzulegen.
ENDIF.
ELSE.
IF p_out0 = ‚X‘.
<ls_alv>-ampel = ‚GRÜN‘. „Grün bereits angelegt.
ELSE.
<ls_alv>-ampel = ‚@08@‘. „Grün bereits angelegt.
ENDIF.
ENDIF.
* LOOP AT lt_pa2006 ASSIGNING FIELD-SYMBOL(<pa2006>).
* DATA lv_int TYPE integer.
*
* „Kontrolle, ob noch kein neuerer Satz angelegt wurde.
* CLEAR lv_int.
* SELECT DISTINCT 1 FROM pa2006 INTO @lv_int
* WHERE pernr = @<pa2006>-pernr AND begda GT @so_datum-high.
* ENDSELECT.
*
* IF sy-subrc = 4 .
* APPEND INITIAL LINE TO gt_alv ASSIGNING <ls_alv>.
* MOVE-CORRESPONDING wa TO <ls_alv>.
* MOVE-CORRESPONDING <pa2006> TO <ls_alv>.
* <ls_alv>-update = ‚X‘.
* IF p_out0 = ‚X‘.
* <ls_alv>-ampel = ‚ROT‘.
* ELSE.
* <ls_alv>-ampel = ‚@0A@‘. „Rot noch anzulegen.
* ENDIF.
* IF lv_int = 1.
* CLEAR <ls_alv>-update.
* IF p_out0 = ‚X‘.
* <ls_alv>-ampel = ‚GRÜN‘. „Grün bereits angelegt.
* ELSE.
* <ls_alv>-ampel = ‚@08@‘. „Grün bereits angelegt.
* ENDIF.
* ENDIF.
* „MOVE <pa2006>-begda TO <ls_alv>-begda.
* „MOVE <pa2006>-endda TO <ls_alv>-endda.
* „MOVE <pa2006>-anzhl TO <ls_alv>-anzhl.
* „MOVE <pa2006>-desta TO <ls_alv>-desta.
* „MOVE <pa2006>-deend TO <ls_alv>-deend.
* ENDIF.
*
* „MA Kein Update, wenn nicht mehr aktiv, sprich Endedatum.
* IF wa-endda LE so_datum-high.
* CLEAR <ls_alv>-update.
* IF p_out0 = ‚X‘.
* <ls_alv>-ampel = ‚GELB‘. „Gelb Mitarbeiter läuft aus.
* ELSE.
* <ls_alv>-ampel = ‚@09@‘. „Gelb Mitarbeiter läuft aus.
* ENDIF.
* ENDIF.
* ENDLOOP.
ENDLOOP.
ENDFORM.
FORM sort_data.
IF p_sort0 = ‚X‘.
SORT gt_alv BY nachn begda.
ELSE.
SORT gt_alv BY pernr begda.
ENDIF.
ENDFORM.
FORM show_dialog.
cl_demo_output=>display( data = gt_alv name = ‚Urlaubskontingente‘ ).
IF 1 = 2. „Testmodus
DATA name TYPE string.
DATA lv_anz TYPE integer.
„data value type data.
cl_demo_output=>display( gt_alv_pers ).
lv_anz = lines( gt_alv_pers ).
cl_demo_output=>write_data( value = lv_anz name = ‚Anzahl der Sätze‘ ).
cl_demo_output=>display( ).
ENDIF.
ENDFORM.
FORM show_alv.
„Initialisierung
DATA: lref_salv TYPE REF TO cl_salv_table,
lr_layout TYPE REF TO cl_salv_layout,
ls_key TYPE salv_s_layout_key.
DATA: lr_functions TYPE REF TO cl_salv_functions_list.
DATA: lo_events TYPE REF TO cl_salv_events_table. „HST 20190712
* ALV aufbauen,
* lref_salv zeigt danach auf das Objekt,
* gt_alv_pers ist die Tabelle, die als Info mitgegeben wird, wo die Daten zukünftig gespeichert werden.
TRY.
CALL METHOD cl_salv_table=>factory
IMPORTING
r_salv_table = lref_salv
CHANGING
t_table = gt_alv.
„HST 20190712 Beginn
lo_events = lref_salv->get_event( ).
SET HANDLER cl_event_handler=>on_before_salv_function FOR lo_events.
SET HANDLER cl_event_handler=>on_after_salv_function FOR lo_events.
SET HANDLER cl_event_handler=>on_added_function FOR lo_events.
SET HANDLER cl_event_handler=>on_top_of_page FOR lo_events.
SET HANDLER cl_event_handler=>on_end_of_page FOR lo_events.
SET HANDLER cl_event_handler=>on_double_click FOR lo_events.
SET HANDLER cl_event_handler=>on_link_click FOR lo_events.
„HST 20190712 Ende
CATCH cx_salv_msg .
cl_demo_output=>display(‚Error‘ ).
ENDTRY.
„Die Keydaten werden gefüllt
ls_key-report = sy-repid.
„lr_layout zeigt auf das Layout des ALV
lr_layout = lref_salv->get_layout( ).
„Layout erhält Keydaten: Program Name
lr_layout->set_key( ls_key ).
„Layout Speichern erlaubt (3 Werte möglich) User can save
lr_layout->set_save_restriction( cl_salv_layout=>restrict_none ).
* Layout auf Kundenspezifisches Layout einstellen
* IF sy-slset = ‚CUS&Z_PPMDT_01‘.
* lr_layout->set_initial_layout( value = ‚/Z_PPMDT_TEL‘ ).
* ENDIF.
„lr_functions zeigt auf die Funktionen des ALV
lr_functions = lref_salv->get_functions( ).
„lr_functions einschalten
“ lr_functions->set_default( ). „minimal
lr_functions->set_all( abap_true ). „Standard
* Feldkatalog ändern
DATA: lr_columns TYPE REF TO cl_salv_columns_table,
lr_column TYPE REF TO cl_salv_column_table.
lr_columns = lref_salv->get_columns( ).
* lr_columns->set_optimize( abap_true ).
TRY.
lr_column ?= lr_columns->get_column( ‚PERNR‘ ).
lr_column->set_output_length( ‚5‘ ).
lr_column->set_cell_type( if_salv_c_cell_type=>hotspot ).
lr_column ?= lr_columns->get_column( ‚NACHN‘ ).
lr_column->set_output_length( ’20‘ ).
lr_column ?= lr_columns->get_column( ‚VORNA‘ ).
lr_column->set_output_length( ’20‘ ).
lr_column ?= lr_columns->get_column( ‚BEGDA‘ ).
lr_column->set_short_text( ‚Beginn K.‘).
lr_column->set_medium_text( ‚Beginn Datum K.‘).
lr_column->set_long_text( ‚Beginn Datum Kontingent‘).
lr_column ?= lr_columns->get_column( ‚ENDDA‘ ).
lr_column->set_short_text( ‚Ende K.‘).
lr_column->set_medium_text( ‚Ende Datum K.‘).
lr_column->set_long_text( ‚Ende Datum Kontingent‘).
lr_column ?= lr_columns->get_column( ‚ANZHL‘ ).
lr_column->set_short_text( ‚Anzahl K.‘).
lr_column->set_medium_text( ‚Anzahl Tage K.‘).
lr_column->set_long_text( ‚Anzahl Tage Kontingent‘).
lr_column ?= lr_columns->get_column( ‚DESTA‘ ).
lr_column->set_short_text( ‚Abtr.Beg.‘).
lr_column->set_medium_text( ‚Abtr. Beginn Datum‘).
lr_column->set_long_text( ‚Abtragung Beginn Datum‘).
lr_column ?= lr_columns->get_column( ‚DEEND‘ ).
lr_column->set_short_text( ‚Abtr.Ende‘).
lr_column->set_medium_text( ‚Abtr. Ende Datum‘).
lr_column->set_long_text( ‚Abtraung Ende Datum‘).
* lr_column ?= lr_columns->get_column( ‚MENG1‘ ).
* lr_column->set_short_text( ‚Abw.Tg.S.‘).
* lr_column->set_medium_text( ‚Abw.Tg.Skonto‘).
* lr_column->set_output_length( ’10‘ ).
* lr_column->set_sign( abap_true ).
lr_column ?= lr_columns->get_column( ‚PERSK‘ ).
lr_column->set_output_length( ’10‘ ).
lr_column->set_short_text( ‚Pers.Kreis‘).
lr_column->set_medium_text( ‚Personenkreis‘).
lr_column->set_long_text( ‚Personenkreis‘).
lr_column ?= lr_columns->get_column( ‚AMPEL‘ ).
lr_column->set_short_text( ‚Status‘).
lr_column->set_medium_text( ‚Status‘).
lr_column->set_long_text( ‚Aktueller Status‘).
lr_column->set_icon( abap_true ).
lr_column ?= lr_columns->get_column( ‚URLUGEP‘ ).
lr_column->set_output_length( ‚5‘ ).
lr_column->set_short_text( ‚Ungepl.U.‘).
lr_column->set_medium_text( ‚Ungepl.Urlaub‘).
lr_column->set_long_text( ‚Ungeplanter Urlaub‘).
lr_column ?= lr_columns->get_column( ‚URLGEP‘ ).
lr_column->set_output_length( ‚5‘ ).
lr_column->set_short_text( ‚Gepl.Url.‘).
lr_column->set_medium_text( ‚Gepl.Urlaub‘).
lr_column->set_long_text( ‚Geplanter Urlaub‘).
lr_column ?= lr_columns->get_column( ‚URLOFFEN‘ ).
lr_column->set_output_length( ‚5‘ ).
lr_column->set_short_text( ‚Off. Url.‘).
lr_column->set_medium_text( ‚Off. Urlaub‘).
lr_column->set_long_text( ‚Offener Urlaub‘).
“ abgerurlaub TYPE p DECIMALS 1, „abgerurlaub
“ urlgep TYPE p DECIMALS 1, „Geplanter Urlaub
** Zusatzinfo ausblenden
* IF p_zusatz IS INITIAL.
* lr_column ?= lr_columns->get_column( ‚ZFBDT‘ ).
* lr_column->set_visible( “ ).
* lr_column ?= lr_columns->get_column( ‚ZBD1T‘ ).
* lr_column->set_visible( “ ).
* lr_column ?= lr_columns->get_column( ‚ZBD2T‘ ).
* lr_column->set_visible( “ ).
* lr_column ?= lr_columns->get_column( ‚ZBD1P‘ ).
* lr_column->set_visible( “ ).
* lr_column ?= lr_columns->get_column( ‚ZBD2P‘ ).
* lr_column->set_visible( “ ).
* ENDIF.
lr_columns->set_column_position( columnname = ‚UPDATE‘ position = 1 ).
„lr_columns->set_column_position( columnname = ‚PERSK‘ position = 1 ).
lr_columns->set_column_position( columnname = ‚DEEND‘ position = 1 ).
lr_columns->set_column_position( columnname = ‚DESTA‘ position = 1 ).
lr_columns->set_column_position( columnname = ‚ANZHL‘ position = 1 ).
lr_columns->set_column_position( columnname = ‚ENDDA‘ position = 1 ).
lr_columns->set_column_position( columnname = ‚BEGDA‘ position = 1 ).
lr_columns->set_column_position( columnname = ‚VORNA‘ position = 1 ).
lr_columns->set_column_position( columnname = ‚NACHN‘ position = 1 ).
lr_columns->set_column_position( columnname = ‚PERNR‘ position = 1 ).
lr_columns->set_column_position( columnname = ‚AMPEL‘ position = 1 ).
„HST20190823 Anfang
PERFORM visible USING lr_columns ‚PERSK‘ p_visibl. „Personenkreis/Mitarbeitergruppe
PERFORM visible USING lr_columns ‚PERSG‘ p_visibl. „Personengruppe/Mitarbeitergruppe
PERFORM visible USING lr_columns ‚ABKRS‘ p_visibl. „Abrechnungskreis
PERFORM visible USING lr_columns ‚BTRTL‘ p_visibl. „Teilbereich
PERFORM visible USING lr_columns ‚TEILK‘ p_visibl. „Teilzeitkennzeichen
„HST20190823 Ende
„lr_columns->get_count_column
CATCH cx_salv_not_found.
cl_demo_output=>display(‚Error‘ ).
ENDTRY.
* Ausgabe
lref_salv->display( ).
ENDFORM.
„Unterprogramm von show_alv
FORM visible
USING
lr_columns TYPE REF TO cl_salv_columns_table
lv_column
lv_visibl .
DATA lr_column TYPE REF TO cl_salv_column_table.
TRY.
lr_column ?= lr_columns->get_column( lv_column ).
IF lv_visibl IS INITIAL.
lr_column->set_visible( “ ).
ELSE.
lr_column->set_visible( abap_true ).
ENDIF.
CATCH cx_salv_not_found.
cl_demo_output=>display(‚Error‘ ).
ENDTRY.
ENDFORM.
FORM show_data.
IF p_out0 = ‚X‘. „Dialog Output
PERFORM show_dialog.
ELSE. „ALV Output
PERFORM show_alv.
ENDIF.
ENDFORM.
*&———————————————————————*
*& FORM call_transaction
*&———————————————————————*
* Call standard transactions with authority check and progress indicator
*———————————————————————-*
„HST 20190712
FORM call_transaction USING trx TYPE tcode.
DATA: lv_message TYPE string.
CONCATENATE ‚Opening transaction‘ trx ‚…‘ INTO lv_message SEPARATED BY space. „#EC NOTEXT
CALL FUNCTION ‚AUTHORITY_CHECK_TCODE‘
EXPORTING
tcode = trx
EXCEPTIONS
ok = 0
not_ok = 1
OTHERS = 2.
IF sy-subrc NE 0.
MESSAGE e172(00) WITH trx.
ELSE.
CALL FUNCTION ‚SAPGUI_PROGRESS_INDICATOR‘
EXPORTING
text = lv_message.
CALL TRANSACTION trx AND SKIP FIRST SCREEN.
ENDIF.
ENDFORM. „call transaction
FORM display_pa30 TABLES gt_alv USING row TYPE salv_de_row column TYPE salv_de_column.
TRY.
gs_alv = gt_alv[ row ].
SET PARAMETER ID: ‚PER‘ FIELD gs_alv-pernr.
PERFORM call_transaction USING ‚PA30‘.
„BREAK-POINT.
CATCH cx_sy_itab_line_not_found.
cl_demo_output=>display(‚Einzelzeile auswählen‘ ).
„cl_abap_browser=>show_html( html = VALUE #( ( ‚Einzelzeile MATNR auswählen‘ ) ) ).
ENDTRY.
ENDFORM.
FORM display TABLES gt_alv USING row TYPE salv_de_row column TYPE salv_de_column.
IF column EQ ‚PERNR‘.
PERFORM display_pa30 TABLES gt_alv USING row column.
ENDIF.
ENDFORM.