Batch-Job E-Mail Versand

Getting started ... Alles für einen gelungenen Start.
14 Beiträge • Seite 1 von 1
14 Beiträge Seite 1 von 1

Batch-Job E-Mail Versand

Beitrag von Bright4.5 (Specialist / 162 / 19 / 0 ) »
Hallo,

ich hätte leider gerade ein kleines Problem und zwar:

Bei uns wird permanent der Job "SAPCONNECT INT SENDEN" angestoßen (wohl alle 2 Minuten). Dieser verschickt wohl E-Mails an Anwender mit einem Anhang in welcher sich ein Formular befindet. Hierbei soll der Betreff angepasst werden. Dies habe ich soweit in der Nace über die Nachrichtenart gelöst. Dort bin ich reingegangen und habe den Mailtext bei Betreff entsprechend angepasst.

Nun sollte eigentlich, wenn dieses Formular mitgeschickt wird mit der Nachrichtenart der Betreff entsprechend geändert sein.

Nun aber meine Frage/Problem: Woher weiß dieses "SAPCONNECT INT SENDEN" an wen es die E-Mails generiert und mit welchem Inhalt. Das ist mir irgendwie schleierhaft. Ich würde es bei uns gerne im Q-System testen, ob meine Änderung passt, bloß wie teste ich sowas? In der SO01 kann ich den Betreff ja direkt manuell eingeben.

Versteht ihr mein Problem?

Vielen Dank im Voraus.


Re: Batch-Job E-Mail Versand

Beitrag von jocoder (Specialist / 252 / 3 / 74 ) »
Der E-Mail-Versand ist normalerweise zweigeteilt. Im ersten Schritt erstellt eine Applikation die E-Mails mit Betreff, Empfänger, Inhalt und Absender. Die E-Mail wird als zu versenden in die Transaktion SOST gestellt. Im zweiten Schritt versendet ein Job (mit dem ABAP-Programm RSCONN01) diese E-Mails (lässt sich mit Job-Steps von "SAPCONNECT INT SENDEN" prüfen).
Zum Testen braucht es den ersten Schritt also die Applikation. Die E-Mail kann dann auch manuell in der SOST gesendet werden oder dort Inhalt und Betreff geprüft werden.

Folgende Benutzer bedankten sich beim Autor jocoder für den Beitrag:
Bright4.5


Re: Batch-Job E-Mail Versand

Beitrag von Bright4.5 (Specialist / 162 / 19 / 0 ) »
hmm okay.

jetz hätte ich das gerade mal getestet, bloß leider funktioniert es noch nicht. Wenn ich doch hier den Dokumententitel (Siehe Bild "Sost") ändern möchte, dass hier ein gewisser Text erscheint, welcher der Betreff der E-Mail ist, dachte ich, muss ich dass in der Nachrichtenart ändern und zwar in der NACE über Mailtexte (Siehe Bild "NACE") oder liege ich da falsch?

Vielen Dank im Voraus.

Re: Batch-Job E-Mail Versand

