gelöst Nachrichtensteuerung: Rechnung via eMail versenden


SAP R/3 Vertrieb: Auftragsverwaltung, Versand und Transport, Fakturierung, Kreditmanagement, Außenhandel/Zoll...

Moderatoren: Jan, Steff

gelöst Nachrichtensteuerung: Rechnung via eMail versenden

Beitragvon METi12 » 23.01.2014, 13:28

Hallo zusammen,

ich habe eine Nachricht für eine Faktura so eingestellt, dass sie per Sendemedium 5 als E-Mail verarbeitet wird, klappt auch soweit.

Was auch in der E-Mail erscheint, ist der Mailtext als Betreff. Was jedoch nicht übernommen wird, ist der Mailtext.
Ich hab gelesen, dass mittels Transaktion SODIS ich den Mailtext ändern kann. Leider funktioniert bei uns die Transaktion SODIS nicht, kommt die Meldung "Transaktion SODIS existiert nicht". Kann mit bitte jemand sagen woran das liegen könnte? Wir verwenden zurzeit SAP ECC 6.0.

Oder gibt es eine andere Möglichkeit?

Danke für Eure Unterstützung
METi12
ForumUser
 
Beiträge: 11
Registriert: 22.01.2014, 12:21
Dank erhalten: 0 mal
Ich bin: Berater/in

Sponsor

Alte ABAP-Entwicklerweisheit: Weißt du weder aus noch ein, baust du einen BADI ein

Re: Nachrichtensteuerung: Rechnung via eMail versenden

Beitragvon Tron » 24.01.2014, 15:36

Moin,
vielleicht sagt Dir dieses Verfahren zu, welches ich vor 2 Jahren mal entwickelt habe:
ich nehme an, dass ein "Email-Body-Text" gar nicht vorgesehen ist, deshalb habe ich folgende Idee:

Der Text wird aus einem Faktura Kopftext gezogen.
Dazu kann man sich einen eigenen Textbaustein mit VOTXN customizen und im Druckprogramm verwenden.

Was für MEDRUCK geht, funktioniert auch im Fakturadruck!
http://www.apentia-forum.de/viewtopic.php?t=16922

Das Programm leistet nun folgendes:
Der Druck wird auf dem Drucker augegeben und gleichzeitig wird aus dem
Spool ein PDF als Anhang zur Mail erzeugt. Der Kopftext wird als Email-body
gezogen und die Email-Adresse wird von der Partner-Rolle RE(chnungsempfänger)
ermittelt. Dann wird das ganze Packet versendet.

Vorteile:
Das Original-Druckprogramm muß so nicht verändert werden und der Customizingaufwand
ist minimal. Desweiteren hat man beliebige Erweiterungsmöglichkeiten.
z.B Mailinglisten zu verwenden, oder sich selbst die Mail zu schicken, um digital zu signieren,
oder weitere Anlagen anheften.Wenn man die Kopiersteuerung bemüht, kann man einen Vorlagetext beim Anlegen der Faktura definieren.
Noch weitere Ideen ?

Was zu tun ist:

1.) Bei Bedarf einen neuen Kopftext "erfinden". (Transaktion VOTXN)
(ich habe die Id YEML verwendet, ggf anpassen)

Bild

...und

Bild

In der Anwendung VF02 - texte
Bild

2.) Das Druckprogramm customizen für Nachrichtenart RD00 (Transaktion NACE)
z.B. aus RVADIN01 wird YFAKTURA_EMAIL der Eintrag ENTRY kann bleiben.

Bild

Das angepasste Druckprogramm für den Rechnungsdruck:
Code: Alles auswählen
*&---------------------------------------------------------------------*
*& Subroutinepool YFAKTURA_EMAIL by TRON                               *
*&                                                                     *
*&---------------------------------------------------------------------*
*&                                                                     *
*&                                                                     *
*&---------------------------------------------------------------------*

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

REPORT  yfaktura_email.
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 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

* RVADIN01 = Sapscript
* RLB_INVOICE = Smartforms

*-Orig program------+
*                   |
*-Orig Form-+       |
*           |       |
  PERFORM entry(RLB_INVOICE) USING return_code us_screen.

* 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&#91;&#93; 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

