Job lesen in dem man ein Programm angibt welches in der Stepliste ist und Mail versenden
REPORT z_job_lesen.
************************************************************************
************************************************************************
**************************** *******************************
*************************** @MREGOTZ ******************************
**************************** *******************************
************************************************************************
*&H
*&H PROGRAMMNAME : ZCHPGHR_IF_SAP_CHECK_JOB
*&H TRANSAKTIONSCODE : Z_PTEXDIR
*&H PROGRAMMTITEL : Prüfen ob Job erfolgreich war sonst Mail senden
*&H ZWECK : Dieses Programm Prüft ob in der SM37 der Job
*&H erfolgreich ausgeführt wurde.
*&H Falls nicht sendet er eine E-MAIL.
*&H AUTOR : Regotz Michel
*&H DATUM : 27.05.2020
*&H VORAUSSETZUNGEN : BODET im Einsatz
*&H SAP-MODUL : HR PT
*&H
*&H Company/Department : Swisscom AG
*&H Phone : +41 79 322 04 86 (Mobil)
*&H E-Mail : Michel.Regotz@Swisscom.ch
*&H
************************************************************************
*&D
*&D Beschreibung : Dieses Programm Prüft ob in der SM37 der Job
*&D erfolgreich ausgeführt wurde.
*&D Falls nicht sendet er eine E-MAIL.
*&D
*&D Er prüft die beiden Jobs
*&D - Z_BODET_ABSENZEN
*&D - Z_BODET_FERIENSALDI_JAHRESWECHSE
*&D
*&D Falls einer dieser beiden Jobs abgebrochen ist
*&D wird ein Mail versendet
*&D
*&D --------------------------------------------------------------------
*&D Leistung : BODET
*&D --------------------------------------------------------------------
*&D Tabellen : SM37 Job Resultate
*&D --------------------------------------------------------------------
*&D Verarbeitung : -> Jobs lesen
*&D -> Job status abrfage
*&D -> Mail falls abgebrochen
*&D
************************************************************************
*&C Change history :
*&C --------------------------------------------------------------------
*&C Developer | Date | Description
*&C --------------------------------------------------------------------
*&C <Name> | <Date> | <Description>
*&C --------------------------------------------------------------------
*&C <Name> | <Date> | <Description>
*&C --------------------------------------------------------------------
*&C <Name> | <Date> | <Description>
*&C --------------------------------------------------------------------
*&C <Name> | <Date> | <Description>
************************************************************************
************************************************************************
* DATENDEKLARATION *
************************************************************************
INCLUDE lbtchdef. " Hintergrundverarbeitung der Definitionen.
INCLUDE <list>. " Ikonen, Zeilen u.a. Definitionen auflisten.
* Datendeklaration: BP_FIND_JOBS_WITH_PROGRAM
DATA sel_joblist LIKE tbtcjob OCCURS 100 WITH HEADER LINE.
" Interne Tabelle für gefundene Jobs.v
* Datendeklaration: SHOW_JOBSTATE
DATA: " Mögliche Jobstatus.
gf_aborted TYPE c,
gf_finished TYPE c,
gf_preliminary TYPE c,
gf_ready TYPE c,
gf_running TYPE c,
gf_scheduled TYPE c.
DATA: gf_status TYPE text20.
* Datendeklaration: Mailversand
DATA: gf_mail_senden TYPE c.
* Datendeklaration: Mailversand Form
DATA: gt_longtext TYPE tlinet.
Data: gs_longtext type tline.
DATA: gf_sdlstrtdt TYPE c LENGTH 10.
DATA: gf_strtdate TYPE c LENGTH 10.
DATA: gf_strttime TYPE c LENGTH 8.
DATA: gf_header TYPE so_obj_des. "VALUE 'Betreff mit CL_BCS erzeugen'.
*
DATA: gf_mlrec TYPE so_obj_nam,
gf_sent_to_all TYPE os_boolean,
gf_email TYPE adr6-smtp_addr,
* gf_subject TYPE so_obj_des,
* gf_text TYPE bcsy_text,
gt_mailtext TYPE soli_tab,
gr_mail TYPE REF TO cl_bcs,
gr_bcs_exception TYPE REF TO cx_bcs,
gr_recipient TYPE REF TO if_recipient_bcs,
gr_sender TYPE REF TO cl_sapuser_bcs,
gf_body TYPE string,
gr_document TYPE REF TO cl_document_bcs,
gt_member TYPE TABLE OF sodm1,
* gs_member TYPE sodm1,
gt_objpara TYPE TABLE OF selc,
gt_objparb TYPE TABLE OF soop1,
gt_recipients TYPE bcsy_re3,
gs_recipient TYPE bcss_re3.
FIELD-SYMBOLS: <gfs_verteiler> TYPE somlreci1,
<gfs_member> TYPE sodm1.
************************************************************************
* SELEKTIONSPARAMETER *
************************************************************************
PARAMETERS: p_report TYPE sy-repid.
************************************************************************
* INITIALIZATION *
************************************************************************
************************************************************************
* AT SELECTION-SCREEN OUTPUT *
************************************************************************
************************************************************************
* START-OF-SELECTION *
************************************************************************
START-OF-SELECTION.
* Jobs suchen, die das ABAP-Programm RSCRIDX4 enthalten.
* Programm- und Variantenname in Großbuchstaben. Es können auch
* Jobs gesucht werden, die ein externes Programm ausführen.
CALL FUNCTION 'BP_FIND_JOBS_WITH_PROGRAM'
EXPORTING
abap_program_name = p_report
"'PFCG_TIME_DEPENDENCY'
abap_variant_name = ' '
external_program_name = ' '
" Im nicht-interaktiven Modus kann mit einem
" Programmnamen und/oder einem Variantennamen
" gesucht werden. Nichtangabe dieser "Spezifikationen
" führt zu "PROGRAM_SPECIFICATION_MISSING.
dialog = btc_no
" BTC_NO: Nicht-interaktiver Modus. Mindestens
" einen Programmnamen im Aufruf angeben.
" BTC_YES: Benutzer gibt Programmnamen
" und Variante ein.
TABLES
joblist = sel_joblist
" Interne Tabelle mit Format TBTCJOB, die alle
" gefundenen Jobs enthält.
EXCEPTIONS
no_jobs_found = 1
program_specification_missing = 2
invalid_dialog_type = 3
job_find_canceled = 4
OTHERS = 5.
IF sy-subrc <> 0.
*<Error handling>
ENDIF.
* Listen-Header angeben.
WRITE: / 'Status', 9 'Job Name', 50 'Job Nr.', 60 'Geplant', 72 'Ausgeführt', 85 'Zeit', 100 'Statustext'.
ULINE AT /1(120).
SORT sel_joblist BY sdlstrtdt ASCENDING.
* Schleife durch von BP_FIND_JOBS_WITH_PROGRAM gefundene Jobs.
LOOP AT sel_joblist.
CALL FUNCTION 'SHOW_JOBSTATE'
EXPORTING
jobcount = sel_joblist-jobcount
jobname = sel_joblist-jobname
" Zu prüfenden Job kennzeichnen. Name
" und Nummer sind erforderlich.
IMPORTING
" Mögliche Status. Status des Jobs wird auf Wert ‘X’ festgelegt.
aborted = gf_aborted " Job abnormal beendet.
finished = gf_finished " Job erfolgreich abgeschlossen.
preliminary = gf_preliminary
" Job kann nicht gestartet werden: Job
" eingeplant, jedoch noch nicht freigegeben
" oder Job ohne Startbedingung eingeplant.
ready = gf_ready
" Job eingeplant, freigegeben, Startbedingung
" erfüllt, Job jedoch noch nicht gestartet.
running = gf_running " Job wird verarbeitet.
scheduled = gf_scheduled " Job eingeplant und freigegeben, wartet auf
" Erfüllung der Startbedingung.
EXCEPTIONS
jobcount_missing = 1
jobname_missing = 2
job_notex = 3
OTHERS = 4.
IF sy-subrc <> 0.
*<Error handling>
ENDIF.
* Den Status des Jobs bestimmen, der gerade von
* SHOW_JOBSTATE geprüft wurde. Statusikone zuordnen und in
* Liste schreiben.
"Status in Text umwandeln
IF gf_aborted = 'X'.
gf_status = 'abgebrochen'.
ELSEIF gf_finished = 'X'.
gf_status = 'fertig'.
ELSEIF gf_preliminary = 'X'.
gf_status = 'freigegeben'.
ELSEIF gf_ready = 'X'.
gf_status = 'bereit'.
ELSEIF gf_running = 'X'.
gf_status = 'aktiv'.
ELSEIF gf_scheduled = 'X'.
gf_status = 'geplant'.
ENDIF.
"Protokoll erestellen
IF gf_finished = 'X'.
WRITE: /3 icon_checked AS ICON,
AT 9 sel_joblist-jobname,
AT 50 sel_joblist-jobcount,
AT 60 sel_joblist-sdlstrtdt,
AT 72 sel_joblist-strtdate,
AT 85 sel_joblist-strttime,
AT 100 gf_status.
ELSEIF gf_aborted = 'X'.
WRITE: /3 icon_failure AS ICON,
AT 9 sel_joblist-jobname,
AT 50 sel_joblist-jobcount,
AT 60 sel_joblist-sdlstrtdt,
AT 72 sel_joblist-strtdate,
AT 85 sel_joblist-strttime,
AT 100 gf_status.
ELSE.
WRITE: /3 icon_incomplete AS ICON,
AT 9 sel_joblist-jobname,
AT 50 sel_joblist-jobcount,
AT 60 sel_joblist-sdlstrtdt,
AT 72 sel_joblist-strtdate,
AT 85 sel_joblist-strttime,
AT 100 gf_status.
ENDIF.
"Mailversandliste vorbereiten
gf_sdlstrtdt = |{ sel_joblist-sdlstrtdt DATE = USER }|.
gf_strtdate = |{ sel_joblist-strtdate DATE = USER }|.
CONCATENATE sel_joblist-strttime(2)
':'
sel_joblist-strttime+2(2)
':'
sel_joblist-strttime+4(2)
INTO gf_strttime.
CONCATENATE '<tr><td>'
sel_joblist-jobname
sel_joblist-jobcount
gf_sdlstrtdt
gf_strtdate
gf_strttime
gf_status
'</td></tr>'
INTO gs_longtext-tdline SEPARATED BY space.
Append gs_longtext to gt_longtext.
IF sel_joblist-strtdate = sy-datum AND gf_finished IS INITIAL.
gf_mail_senden = 'X'."Mail versenden.
ENDIF.
ENDLOOP.
IF gf_mail_senden = 'X'.
PERFORM send_mail.
ENDIF.
*&---------------------------------------------------------------------*
*& Form SEND_MAIL
*&---------------------------------------------------------------------*
* @mregotz 09.06.2016
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM send_mail .
TRY.
"Create send request
gr_mail = cl_bcs=>create_persistent( ).
"Email Von...(Absender)
gr_sender = cl_sapuser_bcs=>create( sy-uname ).
"gr_sender = 'Support3rdLevel.SAP-HR@swisscom.com'.
"Add sender to send request
CALL METHOD gr_mail->set_sender
EXPORTING
i_sender = gr_sender.
IF sy-sysid = 'CD1'.
"Email An... (Empfänger)
gf_email = 'michel.regotz@swisscom.com'. "'@hotmail.ch'
"verwenden die hotmail Adresse, auf Swisscom Adressen kann man keine Mails schicken Security.
gr_recipient = cl_cam_address_bcs=>create_internet_address( gf_email ).
"Add recipient to send request
CALL METHOD gr_mail->add_recipient
EXPORTING
i_recipient = gr_recipient
i_express = 'X'.
ENDIF.
"Lesen einer Verteiler Liste
CALL FUNCTION 'SO_DLI_READ'
EXPORTING
distributionlist = 'ZCH_BODET'
system_dli = 'X'
TABLES
member = gt_member
objpara = gt_objpara
objparb = gt_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 gt_member ASSIGNING <gfs_member>.
CLEAR: gf_email.
gf_email = <gfs_member>-address.
"Email An... (Empfänger)
gr_recipient = cl_cam_address_bcs=>create_internet_address( gf_email ).
"Vertilerliste Sendeauftrag hinzufügen
CALL METHOD gr_mail->add_recipient
EXPORTING
i_recipient = gr_recipient
i_express = 'X'.
CLEAR gs_recipient.
gs_recipient-recipient = gr_recipient.
APPEND gs_recipient TO gt_recipients.
ENDLOOP.
ENDIF.
"Email Betreff
IF sy-sysid = 'CD1'.
CONCATENATE 'Testmail - BODET Jobabruch' p_report INTO gf_header SEPARATED BY space.
ELSE.
CONCATENATE 'BODET Jobabruch' p_report INTO gf_header SEPARATED BY space.
ENDIF.
"HTML-Formatierter Mailinhalt
CONCATENATE gf_body
`<table cellspacing="1" cellpadding="1"`
` width="600" border="0">` INTO gf_body.
CONCATENATE gf_body `<tbody>` INTO gf_body.
CONCATENATE gf_body `<tr><td valign="top"><strong>`
`BODET Jobabruch!`
`</strong></td></tr><tr><td><br>`
`Der heutige Job für die Verbuchung der Absenzen oder Feriensaldi wurde im SAP abgebrochen. `
`Bitte kontaktieren Sie ihren SAP Berater. </td></tr><br><br>`
`<tr><td><strong> Kontakte </strong></td></tr>`
`<tr><td> Jens Moerk </td></tr>`
`<tr><td> Jens.Moerk@swisscom.com </td></tr>`
`<tr><td> +41-58-221 12 81 </td></tr><br>`
`<tr><td> Michel Regotz </td></tr>`
`<tr><td> Michel.Regotz@swisscom.com </td></tr>`
`<tr><td> +41-79-322 04 86 </td></tr><br><br>`
`<tr><td><strong> Jobliste </strong></td></tr><br>`
INTO gf_body.
LOOP AT gt_longtext INTO gs_longtext.
CONCATENATE gf_body gs_longtext-tdline INTO gf_body.
ENDLOOP.
CONCATENATE gf_body `</tbody></table>` INTO gf_body.
gt_mailtext = cl_document_bcs=>string_to_soli( gf_body ).
"Email BODY (Text)
gr_document = cl_document_bcs=>create_document( i_type = 'HTM'
i_text = gt_mailtext
i_subject = gf_header ).
"Inhalte dem Sendeauftrag zuordenen
CALL METHOD gr_mail->set_document( gr_document ).
"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 gr_mail->set_send_immediately
EXPORTING
i_send_immediately = 'X'.
"Email senden
CALL METHOD gr_mail->send(
EXPORTING
i_with_error_screen = 'X'
RECEIVING
result = gf_sent_to_all ).
IF gf_sent_to_all = 'X'.
WRITE 'Email sent!'.
ENDIF.
"Commit damit das Email gesendet wird.
COMMIT WORK.
"Ausnahmen Behandlung
CATCH cx_bcs INTO gr_bcs_exception.
WRITE:
'Error!',
'Error type:',
gr_bcs_exception->error_type.
ENDTRY.
ENDFORM. "