Beitrag von Tron (Top Expert / 1243 / 26 / 304 ) »
Moin,
Bright4.5 hat geschrieben:
23.04.2021 14:04
Wenn ich doch hier den Dokumententitel (Siehe Bild "Sost") ändern möchte, dass hier ein gewisser Text erscheint, welcher der Betreff der E-Mail ist, dachte ich, muss ich dass in der Nachrichtenart ändern und zwar in der NACE über Mailtexte (Siehe Bild "NACE") oder liege ich da falsch?
Du kannst gerne die SAP Notes studieren, jedoch war es 2008 nicht so einfach möglich, den Betreff durch Customizing zu verändern. Hinzu kommt, das Du keinen Einfluss auf den Empfänger der Mail hast und noch weitere Punkte , die mich seinerseits veranlasst haben, die Generische Druckumleitung zu entwickeln.
( Damals wars : http://bb1.gate2app.com/viewtopic.php?f=16&t=2755 )

Neueste Version:
https://abapforum.com/forum/viewtopic.p ... 713#p94713

Abschnitt : Erzeuge Betreff

Code: Alles auswählen.

*----------------------------------------------------------------------*
* create Email subject
*----------------------------------------------------------------------*
  lsubject = 'Purchase Order'.
  IF nast-spras = 'D'.
    lsubject = 'Bestellung'.
  ENDIF.

  IF NOT g_debug IS INITIAL.
    CONCATENATE 'TEST:' lsubject INTO lsubject SEPARATED BY space..
  ENDIF.

  CONCATENATE lsubject nast-objky INTO lsubject SEPARATED BY space.
Der Vorteil liegt insbesondere darin, dass man weder Formularanpassungen noch Druckprogramme ändern muss.
Was hier am Beispiel der Bestellung gezeigt wird, ist anwendbar auf alle Nachrichtenarten, die über NACE ge-customized werden.
In der Umleitung hat man praktisch die volle Kontrolle über den Prozess und Inhalt. Die Umleitung ist zudem leicht ein und ausbaubar und man kann sie zu jeder Zeit in Betrieb nehmen, da Sie Praktisch keine Veränderungen in den Anwendungsdaten vornimmt . Wann hat man das schon mal 😉 .

gruß Jens
<:: XING-Gruppe Tricktresor::>
Die deutsche Rechtschreibung ist Freeware, du darfst sie kostenlos nutzen –
Aber sie ist nicht Open Source, d. h. du darfst sie nicht verändern oder in veränderter Form veröffentlichen.

Re: Batch-Job E-Mail Versand

Beitrag von Bright4.5 (Specialist / 162 / 19 / 0 ) »
Hallo Jens,

vielen Dank für deine Antwort.

Verstehe ich das jetzt so richtig, dass du einen eigenen Code geschrieben hast und, welcher das Programm SAPFM06P ersetzen soll, um dort die Versendung zu beeinflussen (z.B. den Betreff)?

Also wie sollte ich am besten vorgehen? Würdest du es mir bitte Schritt für Schritt erklären? Weil ich verstehe es glaube ich gerade nicht so ganz....

Also was meine Annahme ist, ist dass du dort einen eigenen Code geschrieben hast (den ich eventuell kopieren könnte), welcher anstatt SAPFM06P (dem Druckprogramm) aufgerufen werden soll. Dann müsste ich in dem Druckprogram, aber bei allen anderen Nachrichtenarten wieder das ursprüngliche SAPFM06P aufrufen, so wie in deinem Coding?

Würde das so passen oder bin ich auf dem Holzweg?

Vielen Dank im Voraus.

Re: Batch-Job E-Mail Versand

Beitrag von Tron (Top Expert / 1243 / 26 / 304 ) »
Moin.
Bright4.5 hat geschrieben:
26.04.2021 11:27
Verstehe ich das jetzt so richtig, dass du einen eigenen Code geschrieben hast und, welcher das Programm SAPFM06P ersetzen soll, um dort die Versendung zu beeinflussen (z.B. den Betreff)?
Ich habe ein Programm geschrieben, das das Ursprüngliche Druckprogramm SAPFM06P nunmehr als Unterprogramm aufruft, um an die SpoolId zu kommen.
Nachdem das Original Druckprogramm (SAPFM06P) durchlaufen wurde , generiere ich ein PDF aus dem Spool und erzeuge die Email selbst, an die ich das PDF anhänge.
Seinerseits habe ich das mit Nachrichtenmedium 1 / drucken gemacht, so das eine Email erzeugt und gleichzeitig auch gedruckt wurde .

Das Geheimnis liegt in der Art und Weise, wie eine Anwendung das Druckprogramm ermittelt und ausführt. Das habe ich mir zunutze gemacht und einen Zwischenschritt eingebaut.
Beispiel:
In der Tabelle TNAPR (NACE) würde für das Programm SAPFM06P stehen und die Formroutine ENTRY_NEU, dann liest die Anwendung die Werte und ruft das Druckunterprogramm so auf :
PERFORM (subrname) IN PROGRAM (programname) IF FOUND.
Wobei subrname = TNAPR-RONAM = ENTRY-NEU und programname = TNAPR-PGNAM = SAPFM06P ist.
Also ein dynamischer Unterprogramm-Aufruf.
Wenn ich nun ein eigenes Druckprogram anlege und das in der Nace customize,
schaffe ich so eine "Umleitung", indem ich von meinem Druckprogramm das Ursprüngliche Druckprogramm aufrufe .
Probiers mal mit debuggen aus.

Code: Alles auswählen.

PROGRAM zmedruck
DATA: retcode   type sy-subrc.         "Returncode
DATA: xscreen(1) TYPE c.               "Output on printer or screen
TABLES: nast,                          "Messages
             tnapr.                         "Programs & Forms

FORM entry_neu USING return_code TYPE i
                 us_screen TYPE c.

 PERFORM entry_neu(sapfm06p) USING return_code us_screen.

endform.
Erwähnenswert ist noch, dass die Werte der NAST und der TNAPR im meinem Unterprogramm zur Verfügung stehen.
Bright4.5 hat geschrieben:
26.04.2021 11:27
... Dann müsste ich in dem Druckprogram, aber bei allen anderen Nachrichtenarten wieder das ursprüngliche SAPFM06P aufrufen, so wie in deinem Coding?
Wenn Du den Vorschlag 1:1 übernehmen willst, müsstest Du :
1.) Die Programmteile erstellen
Funktionsbaustein y_bc_email_post und das Druckprogramm ZMEDRUCK_EMAIL
ggf. im TODO Abschnitt die Nachrichtenart korrigieren , falls Deine Nachrichtenart nicht "NEU" ist.
2.) In der NACE das Druckprogramm austauschen ( alt = SAPFM06P ) mit ZMEDRUCK_EMAIL
Im Abschnitt einen ggf. einen Textbaustein aus eurer Anwendung nehmen.

Code: Alles auswählen.

*----------------------------------------------------------------------*
* create Email body
*----------------------------------------------------------------------*
  DATA s_tk TYPE stxh_key.
  DATA t_text TYPE TABLE OF tline.
  DATA s_text TYPE tline.

  s_tk-tdobject = 'EKKO'.
  s_tk-tdid = 'F21'.
  s_tk-tdspras = nast-spras.
  s_tk-tdname = nast-objky.
Das Testprogramm ist optional, aber man kann Bestellnachrichten nicht so einfach wiederholen, oder debuggen.

gruß Jens
siehe auch: https://abapforum.com/forum/viewtopic.php?f=11&t=19358
<:: XING-Gruppe Tricktresor::>
Die deutsche Rechtschreibung ist Freeware, du darfst sie kostenlos nutzen –
Aber sie ist nicht Open Source, d. h. du darfst sie nicht verändern oder in veränderter Form veröffentlichen.

Re: Batch-Job E-Mail Versand

Beitrag von Bright4.5 (Specialist / 162 / 19 / 0 ) »
-
Zuletzt geändert von Bright4.5 am 27.04.2021 11:47, insgesamt 1-mal geändert.

Re: Batch-Job E-Mail Versand

Beitrag von Bright4.5 (Specialist / 162 / 19 / 0 ) »
Hallo Tron,

vielen Dank für deine Nachricht.

Ich habe jetzt mal in der Nace das Programm abgeändert, wie von dir beschrieben (Siehe Bild) und das Programm ZMEDRUCK_EMAIL kopiert und bei uns eingepflegt. Die Nachrichtenart und das Programm habe ich angepasst.

Code: Alles auswählen.

PROGRAM zmedruck_email.

PARAMETERS p_email TYPE text80 LOWER CASE.
PARAMETERS p_sender TYPE text80 LOWER CASE.
PARAMETERS p_norep AS CHECKBOX.