*&amp;---------------------------------------------------------------------*
*&amp;      Form  PROCESSING
*&amp;---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM processing USING spoolid TYPE itcpp-tdspoolid.
  DATA: numbytes TYPE i,
        pdfspoolid LIKE tsp01-rqident,
        jobname LIKE tbtcjob-jobname,
        jobcount LIKE tbtcjob-jobcount.

  DATA: BEGIN OF pdf OCCURS 0,
        t(134),
        END OF pdf.
  DATA:
        i TYPE i,
        k TYPE i,
        j TYPE i.

  DATA:   document_data LIKE sodocchgi1,
          object_txt LIKE solisti1 OCCURS 10 WITH HEADER LINE,
          object_pack LIKE sopcklsti1 OCCURS 1 WITH HEADER LINE,
          object_bin LIKE solisti1 OCCURS 10 WITH HEADER LINE,
          receiver_list LIKE somlreci1 OCCURS 1 WITH HEADER LINE,
          tab_lines TYPE i.

* for Invoice Header Text
  data:
  lv_ID type THEAD-TDID value 'YEML',
  lv_LANGUAGE type THEAD-TDSPRAS,
  lv_NAME type THEAD-TDNAME,
  lv_OBJECT type THEAD-TDOBJECT value 'VBBK',
  lt_lines type table of tline,
  ls_line type tline.

* For partner Email
  constants:
  lv_ITEM_NUMBER type VBUP-POSNR value '000000',
  lv_PARTNER_ROLE type VBPA-PARVW value 'RE'.

  data:
  lv_DOCUMENT_NUMBER type VBUK-VBELN,
  ls_vbpa type vbpa.

****  Main - Email  ****

* Title and Description
  document_data-obj_name  = 'INVOICE'.
  document_data-obj_descr = nast-objky.

* Text of Email
  CONCATENATE 'Rechnung' nast-objky INTO object_txt
  SEPARATED BY space.
  APPEND object_txt.


  lv_language = nast-spras.
  lv_NAME = nast-objky.

  CALL FUNCTION 'READ_TEXT'
    EXPORTING
      ID                      = lv_ID
      LANGUAGE                = lv_LANGUAGE
      NAME                    = lv_NAME
      OBJECT                  = lv_OBJECT
    TABLES
      LINES                   = lt_lines
    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.
  ENDIF.

  loop at lt_lines into ls_line.
    append ls_line-TDLINE to object_txt.
  endloop.

* Packing List(Main-Part)

* Calculate the contens length
  DESCRIBE TABLE object_txt LINES tab_lines.
  READ TABLE object_txt INDEX tab_lines.
  document_data-doc_size = ( tab_lines - 1 ) * 255 +
  STRLEN( object_txt ).

* generate the Packing List
  CLEAR object_pack-transf_bin.
  object_pack-head_start = 1.
  object_pack-head_num   = 0.
  object_pack-body_start = 1.
  object_pack-body_num   = tab_lines.
  object_pack-doc_type   = 'RAW'.
  APPEND object_pack.

  CALL FUNCTION 'CONVERT_OTFSPOOLJOB_2_PDF'
      EXPORTING
        src_spoolid                    = spoolid
        no_dialog                      = ' '
*        DST_DEVICE                     =
*       PDF_DESTINATION                =
      IMPORTING
        pdf_bytecount                  = numbytes
        pdf_spoolid                    = pdfspoolid
*       OTF_PAGECOUNT                  =
        btc_jobname                    = jobname
        btc_jobcount                   = jobcount
      TABLES
        pdf                            = 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.

  IF sy-subrc = 0.

    k = i = 0.
    LOOP AT pdf.

      DO 134 TIMES.
        j = sy-index - 1.
        object_bin+i(1) = pdf+j(1).
        i = i + 1.

        IF i > 254.
          APPEND object_bin.
          CLEAR i.
        ENDIF.

        k = k + 1.
        IF k GE numbytes.
          IF i NE 0. APPEND object_bin.ENDIF.
          EXIT.
        ENDIF.
      ENDDO.

    ENDLOOP.

  ELSE.
    EXIT.
  ENDIF.


* Generate the Attachment
*  Packing List(Att)
  DESCRIBE TABLE object_bin LINES tab_lines.
  READ TABLE object_bin INDEX tab_lines.

  object_pack-doc_size = ( tab_lines - 1 ) * 255 + STRLEN( object_bin ).
  object_pack-transf_bin = 'X'.
  object_pack-head_start = 1.
  object_pack-head_num   = 0.
  object_pack-body_start = 1.
  object_pack-body_num   = tab_lines.
  object_pack-doc_type   = 'PDF'.
  object_pack-obj_name   = 'SPOOL'.
  object_pack-obj_descr  = nast-objky.
  APPEND object_pack.


