[ABAP] Verarbeitungsprotokoll zu Nachrichten lesen (NAST, CMFK, CMFP)

* https://www.berater-wiki.de/Access_Tabellenbeziehung_Fehlerprotokoll

DATA: lv_kappl TYPE nast-kappl.
DATA: lv_objky TYPE nast-objky.
DATA: lv_kschl TYPE nast-kschl.
DATA: lv_erdat TYPE nast-erdat.
DATA: lv_eruhr TYPE nast-eruhr.
DATA: lv_usnam TYPE nast-usnam.

SELECT-OPTIONS: so_kappl FOR lv_kappl.
SELECT-OPTIONS: so_objky FOR lv_objky.
SELECT-OPTIONS: so_kschl FOR lv_kschl.
SELECT-OPTIONS: so_erdat FOR lv_erdat.
SELECT-OPTIONS: so_eruhr FOR lv_eruhr.
SELECT-OPTIONS: so_usnam FOR lv_usnam.

INITIALIZATION.

* Applikation für Nachrichtenkonditionen ('EF' = Bestellungen)
  so_kappl[] = VALUE #( ( sign = 'I' option = 'EQ' low = 'EF' high = '' ) ).
* Nachrichtenart
  so_kschl[] = VALUE #( ( sign = 'I' option = 'EQ' low = 'NEU' high = '' ) ).

START-OF-SELECTION.

* NAST (Nachrichtenstatus)
* CMFK (Speicherstruktur für den Kopf des Fehlerprotokolls)
* CMFP (Speicherstruktur für die gesammelten Fehler)
  SELECT FROM nast AS na
         LEFT OUTER JOIN cmfk AS ck ON na~cmfpnr = ck~nr
         LEFT OUTER JOIN cmfp AS cp ON na~cmfpnr = cp~nr
         FIELDS na~kappl,
                na~objky,
                na~kschl,
                na~parnr,
                na~erdat,
                na~eruhr,
                na~nacha,
                na~vsztp,
                na~usnam,
                na~tcode,
                na~ldest,
                na~tdreceiver,
                na~tdcovtitle,
                na~tdarmod,
                na~objtype,
                na~cmfpnr,
                ck~aplid,
                ck~nr,
                ck~datum,
                ck~uzeit,
                ck~uname,
                ck~objid,
                cp~msgcnt,
                cp~arbgb,
                cp~msgty,
                cp~msgnr,
                cp~msgv1,
                cp~msgv2,
                cp~msgv3,
                cp~msgv4,
                cp~logsys
         WHERE na~kappl IN @so_kappl
           AND na~objky IN @so_objky
           AND na~kschl IN @so_kschl
           AND na~erdat IN @so_erdat
           AND na~eruhr IN @so_eruhr
           AND na~usnam IN @so_usnam
         INTO TABLE @DATA(it_nast).

  IF sy-subrc = 0.
    cl_demo_output=>write_data( it_nast ).
* HTML-Code vom Demo-Output holen
    DATA(lv_html) = cl_demo_output=>get( ).
* Daten im Inline-Browser im SAP-Fenster anzeigen
    cl_abap_browser=>show_html( EXPORTING
                                  title        = 'Verarbeitungsprotokoll Nachrichten'
                                  html_string  = lv_html
                                  container    = cl_gui_container=>default_screen ).

* cl_gui_container=>default_screen erzwingen
    WRITE: space.
  ENDIF.

[ABAP] Adressenaufbereitung mit CUSTOMER_ADDRESS_TO_ITF

DATA: lv_address TYPE bapiaddr3.
DATA: it_bapi_return TYPE STANDARD TABLE OF bapiret2 WITH DEFAULT KEY.
 
CALL FUNCTION 'BAPI_USER_GET_DETAIL'
  EXPORTING
    username = sy-uname
  IMPORTING
    address  = lv_address
  TABLES
    return   = it_bapi_return.

DATA: lv_customer TYPE scustom.
lv_customer-name = lv_address-fullname.
lv_customer-street = lv_address-street.
lv_customer-postbox = lv_address-po_box.
lv_customer-postcode = lv_address-postl_cod1.
lv_customer-city   = lv_address-city.
lv_customer-country = lv_address-country.
lv_customer-region = lv_address-region.
lv_customer-telephone = lv_address-tel1_numbr.
lv_customer-email = lv_address-e_mail.