SELECTION-SCREEN SKIP 1.
SELECTION-SCREEN ULINE.
PARAMETERS p_spool TYPE itcpp-tdspoolid." Spool number for tesing
PARAMETERS g_debug AS CHECKBOX.         " X= Debugging active

PERFORM test.
EXIT.

* WARNING : NO POPUPS - NO COMMIT WORK IN HERE !!!!!!!!!!!!!!!!!!!!!!!!!


* How to do (i left some TODO-comments)
* 1.) Change/verify the "PERFORM" so the "TRUE" Print Routine is called
*     (only needed if you have an own ME_DRUCK) just look table TNAPR
* 2.) Change the Receiver Email-adress.
* 3.) Activate ZMEDRUCK_EMAIL :-)
* 4.) Customize (Tc NACE) the message-Type "NEU" and enter
*     "ZMEDRUCK_EMAIL" as Program and "ENTRY_NEU" as FORM

* How it is working (short version)
* by customizing, the original Print routine is substituted by this one
* to retrieve the SpoolId, which we need for PDF generation and email.
* ZMEDRUCK_EMAIL_BDS calls the "Original" Print routine as a subroutine.
* After this step the Program retrieves the Spool created.
* Then the OTF is converted into PDF and attached to the mail


DATA: retcode   LIKE sy-subrc.         "Returncode
DATA: xscreen(1) TYPE c.               "Output on printer or screen
TABLES: nast,                          "Messages
        tnapr.                         "Programs & Forms

*&---------------------------------------------------------------------*
*&      Form  ENTRY
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->RETURN_CODE  text
*      -->US_SCREEN    text
*----------------------------------------------------------------------*
FORM entry_aufb USING return_code TYPE i
                 us_screen TYPE c.

  FIELD-SYMBOLS: <f> TYPE itcpp,
                 <p> TYPE  ssfcrescl.

  DATA pgnam TYPE na_pgnam." Programname
  DATA ronam TYPE na_ronam."Formname
  DATA fm_name TYPE rs38l_fnam. "genr.Druckbaustein
  DATA lv_vec(80).
  DATA spoolid TYPE rspoid.

  CLEAR retcode.
  xscreen = us_screen.

*              Call the "Original" Printroutine
************************
* @@@@ TODO !!!!!
************************
*-real program---------+
*                      |
*-real Form---+        |
*             |        |
  CASE nast-kschl.
*    WHEN 'NEU'.
*      PERFORM entry_neu(sapfm06p) USING return_code us_screen.
*    WHEN 'YNCS'.
*      PERFORM entry_neu(sapfm06p) USING return_code us_screen.
    WHEN 'ZG43'.
      PERFORM entry_aufb(zmedruck_email) USING return_code us_screen.
    WHEN OTHERS.
  ENDCASE.

  PERFORM read_variant.

* use Test case in Preview mode and if SAPscript debugger is active
  IF NOT us_screen IS INITIAL AND NOT g_debug IS INITIAL.

    spoolid = p_spool.

    PERFORM processing USING spoolid.
    EXIT.
  ENDIF.

* Try Sapscript
  ASSIGN ('(SAPLSTXC)ITCPP') TO <f>.
  IF sy-subrc = 0 AND
     NOT <f>-tdspoolid IS INITIAL AND
     us_screen IS INITIAL.

    PERFORM processing USING <f>-tdspoolid.
    UNASSIGN <f>.

  ELSE.
* Try Smartforms
    CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'
      EXPORTING
        formname           = tnapr-sform
      IMPORTING
        fm_name            = fm_name
      EXCEPTIONS
        no_form            = 1
        no_function_module = 2
        OTHERS             = 3.

    IF sy-subrc <> 0.
      retcode = 1.
      EXIT.
    ENDIF.

    SELECT SINGLE pname FROM tfdir INTO lv_vec
    WHERE funcname = fm_name.
    IF sy-subrc = 0.

      CONCATENATE '(' lv_vec ')JOB_OUTPUT_INFO' INTO lv_vec.
      ASSIGN (lv_vec) TO <p>.

      IF sy-subrc = 0 AND
      NOT <p>-spoolids[] IS INITIAL AND
      us_screen IS INITIAL.

        LOOP AT <p>-spoolids INTO spoolid.
          PERFORM processing USING spoolid.
          EXIT.
        ENDLOOP.
        UNASSIGN <p>.

      ENDIF. " have Ids

    ENDIF." tfdir entry

  ENDIF." sapscript/smartforms


  IF retcode NE 0.
    return_code = 1.
  ELSE.
    return_code = 0.
  ENDIF.


ENDFORM.                    "ENTRY

*&---------------------------------------------------------------------*
*&      Form  PROCESSING
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM processing USING spoolid TYPE itcpp-tdspoolid.

  DATA l_upd TYPE sy-subrc.
  DATA l_spnr TYPE rspoid.
  DATA lsmtp_addr TYPE  ad_smtpadr .
  DATA lsubject TYPE so_obj_des.
  DATA l_sender TYPE ad_smtpadr VALUE 'Sender@xy.sap'.
  DATA l_use_noreply TYPE xfeld VALUE 'X'.

  DATA l_ebeln TYPE ekpa-ebeln.
  DATA l_lifnr TYPE lfa1-lifnr.
  DATA l_adrnr TYPE lfa1-adrnr.

  DATA tt_soli TYPE bcsy_text.
  DATA s_soli TYPE soli.
*----------------------------------------------------------------------*
* read vendor email
*----------------------------------------------------------------------*
  CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
    EXPORTING
      input  = nast-parnr
    IMPORTING
      output = l_lifnr.

  SELECT SINGLE adrnr FROM lfa1 INTO l_adrnr WHERE
    lifnr = l_lifnr.
  IF NOT l_adrnr IS INITIAL.
    SELECT SINGLE smtp_addr FROM adr6 INTO lsmtp_addr WHERE
      addrnumber = l_adrnr AND flgdefault = 'X'.
  ENDIF.