* generate the receiver list

  lv_DOCUMENT_NUMBER = nast-objky.

* Get Partner RE Email
  CALL FUNCTION 'SD_VBPA_SELECT'
    EXPORTING
      I_DOCUMENT_NUMBER = lv_DOCUMENT_NUMBER
      I_ITEM_NUMBER     = lv_ITEM_NUMBER
      I_PARTNER_ROLE    = lv_PARTNER_ROLE
    IMPORTING
      E_VBPA            = ls_vbpa
    EXCEPTIONS
      PARTNER_NOT_FOUND = 1
      OTHERS            = 2.

  IF SY-SUBRC <> 0.
  ENDIF.

* Internet User
  clear receiver_list.

  select single SMTP_ADDR from adr6 into receiver_list-receiver where
  ADDRNUMBER = ls_vbpa-adrnr and FLGDEFAULT = 'X'.

  if sy-subrc = 0 and not receiver_list-receiver is initial.
    receiver_list-rec_type = 'U'.
    receiver_list-com_type ='INT'.
    APPEND receiver_list.
  else.
    receiver_list-receiver = 'SAPUSER@LOCALHOST'.
    receiver_list-rec_type = 'U'.
    receiver_list-com_type ='INT'.
    APPEND receiver_list.
  endif.


* Send the mail
  CALL FUNCTION 'SO_NEW_DOCUMENT_ATT_SEND_API1'
    EXPORTING
      document_data              = document_data
*     put_in_outbox              = 'X' not really
      commit_work                = ' '
    TABLES
      packing_list               = object_pack
      contents_bin               = object_bin
      contents_txt               = object_txt
      receivers                  = receiver_list
    EXCEPTIONS
      too_many_receivers         = 1
      document_not_sent          = 2
      document_type_not_exist    = 3
      operation_no_authorization = 4
      parameter_error            = 5
      x_error                    = 6
      enqueue_error              = 7
      OTHERS                     = 8.

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

ENDFORM.                    "PROCESSING
 

lg 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.
Tron
Expert
 
Beiträge: 974
Registriert: 04.08.2007, 21:08
Wohnort: Hamburg
Dank erhalten: 188 mal
Ich bin: Entwickler/in

Re: Nachrichtensteuerung: Rechnung via eMail versenden

Beitragvon METi12 » 03.02.2014, 08:02

Hallo Tron,

vielen Dank für deine Hilfe. Ich habe alles gemacht wie du bschrieben hast. Nur bei uns funktioniert
Code: Alles auswählen
    PERFORM entry(RLB_INVOICE) USING return_code us_screen.
sondern
Code: Alles auswählen
  PERFORM entry(rvadin01) USING return_code us_screen.


Leider habe ich das Problem, wenn ich eine PDF erzeuge und die per mail sende kann ich später die erzeuge PDF nicht öffnen, kommt die Fehlermeldung "Beim Öffnen des Dokuments ist ein Fehler aufgetreten ...".

Der zweite Fehler ist, dass wenn ich eine Faktura zum 2 bzw. 3-mal drucke, die Seiten immer mehr werden, d.h. beim zweiten druck werden 2 Seiten gedruckt und beim n druck werden n Seiten gedruckt.

Hier noch mal meine Coding.

Code: Alles auswählen
*&amp;amp;---------------------------------------------------------------------*
*&amp;amp; Subroutinepool YFAKTURA_EMAIL by TRON                               *
*&amp;amp;                                                                     *
*&amp;amp;---------------------------------------------------------------------*
*&amp;amp;                                                                     *
*&amp;amp;                                                                     *
*&amp;amp;---------------------------------------------------------------------*

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

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

*&amp;amp;---------------------------------------------------------------------*
*&amp;amp;      Form  ENTRY
*&amp;amp;---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->RETURN_CODE  text
*      -->US_SCREEN    text
*----------------------------------------------------------------------*
FORM entry 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

* RVADIN01 = Sapscript
* RLB_INVOICE = Smartforms

*-Orig program------+
*                   |
*-Orig Form-+       |
*           |       |
  PERFORM entry(rvadin01) USING return_code us_screen.

* 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&amp;#91;&amp;#93; 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

