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-POOLSslis.
INFOTYPES000100070050.                    "Note1653704
TABLESpernrpcl2pcl1,t549qt555ft001prpfausgsscrfields,
        t555e
.
DATA:    ms_variant LIKE disvariant,
         os_variant 
LIKE disvariant.
DATABEGIN OF  fehler_uebergabe OCCURS 10.
        
INCLUDE STRUCTURE pc2b8.
DATAEND OF fehler_uebergabe.
DATABEGIN 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 WITH HEADER LINE.
DATA farb_str       TYPE slis_specialcol_alv.
DATA ms_layout      TYPE slis_layout_alv.
DATAn,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.
DATABEGIN OF fausg OCCURS 1.
        
INCLUDE STRUCTURE rpfausg.
DATA:   farbtabelle TYPE slis_t_specialcol_alv.
DATAEND OF fausg  .
DATAgt_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 >< .
      
"* 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.
  
TYPESBEGIN OF t_zeigan,
           feldname
(25TYPE c,
           janein       
TYPE c,
         
END OF t_zeigan.
  
DATAzeigan TYPE t_zeigan OCCURS 15 WITH HEADER LINE.
  
DATAtf_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 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 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.
  
DATAintensified              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
  
DATAls_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.
  
DATABEGIN OF a_error_periods OCCURS 0,
           srtfd   
LIKE pcl2-srtfd,
        
END OF a_error_periods.
  
DATABEGIN 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 .
  
DATAsend_request     TYPE REF TO cl_bcs.
  
DATAlf_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.
  
DATAlf_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.
  
DATAlf_fname TYPE ad_namelas,
        lf_lname 
TYPE ad_namefir,
        ls_usr21 
TYPE usr21.
  
DATAlt_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_subtylf_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_fnamelf_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.
  
CLEARls_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.
  
CLEARls_text-line.
  
APPEND ls_text TO lt_text.
  
IF lf_stunden <> 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 <> 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.
  
CLEARls_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.
  
CLEARls_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.
  
CLEARls_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=>createsy-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_addresslf_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_addresslf_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>.
      
CLEARlf_email.
      lf_email 
<lfs_member>-address.
      
"Email An... (Empfänger)
      lr_recipient 
cl_cam_address_bcs=>create_internet_addresslf_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.
  
DATAlf_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(pnWITH
       
'Die Variante' lf_variante 'ist nicht vorhanden'.
    
ELSE.
      
MESSAGE i016(pnWITH
       
'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

        search this website

Regotz Michel