* no email found - exit
  IF lsmtp_addr IS INITIAL.
    lsmtp_addr = p_email. "use Fallback receiver email
  ENDIF.

  IF NOT g_debug IS INITIAL.
    lsmtp_addr = p_email. "use Fallback receiver email
  ENDIF.

  IF lsmtp_addr IS INITIAL.
    EXIT."no receiver email
  ENDIF.

*----------------------------------------------------------------------*
* create Email subject
*----------------------------------------------------------------------*
  lsubject = 'Purchase Order'.
  IF nast-spras = 'D'.
    lsubject = 'Bestellung'.
  ENDIF.

  IF NOT g_debug IS INITIAL.
    CONCATENATE 'TEST:' lsubject INTO lsubject SEPARATED BY space..
  ENDIF.

  CONCATENATE lsubject nast-objky INTO lsubject SEPARATED BY space.

*----------------------------------------------------------------------*
* create Email body
*----------------------------------------------------------------------*
  DATA s_tk TYPE stxh_key.
  DATA t_text TYPE TABLE OF tline.
  DATA s_text TYPE tline.

  s_tk-tdobject = 'EKKO'.
  s_tk-tdid = 'F21'.
  s_tk-tdspras = nast-spras.
  s_tk-tdname = nast-objky.

  CALL FUNCTION 'READ_TEXT'
    EXPORTING
      id                      = s_tk-tdid
      language                = s_tk-tdspras
      name                    = s_tk-tdname
      object                  = s_tk-tdobject
    TABLES
      lines                   = t_text
    EXCEPTIONS
      id                      = 1
      language                = 2
      name                    = 3
      not_found               = 4
      object                  = 5
      reference_check         = 6
      wrong_access_to_archive = 7
      OTHERS                  = 8.
  IF sy-subrc <> 0.
  ELSE.
    LOOP AT t_text INTO s_text.
      s_soli = s_text-tdline.
      APPEND s_soli TO tt_soli.
    ENDLOOP.
  ENDIF.

  l_spnr = spoolid.

  l_sender = p_sender." Sender Email address


*----------------------------------------------------------------------*
* Post Email
*----------------------------------------------------------------------*
* Verbucher aktiv ?
  CALL FUNCTION 'TH_IN_UPDATE_TASK'
    IMPORTING
      in_update_task = l_upd.

  IF l_upd IS INITIAL.
    CALL FUNCTION 'Y_BC_EMAIL_POST'
      EXPORTING
        i_rqident     = l_spnr
        i_smtp_addr   = lsmtp_addr
        i_sender      = l_sender
        tt_text       = tt_soli
        i_subject     = lsubject
        i_use_noreply = p_norep.

    COMMIT WORK AND WAIT.

  ELSE.

    CALL FUNCTION 'Y_BC_EMAIL_POST' IN UPDATE TASK
      EXPORTING
        i_rqident     = l_spnr
        i_smtp_addr   = lsmtp_addr
        i_sender      = l_sender
        tt_text       = tt_soli
        i_subject     = lsubject
        i_use_noreply = p_norep.

  ENDIF.

ENDFORM.                    "processing
*----------------------------------------------------------------------*
* Read Variant DEFAULT with initialization parameters
*----------------------------------------------------------------------*

FORM read_variant.
  TYPES: BEGIN OF ty_info,
           typ(1),
           null(1),
           line(120),
         END OF ty_info.

* für autom. Variante TEST laden
  DATA:
    l_report   TYPE raldb_repo ##NEEDED,
    l_variante TYPE raldb_vari ##NEEDED,
    t_info     TYPE TABLE OF ty_info ##NEEDED.

** Load variant sy-uname
  l_report   = sy-repid.
  l_variante = 'DEFAULT'.


  CALL FUNCTION 'RS_COVERPAGE_SELECTIONS'
    EXPORTING
      report  = l_report
      variant = l_variante
    TABLES
      infotab = t_info
    EXCEPTIONS
      OTHERS  = 3 ##FM_SUBRC_OK.
ENDFORM.


FORM test.
  DATA rc TYPE i.

  SELECT SINGLE * FROM nast INTO nast WHERE objky = '4712043568' .
  nast-vstat = '0'.

  SELECT SINGLE * FROM tnapr INTO tnapr WHERE
    kschl = 'YNCS' AND
    nacha = '1' AND
    kappl = 'EF'.

  PERFORM entry_aufb USING rc ' '.

ENDFORM.

Leider passt es irgendwie noch nicht. Leider klappt es auch nicht, das Ganze zu debuggen. Wenn ich in der ME22N eine Nachricht wiederhole und dann speichere (So soll die E-Mail mit dem Betreff dann versendet werden), geht er nie in den Debugger rein. Ich habe auch schon versucht den Verbuchungsdebugger zu aktivieren. Hat leider irgendwie auch nicht geklappt.

Was müsste ich noch tun?

Vielen Dank im Voraus.

Re: Batch-Job E-Mail Versand

Beitrag von Tron (Top Expert / 1243 / 26 / 304 ) »
Nun.
Starte das Programm zmedruck_email über SE38 und versichere dich, das
im Unterprogramm auch ein NAST Eintrag defunden wird (für '4712043568') .
Habe noch auf ZG43 geändert und einen Break gesetzt,

Code: Alles auswählen.

FORM test.
  DATA rc TYPE i.

BREAK-POINT.

  SELECT SINGLE * FROM nast INTO nast WHERE objky = '4712043568' .
  nast-vstat = '0'.

  SELECT SINGLE * FROM tnapr INTO tnapr WHERE
    kschl = 'ZG43' AND
    nacha = '1' AND
    kappl = 'EF'.

  PERFORM entry_aufb USING rc ' '.