*&amp;amp;---------------------------------------------------------------------*
*&amp;amp;      Form  PROCESSING
*&amp;amp;---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM processing USING spoolid TYPE itcpp-tdspoolid.
  DATA: numbytes TYPE i,
        pdfspoolid LIKE tsp01-rqident,
        jobname LIKE tbtcjob-jobname,
        jobcount LIKE tbtcjob-jobcount.

  DATA: BEGIN OF pdf OCCURS 0,
        t(134),
        END OF pdf.
  DATA:
        i TYPE i,
        k TYPE i,
        j TYPE i.

  DATA:   document_data LIKE sodocchgi1,
          object_txt LIKE solisti1 OCCURS 10 WITH HEADER LINE,
          object_pack LIKE sopcklsti1 OCCURS 1 WITH HEADER LINE,
          object_bin LIKE solisti1 OCCURS 10 WITH HEADER LINE,
          receiver_list LIKE somlreci1 OCCURS 1 WITH HEADER LINE,
          tab_lines TYPE i.

* for Invoice Header Text
  data:
  lv_ID type THEAD-TDID value 'YEML',
  lv_LANGUAGE type THEAD-TDSPRAS,
  lv_NAME type THEAD-TDNAME,
  lv_OBJECT type THEAD-TDOBJECT value 'VBBK',
  lt_lines type table of tline,
  ls_line type tline.

* For partner Email
  constants:
  lv_ITEM_NUMBER type VBUP-POSNR value '000000',
  lv_PARTNER_ROLE type VBPA-PARVW value 'RE'.

  data:
  lv_DOCUMENT_NUMBER type VBUK-VBELN,
  ls_vbpa type vbpa.

****  Main - Email  ****

* Title and Description
  document_data-obj_name  = 'INVOICE'.
  document_data-obj_descr = nast-objky.

* Text of Email
  CONCATENATE 'Rechnung' nast-objky INTO object_txt
  SEPARATED BY space.
  APPEND object_txt.


  lv_language = nast-spras.
  lv_NAME = nast-objky.

  CALL FUNCTION 'READ_TEXT'
    EXPORTING
      ID                      = lv_ID
      LANGUAGE                = lv_LANGUAGE
      NAME                    = lv_NAME
      OBJECT                  = lv_OBJECT
    TABLES
      LINES                   = lt_lines
    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.
  ENDIF.

  loop at lt_lines into ls_line.
    append ls_line-TDLINE to object_txt.
  endloop.

* Packing List(Main-Part)

* Calculate the contens length
  DESCRIBE TABLE object_txt LINES tab_lines.
  READ TABLE object_txt INDEX tab_lines.
  document_data-doc_size = ( tab_lines - 1 ) * 255 +
  STRLEN( object_txt ).

* generate the Packing List
  CLEAR object_pack-transf_bin.
  object_pack-head_start = 1.
  object_pack-head_num   = 0.
  object_pack-body_start = 1.
  object_pack-body_num   = tab_lines.
  object_pack-doc_type   = 'RAW'.
  APPEND object_pack.

  CALL FUNCTION 'CONVERT_OTFSPOOLJOB_2_PDF'
      EXPORTING
        src_spoolid                    = spoolid
        no_dialog                      = ' '
*        DST_DEVICE                     =
*       PDF_DESTINATION                =
      IMPORTING
        pdf_bytecount                  = numbytes
        pdf_spoolid                    = pdfspoolid
*       OTF_PAGECOUNT                  =
        btc_jobname                    = jobname
        btc_jobcount                   = jobcount
      TABLES
        pdf                            = 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.

  IF sy-subrc = 0.

    k = i = 0.
    LOOP AT pdf.

      DO 134 TIMES.
        j = sy-index - 1.
        object_bin+i(1) = pdf+j(1).
        i = i + 1.

        IF i > 254.
          APPEND object_bin.
          CLEAR i.
        ENDIF.

        k = k + 1.
        IF k GE numbytes.
          IF i NE 0. APPEND object_bin.ENDIF.
          EXIT.
        ENDIF.
      ENDDO.

    ENDLOOP.

  ELSE.
    EXIT.
  ENDIF.