DATA: lv_sender_country TYPE szad_field-send_cntry.
lv_sender_country = 'US'.

DATA: it_address_lines TYPE tline_tab.

CALL FUNCTION 'CUSTOMER_ADDRESS_TO_ITF'
  EXPORTING
    is_customer        = lv_customer
    iv_sending_country = lv_sender_country
*   IV_NUMBER_OF_LINES = 5
  IMPORTING
    et_address         = it_address_lines.

cl_demo_output=>write_data( lv_address ).
cl_demo_output=>write_data( lv_customer ).
cl_demo_output=>write_data( lv_sender_country ).
cl_demo_output=>write_data( it_address_lines ).
cl_demo_output=>display( ).

[ABAP] Adressenaufbereitung mit ADDRESS_INTO_PRINTFORM

* https://www.berater-wiki.de/Adressenaufbereitung#Funktionsbaustein_ADDRESS_INTO_PRINTFORM

DATA: lv_address TYPE bapiaddr3.
DATA: it_bapi_return TYPE STANDARD TABLE OF bapiret2 WITH DEFAULT KEY.

CALL FUNCTION 'BAPI_USER_GET_DETAIL'
  EXPORTING
    username = sy-uname
  IMPORTING
    address  = lv_address
  TABLES
    return   = it_bapi_return.

DATA: ls_address TYPE  adrs1.
ls_address-title_text = lv_address-title_p.
ls_address-name1      = lv_address-fullname.
ls_address-street     = lv_address-street.
*  ls_address-po_box     = is_customer-postbox.
ls_address-post_code1 = lv_address-postl_cod1.
*  ls_address-region     = is_customer-region.
ls_address-city1      = lv_address-city.
ls_address-country    = lv_address-country.
DATA: lv_sender_country TYPE land1.
lv_sender_country = 'US'.

DATA: it_address_lines TYPE szadr_printform_table.
CALL FUNCTION 'ADDRESS_INTO_PRINTFORM'
  EXPORTING
    address_1               = ls_address
    address_type            = '1' "normal/company
    sender_country          = lv_sender_country
    *    number_of_lines         = 5
  IMPORTING
    address_printform_table = it_address_lines.
    
cl_demo_output=>write_data( ls_address ).
cl_demo_output=>write_data( lv_sender_country ).
cl_demo_output=>write_data( it_address_lines ).
cl_demo_output=>display( ).

[ABAP] Adobe Forms Formular aufrufen und als xstring weiterverarbeiten

* https://www.berater-wiki.de/Aufruf_des_Adobe_Formulars_im_Rahmenprogramm
* https://wiki.scn.sap.com/wiki/display/ABAP/Adobe+Forms+from+Scratch

* Hilfsfunktionen für Adobe Forms
INCLUDE fp_utilities.

* Formularname
DATA(lv_form) = CONV fpname( 'ZADOBE_FORM_NAME' ).
* Name für generierten Funktionsbaustein
DATA: lv_funcname TYPE funcname.
DATA: lv_interface_type TYPE fpinterfacetype.

TRY.
* Namen des Funktionsbausteins für ein Formular bestimmen
  CALL FUNCTION 'FP_FUNCTION_MODULE_NAME'
    EXPORTING
      i_name           = lv_form
    IMPORTING
      e_funcname       = lv_funcname
      e_interface_type = lv_interface_type.

  DATA: lv_outputparams TYPE sfpoutputparams.

** Output Parameter für neues Interface
** Druckerdialog ausblenden
*  lv_outputparams-nodialog = 'X'.
** Druckvorschau
*  lv_outputparams-preview  = 'X'.
** Druckbutton ausblenden
*  lv_outputparams-noprint  = 'X'.
** Druckvorschaubutton ausblenden
*  lv_outputparams-nopreview   = 'X'.
** Name Ausgabegerät (Drucker)
*  lv_outputparams-dest     = 'LP01'.
*  lv_outputparams-nopdf    =
** Spoolsteuerung
** Neuen Spoolrequest anlegen
*  lv_outputparams-reqnew   = 'X'.
** Spoolrequest schließen
*  lv_outputparams-reqfinal = 'X'.

* PDF XSTRING anfordern
   lv_outputparams-getpdf   = 'X'.