ENDFORM.
gruß Jens
<:: XING-Gruppe Tricktresor::>
Die deutsche Rechtschreibung ist Freeware, du darfst sie kostenlos nutzen –
Aber sie ist nicht Open Source, d. h. du darfst sie nicht verändern oder in veränderter Form veröffentlichen.

Re: Batch-Job E-Mail Versand

Beitrag von Bright4.5 (Specialist / 162 / 19 / 0 ) »
Hallo Tron,

tut mir leid, wenn ich mich hier gerade ein bisschen blöd anstelle, aber irgendwie steh ich auf dem Schlauch.

Hier mal meine Schritte alles was ich gemacht habe detailliert:

Ich habe das Programm ZMEDRUCK_EMAIL erstellt und zwar so:

Code: Alles auswählen.

PROGRAM zmedruck_email.

PARAMETERS p_email TYPE text80 LOWER CASE.
PARAMETERS p_sender TYPE text80 LOWER CASE.
PARAMETERS p_norep AS CHECKBOX.

SELECTION-SCREEN SKIP 1.
SELECTION-SCREEN ULINE.
PARAMETERS p_spool TYPE itcpp-tdspoolid." Spool number for tesing
PARAMETERS g_debug AS CHECKBOX.         " X= Debugging active

PERFORM test.
EXIT.

* WARNING : NO POPUPS - NO COMMIT WORK IN HERE !!!!!!!!!!!!!!!!!!!!!!!!!


* How to do (i left some TODO-comments)
* 1.) Change/verify the "PERFORM" so the "TRUE" Print Routine is called
*     (only needed if you have an own ME_DRUCK) just look table TNAPR
* 2.) Change the Receiver Email-adress.
* 3.) Activate ZMEDRUCK_EMAIL :-)
* 4.) Customize (Tc NACE) the message-Type "NEU" and enter
*     "ZMEDRUCK_EMAIL" as Program and "ENTRY_NEU" as FORM

* How it is working (short version)
* by customizing, the original Print routine is substituted by this one
* to retrieve the SpoolId, which we need for PDF generation and email.
* ZMEDRUCK_EMAIL_BDS calls the "Original" Print routine as a subroutine.
* After this step the Program retrieves the Spool created.
* Then the OTF is converted into PDF and attached to the mail


DATA: retcode   LIKE sy-subrc.         "Returncode
DATA: xscreen(1) TYPE c.               "Output on printer or screen
TABLES: nast,                          "Messages
        tnapr.                         "Programs & Forms

*&---------------------------------------------------------------------*
*&      Form  ENTRY
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->RETURN_CODE  text
*      -->US_SCREEN    text
*----------------------------------------------------------------------*
FORM entry_aufb USING return_code TYPE i
                 us_screen TYPE c.

  FIELD-SYMBOLS: <f> TYPE itcpp,
                 <p> TYPE  ssfcrescl.

  DATA pgnam TYPE na_pgnam." Programname
  DATA ronam TYPE na_ronam."Formname
  DATA fm_name TYPE rs38l_fnam. "genr.Druckbaustein
  DATA lv_vec(80).
  DATA spoolid TYPE rspoid.

  CLEAR retcode.
  xscreen = us_screen.

*              Call the "Original" Printroutine
************************
* @@@@ TODO !!!!!
************************
*-real program---------+
*                      |
*-real Form---+        |
*             |        |
  CASE nast-kschl.
*    WHEN 'NEU'.
*      PERFORM entry_neu(sapfm06p) USING return_code us_screen.
*    WHEN 'YNCS'.
*      PERFORM entry_neu(sapfm06p) USING return_code us_screen.
    WHEN 'ZG43'.
      PERFORM entry_aufb(zmedruck_email) USING return_code us_screen.
    WHEN OTHERS.
  ENDCASE.

  PERFORM read_variant.

* use Test case in Preview mode and if SAPscript debugger is active
  IF NOT us_screen IS INITIAL AND NOT g_debug IS INITIAL.

    spoolid = p_spool.

    PERFORM processing USING spoolid.
    EXIT.
  ENDIF.

* Try Sapscript
  ASSIGN ('(SAPLSTXC)ITCPP') TO <f>.
  IF sy-subrc = 0 AND
     NOT <f>-tdspoolid IS INITIAL AND
     us_screen IS INITIAL.

    PERFORM processing USING <f>-tdspoolid.
    UNASSIGN <f>.

  ELSE.
* Try Smartforms
    CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'
      EXPORTING
        formname           = tnapr-sform
      IMPORTING
        fm_name            = fm_name
      EXCEPTIONS
        no_form            = 1
        no_function_module = 2
        OTHERS             = 3.

    IF sy-subrc <> 0.
      retcode = 1.
      EXIT.
    ENDIF.

    SELECT SINGLE pname FROM tfdir INTO lv_vec
    WHERE funcname = fm_name.
    IF sy-subrc = 0.

      CONCATENATE '(' lv_vec ')JOB_OUTPUT_INFO' INTO lv_vec.
      ASSIGN (lv_vec) TO <p>.

      IF sy-subrc = 0 AND
      NOT <p>-spoolids[] IS INITIAL AND
      us_screen IS INITIAL.

        LOOP AT <p>-spoolids INTO spoolid.
          PERFORM processing USING spoolid.
          EXIT.
        ENDLOOP.
        UNASSIGN <p>.

      ENDIF. " have Ids

    ENDIF." tfdir entry

  ENDIF." sapscript/smartforms


  IF retcode NE 0.
    return_code = 1.
  ELSE.
    return_code = 0.
  ENDIF.


ENDFORM.                    "ENTRY