* Generate the Attachment
*  Packing List(Att)
  DESCRIBE TABLE object_bin LINES tab_lines.
  READ TABLE object_bin INDEX tab_lines.

  object_pack-doc_size = ( tab_lines - 1 ) * 255 + STRLEN( object_bin ).
  object_pack-transf_bin = 'X'.
  object_pack-head_start = 1.
  object_pack-head_num   = 0.
  object_pack-body_start = 1.
  object_pack-body_num   = tab_lines.
  object_pack-doc_type   = 'PDF'.
  object_pack-obj_name   = 'SPOOL'.
  object_pack-obj_descr  = nast-objky.
  APPEND object_pack.


* generate the receiver list

  lv_DOCUMENT_NUMBER = nast-objky.

* Get Partner RE Email
  CALL FUNCTION 'SD_VBPA_SELECT'
    EXPORTING
      I_DOCUMENT_NUMBER = lv_DOCUMENT_NUMBER
      I_ITEM_NUMBER     = lv_ITEM_NUMBER
      I_PARTNER_ROLE    = lv_PARTNER_ROLE
    IMPORTING
      E_VBPA            = ls_vbpa
    EXCEPTIONS
      PARTNER_NOT_FOUND = 1
      OTHERS            = 2.

  IF SY-SUBRC <> 0.
  ENDIF.

* Internet User
  clear receiver_list.

  select single SMTP_ADDR from adr6 into receiver_list-receiver where
  ADDRNUMBER = ls_vbpa-adrnr and FLGDEFAULT = 'X'.

  if sy-subrc = 0 and not receiver_list-receiver is initial.
    receiver_list-rec_type = 'U'.
    receiver_list-com_type ='INT'.
    APPEND receiver_list.
  else.
    receiver_list-receiver = 'SAPUSER@LOCALHOST'.
    receiver_list-rec_type = 'U'.
    receiver_list-com_type ='INT'.
    APPEND receiver_list.
  endif.


* Send the mail
  CALL FUNCTION 'SO_NEW_DOCUMENT_ATT_SEND_API1'
    EXPORTING
      document_data              = document_data
*     put_in_outbox              = 'X' not really
      commit_work                = ' '
    TABLES
      packing_list               = object_pack
      contents_bin               = object_bin
      contents_txt               = object_txt
      receivers                  = receiver_list
    EXCEPTIONS
      too_many_receivers         = 1
      document_not_sent          = 2
      document_type_not_exist    = 3
      operation_no_authorization = 4
      parameter_error            = 5
      x_error                    = 6
      enqueue_error              = 7
      OTHERS                     = 8.

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

ENDFORM.                    "PROCESSING


Danke für eure Hilfe.

Gruß Meti12
METi12
ForumUser
 
Beiträge: 11
Registriert: 22.01.2014, 12:21
Dank erhalten: 0 mal
Ich bin: Berater/in

Re: Nachrichtensteuerung: Rechnung via eMail versenden

Beitragvon Tron » 03.02.2014, 11:05

Moin.
Der Funktionsbaustein SO_NEW_DOCUMENT_ATT_SEND_API1 ist seit der Unicode umstellung "mit Vorsicht" zu geniessen !

