Zeitwirtschaftsfehler
Anzeige von Zeitauswertungsmeldungen
Es kann eine Verteilerliste angelegt werden.
REPORT Z_REMI_TEST.
Das Coding sieht so aus:
*&---------------------------------------------------------------------*
*& Report ZPT_CH_RPTERL00
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT zpt_ch_rpterl00.
* XRK Note1653704 20111116 IT0002 is superfluous
* XRK Note1471643 20100521 Permit saving user-specific display variants
* XIRAC0K052148 090305 set tooltip for colours
* 4.7 XQI"L6BK012930 flexibler Seitenumbruch
* 4.6C-LCP
* XIRL9CK038337 190101 note 375245 applied
* XHRL9CK038198 180101 note 308039 applied
TYPE-POOLS: slis.
INFOTYPES: 0001, 0007, 0050. "Note1653704
TABLES: pernr, pcl2, pcl1,t549q, t555f, t001p, rpfausg, sscrfields,
t555e.
DATA: ms_variant LIKE disvariant,
os_variant LIKE disvariant.
DATA: BEGIN OF fehler_uebergabe OCCURS 10.
INCLUDE STRUCTURE pc2b8.
DATA: END OF fehler_uebergabe.
DATA: BEGIN OF ep_str,
permo TYPE permo,
pabrj TYPE pabrj,
pabrp TYPE pabrp,
END OF ep_str.
DATA: error_periods LIKE ep_str OCCURS 0.
DATA fieldcat TYPE slis_t_fieldcat_alv WITH HEADER LINE.
DATA fk_str TYPE slis_fieldcat_alv.
DATA farbtabelle_m TYPE slis_specialcol_alv OCCURS 1 WITH HEADER LINE.
DATA farb_str TYPE slis_specialcol_alv.
DATA ms_layout TYPE slis_layout_alv.
DATA: n,k TYPE i,
tag TYPE c,
tages_namen LIKE t246 OCCURS 7,
tages_name LIKE t246,
day_names_error TYPE c.
DATA flach_fausg LIKE rpfausg.
" flach_fausg hat im Ggs. zu fausg keine farbtabelle, ist also flach.
DATA: BEGIN OF fausg OCCURS 1.
INCLUDE STRUCTURE rpfausg.
DATA: farbtabelle TYPE slis_t_specialcol_alv.
DATA: END OF fausg .
DATA: gt_excl TYPE TABLE OF alv_s_qinf. "AC0K052148
INCLUDE rpterli1.
*INCLUDE SEL_OPTIONS.
DATA alv_var_copy LIKE alv_var.
**************************
INITIALIZATION.
**************************
PERFORM u_variante.
INCLUDE rpclst00.
INCLUDE rpc2b200.
INCLUDE rpppxd00.
INCLUDE rpppxd10.
rp-init-buffer.
rp-def-time-period.
***************************
AT SELECTION-SCREEN OUTPUT.
***************************
" Der FB REUSE_ALV_VARIANT_EXISTENCE tut zweierlei:
" 1. Es wird geprüft, ob es die Anzeige-Variante gibt, die das Feld
" alv_var bestimmt.
" 2. Es wird die Struktur ms_variant vervollständigt.
" Die Prüfung geschiet eigentlich schon bei PAI, ausser das Feld
" wurde von einer Anzeige-Variante des Selektionsbildschirms
" gefüllt.
" Falls die Prüfung schiefgeht, sollte man noch eine Fehlermeldung
" ausgeben.
CLEAR var_text .
IF alv_var NE space.
CLEAR ms_variant.
ms_variant-report = sy-repid.
ms_variant-variant = alv_var.
CALL FUNCTION 'REUSE_ALV_VARIANT_EXISTENCE'
CHANGING
cs_variant = ms_variant
EXCEPTIONS
wrong_input = 1
not_found = 2
program_error = 3
OTHERS = 4.
IF sy-subrc >< 0 .
"* warnung ausgeben, falls ein alv-Variantenname nicht existiert,
"* er aber über eine Variante vom Selektionsbild eingelesen wurde.
"* message ....
ELSE.
var_text = ms_variant-text.
alv_var_copy = alv_var.
" Sinn von alv_var_copy:
" Krücke für fehlenden Datentransport bei
" AT SELECTION-SCREEN ON VALUE-REQUEST FOR alv_var.
ENDIF.
ENDIF.
*************************************************
AT SELECTION-SCREEN ON VALUE-REQUEST FOR alv_var.
*************************************************
CLEAR ms_variant.
ms_variant-report = sy-repid.
alv_var = alv_var_copy.
IF alv_var NE space.
ms_variant-variant = alv_var.
ENDIF.
CALL FUNCTION 'REUSE_ALV_VARIANT_F4'
EXPORTING
is_variant = ms_variant
IMPORTING
es_variant = os_variant
EXCEPTIONS
not_found = 1
program_error = 2
OTHERS = 3.
IF os_variant <> '' AND sy-subrc = 0.
ms_variant = os_variant.
alv_var = ms_variant-variant.
var_text = ms_variant-text.
ENDIF.
*******************************
AT SELECTION-SCREEN.
*******************************
CLEAR ms_variant.
IF alv_var NE space.
ms_variant-report = sy-repid.
ms_variant-variant = alv_var.
CALL FUNCTION 'REUSE_ALV_VARIANT_EXISTENCE'
CHANGING
cs_variant = ms_variant.
ENDIF.
alv_var_copy = alv_var.
***********************
START-OF-SELECTION.
***********************
CALL FUNCTION 'DAY_NAMES_GET'
EXPORTING
language = sy-langu
TABLES
day_names = tages_namen
EXCEPTIONS
day_names_not_found = 1
OTHERS = 2.
IF sy-subrc <> 0.
day_names_error = 'X'.
ENDIF.
" Perioden ermitteln, die im Datenauswahlzeitraum liegen
SELECT * INTO CORRESPONDING FIELDS OF TABLE error_periods
FROM t549q WHERE permo = rptime_period
AND begda LE pn-endda
AND endda GE pn-begda ORDER BY PRIMARY KEY.
************
GET pernr.
************
PERFORM fehlertabelle_bauen TABLES fehler_uebergabe
error_periods
USING pernr-pernr.
fehler[] = fehler_uebergabe[].
" man kann nicht fehler bei TABLES in obiger FORM
" reinschreiben, weil das
" macro rp-imp-c2-b2 das globale Feld fehler verändert.
CLEAR fausg.
LOOP AT fehler WHERE ldate LE pn-endda
AND ldate GE pn-begda
AND ltime IN s_ltime
AND errty IN s_errty
AND error IN s_error
AND mesty IN s_mesty
AND histf IN s_histf
AND utext IN s_utext
AND pdsnr IN s_pdsnr .
* Begin of INSERTION "XIRL9CK038337
* positioniere Infotypen auf Fehlerdatum
LOOP AT p0001 WHERE begda LE fehler-ldate AND endda GE fehler-ldate.
EXIT.
ENDLOOP.
LOOP AT p0007 WHERE begda LE fehler-ldate AND endda GE fehler-ldate.
EXIT.
ENDLOOP.
LOOP AT p0050 WHERE begda LE fehler-ldate AND endda GE fehler-ldate.
EXIT.
ENDLOOP.
IF t001p-werks NE p0001-werks OR t001p-btrtl NE p0001-btrtl.
" Zuordnung des mobde mit der Tabelle t001p
SELECT SINGLE * FROM t001p WHERE werks = p0001-werks
AND btrtl = p0001-btrtl.
IF sy-subrc NE 0.
CLEAR t001p.
ENDIF.
ENDIF.
* End of INSERTION "XIRL9CK038337
* " Zuordnung des mobde mit der Tabelle t001p "XIRL9CK038337
* SELECT SINGLE * FROM T001P WHERE WERKS = P0001-WERKS "XIRL9CK038337
* AND BTRTL = P0001-BTRTL."XIRL9CK038337
" Damit Listkennzeichen ermitteln aus der t555e
SELECT SINGLE * FROM t555e WHERE mobde = t001p-mobde
AND errty = fehler-errty
AND error = fehler-error.
IF NOT s_listk[] IS INITIAL.
CHECK t555e-listk IN s_listk.
ENDIF.
"---- Selektionsbedingungen sind geprüft.
"---- FehlerAUSGabetabelle (flach_fausg) wird nun gefüllt.
*-- flach_fausg Anfang
CLEAR flach_fausg.
MOVE-CORRESPONDING p0001 TO flach_fausg.
MOVE-CORRESPONDING p0007 TO flach_fausg.
MOVE-CORRESPONDING p0050 TO flach_fausg.
MOVE-CORRESPONDING fehler TO flach_fausg.
flach_fausg-pernr = pernr-pernr.
flach_fausg-listk = t555e-listk.
" Mit dem Datum den Wochentag ermitteln.
IF fehler-ldate <> '' AND day_names_error <> 'X'.
CALL FUNCTION 'DATE_COMPUTE_DAY'
EXPORTING
date = flach_fausg-ldate
IMPORTING
day = tag.
READ TABLE tages_namen WITH KEY sprsl = sy-langu
wotnr = tag
INTO tages_name.
flach_fausg-kurzt = tages_name-kurzt.
ELSE.
flach_fausg-kurzt = ''.
ENDIF.
" Fehlertext mit der Tabelle t555f holen
SELECT SINGLE * FROM t555f
INTO CORRESPONDING FIELDS OF flach_fausg
WHERE mobde = t001p-mobde
AND sprsl = sy-langu
AND errty = fehler-errty
AND error = fehler-error.
*-- flach_fausg Ende
MOVE-CORRESPONDING flach_fausg TO fausg.
PERFORM farbtabelle_bauen
TABLES farbtabelle_m
USING fehler-mesty .
fausg-farbtabelle[] = farbtabelle_m[].
APPEND fausg.
CLEAR fausg.
ENDLOOP.
******************
END-OF-SELECTION.
******************
PERFORM feldkatalog_bauen TABLES fieldcat.
*------- Layout
ms_layout-colwidth_optimize = 'X'.
ms_layout-coltab_fieldname = 'FARBTABELLE'.
ms_layout-zebra = 'X'.
ms_layout-group_change_edit = 'X'. "L6BK012930
ms_variant-report = sy-repid.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
* I_INTERFACE_CHECK = ' '
i_callback_program = sy-repid
* I_CALLBACK_PF_STATUS_SET = ' '
i_callback_user_command = 'REAKTION_AUF_DOPPELKLICK'
* i_structure_name =
is_layout = ms_layout
it_fieldcat = fieldcat[]
* IT_EXCLUDING =
* IT_SPECIAL_GROUPS =
* IT_SORT =
* IT_FILTER =
* IS_SEL_HIDE =
* I_DEFAULT = 'X'
* i_save = 'X' "Note1471643
i_save = 'A' "Note1471643
is_variant = ms_variant
* IT_EVENTS =
* IT_EVENT_EXIT =
* IS_PRINT =
* IS_REPREP_ID =
* I_SCREEN_START_COLUMN = 0
* I_SCREEN_START_LINE = 0
* I_SCREEN_END_COLUMN = 0
* I_SCREEN_END_LINE = 0
it_except_qinfo = gt_excl "AC0K052148
i_grid_title = sy-title "AC0K052148
* IMPORTING
* E_EXIT_CAUSED_BY_CALLER =
* ES_EXIT_CAUSED_BY_USER =
TABLES
t_outtab = fausg
* EXCEPTIONS
* PROGRAM_ERROR = 1
* OTHERS = 2
.
* ---------- ENDE -----
INCLUDE rpppxm00.
******************
*----Form-Routinen
**********************
FORM feldkatalog_bauen
TABLES t_feldkatze STRUCTURE fk_str.
TYPES: BEGIN OF t_zeigan,
feldname(25) TYPE c,
janein TYPE c,
END OF t_zeigan.
DATA: zeigan TYPE t_zeigan OCCURS 15 WITH HEADER LINE.
DATA: tf_names LIKE x031l OCCURS 10 WITH HEADER LINE.
" tf_names => table-field-names
INCLUDE rpterli2.
* INCLUDE ZEIGAN.
CALL FUNCTION 'DDIF_NAMETAB_GET'
EXPORTING
tabname = 'RPFAUSG'
all_types = ' '
TABLES
x031l_tab = tf_names[]
EXCEPTIONS
not_found = 1
OTHERS = 2.
" Feldkatalog wird nun gebaut
" Zuerst kommen die Felder dran, die in der Tabelle zeigan sind.
" Diese Felder werden angezeigt, wenn keine Anz-Variante gewählt ist.
LOOP AT zeigan.
READ TABLE tf_names WITH KEY fieldname = zeigan-feldname.
IF sy-subrc = 0 OR sy-subrc = 2. " --> Eintrag gefunden.
t_feldkatze-fieldname = tf_names-fieldname.
t_feldkatze-ref_tabname = 'RPFAUSG'.
t_feldkatze-no_out = ''.
APPEND t_feldkatze TO t_feldkatze.
ENDIF.
ENDLOOP.
" Die Felder der tf_names, die noch nicht drankamen, werden jetzt
" versorgt.
t_feldkatze-ref_tabname = 'RPFAUSG'.
t_feldkatze-no_out = 'X'.
LOOP AT tf_names.
t_feldkatze-fieldname = tf_names-fieldname.
READ TABLE zeigan WITH KEY feldname = tf_names-fieldname.
IF sy-subrc = 4 OR sy-subrc = 8. "-->nicht in zeigan.
APPEND t_feldkatze.
ENDIF.
ENDLOOP.
ENDFORM. "feldkatalog_bauen
**********************
FORM farbtabelle_bauen
TABLES farbtabelle STRUCTURE farb_str
USING messagetype TYPE mesty.
DATA: intensified TYPE i,
colour TYPE i.
" Kopie vom rpterr40 FORM WRITE_ERROR (ZEILE 107)
" Die Schwere des Abbruchzeichens MESTY ist ausschlaggebend für die
" Farbdarstellung
IF messagetype EQ 'I'.
colour = 3. "gelb
intensified = 1.
ELSEIF messagetype EQ 'F'.
colour = 6. "orange
intensified = 0.
ELSEIF messagetype EQ 'E'.
colour = 6. "rot
intensified = 1.
ELSE.
colour = 0. " -> keine besondere farbgebung
ENDIF.
" Kopie ende
" Die Felder ERROR und ETEXT werden gefärbt.
CLEAR farbtabelle[].
IF colour NE 0.
farbtabelle-fieldname = 'ERROR'.
farbtabelle-color-col = colour.
farbtabelle-color-int = intensified.
APPEND farbtabelle.
farbtabelle-fieldname = 'ETEXT'.
farbtabelle-color-col = colour.
farbtabelle-color-int = intensified.
APPEND farbtabelle.
ENDIF.
*---- set tooltip for colours begin "AC0K052148
DATA: ls_excl TYPE alv_s_qinf.
CHECK gt_excl[] IS INITIAL.
ls_excl-type = cl_salv_tooltip=>c_type_color.
ls_excl-text = 'Information'(t01).
ls_excl-value = '31'.
APPEND ls_excl TO gt_excl.
ls_excl-text = 'Abbruch'(t02).
ls_excl-value = '61'.
APPEND ls_excl TO gt_excl.
ls_excl-text = 'Fehler'(t03).
ls_excl-value = '60'.
APPEND ls_excl TO gt_excl.
ls_excl-text = 'Hinweis'(t04).
CLEAR ls_excl-value.
APPEND ls_excl TO gt_excl.
*----- end "AC0K052148
ENDFORM. "farbtabelle_bauen
************************
FORM fehlertabelle_bauen
TABLES hajw_fehler STRUCTURE pc2b8
error_periods STRUCTURE ep_str
USING person TYPE p_pernr.
DATA: BEGIN OF a_error_periods OCCURS 0,
srtfd LIKE pcl2-srtfd,
END OF a_error_periods.
DATA: BEGIN OF b_error_periods OCCURS 0,
relid LIKE pcl2-relid,
srtfd LIKE pcl2-srtfd,
srtf2 LIKE pcl2-srtf2,
END OF b_error_periods.
" Mit den Perioden werden keys für die pcl2 gebaut
rp-init-buffer. "L9CK038198
CLEAR a_error_periods[].
LOOP AT error_periods.
CONCATENATE pernr-pernr
error_periods-pabrj
error_periods-pabrp
'1'
INTO a_error_periods-srtfd.
APPEND a_error_periods.
ENDLOOP.
" Welche für welche keys gibt es in der pcl2 überhaupt Einträge?
SELECT * INTO CORRESPONDING FIELDS OF TABLE b_error_periods
FROM pcl2 FOR ALL ENTRIES IN a_error_periods
WHERE srtfd = a_error_periods-srtfd
AND relid = 'B2'
AND srtf2 = 0.
CLEAR hajw_fehler[].
LOOP AT b_error_periods.
b2-key = b_error_periods-srtfd.
rp-imp-c2-b2.
APPEND LINES OF fehler TO hajw_fehler.
ENDLOOP.
fehler[] = hajw_fehler[].
ENDFORM. "fehlertabelle_bauen
*---------------------------------------------------------------------
* Unterprogramm fuer Reaktion auf Doppelklick
*---------------------------------------------------------------------
FORM reaktion_auf_doppelklick USING i_ucomm
i_selfield TYPE slis_selfield.
CASE i_ucomm.
WHEN '&IC1'. "bei Doppelklick
READ TABLE fausg INTO fausg
INDEX i_selfield-tabindex.
* Hier koennen Sie auf den Doppelklick reagieren.
* gs_aktuelle_zeile enthaelt die Zeile,
* die doppelgeklickt wurde.
* I_SELFIELD-FIELDNAME enthaelt den Namen
* des angeklickten Felds in der internen Tabelle.
PERFORM zdoopelklick.
ENDCASE.
ENDFORM. "REAKTION_AUF_DOPPELKLICK
*&---------------------------------------------------------------------*
*& Form ZDOOPELKLICK
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM zdoopelklick .
DATA: send_request TYPE REF TO cl_bcs.
DATA: lf_subject TYPE sood-objdes,
lt_text TYPE bcsy_text,
ls_text TYPE LINE OF bcsy_text,
lf_text TYPE so_text255,
lf_email TYPE adr6-smtp_addr,
lr_recipient TYPE REF TO if_recipient_bcs, "BCSY_RE3, "TYPE REF TO if_recipient_bcs,
lt_recipients TYPE bcsy_re3,
ls_recipient TYPE bcss_re3,
lr_mail TYPE REF TO cl_bcs,
lr_sender TYPE REF TO if_sender_bcs,
lf_sent_to_all TYPE os_boolean,
lf_text_floating TYPE os_boolean,
lf_attachments TYPE bcsy_ifdoc,
lf_replyto TYPE REF TO if_recipient_bcs,
lf_appl_object TYPE borident,
lf_encrypt TYPE bcsd_encr,
lf_sign TYPE bcsd_sign,
lf_vsi_profile TYPE vscan_profile,
lf_date TYPE c LENGTH 10,
lf_tag TYPE p.
DATA: lf_subty TYPE subty,
lf_absenz TYPE abwtxt,
lf_stdaz TYPE abstd,
lf_stunden TYPE c LENGTH 4,
lf_stdaza TYPE abstd,
lf_stundena TYPE c LENGTH 4,
lf_vorna TYPE vorna,
lf_datum TYPE sy-datum,
lf_status TYPE char30,
lf_text60 TYPE text60,
lf_art TYPE subty,
lf_arttext TYPE stext,
lf_werks TYPE persa.
DATA: lf_fname TYPE ad_namelas,
lf_lname TYPE ad_namefir,
ls_usr21 TYPE usr21.
DATA: lt_member TYPE TABLE OF sodm1,
ls_member TYPE sodm1,
lt_objpara TYPE TABLE OF selc,
lt_objparb TYPE TABLE OF soop1.
FIELD-SYMBOLS: <lfs_verteiler> TYPE somlreci1,
<lfs_member> TYPE sodm1.
*======================================================================*
* Titel
*======================================================================*
SELECT SINGLE werks FROM pa0001 INTO lf_werks
WHERE pernr = fausg-pernr
AND endda >= fausg-ldate
AND begda <= fausg-ldate.
CONCATENATE
fausg-ldate+6(2) '.'
fausg-ldate+4(2) '.'
fausg-ldate(4)
INTO lf_date.
CONCATENATE
'Error ZA' " 8
lf_werks " 4
lf_date "10
fausg-pernr " 8
fausg-ename "16 Rest
INTO lf_subject SEPARATED BY space.
*======================================================================*
* Rückmelde Datum berechnen
*======================================================================*
"lese den Wochentag in Zahlen
CALL FUNCTION 'DAY_IN_WEEK'
EXPORTING
datum = sy-datum
IMPORTING
wotnr = lf_tag.
CASE lf_tag.
"Montag
WHEN 1.
lf_datum = sy-datum + 2.
"Dienstag
WHEN 2.
lf_datum = sy-datum + 2.
"Mittwoch
WHEN 3.
lf_datum = sy-datum + 2.
"Donnerstag
WHEN 4.
lf_datum = sy-datum + 4.
"Freitag
WHEN 5.
lf_datum = sy-datum + 4.
"Samstag
WHEN 6.
lf_datum = sy-datum + 3.
"Sonntag
WHEN 7.
lf_datum = sy-datum + 2.
ENDCASE.
*======================================================================*
* Text Variabeln vorbereiten
*======================================================================*
"Lese den Vornamen des betroffenen Mitarbeiters
SELECT SINGLE vorna FROM pa0002 INTO lf_vorna
WHERE pernr = fausg-pernr
AND endda >= fausg-ldate
AND begda <= fausg-ldate.
"Leses den Subty im IT2001
SELECT SINGLE subty stdaz FROM pa2001 INTO (lf_subty, lf_stdaza)
WHERE pernr = fausg-pernr
AND endda >= fausg-ldate
AND begda <= fausg-ldate.
"Schreibe die Abwesenheitsstunden in Character Feld
lf_stundena = lf_stdaza.
"Text der Absenz lesen
SELECT SINGLE atext FROM t554t INTO lf_absenz
WHERE sprsl = 'D'
AND moabw = '02'
AND awart = lf_subty.
"Lese die Anwesenheitsstunden
SELECT SINGLE stdaz FROM pa2002 INTO lf_stdaz
WHERE pernr = fausg-pernr
AND endda >= fausg-ldate
AND begda <= fausg-ldate.
"Schreibe die Anwesenheitsstunden in Character Feld
lf_stunden = lf_stdaz.
"Lese die Namen und Vornamen in der Transaktion SU01
SELECT SINGLE * FROM usr21 INTO ls_usr21
WHERE bname = sy-uname.
SELECT SINGLE name_first name_last FROM adrp INTO (lf_fname, lf_lname)
WHERE persnumber = ls_usr21-persnumber
AND date_from <= sy-datum
AND date_to >= sy-datum.
"Lese den Status in der ZESS_CHRIS_OFFER dies ist der Gehnemigungs Status des HR Portals
SELECT SINGLE status FROM zess_chris_offer INTO lf_status
WHERE pernr = fausg-pernr
AND begda <= fausg-ldate
AND endda >= fausg-ldate.
*======================================================================*
* Text für Mail erstellen
*======================================================================*
"Begrüssung
CONCATENATE
'Hallo'
lf_vorna
INTO ls_text-line SEPARATED BY space.
APPEND ls_text TO lt_text.
CLEAR: ls_text-line.
APPEND ls_text TO lt_text.
"IT2002 oder IT2004
IF lf_stunden = 0.
"Lese den Subty im IT2004
SELECT SINGLE subty FROM pa2004 INTO lf_art
WHERE pernr = fausg-pernr
AND endda >= fausg-ldate
AND begda <= fausg-ldate.
"Hole den Text des Subtypen aus dem IT2004
SELECT SINGLE stext FROM t557t INTO lf_arttext
WHERE sprsl = 'DE'
AND mover = '02'
AND stnby = lf_art.
CONCATENATE lf_arttext 'gebucht' INTO lf_text60 SEPARATED BY space.
ELSE.
"IT2002
CONCATENATE lf_stunden 'Stunden Arbeitszeit gebucht.' INTO lf_text60 SEPARATED BY space.
ENDIF.
CONCATENATE
'Bei dir liegt ein Fehler in der Zeitwirtschaft vor.'
'Du hast am '
lf_date
'einen Tag bezahlte Absenz' lf_absenz
'(Status:' lf_status lf_stundena 'Stunden)'
'erfasst und Zeitgleich'
lf_text60
INTO ls_text-line SEPARATED BY space.
APPEND ls_text TO lt_text.
ls_text-line = 'Dies führt zu einem Fehler und eins von beiden muss entfernt werden.'.
APPEND ls_text TO lt_text.
CLEAR: ls_text-line.
APPEND ls_text TO lt_text.
IF lf_stunden <> 0 AND fausg-ldate+4(2) <> sy-datum+4(2)..
CONCATENATE
'Falls die bezahlte Absenz nicht korrekt ist, kann diese im Portal storniert werden (mit Genehmigung des Vorgesetzen).'
'Falls die Arbeitszeit nicht korrekt ist, teile mir das bitte mit.'
INTO ls_text-line SEPARATED BY space.
ELSEIF lf_stunden <> 0 AND fausg-ldate+4(2) = sy-datum+4(2).
CONCATENATE
'Falls die bezahlte Absenz nicht korrekt ist, kann diese im Portal storniert werden (mit Genehmigung des Vorgesetzen).'
'Falls die Arbeitszeit nicht korrekt ist, korrigiere diese und gibt mir kurz Feedback.'
INTO ls_text-line SEPARATED BY space.
ELSE.
CONCATENATE
'Falls die bezahlte Absenz nicht korrekt ist, kann diese im Portal storniert werden (mit Genehmigung des Vorgesetzen).'
'Falls die' lf_arttext 'nicht korrekt ist, kann diese ebenfalls im Portal storniert werden (mit Genehmigung des Vorgesetzen).'
INTO ls_text-line SEPARATED BY space.
ENDIF.
APPEND ls_text TO lt_text.
CLEAR: ls_text-line.
APPEND ls_text TO lt_text.
CONCATENATE
lf_datum+6(2)'.'
lf_datum+4(2)'.'
lf_datum(4)'.'
INTO ls_text-line.
CONCATENATE
'Besten Dank für deine Rückmeldung bis am'
ls_text-line
INTO ls_text-line SEPARATED BY space.
APPEND ls_text TO lt_text.
CLEAR: ls_text-line.
APPEND ls_text TO lt_text.
CONCATENATE
'Freundliche'
'Grüsse'
INTO ls_text-line SEPARATED BY space.
APPEND ls_text TO lt_text.
CLEAR: ls_text-line.
APPEND ls_text TO lt_text.
CONCATENATE
lf_fname
lf_lname
INTO ls_text-line SEPARATED BY space.
APPEND ls_text TO lt_text.
*======================================================================*
* Sender
*======================================================================*
"Sendeauftrag vom System anfordern
lr_mail = cl_bcs=>create_persistent( ).
"Email Von...(Absender)
lr_sender = cl_sapuser_bcs=>create( sy-uname ).
"Absender dem Sendeauftrag hinzufügen
CALL METHOD lr_mail->set_sender
EXPORTING
i_sender = lr_sender.
*======================================================================*
* Empfänger
*======================================================================*
"Kopie für MREGOTZ nur im EWE
IF sy-uname = 'MREGOTZ' AND sy-sysid = 'EWE'.
"Email An... (Empfänger)
lf_email = 'MICHEL.REGOTZ@T-SYSTEMS.COM'.
lr_recipient = cl_cam_address_bcs=>create_internet_address( lf_email ).
"Add recipient to send request
CALL METHOD lr_mail->add_recipient
EXPORTING
i_recipient = lr_recipient
i_express = 'X'.
CLEAR ls_recipient.
ls_recipient-recipient = lr_recipient.
APPEND ls_recipient TO lt_recipients.
ENDIF.
"Suchen der E-Mail Adresse der betroffenen Person
SELECT SINGLE usrid_long FROM pa0105 INTO lf_email
WHERE pernr = fausg-pernr
AND subty = '0010'
AND endda >= sy-datum
AND begda <= sy-datum.
"Empfänger Hinzufügen
"Email An... (Empfänger)
lr_recipient = cl_cam_address_bcs=>create_internet_address( lf_email ).
"Add recipient to send request
CALL METHOD lr_mail->add_recipient
EXPORTING
i_recipient = lr_recipient
i_express = 'X'.
CLEAR ls_recipient.
ls_recipient-recipient = lr_recipient.
APPEND ls_recipient TO lt_recipients.
"Lesen einer Verteiler Liste
CALL FUNCTION 'SO_DLI_READ'
EXPORTING
distributionlist = 'ZCH_RPTERL00'
system_dli = 'X'
TABLES
member = lt_member
objpara = lt_objpara
objparb = lt_objparb
EXCEPTIONS
active_user_not_exist = 1
communication_failure = 2
component_not_available = 3
dl_name_not_exist = 4
folder_not_exist = 5
folder_no_authorization = 6
forwarder_not_exist = 7
object_not_exist = 8
object_no_authorization = 9
operation_no_authorization = 10
owner_not_exist = 11
parameter_error = 12
substitute_not_active = 13
substitute_not_defined = 14
system_failure = 15
user_not_exist = 16
x_error = 17
OTHERS = 18.
IF sy-subrc <> 0.
" MESSAGE 'Es wude keine Empfängerliste gefunden' TYPE 'I' DISPLAY LIKE 'W'.
ELSE.
" Verteilerliste hinzufügen
LOOP AT lt_member ASSIGNING <lfs_member>.
CLEAR: lf_email.
lf_email = <lfs_member>-address.
"Email An... (Empfänger)
lr_recipient = cl_cam_address_bcs=>create_internet_address( lf_email ).
"Vertilerliste Sendeauftrag hinzufügen
CALL METHOD lr_mail->add_recipient
EXPORTING
i_recipient = lr_recipient
i_express = 'X'
i_copy = 'X'.
CLEAR ls_recipient.
ls_recipient-recipient = lr_recipient.
APPEND ls_recipient TO lt_recipients.
ENDLOOP.
ENDIF.
*======================================================================*
* Mail anzeigen falls man es ändern möchte
*======================================================================*
"Rufe Mail Oberfläche auf.
TRY.
CALL METHOD cl_bcs=>short_message
EXPORTING
i_subject = lf_subject
i_text = lt_text
i_recipients = lt_recipients
i_sender = lr_sender
* i_text_floating =
* i_attachments =
* i_replyto =
* i_appl_object =
i_starting_at_x = 10
i_starting_at_y = 10
i_ending_at_y = 30
i_ending_at_x = 100
* i_encrypt =
* i_sign =
* iv_vsi_profile =
* receiving
* result =
.
COMMIT WORK AND WAIT.
CATCH cx_send_req_bcs.
CATCH cx_bcs.
ENDTRY.
* "Mail direkt senden ohne das man dies in der SOST zum senden freigeben muss.
* "Sofort senden aktivieren, andernfalls versendet "SCOT" beim nächsten Joblauf
* CALL METHOD lr_mail->set_send_immediately
* EXPORTING
* i_send_immediately = 'X'.
*
* "Email senden
* CALL METHOD lr_mail->send(
* EXPORTING
* i_with_error_screen = 'X'
* RECEIVING
* result = lf_sent_to_all ).
* IF lf_sent_to_all = 'X'.
* WRITE 'Email sent!'.
* ENDIF.
ENDFORM. " ZDOOPELKLICK
*&---------------------------------------------------------------------*
*& Form U_VARIANTE
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM u_variante .
*======================================================================*
* Beginn: Die Variante REGOTZ wird nun automatisch gezogen
*======================================================================*
"Daten Deklaration um die Variante automatisch zu ziehen.
DATA: lf_variante TYPE rsvar-variant VALUE 'MREGOTZ'.
IF sy-uname = 'MREGOTZ'.
* Die Variante REGOTZ wird nun automatisch gezogen
CALL FUNCTION 'RS_SUPPORT_SELECTIONS'
EXPORTING
report = sy-repid
variant = lf_variante
EXCEPTIONS
variant_not_existent = 1
variant_obsolete = 2
OTHERS = 3.
IF sy-subrc <> 0.
* Variante & ist nicht vorhanden
MESSAGE i016(pn) WITH
'Die Variante' lf_variante 'ist nicht vorhanden'.
ELSE.
MESSAGE i016(pn) WITH
'Die Variante' lf_variante 'wird automatisch gezogen'.
ENDIF.
ENDIF.
*======================================================================*
* Ende Die Variante REGOTZ wird nun automatisch gezogen
*======================================================================*
ENDFORM. " U_VARIANTE
Das Coding sieht so aus:
*&---------------------------------------------------------------------*
*& Report ZPT_CH_RPTERL00
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT zpt_ch_rpterl00.
* XRK Note1653704 20111116 IT0002 is superfluous
* XRK Note1471643 20100521 Permit saving user-specific display variants
* XIRAC0K052148 090305 set tooltip for colours
* 4.7 XQI"L6BK012930 flexibler Seitenumbruch
* 4.6C-LCP
* XIRL9CK038337 190101 note 375245 applied
* XHRL9CK038198 180101 note 308039 applied
TYPE-POOLS: slis.
INFOTYPES: 0001, 0007, 0050. "Note1653704
TABLES: pernr, pcl2, pcl1,t549q, t555f, t001p, rpfausg, sscrfields,
t555e.
DATA: ms_variant LIKE disvariant,
os_variant LIKE disvariant.
DATA: BEGIN OF fehler_uebergabe OCCURS 10.
INCLUDE STRUCTURE pc2b8.
DATA: END OF fehler_uebergabe.
DATA: BEGIN OF ep_str,
permo TYPE permo,
pabrj TYPE pabrj,
pabrp TYPE pabrp,
END OF ep_str.
DATA: error_periods LIKE ep_str OCCURS 0.
DATA fieldcat TYPE slis_t_fieldcat_alv WITH HEADER LINE.
DATA fk_str TYPE slis_fieldcat_alv.
DATA farbtabelle_m TYPE slis_specialcol_alv OCCURS 1 WITH HEADER LINE.
DATA farb_str TYPE slis_specialcol_alv.
DATA ms_layout TYPE slis_layout_alv.
DATA: n,k TYPE i,
tag TYPE c,
tages_namen LIKE t246 OCCURS 7,
tages_name LIKE t246,
day_names_error TYPE c.
DATA flach_fausg LIKE rpfausg.
" flach_fausg hat im Ggs. zu fausg keine farbtabelle, ist also flach.
DATA: BEGIN OF fausg OCCURS 1.
INCLUDE STRUCTURE rpfausg.
DATA: farbtabelle TYPE slis_t_specialcol_alv.
DATA: END OF fausg .
DATA: gt_excl TYPE TABLE OF alv_s_qinf. "AC0K052148
INCLUDE rpterli1.
*INCLUDE SEL_OPTIONS.
DATA alv_var_copy LIKE alv_var.
**************************
INITIALIZATION.
**************************
PERFORM u_variante.
INCLUDE rpclst00.
INCLUDE rpc2b200.
INCLUDE rpppxd00.
INCLUDE rpppxd10.
rp-init-buffer.
rp-def-time-period.
***************************
AT SELECTION-SCREEN OUTPUT.
***************************
" Der FB REUSE_ALV_VARIANT_EXISTENCE tut zweierlei:
" 1. Es wird geprüft, ob es die Anzeige-Variante gibt, die das Feld
" alv_var bestimmt.
" 2. Es wird die Struktur ms_variant vervollständigt.
" Die Prüfung geschiet eigentlich schon bei PAI, ausser das Feld
" wurde von einer Anzeige-Variante des Selektionsbildschirms
" gefüllt.
" Falls die Prüfung schiefgeht, sollte man noch eine Fehlermeldung
" ausgeben.
CLEAR var_text .
IF alv_var NE space.
CLEAR ms_variant.
ms_variant-report = sy-repid.
ms_variant-variant = alv_var.
CALL FUNCTION 'REUSE_ALV_VARIANT_EXISTENCE'
CHANGING
cs_variant = ms_variant
EXCEPTIONS
wrong_input = 1
not_found = 2
program_error = 3
OTHERS = 4.
IF sy-subrc >< 0 .
"* warnung ausgeben, falls ein alv-Variantenname nicht existiert,
"* er aber über eine Variante vom Selektionsbild eingelesen wurde.
"* message ....
ELSE.
var_text = ms_variant-text.
alv_var_copy = alv_var.
" Sinn von alv_var_copy:
" Krücke für fehlenden Datentransport bei
" AT SELECTION-SCREEN ON VALUE-REQUEST FOR alv_var.
ENDIF.
ENDIF.
*************************************************
AT SELECTION-SCREEN ON VALUE-REQUEST FOR alv_var.
*************************************************
CLEAR ms_variant.
ms_variant-report = sy-repid.
alv_var = alv_var_copy.
IF alv_var NE space.
ms_variant-variant = alv_var.
ENDIF.
CALL FUNCTION 'REUSE_ALV_VARIANT_F4'
EXPORTING
is_variant = ms_variant
IMPORTING
es_variant = os_variant
EXCEPTIONS
not_found = 1
program_error = 2
OTHERS = 3.
IF os_variant <> '' AND sy-subrc = 0.
ms_variant = os_variant.
alv_var = ms_variant-variant.
var_text = ms_variant-text.
ENDIF.
*******************************
AT SELECTION-SCREEN.
*******************************
CLEAR ms_variant.
IF alv_var NE space.
ms_variant-report = sy-repid.
ms_variant-variant = alv_var.
CALL FUNCTION 'REUSE_ALV_VARIANT_EXISTENCE'
CHANGING
cs_variant = ms_variant.
ENDIF.
alv_var_copy = alv_var.
***********************
START-OF-SELECTION.
***********************
CALL FUNCTION 'DAY_NAMES_GET'
EXPORTING
language = sy-langu
TABLES
day_names = tages_namen
EXCEPTIONS
day_names_not_found = 1
OTHERS = 2.
IF sy-subrc <> 0.
day_names_error = 'X'.
ENDIF.
" Perioden ermitteln, die im Datenauswahlzeitraum liegen
SELECT * INTO CORRESPONDING FIELDS OF TABLE error_periods
FROM t549q WHERE permo = rptime_period
AND begda LE pn-endda
AND endda GE pn-begda ORDER BY PRIMARY KEY.
************
GET pernr.
************
PERFORM fehlertabelle_bauen TABLES fehler_uebergabe
error_periods
USING pernr-pernr.
fehler[] = fehler_uebergabe[].
" man kann nicht fehler bei TABLES in obiger FORM
" reinschreiben, weil das
" macro rp-imp-c2-b2 das globale Feld fehler verändert.
CLEAR fausg.
LOOP AT fehler WHERE ldate LE pn-endda
AND ldate GE pn-begda
AND ltime IN s_ltime
AND errty IN s_errty
AND error IN s_error
AND mesty IN s_mesty
AND histf IN s_histf
AND utext IN s_utext
AND pdsnr IN s_pdsnr .
* Begin of INSERTION "XIRL9CK038337
* positioniere Infotypen auf Fehlerdatum
LOOP AT p0001 WHERE begda LE fehler-ldate AND endda GE fehler-ldate.
EXIT.
ENDLOOP.
LOOP AT p0007 WHERE begda LE fehler-ldate AND endda GE fehler-ldate.
EXIT.
ENDLOOP.
LOOP AT p0050 WHERE begda LE fehler-ldate AND endda GE fehler-ldate.
EXIT.
ENDLOOP.
IF t001p-werks NE p0001-werks OR t001p-btrtl NE p0001-btrtl.
" Zuordnung des mobde mit der Tabelle t001p
SELECT SINGLE * FROM t001p WHERE werks = p0001-werks
AND btrtl = p0001-btrtl.
IF sy-subrc NE 0.
CLEAR t001p.
ENDIF.
ENDIF.
* End of INSERTION "XIRL9CK038337
* " Zuordnung des mobde mit der Tabelle t001p "XIRL9CK038337
* SELECT SINGLE * FROM T001P WHERE WERKS = P0001-WERKS "XIRL9CK038337
* AND BTRTL = P0001-BTRTL."XIRL9CK038337
" Damit Listkennzeichen ermitteln aus der t555e
SELECT SINGLE * FROM t555e WHERE mobde = t001p-mobde
AND errty = fehler-errty
AND error = fehler-error.
IF NOT s_listk[] IS INITIAL.
CHECK t555e-listk IN s_listk.
ENDIF.
"---- Selektionsbedingungen sind geprüft.
"---- FehlerAUSGabetabelle (flach_fausg) wird nun gefüllt.
*-- flach_fausg Anfang
CLEAR flach_fausg.
MOVE-CORRESPONDING p0001 TO flach_fausg.
MOVE-CORRESPONDING p0007 TO flach_fausg.
MOVE-CORRESPONDING p0050 TO flach_fausg.
MOVE-CORRESPONDING fehler TO flach_fausg.
flach_fausg-pernr = pernr-pernr.
flach_fausg-listk = t555e-listk.
" Mit dem Datum den Wochentag ermitteln.
IF fehler-ldate <> '' AND day_names_error <> 'X'.
CALL FUNCTION 'DATE_COMPUTE_DAY'
EXPORTING
date = flach_fausg-ldate
IMPORTING
day = tag.
READ TABLE tages_namen WITH KEY sprsl = sy-langu
wotnr = tag
INTO tages_name.
flach_fausg-kurzt = tages_name-kurzt.
ELSE.
flach_fausg-kurzt = ''.
ENDIF.
" Fehlertext mit der Tabelle t555f holen
SELECT SINGLE * FROM t555f
INTO CORRESPONDING FIELDS OF flach_fausg
WHERE mobde = t001p-mobde
AND sprsl = sy-langu
AND errty = fehler-errty
AND error = fehler-error.
*-- flach_fausg Ende
MOVE-CORRESPONDING flach_fausg TO fausg.
PERFORM farbtabelle_bauen
TABLES farbtabelle_m
USING fehler-mesty .
fausg-farbtabelle[] = farbtabelle_m[].
APPEND fausg.
CLEAR fausg.
ENDLOOP.
******************
END-OF-SELECTION.
******************
PERFORM feldkatalog_bauen TABLES fieldcat.
*------- Layout
ms_layout-colwidth_optimize = 'X'.
ms_layout-coltab_fieldname = 'FARBTABELLE'.
ms_layout-zebra = 'X'.
ms_layout-group_change_edit = 'X'. "L6BK012930
ms_variant-report = sy-repid.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
* I_INTERFACE_CHECK = ' '
i_callback_program = sy-repid
* I_CALLBACK_PF_STATUS_SET = ' '
i_callback_user_command = 'REAKTION_AUF_DOPPELKLICK'
* i_structure_name =
is_layout = ms_layout
it_fieldcat = fieldcat[]
* IT_EXCLUDING =
* IT_SPECIAL_GROUPS =
* IT_SORT =
* IT_FILTER =
* IS_SEL_HIDE =
* I_DEFAULT = 'X'
* i_save = 'X' "Note1471643
i_save = 'A' "Note1471643
is_variant = ms_variant
* IT_EVENTS =
* IT_EVENT_EXIT =
* IS_PRINT =
* IS_REPREP_ID =
* I_SCREEN_START_COLUMN = 0
* I_SCREEN_START_LINE = 0
* I_SCREEN_END_COLUMN = 0
* I_SCREEN_END_LINE = 0
it_except_qinfo = gt_excl "AC0K052148
i_grid_title = sy-title "AC0K052148
* IMPORTING
* E_EXIT_CAUSED_BY_CALLER =
* ES_EXIT_CAUSED_BY_USER =
TABLES
t_outtab = fausg
* EXCEPTIONS
* PROGRAM_ERROR = 1
* OTHERS = 2
.
* ---------- ENDE -----
INCLUDE rpppxm00.
******************
*----Form-Routinen
**********************
FORM feldkatalog_bauen
TABLES t_feldkatze STRUCTURE fk_str.
TYPES: BEGIN OF t_zeigan,
feldname(25) TYPE c,
janein TYPE c,
END OF t_zeigan.
DATA: zeigan TYPE t_zeigan OCCURS 15 WITH HEADER LINE.
DATA: tf_names LIKE x031l OCCURS 10 WITH HEADER LINE.
" tf_names => table-field-names
INCLUDE rpterli2.
* INCLUDE ZEIGAN.
CALL FUNCTION 'DDIF_NAMETAB_GET'
EXPORTING
tabname = 'RPFAUSG'
all_types = ' '
TABLES
x031l_tab = tf_names[]
EXCEPTIONS
not_found = 1
OTHERS = 2.
" Feldkatalog wird nun gebaut
" Zuerst kommen die Felder dran, die in der Tabelle zeigan sind.
" Diese Felder werden angezeigt, wenn keine Anz-Variante gewählt ist.
LOOP AT zeigan.
READ TABLE tf_names WITH KEY fieldname = zeigan-feldname.
IF sy-subrc = 0 OR sy-subrc = 2. " --> Eintrag gefunden.
t_feldkatze-fieldname = tf_names-fieldname.
t_feldkatze-ref_tabname = 'RPFAUSG'.
t_feldkatze-no_out = ''.
APPEND t_feldkatze TO t_feldkatze.
ENDIF.
ENDLOOP.
" Die Felder der tf_names, die noch nicht drankamen, werden jetzt
" versorgt.
t_feldkatze-ref_tabname = 'RPFAUSG'.
t_feldkatze-no_out = 'X'.
LOOP AT tf_names.
t_feldkatze-fieldname = tf_names-fieldname.
READ TABLE zeigan WITH KEY feldname = tf_names-fieldname.
IF sy-subrc = 4 OR sy-subrc = 8. "-->nicht in zeigan.
APPEND t_feldkatze.
ENDIF.
ENDLOOP.
ENDFORM. "feldkatalog_bauen
**********************
FORM farbtabelle_bauen
TABLES farbtabelle STRUCTURE farb_str
USING messagetype TYPE mesty.
DATA: intensified TYPE i,
colour TYPE i.
" Kopie vom rpterr40 FORM WRITE_ERROR (ZEILE 107)
" Die Schwere des Abbruchzeichens MESTY ist ausschlaggebend für die
" Farbdarstellung
IF messagetype EQ 'I'.
colour = 3. "gelb
intensified = 1.
ELSEIF messagetype EQ 'F'.
colour = 6. "orange
intensified = 0.
ELSEIF messagetype EQ 'E'.
colour = 6. "rot
intensified = 1.
ELSE.
colour = 0. " -> keine besondere farbgebung
ENDIF.
" Kopie ende
" Die Felder ERROR und ETEXT werden gefärbt.
CLEAR farbtabelle[].
IF colour NE 0.
farbtabelle-fieldname = 'ERROR'.
farbtabelle-color-col = colour.
farbtabelle-color-int = intensified.
APPEND farbtabelle.
farbtabelle-fieldname = 'ETEXT'.
farbtabelle-color-col = colour.
farbtabelle-color-int = intensified.
APPEND farbtabelle.
ENDIF.
*---- set tooltip for colours begin "AC0K052148
DATA: ls_excl TYPE alv_s_qinf.
CHECK gt_excl[] IS INITIAL.
ls_excl-type = cl_salv_tooltip=>c_type_color.
ls_excl-text = 'Information'(t01).
ls_excl-value = '31'.
APPEND ls_excl TO gt_excl.
ls_excl-text = 'Abbruch'(t02).
ls_excl-value = '61'.
APPEND ls_excl TO gt_excl.
ls_excl-text = 'Fehler'(t03).
ls_excl-value = '60'.
APPEND ls_excl TO gt_excl.
ls_excl-text = 'Hinweis'(t04).
CLEAR ls_excl-value.
APPEND ls_excl TO gt_excl.
*----- end "AC0K052148
ENDFORM. "farbtabelle_bauen
************************
FORM fehlertabelle_bauen
TABLES hajw_fehler STRUCTURE pc2b8
error_periods STRUCTURE ep_str
USING person TYPE p_pernr.
DATA: BEGIN OF a_error_periods OCCURS 0,
srtfd LIKE pcl2-srtfd,
END OF a_error_periods.
DATA: BEGIN OF b_error_periods OCCURS 0,
relid LIKE pcl2-relid,
srtfd LIKE pcl2-srtfd,
srtf2 LIKE pcl2-srtf2,
END OF b_error_periods.
" Mit den Perioden werden keys für die pcl2 gebaut
rp-init-buffer. "L9CK038198
CLEAR a_error_periods[].
LOOP AT error_periods.
CONCATENATE pernr-pernr
error_periods-pabrj
error_periods-pabrp
'1'
INTO a_error_periods-srtfd.
APPEND a_error_periods.
ENDLOOP.
" Welche für welche keys gibt es in der pcl2 überhaupt Einträge?
SELECT * INTO CORRESPONDING FIELDS OF TABLE b_error_periods
FROM pcl2 FOR ALL ENTRIES IN a_error_periods
WHERE srtfd = a_error_periods-srtfd
AND relid = 'B2'
AND srtf2 = 0.
CLEAR hajw_fehler[].
LOOP AT b_error_periods.
b2-key = b_error_periods-srtfd.
rp-imp-c2-b2.
APPEND LINES OF fehler TO hajw_fehler.
ENDLOOP.
fehler[] = hajw_fehler[].
ENDFORM. "fehlertabelle_bauen
*---------------------------------------------------------------------
* Unterprogramm fuer Reaktion auf Doppelklick
*---------------------------------------------------------------------
FORM reaktion_auf_doppelklick USING i_ucomm
i_selfield TYPE slis_selfield.
CASE i_ucomm.
WHEN '&IC1'. "bei Doppelklick
READ TABLE fausg INTO fausg
INDEX i_selfield-tabindex.
* Hier koennen Sie auf den Doppelklick reagieren.
* gs_aktuelle_zeile enthaelt die Zeile,
* die doppelgeklickt wurde.
* I_SELFIELD-FIELDNAME enthaelt den Namen
* des angeklickten Felds in der internen Tabelle.
PERFORM zdoopelklick.
ENDCASE.
ENDFORM. "REAKTION_AUF_DOPPELKLICK
*&---------------------------------------------------------------------*
*& Form ZDOOPELKLICK
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM zdoopelklick .
DATA: send_request TYPE REF TO cl_bcs.
DATA: lf_subject TYPE sood-objdes,
lt_text TYPE bcsy_text,
ls_text TYPE LINE OF bcsy_text,
lf_text TYPE so_text255,
lf_email TYPE adr6-smtp_addr,
lr_recipient TYPE REF TO if_recipient_bcs, "BCSY_RE3, "TYPE REF TO if_recipient_bcs,
lt_recipients TYPE bcsy_re3,
ls_recipient TYPE bcss_re3,
lr_mail TYPE REF TO cl_bcs,
lr_sender TYPE REF TO if_sender_bcs,
lf_sent_to_all TYPE os_boolean,
lf_text_floating TYPE os_boolean,
lf_attachments TYPE bcsy_ifdoc,
lf_replyto TYPE REF TO if_recipient_bcs,
lf_appl_object TYPE borident,
lf_encrypt TYPE bcsd_encr,
lf_sign TYPE bcsd_sign,
lf_vsi_profile TYPE vscan_profile,
lf_date TYPE c LENGTH 10,
lf_tag TYPE p.
DATA: lf_subty TYPE subty,
lf_absenz TYPE abwtxt,
lf_stdaz TYPE abstd,
lf_stunden TYPE c LENGTH 4,
lf_stdaza TYPE abstd,
lf_stundena TYPE c LENGTH 4,
lf_vorna TYPE vorna,
lf_datum TYPE sy-datum,
lf_status TYPE char30,
lf_text60 TYPE text60,
lf_art TYPE subty,
lf_arttext TYPE stext,
lf_werks TYPE persa.
DATA: lf_fname TYPE ad_namelas,
lf_lname TYPE ad_namefir,
ls_usr21 TYPE usr21.
DATA: lt_member TYPE TABLE OF sodm1,
ls_member TYPE sodm1,
lt_objpara TYPE TABLE OF selc,
lt_objparb TYPE TABLE OF soop1.
FIELD-SYMBOLS: <lfs_verteiler> TYPE somlreci1,
<lfs_member> TYPE sodm1.
*======================================================================*
* Titel
*======================================================================*
SELECT SINGLE werks FROM pa0001 INTO lf_werks
WHERE pernr = fausg-pernr
AND endda >= fausg-ldate
AND begda <= fausg-ldate.
CONCATENATE
fausg-ldate+6(2) '.'
fausg-ldate+4(2) '.'
fausg-ldate(4)
INTO lf_date.
CONCATENATE
'Error ZA' " 8
lf_werks " 4
lf_date "10
fausg-pernr " 8
fausg-ename "16 Rest
INTO lf_subject SEPARATED BY space.
*======================================================================*
* Rückmelde Datum berechnen
*======================================================================*
"lese den Wochentag in Zahlen
CALL FUNCTION 'DAY_IN_WEEK'
EXPORTING
datum = sy-datum
IMPORTING
wotnr = lf_tag.
CASE lf_tag.
"Montag
WHEN 1.
lf_datum = sy-datum + 2.
"Dienstag
WHEN 2.
lf_datum = sy-datum + 2.
"Mittwoch
WHEN 3.
lf_datum = sy-datum + 2.
"Donnerstag
WHEN 4.
lf_datum = sy-datum + 4.
"Freitag
WHEN 5.
lf_datum = sy-datum + 4.
"Samstag
WHEN 6.
lf_datum = sy-datum + 3.
"Sonntag
WHEN 7.
lf_datum = sy-datum + 2.
ENDCASE.
*======================================================================*
* Text Variabeln vorbereiten
*======================================================================*
"Lese den Vornamen des betroffenen Mitarbeiters
SELECT SINGLE vorna FROM pa0002 INTO lf_vorna
WHERE pernr = fausg-pernr
AND endda >= fausg-ldate
AND begda <= fausg-ldate.
"Leses den Subty im IT2001
SELECT SINGLE subty stdaz FROM pa2001 INTO (lf_subty, lf_stdaza)
WHERE pernr = fausg-pernr
AND endda >= fausg-ldate
AND begda <= fausg-ldate.
"Schreibe die Abwesenheitsstunden in Character Feld
lf_stundena = lf_stdaza.
"Text der Absenz lesen
SELECT SINGLE atext FROM t554t INTO lf_absenz
WHERE sprsl = 'D'
AND moabw = '02'
AND awart = lf_subty.
"Lese die Anwesenheitsstunden
SELECT SINGLE stdaz FROM pa2002 INTO lf_stdaz
WHERE pernr = fausg-pernr
AND endda >= fausg-ldate
AND begda <= fausg-ldate.
"Schreibe die Anwesenheitsstunden in Character Feld
lf_stunden = lf_stdaz.
"Lese die Namen und Vornamen in der Transaktion SU01
SELECT SINGLE * FROM usr21 INTO ls_usr21
WHERE bname = sy-uname.
SELECT SINGLE name_first name_last FROM adrp INTO (lf_fname, lf_lname)
WHERE persnumber = ls_usr21-persnumber
AND date_from <= sy-datum
AND date_to >= sy-datum.
"Lese den Status in der ZESS_CHRIS_OFFER dies ist der Gehnemigungs Status des HR Portals
SELECT SINGLE status FROM zess_chris_offer INTO lf_status
WHERE pernr = fausg-pernr
AND begda <= fausg-ldate
AND endda >= fausg-ldate.
*======================================================================*
* Text für Mail erstellen
*======================================================================*
"Begrüssung
CONCATENATE
'Hallo'
lf_vorna
INTO ls_text-line SEPARATED BY space.
APPEND ls_text TO lt_text.
CLEAR: ls_text-line.
APPEND ls_text TO lt_text.
"IT2002 oder IT2004
IF lf_stunden = 0.
"Lese den Subty im IT2004
SELECT SINGLE subty FROM pa2004 INTO lf_art
WHERE pernr = fausg-pernr
AND endda >= fausg-ldate
AND begda <= fausg-ldate.
"Hole den Text des Subtypen aus dem IT2004
SELECT SINGLE stext FROM t557t INTO lf_arttext
WHERE sprsl = 'DE'
AND mover = '02'
AND stnby = lf_art.
CONCATENATE lf_arttext 'gebucht' INTO lf_text60 SEPARATED BY space.
ELSE.
"IT2002
CONCATENATE lf_stunden 'Stunden Arbeitszeit gebucht.' INTO lf_text60 SEPARATED BY space.
ENDIF.
CONCATENATE
'Bei dir liegt ein Fehler in der Zeitwirtschaft vor.'
'Du hast am '
lf_date
'einen Tag bezahlte Absenz' lf_absenz
'(Status:' lf_status lf_stundena 'Stunden)'
'erfasst und Zeitgleich'
lf_text60
INTO ls_text-line SEPARATED BY space.
APPEND ls_text TO lt_text.
ls_text-line = 'Dies führt zu einem Fehler und eins von beiden muss entfernt werden.'.
APPEND ls_text TO lt_text.
CLEAR: ls_text-line.
APPEND ls_text TO lt_text.
IF lf_stunden <> 0 AND fausg-ldate+4(2) <> sy-datum+4(2)..
CONCATENATE
'Falls die bezahlte Absenz nicht korrekt ist, kann diese im Portal storniert werden (mit Genehmigung des Vorgesetzen).'
'Falls die Arbeitszeit nicht korrekt ist, teile mir das bitte mit.'
INTO ls_text-line SEPARATED BY space.
ELSEIF lf_stunden <> 0 AND fausg-ldate+4(2) = sy-datum+4(2).
CONCATENATE
'Falls die bezahlte Absenz nicht korrekt ist, kann diese im Portal storniert werden (mit Genehmigung des Vorgesetzen).'
'Falls die Arbeitszeit nicht korrekt ist, korrigiere diese und gibt mir kurz Feedback.'
INTO ls_text-line SEPARATED BY space.
ELSE.
CONCATENATE
'Falls die bezahlte Absenz nicht korrekt ist, kann diese im Portal storniert werden (mit Genehmigung des Vorgesetzen).'
'Falls die' lf_arttext 'nicht korrekt ist, kann diese ebenfalls im Portal storniert werden (mit Genehmigung des Vorgesetzen).'
INTO ls_text-line SEPARATED BY space.
ENDIF.
APPEND ls_text TO lt_text.
CLEAR: ls_text-line.
APPEND ls_text TO lt_text.
CONCATENATE
lf_datum+6(2)'.'
lf_datum+4(2)'.'
lf_datum(4)'.'
INTO ls_text-line.
CONCATENATE
'Besten Dank für deine Rückmeldung bis am'
ls_text-line
INTO ls_text-line SEPARATED BY space.
APPEND ls_text TO lt_text.
CLEAR: ls_text-line.
APPEND ls_text TO lt_text.
CONCATENATE
'Freundliche'
'Grüsse'
INTO ls_text-line SEPARATED BY space.
APPEND ls_text TO lt_text.
CLEAR: ls_text-line.
APPEND ls_text TO lt_text.
CONCATENATE
lf_fname
lf_lname
INTO ls_text-line SEPARATED BY space.
APPEND ls_text TO lt_text.
*======================================================================*
* Sender
*======================================================================*
"Sendeauftrag vom System anfordern
lr_mail = cl_bcs=>create_persistent( ).
"Email Von...(Absender)
lr_sender = cl_sapuser_bcs=>create( sy-uname ).
"Absender dem Sendeauftrag hinzufügen
CALL METHOD lr_mail->set_sender
EXPORTING
i_sender = lr_sender.
*======================================================================*
* Empfänger
*======================================================================*
"Kopie für MREGOTZ nur im EWE
IF sy-uname = 'MREGOTZ' AND sy-sysid = 'EWE'.
"Email An... (Empfänger)
lf_email = 'MICHEL.REGOTZ@T-SYSTEMS.COM'.
lr_recipient = cl_cam_address_bcs=>create_internet_address( lf_email ).
"Add recipient to send request
CALL METHOD lr_mail->add_recipient
EXPORTING
i_recipient = lr_recipient
i_express = 'X'.
CLEAR ls_recipient.
ls_recipient-recipient = lr_recipient.
APPEND ls_recipient TO lt_recipients.
ENDIF.
"Suchen der E-Mail Adresse der betroffenen Person
SELECT SINGLE usrid_long FROM pa0105 INTO lf_email
WHERE pernr = fausg-pernr
AND subty = '0010'
AND endda >= sy-datum
AND begda <= sy-datum.
"Empfänger Hinzufügen
"Email An... (Empfänger)
lr_recipient = cl_cam_address_bcs=>create_internet_address( lf_email ).
"Add recipient to send request
CALL METHOD lr_mail->add_recipient
EXPORTING
i_recipient = lr_recipient
i_express = 'X'.
CLEAR ls_recipient.
ls_recipient-recipient = lr_recipient.
APPEND ls_recipient TO lt_recipients.
"Lesen einer Verteiler Liste
CALL FUNCTION 'SO_DLI_READ'
EXPORTING
distributionlist = 'ZCH_RPTERL00'
system_dli = 'X'
TABLES
member = lt_member
objpara = lt_objpara
objparb = lt_objparb
EXCEPTIONS
active_user_not_exist = 1
communication_failure = 2
component_not_available = 3
dl_name_not_exist = 4
folder_not_exist = 5
folder_no_authorization = 6
forwarder_not_exist = 7
object_not_exist = 8
object_no_authorization = 9
operation_no_authorization = 10
owner_not_exist = 11
parameter_error = 12
substitute_not_active = 13
substitute_not_defined = 14
system_failure = 15
user_not_exist = 16
x_error = 17
OTHERS = 18.
IF sy-subrc <> 0.
" MESSAGE 'Es wude keine Empfängerliste gefunden' TYPE 'I' DISPLAY LIKE 'W'.
ELSE.
" Verteilerliste hinzufügen
LOOP AT lt_member ASSIGNING <lfs_member>.
CLEAR: lf_email.
lf_email = <lfs_member>-address.
"Email An... (Empfänger)
lr_recipient = cl_cam_address_bcs=>create_internet_address( lf_email ).
"Vertilerliste Sendeauftrag hinzufügen
CALL METHOD lr_mail->add_recipient
EXPORTING
i_recipient = lr_recipient
i_express = 'X'
i_copy = 'X'.
CLEAR ls_recipient.
ls_recipient-recipient = lr_recipient.
APPEND ls_recipient TO lt_recipients.
ENDLOOP.
ENDIF.
*======================================================================*
* Mail anzeigen falls man es ändern möchte
*======================================================================*
"Rufe Mail Oberfläche auf.
TRY.
CALL METHOD cl_bcs=>short_message
EXPORTING
i_subject = lf_subject
i_text = lt_text
i_recipients = lt_recipients
i_sender = lr_sender
* i_text_floating =
* i_attachments =
* i_replyto =
* i_appl_object =
i_starting_at_x = 10
i_starting_at_y = 10
i_ending_at_y = 30
i_ending_at_x = 100
* i_encrypt =
* i_sign =
* iv_vsi_profile =
* receiving
* result =
.
COMMIT WORK AND WAIT.
CATCH cx_send_req_bcs.
CATCH cx_bcs.
ENDTRY.
* "Mail direkt senden ohne das man dies in der SOST zum senden freigeben muss.
* "Sofort senden aktivieren, andernfalls versendet "SCOT" beim nächsten Joblauf
* CALL METHOD lr_mail->set_send_immediately
* EXPORTING
* i_send_immediately = 'X'.
*
* "Email senden
* CALL METHOD lr_mail->send(
* EXPORTING
* i_with_error_screen = 'X'
* RECEIVING
* result = lf_sent_to_all ).
* IF lf_sent_to_all = 'X'.
* WRITE 'Email sent!'.
* ENDIF.
ENDFORM. " ZDOOPELKLICK
*&---------------------------------------------------------------------*
*& Form U_VARIANTE
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM u_variante .
*======================================================================*
* Beginn: Die Variante REGOTZ wird nun automatisch gezogen
*======================================================================*
"Daten Deklaration um die Variante automatisch zu ziehen.
DATA: lf_variante TYPE rsvar-variant VALUE 'MREGOTZ'.
IF sy-uname = 'MREGOTZ'.
* Die Variante REGOTZ wird nun automatisch gezogen
CALL FUNCTION 'RS_SUPPORT_SELECTIONS'
EXPORTING
report = sy-repid
variant = lf_variante
EXCEPTIONS
variant_not_existent = 1
variant_obsolete = 2
OTHERS = 3.
IF sy-subrc <> 0.
* Variante & ist nicht vorhanden
MESSAGE i016(pn) WITH
'Die Variante' lf_variante 'ist nicht vorhanden'.
ELSE.
MESSAGE i016(pn) WITH
'Die Variante' lf_variante 'wird automatisch gezogen'.
ENDIF.
ENDIF.
*======================================================================*
* Ende Die Variante REGOTZ wird nun automatisch gezogen
*======================================================================*
ENDFORM. " U_VARIANTE