*&---------------------------------------------------------------------*
*&      Form  PROCESSING
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM processing USING spoolid TYPE itcpp-tdspoolid.

  DATA l_upd TYPE sy-subrc.
  DATA l_spnr TYPE rspoid.
  DATA lsmtp_addr TYPE  ad_smtpadr .
  DATA lsubject TYPE so_obj_des.
  DATA l_sender TYPE ad_smtpadr VALUE 'blubber@gmx.de'.
  DATA l_use_noreply TYPE xfeld VALUE 'X'.

  DATA l_ebeln TYPE ekpa-ebeln.
  DATA l_lifnr TYPE lfa1-lifnr.
  DATA l_adrnr TYPE lfa1-adrnr.

  DATA tt_soli TYPE bcsy_text.
  DATA s_soli TYPE soli.
*----------------------------------------------------------------------*
* read vendor email
*----------------------------------------------------------------------*
  CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
    EXPORTING
      input  = nast-parnr
    IMPORTING
      output = l_lifnr.

  SELECT SINGLE adrnr FROM lfa1 INTO l_adrnr WHERE
    lifnr = l_lifnr.
  IF NOT l_adrnr IS INITIAL.
    SELECT SINGLE smtp_addr FROM adr6 INTO lsmtp_addr WHERE
      addrnumber = l_adrnr AND flgdefault = 'X'.
  ENDIF.

* no email found - exit
  IF lsmtp_addr IS INITIAL.
    lsmtp_addr = p_email. "use Fallback receiver email
  ENDIF.

  IF NOT g_debug IS INITIAL.
    lsmtp_addr = p_email. "use Fallback receiver email
  ENDIF.

  IF lsmtp_addr IS INITIAL.
    EXIT."no receiver email
  ENDIF.

*----------------------------------------------------------------------*
* create Email subject
*----------------------------------------------------------------------*
  lsubject = 'Purchase Order'.
  IF nast-spras = 'D'.
    lsubject = 'Bestellung'.
  ENDIF.

  IF NOT g_debug IS INITIAL.
    CONCATENATE 'TEST:' lsubject INTO lsubject SEPARATED BY space..
  ENDIF.

  CONCATENATE lsubject nast-objky INTO lsubject SEPARATED BY space.

*----------------------------------------------------------------------*
* create Email body
*----------------------------------------------------------------------*
  DATA s_tk TYPE stxh_key.
  DATA t_text TYPE TABLE OF tline.
  DATA s_text TYPE tline.

  s_tk-tdobject = 'EKKO'.
  s_tk-tdid = 'F21'.
  s_tk-tdspras = nast-spras.
  s_tk-tdname = nast-objky.

  CALL FUNCTION 'READ_TEXT'
    EXPORTING
      id                      = s_tk-tdid
      language                = s_tk-tdspras
      name                    = s_tk-tdname
      object                  = s_tk-tdobject
    TABLES
      lines                   = t_text
    EXCEPTIONS
      id                      = 1
      language                = 2
      name                    = 3
      not_found               = 4
      object                  = 5
      reference_check         = 6
      wrong_access_to_archive = 7
      OTHERS                  = 8.
  IF sy-subrc <> 0.
  ELSE.
    LOOP AT t_text INTO s_text.
      s_soli = s_text-tdline.
      APPEND s_soli TO tt_soli.
    ENDLOOP.
  ENDIF.

  l_spnr = spoolid.

  l_sender = p_sender." Sender Email address


*----------------------------------------------------------------------*
* Post Email
*----------------------------------------------------------------------*
* Verbucher aktiv ?
  CALL FUNCTION 'TH_IN_UPDATE_TASK'
    IMPORTING
      in_update_task = l_upd.

  IF l_upd IS INITIAL.
    CALL FUNCTION 'Y_BC_EMAIL_POST'
      EXPORTING
        i_rqident     = l_spnr
        i_smtp_addr   = lsmtp_addr
        i_sender      = l_sender
        tt_text       = tt_soli
        i_subject     = lsubject
        i_use_noreply = p_norep.

    COMMIT WORK AND WAIT.

  ELSE.

    CALL FUNCTION 'Y_BC_EMAIL_POST' IN UPDATE TASK
      EXPORTING
        i_rqident     = l_spnr
        i_smtp_addr   = lsmtp_addr
        i_sender      = l_sender
        tt_text       = tt_soli
        i_subject     = lsubject
        i_use_noreply = p_norep.

  ENDIF.

ENDFORM.                    "processing
*----------------------------------------------------------------------*
* Read Variant DEFAULT with initialization parameters
*----------------------------------------------------------------------*

FORM read_variant.
  TYPES: BEGIN OF ty_info,
           typ(1),
           null(1),
           line(120),
         END OF ty_info.

* für autom. Variante TEST laden
  DATA:
    l_report   TYPE raldb_repo ##NEEDED,
    l_variante TYPE raldb_vari ##NEEDED,
    t_info     TYPE TABLE OF ty_info ##NEEDED.

** Load variant sy-uname
  l_report   = sy-repid.
  l_variante = 'DEFAULT'.


  CALL FUNCTION 'RS_COVERPAGE_SELECTIONS'
    EXPORTING
      report  = l_report
      variant = l_variante
    TABLES
      infotab = t_info
    EXCEPTIONS
      OTHERS  = 3 ##FM_SUBRC_OK.
ENDFORM.


FORM test.
  DATA rc TYPE i.

  SELECT SINGLE * FROM nast INTO nast WHERE objky = '2400431702' .
  nast-vstat = '0'.

  SELECT SINGLE * FROM tnapr INTO tnapr WHERE
    kschl = 'ZG43' AND
    nacha = '1' AND
    kappl = 'EF'.

  PERFORM entry_aufb USING rc ' '.

ENDFORM.

Nun habe ich den Funktionsbaustein Y_BC_EMAIL_POST erstellt:

Code: Alles auswählen.