DESHALB die Umstellung auf Email mit Klassen:
Code: Alles auswählen
    *&amp;---------------------------------------------------------------------*
    *&amp; Subroutinepool INVOICE EMAIL AS PDF ATTACHMENT                      *
    *&amp;                                                                     *
    *&amp;---------------------------------------------------------------------*
    *&amp;                                                                     *
    *&amp;                                                                     *
    *&amp;---------------------------------------------------------------------*

    * WARNING : NO POPUPS - NO COMMIT WORK ALLOWED !!!!!!!!!!!!!!!!!!!!!!!!!

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

    *&amp;---------------------------------------------------------------------*
    *&amp;      Form  ENTRY
    *&amp;---------------------------------------------------------------------*
    *       text
    *----------------------------------------------------------------------*
    *      -->RETURN_CODE  text
    *      -->US_SCREEN    text
    *----------------------------------------------------------------------*
    FORM entry 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

    * RVADIN01 = Sapscript
    * RLB_INVOICE = Smartforms

    *-Orig program------+
    *                   |
    *-Orig Form-+       |
    *           |       |
      PERFORM entry(rlb_invoice) USING return_code us_screen.

    * 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&#91;&#93; 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

    *&amp;---------------------------------------------------------------------*
    *&amp;      Form  processing
    *&amp;---------------------------------------------------------------------*
    *       text
    *----------------------------------------------------------------------*
    *      -->SPOOLID    text
    *----------------------------------------------------------------------*
    FORM processing USING spoolid TYPE itcpp-tdspoolid.

      DATA numbytes TYPE i.
      DATA lbuffer TYPE xstring.

      DATA: BEGIN OF lt_pdf OCCURS 0,
            t(134),
            END OF lt_pdf.

    * for Invoice Header Text
      DATA:
      lv_id TYPE thead-tdid VALUE 'YEML',
      lv_language TYPE thead-tdspras,
      lv_name TYPE thead-tdname,
      lv_object TYPE thead-tdobject VALUE 'VBBK',
      lt_lines TYPE TABLE OF tline,
      ls_line TYPE tline.

    * For partner Email
      CONSTANTS:
      lv_item_number TYPE vbup-posnr VALUE '000000',
      lv_partner_role TYPE vbpa-parvw VALUE 'RE'.

      DATA:
      lv_document_number TYPE vbuk-vbeln,
      ls_vbpa TYPE vbpa.

    * For Email contents
      DATA contents_hex TYPE solix_tab.
      DATA lv_internetadr TYPE adr6-smtp_addr.
      DATA lv_subject TYPE so_obj_des.
      DATA lv_attname TYPE sood-objdes.

      DATA  send_request       TYPE REF TO cl_bcs.
      DATA  text               TYPE bcsy_text.
      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.


      CALL FUNCTION 'CONVERT_OTFSPOOLJOB_2_PDF'
          EXPORTING
            src_spoolid                    = spoolid
            no_dialog                      = ' '
    *        DST_DEVICE                     =
    *       PDF_DESTINATION                =
          IMPORTING
            pdf_bytecount                  = numbytes
    *       pdf_spoolid                    = pdfspoolid
    *       OTF_PAGECOUNT                  =
    *       btc_jobname                    = jobname
    *       btc_jobcount                   = jobcount
          TABLES
            pdf                            = lt_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.

      IF sy-subrc = 0.

        CALL FUNCTION 'SCMS_BINARY_TO_XSTRING'
          EXPORTING
            input_length = numbytes
          IMPORTING
            buffer       = lbuffer
          TABLES
            binary_tab   = lt_pdf
          EXCEPTIONS
            failed       = 1
            OTHERS       = 2.

        IF sy-subrc <> 0.
        ENDIF.


        CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
          EXPORTING
            buffer     = lbuffer
          TABLES
            binary_tab = contents_hex&#91;&#93;.
      ENDIF.

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

    *     create the email body

          lv_language = nast-spras.
          lv_name = nast-objky.

          CALL FUNCTION 'READ_TEXT'
            EXPORTING
              id                      = lv_id
              language                = lv_language
              name                    = lv_name
              object                  = lv_object
            TABLES
              lines                   = lt_lines
            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.
          ENDIF.

          LOOP AT lt_lines INTO ls_line.
            APPEND ls_line-tdline TO text.
          ENDLOOP.

          lv_document_number = nast-objky.

    * Get Partner RE Email
          CALL FUNCTION 'SD_VBPA_SELECT'
            EXPORTING
              i_document_number = lv_document_number
              i_item_number     = lv_item_number
              i_partner_role    = lv_partner_role
            IMPORTING
              e_vbpa            = ls_vbpa
            EXCEPTIONS
              partner_not_found = 1
              OTHERS            = 2.

          IF sy-subrc <> 0.
          ENDIF.

          CLEAR lv_internetadr.
          SELECT SINGLE smtp_addr FROM adr6 INTO lv_internetadr WHERE
          addrnumber = ls_vbpa-adrnr AND flgdefault = 'X'.

    * Email subject
          CONCATENATE 'Invoice:' nast-objky INTO lv_subject .
          document = cl_document_bcs=>create_document(
                                    i_type    = 'RAW'
                                    i_text    = text
                                    i_subject = lv_subject ).

    *     add list attachment to document
          CONCATENATE nast-objky '.pdf' INTO lv_attname.
          document->add_attachment( i_attachment_type    = 'PDF'
                                    i_attachment_subject = lv_attname
                                    i_att_content_hex    = contents_hex ).

    *=============== Prep Send

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

    *     create recipient and add to send request

          IF lv_internetadr IS INITIAL.
            recipient = cl_sapuser_bcs=>create( sy-uname ).
          ELSE.
            recipient = cl_cam_address_bcs=>create_internet_address( lv_internetadr ).
          ENDIF.

          send_request->add_recipient( i_recipient = recipient ).


    *     send
          send_request->set_send_immediately( i_send_immediately = 'X' ).
          sent_to_all = send_request->send( i_with_error_screen = 'X' ).
          IF sent_to_all = 'X'.
            MESSAGE s022(so).
          ENDIF.

        CATCH cx_bcs INTO bcs_exception.
          MESSAGE e865(so) WITH bcs_exception->error_type.
      ENDTRY.


    ENDFORM.                    "processing
 