** XFP Settings für Externes Interface
*  lv_outputparams-xfp       =
** Context
*  lv_outputparams-xfptype   =
*  lv_outputparams-xfpoutdev =

* Formularprozessierung: Job beginnen
  CALL FUNCTION 'FP_JOB_OPEN'
    CHANGING
      ie_outputparams = lv_outputparams
    EXCEPTIONS
      cancel          = 1
      usage_error     = 2
      system_error    = 3
      internal_error  = 4
      OTHERS          = 5.

  IF sy-subrc = 0.

    DATA(lv_docparams) = VALUE sfpdocparams( langu = 'D' country  = 'DE' ).
    DATA: lv_formout TYPE fpformoutput.

* Funtionsbaustein aufrufen
    CALL FUNCTION lv_funcname
      EXPORTING
        /1bcdwb/docparams  = lv_docparams
* ggf. spez. Parameter für Funktionsaufruf hier aufführen
* siehe Transaktion SFP (Form Builder)
      IMPORTING
        /1bcdwb/formoutput = lv_formout
      EXCEPTIONS
        usage_error        = 1
        system_error       = 2
        internal_error     = 3
        OTHERS             = 4.

    IF sy-subrc = 0.
* xstring mit PDF-Daten
      DATA(lv_pdf_raw) = lv_formout-pdf.
* hier weitere Verarbeitung
      ...
    ELSE.
* wenn Fehler beim ADS-Aufruf
      DATA: lv_error_string TYPE string.

      CALL FUNCTION 'FP_GET_LAST_ADS_ERRSTR'
        IMPORTING
          e_adserrstr = lv_error_string.

      IF NOT lv_error_string IS INITIAL.
* detaillierte Fehlermeldung ausgeben
        WRITE: / lv_error_string COLOR COL_NEGATIVE.
      ELSE.
* sonst nur eine unspezifische Fehlermeldung ausgeben
        WRITE: / 'Error within Form Call : ', sy-subrc COLOR COL_NEGATIVE.
      ENDIF.

    ENDIF.

    DATA: lv_result TYPE sfpjoboutput.

* Formularprozessierung: Job beenden
    CALL FUNCTION 'FP_JOB_CLOSE'
      IMPORTING
        e_result       = lv_result
      EXCEPTIONS
        usage_error    = 1
        system_error   = 2
        internal_error = 3
        OTHERS         = 4.

    IF sy-subrc <> 0.
* Fehler beim Beenden der Formprozessierung
      MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    ENDIF.
  ELSE.
* Formprozessierung kann nicht gestartet werden
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

CATCH cx_root.
  WRITE : / 'Fehler beim Ermitteln des Funktionsbausteinnamens.'.
ENDTRY.

[SAPscript] UltraEdit: Syntaxhighlighting von SAPscript-Formularen

Einleitung

SAPscript-Formulare mittels SAP Transaktion SE71 zu editieren ist zugegebenermaßen nicht besonders komfortabel. Es gibt jedoch zwei Möglichkeiten den SAPscript-Code zu extrahieren und mittels Texteditor zu bearbeiten.

Möglichkeit 1: SE71 Formularinfo

In der Transaktion SE71 kann über Menü -> Hilfsmittel -> Formularinfo der Gesamtinhalt eines Anwendungsformulars angezeigt und als Textdatei heruntergeladen werden.

Möglichkeit 2: Download mit Report RSTXSCRP

Die SAP hat im System den Report RSTXSCRP zur Verfügung gestellt, mit dessen Hilfe beliebige Formulare als Textdatei (*.FOR) heruntergeladen und gespeichert werden können.

Texteditoren

Die so gewonnenen Textdateien können mit jedem beliebigen Texteditor angeschaut werden. Sehr gut geeignet zum editieren von beliebigem Code ist neben dem frei verfügbaren Notepad++ auch das kommerziell vertriebene UltraEdit.

Syntax-Highlighting

Für UltraEdit stelle ich hierzu frei verfügbare “Wordfiles” als *.uew-Dateien zur Verfügung. Mit diesen ist es möglich, SAPscript-Textdateien per Syntax-Highlighting und Code-Folding (z.B. IF- und PROTECT-Statements) darzustellen. Die aus SAP extrahierten Textfiles können somit übersichtlich angezeigt werden.

Downloads

Links