FUNCTION Y_BC_EMAIL_POST.
*"----------------------------------------------------------------------
*"*"Lokale Schnittstelle:
*"  IMPORTING
*"     REFERENCE(I_RQIDENT) TYPE  RSPOID
*"     REFERENCE(I_SMTP_ADDR) TYPE  AD_SMTPADR
*"     REFERENCE(I_SENDER) TYPE  AD_SMTPADR
*"     REFERENCE(TT_TEXT) TYPE  BCSY_TEXT
*"     REFERENCE(I_SUBJECT) TYPE  SO_OBJ_DES
*"     REFERENCE(I_FILENAME) TYPE  SO_OBJ_DES
*"     REFERENCE(I_USE_NOREPLY) TYPE  XFELD
*"----------------------------------------------------------------------


  DATA lv_len TYPE i.
  DATA pdf_xstring TYPE xstring.
*     -------- convert document -------------------------------
  DATA pdf_content TYPE TABLE OF solix.
* for email contents
  DATA lv_internetadr TYPE adr6-smtp_addr.
  DATA lv_attname TYPE sood-objdes.

  DATA  send_request       TYPE REF TO cl_bcs.
  DATA  ls_soli            TYPE soli.
  DATA  document           TYPE REF TO cl_document_bcs.
  DATA  recipient          TYPE REF TO if_recipient_bcs.
  DATA  bcs_exception      TYPE REF TO cx_bcs.
  DATA  sent_to_all        TYPE os_boolean.
  DATA  sender             TYPE REF TO if_sender_bcs.
  DATA  l_sendadr          TYPE adr6-smtp_addr.
  DATA  l_pdf_size      TYPE so_obj_len.

  CALL FUNCTION 'CONVERT_OTFSPOOLJOB_2_PDF'
    EXPORTING
      src_spoolid              = i_rqident
      no_dialog                = 'X'
*     DST_DEVICE               =
      pdf_destination          = 'X'
*     NO_BACKGROUND            =
*     USE_CASCADING            = ' '
    IMPORTING
      pdf_bytecount            = lv_len
*     PDF_SPOOLID              =
*     OTF_PAGECOUNT            =
*     BTC_JOBNAME              =
*     BTC_JOBCOUNT             =
      bin_file                 = pdf_xstring
* TABLES
*     PDF                      =
    EXCEPTIONS
      err_no_otf_spooljob      = 1
      err_no_spooljob          = 2
      err_no_permission        = 3
      err_conv_not_possible    = 4
      err_bad_dstdevice        = 5
      user_cancelled           = 6
      err_spoolerror           = 7
      err_temseerror           = 8
      err_btcjob_open_failed   = 9
      err_btcjob_submit_failed = 10
      err_btcjob_close_failed  = 11
      OTHERS                   = 12.

  IF sy-subrc <> 0.
  ENDIF.


  pdf_content = cl_document_bcs=>xstring_to_solix( pdf_xstring ).

  TRY.
*     create the send request
      send_request = cl_bcs=>create_persistent( ).

*     email subject
      l_pdf_size = lv_len.
      document = cl_document_bcs=>create_document(
                                i_type    = 'RAW'
                                i_text    = tt_text
                                i_length  = l_pdf_size
                                i_subject = i_subject ).

*     add list attachment to document
      IF i_filename IS INITIAL.
        CONCATENATE i_subject '.pdf' INTO lv_attname.
      ELSE.
        CONCATENATE i_filename '.pdf' INTO lv_attname.
      ENDIF.
      document->add_attachment( i_attachment_type    = 'PDF'
                                i_attachment_subject = lv_attname
                                i_att_content_hex    = pdf_content ).

*=============== prep send

*     add document to send request
      send_request->set_document( document ).

*     create recipient and add to send request

      recipient = cl_cam_address_bcs=>create_internet_address( i_smtp_addr ).

      send_request->add_recipient( i_recipient = recipient ).

*    create sender and add to send request
      IF NOT i_use_noreply IS INITIAL.
        CONCATENATE 'Noreply@' sy-sysid '-' sy-mandt '.de' INTO l_sendadr.
        sender = cl_cam_address_bcs=>create_internet_address( l_sendadr ).
        send_request->set_sender( EXPORTING i_sender = sender ).
      ELSE.
        IF NOT i_sender IS INITIAL.
          l_sendadr = i_sender.
          sender = cl_cam_address_bcs=>create_internet_address( l_sendadr ).
          send_request->set_sender( EXPORTING i_sender = sender ).
        ENDIF.
      ENDIF.

*     send
      send_request->set_send_immediately( i_send_immediately = 'X' ).


    CATCH cx_bcs INTO bcs_exception.
      MESSAGE s865(so) WITH bcs_exception->error_type DISPLAY LIKE 'E'.
  ENDTRY.

*    commit work and wait.


ENDFUNCTION.


So dies habe ich jetzt bei uns ins Q-System eingepflegt. So nun habe ich die NACE für die Nachrichtenart ZG43 entsprechend angepasst (Siehe Bild 1).

Wenn ich nun in die ME22N gehe und dort die Nachricht ZG43 wiederhole und speicher (dies stößt den E-Mail-Versand an) kommt nun leider, dass die Verbuchung abgebrochen sei.

Irgendwie komme ich auch immer noch nicht in den Debugger rein, wenn ich in der ME22N speicher und es den E-Mail-Versand anstößt.

Was mache ich falsch. Sieht da jemand einen Fehler im Coding oder was muss ich machen?

Wenn ich doch das Programm ZMEDRUCK_MAIL starte, also F8 dann wird ja nur so ein Testdurchlauf gestartet, oder? Leider passiert da bei mir auch nichts...

Das macht mich langsam verrückt...

Vielen Dank im Voraus.

Re: Batch-Job E-Mail Versand

Beitrag von Tron (Top Expert / 1243 / 26 / 304 ) »
Moin.
Der Programmname in der Klammer muß der Programmname sein, der vorher in der NACE stand.

Code: Alles auswählen.