gruß Jens
siehe auch http://apentia-forum.de/viewtopic.php?f ... 7&start=15
<:: 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.

Für diese Nachricht hat Tron einen Dank bekommen :
METi12
Tron
Expert
 
Beiträge: 974
Registriert: 04.08.2007, 21:08
Wohnort: Hamburg
Dank erhalten: 188 mal
Ich bin: Entwickler/in

Re: Nachrichtensteuerung: Rechnung via eMail versenden

Beitragvon METi12 » 03.02.2014, 11:51

Hallo Tron,

Vielen, Vielen Dank!! :D :D :D Du bist der größte!!

Eine Frage habe ich aber noch:

Warum wird meine PDF immer mit mehreren Seiten erzeugt. ich habe eine Faktura die mit 6 Seiten erzeugt wird. Wenn ich die Nachricht wiederhole, dann wird die gleiche Faktura mit 7 seiten erzeugt?

Danke nochmals.

Gruß Meti1212
METi12
ForumUser
 
Beiträge: 11
Registriert: 22.01.2014, 12:21
Dank erhalten: 0 mal
Ich bin: Berater/in

Re: Nachrichtensteuerung: Rechnung via eMail versenden

Beitragvon Tron » 03.02.2014, 15:26

Moin.
Oh Danke!

Gilt das 6 / 7 Seiten-Problem auch schon für das Standard - Handling (ohne dieses Email Programm) ?
Oder anders gefragt: Ist die Anzahl der Seiten im PDF und die Seiten, die gedruckt werden, gleich ?
Sapscript-debuggen könnte hilfreich sein. :wink: Probier es mal im Standard aus.

Sonst gäbe es mehrere Möglichkeiten:
1.) Das Formular produziert Leerzeilen, gerade weil es ein Nachdruck ist. (und möglicherweise Abschnitte im Formular gibt, die entsprechend darauf reagieren)
2.) Die SAP Schriften und die PDF Schriften sind nicht 100% gleich, was dann ggf. einen Seitenumbruch zur Folge hat.

Fakturen sollten eigentlich gar nicht mehrfach druckbar sein. Bei "uns" würden sonst sämtliche Kopien auch archiviert.
Deshalb haben wir eine eigene Nachrichtenart für Testdrucke.
lg 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.
Tron
Expert
 
Beiträge: 974
Registriert: 04.08.2007, 21:08
Wohnort: Hamburg
Dank erhalten: 188 mal
Ich bin: Entwickler/in

Re: Nachrichtensteuerung: Rechnung via eMail versenden

Beitragvon METi12 » 04.02.2014, 08:03

Hallo,

dieser Fehler tritt nur mit dem angepassten Druckprogram auf. Mit den Standard Programm tretten keine Probleme auf.

Zur Fehlerbeschreibung:
Je öfter ich eine Rechnung Drucke, desto Kopien kommen hinzu. Wenn ich eine Nachricht zum 10-mal erstelle, dann erhält die erzeugte PDF auch 10 Kopien der Rechnung, wenn eine Rechnung 2 Seiten hat, dann erhalte ich 20 Seiten. In den Drucker werden dann auch 10 Kopien der Rechnung gedruckt. Als Hinweis erscheint in der Rechnung "Wiederhohlungsdruck". In der Anlageliste erhalte ich dann auch 10 Anlagen. :cry: :cry:

Danke für eure Hilfe

Gruß, Meti12
METi12
ForumUser
 
Beiträge: 11
Registriert: 22.01.2014, 12:21
Dank erhalten: 0 mal
Ich bin: Berater/in

Re: Nachrichtensteuerung: Rechnung via eMail versenden

Beitragvon Tron » 04.02.2014, 09:15

Moin.
... wir sollten die Klassen sicherheitshalber nach deren Verwendung wieder freigeben.
Code: Alles auswählen
     :
     :
  *     send
          send_request->set_send_immediately( i_send_immediately = 'X' ).
          sent_to_all = send_request->send( i_with_error_screen = 'X' ).
          IF sent_to_all = 'X'.
            MESSAGE s022(so).
          ENDIF.

        CATCH cx_bcs INTO bcs_exception.
          MESSAGE e865(so) WITH bcs_exception->error_type.
      ENDTRY.