************************
* @@@@ TODO !!!!!
************************
*-real program---------+
*                      |
*-real Form---+        |
*             |        |
  CASE nast-kschl.

    WHEN 'ZG43'.
      PERFORM entry_aufb(*** HIer muss der Name des vorherigen Programms rein ***) USING return_code us_screen.
    WHEN OTHERS.
  ENDCASE.
gruß Jens
<:: XING-Gruppe Tricktresor::>
Die deutsche Rechtschreibung ist Freeware, du darfst sie kostenlos nutzen –
Aber sie ist nicht Open Source, d. h. du darfst sie nicht verändern oder in veränderter Form veröffentlichen.

Re: Batch-Job E-Mail Versand

Beitrag von Bright4.5 (Specialist / 162 / 19 / 0 ) »
Hallo Tron,

okay, ich hätte es jetzt mal abgeändert:

Code: Alles auswählen.

  CASE nast-kschl.
*    WHEN 'NEU'.
*      PERFORM entry_neu(sapfm06p) USING return_code us_screen.
*    WHEN 'YNCS'.
*      PERFORM entry_neu(sapfm06p) USING return_code us_screen.
    WHEN 'ZG43'.
      PERFORM entry_aufb(SAPFM06P) USING return_code us_screen.
    WHEN OTHERS.
  ENDCASE.

Nun funktioniert die Verbuchung wieder, allerdings ist der Betreff gleich geblieben (Siehe Bild DokuTitel).

Wie bekomme ich das nur hin, dass ich den Betreff ändern kann?? Liegt es vielleicht daran, dass ich die Nachricht nur wiederhole?

Wenn ich das Testprogramm ausführe:

Code: Alles auswählen.

*&---------------------------------------------------------------------*
*& Report YTEST_Y_BC_EMAIL_POST
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT YTEST_Y_BC_EMAIL_POST.

DATA l_upd TYPE sy-subrc.
DATA l_spnr TYPE rspoid VALUE '129'.
DATA lsmtp_addr TYPE  ad_smtpadr VALUE 'blubber@gmx.de'.
DATA lsubject TYPE so_obj_des VALUE 'Test Email'.

* Verbucher aktiv ?
CALL FUNCTION 'TH_IN_UPDATE_TASK'
 IMPORTING
   in_update_task       = l_upd.

IF l_upd IS INITIAL.

CALL FUNCTION 'Y_BC_EMAIL_POST'
  EXPORTING
    i_rqident         = l_spnr
    i_smtp_addr       = lsmtp_addr
*   tt_text           =
    i_subject         = lsubject.

COMMIT WORK AND WAIT.

ELSE.

CALL FUNCTION 'Y_BC_EMAIL_POST' IN UPDATE TASK
  EXPORTING
    i_rqident         = l_spnr
    i_smtp_addr       = lsmtp_addr
*   tt_text           =
    i_subject         = lsubject.

ENDIF.

Kommt immer das eine PDF-Datei erzeugt wurde. Ich hätte hier vermutet, dass auch eine E-Mail an mich geschickt wird (Das ist aber nicht so wichtig). Ich möchte nur den Betreff von der E-Mail ändern....

Leider hat es mit dem Debuggen auch immer noch nicht geklappt. Ich kann es nur bei der Druckvorschau debuggen, aber nicht wenn ich die Nachricht wiederhole und dann speichere...

Re: Batch-Job E-Mail Versand

Beitrag von Bright4.5 (Specialist / 162 / 19 / 0 ) »
Hallo nochmal.

ich müsste hier in dem Programm aber direkt nichts machen, oder?

Also irgendwelche Parameter vorbelegen(Siehe Bild). Ich tappe hier gerade echt komplett im Dunkeln.....

Re: Batch-Job E-Mail Versand

Beitrag von Tron (Top Expert / 1243 / 26 / 304 ) »
Moin.
Also das Einstiegsbild für Testing wie folgt belegen:
Email : deine Emailadresse zum Testen , wir wollen ja niemanden nerven .
Sender : wenn erlaubt Noreply@xyz.com (irgendwas)
oder Noreply anhaken, dann generiert das Programm eine Noreply Adresse .
P_spool : hier kann man eine Spoolnummer vorgeben von einem X-beliebigen Formulardruck , falls man wie in der Bestellung keinen Druck erzeugen kann. (siehe SP01)
G_Debug aktiviert diese option.
Ich habe an alle Unanehmlichkeiten gedacht 😇
Ach wenn Du die Parameter alle eingetragen hast, speichere eine Variante mit Deinem SAP Usernamen, dann werden diese Werte beim Start gleich vorbelegt.

__________________
YTEST_Y_BC_EMAIL_POST ist nur ein Funktionstest für das Versenden im Verbucher

falls Du noch Fragen hast ... nur zu 😉
gruß Jens
<:: XING-Gruppe Tricktresor::>
Die deutsche Rechtschreibung ist Freeware, du darfst sie kostenlos nutzen –
Aber sie ist nicht Open Source, d. h. du darfst sie nicht verändern oder in veränderter Form veröffentlichen.

Seite 1 von 1

Über diesen Beitrag



ABAP & SAP eBook Flatrate von Espresso Tutorials Sponsorlink
Unterstütze die Community und teile den Beitrag für mehr Leser und Austausch

Aktuelle Forenbeiträge

SmartForms show table...
vor 5 Tagen von Lucyalison 2 / 2261
Wie groß ist mein DynPro?
vor 5 Tagen von JanR gelöst 3 / 1135

Vergleichbare Themen

Versand einer E-Mail aus SAP mit PDF Anhang und E-Mail Text
von Haubentaucher » 31.08.2006 07:28
E-Mail Versand
von dkast » 24.10.2017 14:25
Mail Versand Formular
von SAPDIDI2 » 23.01.2007 09:38
E-Mail versand mit dem Anhang.
von nordlender » 22.02.2012 13:40
E-Mail Versand mit Sonderzeichen
von Tipp » 30.09.2014 11:52