CLEAR:
        document,
        recipient,
       send_request.

      :
      :
 

lg Jens
Ich werde aber das mal genauer untersuchen.
<:: 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.
Tron
Expert
 
Beiträge: 974
Registriert: 04.08.2007, 21:08
Wohnort: Hamburg
Dank erhalten: 188 mal
Ich bin: Entwickler/in

Re: Nachrichtensteuerung: Rechnung via eMail versenden

Beitragvon METi12 » 04.02.2014, 15:55

Hallo,

ich hatte davor auch mit
Code: Alles auswählen
CLEAR:
        document,
        recipient,
       send_request.
versucht, hat leider nicht funktioniert.
Könnte dies etwas mit meine "Logische Destination" zu tun haben. Ich verwende hier "LOCL".

Gruß, Meti12
METi12
ForumUser
 
Beiträge: 11
Registriert: 22.01.2014, 12:21
Dank erhalten: 0 mal
Ich bin: Berater/in

Re: Nachrichtensteuerung: Rechnung via eMail versenden

Beitragvon Tron » 04.02.2014, 22:50

Moin.
bei mir hat der Clear auch keine Wirkung.
Also ich kann anstellen was ich will, bei mir werden die Seiten einfach nicht mehr.
Ich hätte eine Idee, wenn sich die Anzahl der Positionen von Druck zu Druck verdoppelt,
aber jeweils eine Seite mehr, könnte ich so adhoc nicht erklären.
Ich habe ebenfalls mal LOCL mit Koppelart F (SAPLPD Popup) genommen.
Produziert ein PDF, da Standarddrucker = PDF und schickt ne Mail (alles wie erwartet).
Ändere das Coding mal so ab, dass der "Druck" als interne SAP-Mail an Dich geschickt wird.
e.g.
Code: Alles auswählen
    *     create recipient and add to send request
* TEST TEST
recipient = cl_sapuser_bcs=>create( sy-uname ).
*         IF lv_internetadr IS INITIAL.
*           recipient = cl_sapuser_bcs=>create( sy-uname ).
*         ELSE.
*           recipient = cl_cam_address_bcs=>create_internet_address( lv_internetadr ).
*         ENDIF.
 

werden es dann auch mehr Seiten ?

lg 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.

Für diese Nachricht hat Tron einen Dank bekommen :
METi12
Tron
Expert
 
Beiträge: 974
Registriert: 04.08.2007, 21:08
Wohnort: Hamburg
Dank erhalten: 188 mal
Ich bin: Entwickler/in

Re: Nachrichtensteuerung: Rechnung via eMail versenden

Beitragvon METi12 » 17.02.2014, 16:19

Hallo zusammen,

danke Tron, ich habe es geschaft.
METi12
ForumUser
 
Beiträge: 11
Registriert: 22.01.2014, 12:21
Dank erhalten: 0 mal
Ich bin: Berater/in


Zurück zu Sales and Distribution

  Aktuelle Beiträge   
(LKW)Bedarfsvorschau je Debitor
vor einer Stunde von owny 0 Antw.
(LKW)Bedarfsvorschau je Debitor
vor einer Stunde von owny 0 Antw.
Lieferplan, Einteilungen, Feinabrufe
vor 15 Stunden von bapimueller 0 Antw.
gelöst Smartforms Struktur rechtsbündig
vor 19 Stunden von qyurryus 3 Antw.
CALL_FUNCTION_SYSCALL_ONLY in RFC-Aufruf
vor 21 Stunden von lausek 0 Antw.

  Ähnliche Beiträge beta
Wiederholungsdruck (Rechnung)
04.04.2005, 13:31 von ewx 3 Antw.
Adressaufbereitung Lieferschein, Rechnung
14.09.2005, 11:24 von Chrisu 9 Antw.
Proforma Rechnung ändern Rechnungsempfänger
13.10.2014, 15:53 von wreichelt 1 Antw.
Rechnung für bestimmte Verkaufsbelegarten senden
08.05.2015, 11:54 von JHM 5 Antw.
Rechnung über VF02 geändert --> NAST-Zugriff?
25.09.2012, 14:54 von Thomas17 3 Antw.

 

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder