[ABAP] Umwandlung SAP Codepage / HTTP Encoding Name

Tabellen

TCP00 (SAP Codepage Katalog)
TCP00A (Codepage-Attribute)

Variante 1 (cl_abap_codepage)

TRY.
    DATA(lv_http_codepage) = |utf-8|.
* utf-8 -> 4110
* get sap codepage by external name
    WRITE: / lv_http_codepage, '->', cl_abap_codepage=>sap_codepage( lv_http_codepage ).
  CATCH cx_root INTO DATA(e_txt).
    WRITE: / e_txt->get_text( ).
ENDTRY.

Variante 2 (cl_i18n_utils)

* Encoding Name in SAP Codepage
DATA(lv_codepage_name) = |UTF-8|.
*H  HTTP-Name
*M  MIME-Name (wird nicht mehr benutzt)
*J  Java-Name (java.io und java.lang APIs)
*W  Microsoft-Windows Codepage-Nummer
*D  Dokumentenreferenz (ID(2),OBJ(60))
*T  Kurzer, internationaler Text
*A  Passende, ASCII-basierte Codepage
*C  RTF: /cpg Wert
*F  RTF: /fcharsetN Wert
*S  Sequenz von Code Units
*G  Enthält Filter Segmente
DATA(lv_kind) = CONV cpattrkind( 'H' ).
DATA(lv_sap_codepage) = CONV cpcodepage( '' ).

* Get a codepage from an encoding name
DATA(rv) = cl_i18n_utils=>get_cp_from_name( EXPORTING im_name = lv_codepage_name
                                                      im_kind = lv_kind
                                            IMPORTING ex_cp   = lv_sap_codepage ).

CASE rv.
* successful
  WHEN 0.
    WRITE: / lv_codepage_name, '->', lv_sap_codepage.
* internal error such as old kernel
  WHEN 1.
* I/O error such as missing TCP00A
  WHEN 8.
* invalid arguments
  WHEN 16.
* not found
  WHEN 128.
ENDCASE.

Variante 3 (cl_abap_codepage)

TRY.
    DATA(lv_sap_codepage) = CONV cpcodepage( '4110' ).
* 4110 -> utf-8
* convert sap codepage to http codepage
    WRITE: / lv_sap_codepage, '->', cl_abap_codepage=>sap_to_http( lv_sap_codepage ).
  CATCH cx_root INTO DATA(e_txt).
    WRITE: / e_txt->get_text( ).
ENDTRY.

Variante 4 (cl_abap_codepage)

TRY.
    DATA(lv_sap_codepage) = CONV cpcodepage( '4110' ).
* 4110 -> UTF8
* convert sap codepage to JAVA codepage
    WRITE: / lv_sap_codepage, '->', cl_abap_codepage=>sap_to_java( lv_sap_codepage ).
  CATCH cx_root INTO DATA(e_txt).
    WRITE: / e_txt->get_text( ).
ENDTRY.

Links

[ABAP] Verschlüsselung mit AES256

TRY.
* get sap codepage by external name
    DATA(lv_codepage_utf8) = cl_abap_codepage=>sap_codepage( 'utf-8' ).

* AES-256 Encryption Key
    DATA(lv_key_xstr) = cl_sec_sxml_writer=>generate_key( algorithm = cl_sec_sxml_writer=>co_aes256_algorithm ).

* Plaintext
    DATA(lv_plain_str) = |Testtext_123|.

* STRING --> XSTRING
    DATA(lv_plain_xstr) = cl_bcs_convert=>string_to_xstring( iv_codepage = CONV #( lv_codepage_utf8 )
                                                             iv_string   = lv_plain_str ).

* 16 Bit-Initialisierungsvector für CBC-(Cypher Block Chaining)-Modes der AES Encryption
    DATA(lv_iv_xstr) = CONV xstring( '00000000000000000000000000000000' ).

* Encrypt data with Initialization Vector

    DATA: lv_encrypted_xstr TYPE xstring.

    cl_sec_sxml_writer=>encrypt_iv( EXPORTING plaintext  = lv_plain_xstr
                                              key        = lv_key_xstr
                                              iv         = lv_iv_xstr
                                              algorithm  = cl_sec_sxml_writer=>co_aes256_algorithm_pem
                                    IMPORTING ciphertext = lv_encrypted_xstr ).


* Decrypt data
    DATA: lv_decrypted_xstr TYPE xstring.

    cl_sec_sxml_writer=>decrypt( EXPORTING ciphertext = lv_encrypted_xstr
                                           key        = lv_key_xstr
                                           algorithm  = cl_sec_sxml_writer=>co_aes256_algorithm_pem
                                 IMPORTING plaintext  = lv_decrypted_xstr ).

* XSTRING --> STRING
    DATA(lv_decrypted_str) = cl_bcs_convert=>xstring_to_string( iv_cp   = lv_codepage_utf8
                                                                iv_xstr = lv_decrypted_xstr ).

* Ausgabe
    WRITE: / 'Plain:', lv_plain_str.
    WRITE: / 'Encrypted xstring:', lv_encrypted_xstr.
    WRITE: / 'Decrypted xstring:', lv_decrypted_xstr.
    WRITE: / 'Decrypted:', lv_decrypted_str.

  CATCH cx_root INTO DATA(e_txt).
    WRITE: / e_txt->get_text( ).
ENDTRY.

[ABAP] Datei-Upload

Variante 1 (cl_gui_frontend_services)

DATA: lv_rc TYPE i.
DATA: it_files TYPE filetable.
DATA: lv_action TYPE i.

* FileOpen-Dialog aufrufen
TRY.
        cl_gui_frontend_services=>file_open_dialog( EXPORTING file_filter    = |pdf (*.pdf)\|*.pdf\|{ cl_gui_frontend_services=>filetype_all }|
                                                              multiselection = abap_false
                                                    CHANGING  file_table     = it_files
                                                              rc             = lv_rc
                                                              user_action    = lv_action ).

    IF lv_action = cl_gui_frontend_services=>action_ok.
* wenn Datei ausgewählt wurde
      IF lines( it_files ) > 0.
* ersten Tabelleneintrag lesen
        DATA(lv_filename) = it_files[ 1 ]-filename.

        DATA: lv_filesize TYPE i.
        DATA: it_bin_data TYPE STANDARD TABLE OF raw255.

* Bild auf Appl. Server hochladen (binary)
        cl_gui_frontend_services=>gui_upload( EXPORTING filename   = |{ lv_filename }|
														filetype   = 'BIN'
										      IMPORTING filelength = lv_filesize
										      CHANGING  data_tab   = it_bin_data ).														

        DATA: lv_xstr TYPE xstring.

* RAW (binary) nach xstring
        CALL FUNCTION 'SCMS_BINARY_TO_XSTRING'
          EXPORTING
            input_length = lv_filesize
          IMPORTING
            buffer       = lv_xstr
          TABLES
            binary_tab   = it_bin_data
          EXCEPTIONS
            failed       = 1
            OTHERS       = 2.

        ...
      ENDIF.
    ENDIF.

  CATCH cx_root INTO DATA(e_text).
    MESSAGE e_text->get_text( ) TYPE 'I'.
ENDTRY.

Variante 2 (cl_secxml_helper)

TRY.
    cl_secxml_helper=>file_f4( EXPORTING initial_directory = ''
                                         window_title      = 'Dateiauswahl'
                               IMPORTING filename          = DATA(lv_xfile) ).


    IF lv_xfile IS NOT INITIAL.
      cl_secxml_helper=>upload_file( EXPORTING filename = lv_xfile
                                     IMPORTING bindata  = DATA(lv_data_xstr) ).
      
      ...
    ENDIF.

  CATCH cx_root INTO DATA(e_txt).
    WRITE: / e_txt->get_text( ).
ENDTRY.

[ABAP] Datei-Download

Variante 1 (cl_gui_frontend_services)

TRY.
* beliebiger Stream
    DATA: lv_xdata TYPE xstring.
    
    ...
    
* xstring -> solix
    DATA(it_solix_data) = cl_bcs_convert=>xstring_to_solix( iv_xstring = lv_xdata ).

* Daten lokal speichern
    cl_gui_frontend_services=>gui_download( EXPORTING
                                              filename     = |Bild.png|
                                              filetype     = 'BIN'
                                              bin_filesize = xstrlen( lv_xdata )
                                            CHANGING
                                              data_tab     = it_solix_data ).
CATCH cx_root INTO DATA(e_txt).
  WRITE: / e_txt->get_text( ).
ENDTRY.

Variante 2 (cl_gui_frontend_services)

* Inhalt einer internen Tabelle als Datei (CSV) auf den lokalen Rechner speichern:
* http://help.sap.com/saphelp_nw70ehp2/helpdata/de/c7/5ab8ec178c44a8aacd1dcac3460db8/content.htm  

* CSV-Daten
DATA: itab TYPE STANDARD TABLE OF string.
* Dateipfad + Dateiname
DATA: lv_file TYPE string VALUE 'c:\temp\test.txt'.

...

TRY.
  cl_gui_frontend_services=>gui_download( EXPORTING
                                            filename = lv_file
                                            filetype = 'DAT'  " mögliche Filetypen: BIN, ASC, DAT, DBF, WK1, VSS, IBM
                                            codepage = '4110' " UTF-8 Encoding: 4110, UTF-16 Big Endian : 4102, UTF-16 Little Endian : 4103.
                                          CHANGING
                                            data_tab = itab ).
      
    WRITE: / |Datei erfolgreich unter { lv_file } gespeichert.|.
  CATCH cx_root INTO DATA(e_text).
    MESSAGE e_text->get_text( ) TYPE 'I'.
ENDTRY.

Variante 3 (cl_secxml_helper)

TRY.
* Daten als Stream
    DATA: lv_xdata TYPE xstring.

    ...

* File lokal speichern auf dem Frontend
    cl_secxml_helper=>save_file( EXPORTING default_file_name = ''
                                           initial_directory = ''
                                           window_title      = 'Datei speichern'
                                           bindata           = lv_xdata ).
  CATCH cx_root INTO DATA(e_txt).
    WRITE: / e_txt->get_text( ).
ENDTRY.

[SAP] Business-Objekte (BOR) / BAPI

Transaktionen

SWO1 (Business Object Builder)

  • Business Objekte anlegen und anzeigen

SWO2 (BOR Browser)
SWO3 (Business Object Builder)
SWO4 (Business Object Repository)
SWO6 (Customizing Objekttypen)
BAPI (BAPI Explorer)

  • Business Objekte anlegen und anzeigen

Objekttypen (Beispiele)

BUS1001 (Material)
BUS1001006 (Standard Material)
BUS2010 (Lieferantenanfrage)
BUS2011 (Lieferantenangebot)
BUS2012 (Bestellung)
BUS2015 (Anlieferung)
BUS2017 (Warenbewegung)
BUS2030 (Kundenanfrage)
BUS2032 (Kundenauftrag)
BUS2081 (Eingangsrechnung)
BUS2091 (Leistungserfassungsblatt)
BUS2105 (Bestellanforderung)
BUS3005 (Kondition)

Klassen

CL_BINARY_RELATION (API für Binäre Verknüpfung)

Tabellen

TOJTB (Business Object Repository Grunddaten)
TOJTT (Texte Grunddaten)
TOJTD (Customizing Objekttypen)
SWOTDI (Definition Schnittstellen)
SWOTDV (Objekttyp Verben Definition)
SWOTLQ (Laufzeittabelle Parameter, Ausnahmen)
SWOTLV (Laufzeittabelle Verben)
SWOTTV (Texte zu Verben)

Funktionsbausteine

SWO_CREATE (Business Objekt initiieren)
SWO_INVOKE (Buisness Objekt Metode aufrufen / Attribute setzen)
SWO_FREE (Business Objekt freigeben)
SWE_EVENT_CREATE (Erzeugen eines Ereignisses (public))
SWE_EVENT_GET_RECEIVERS (Ermittelt die Empfänger eines Ereignisses (INTERN))

Reports

MMPUR_BOR_CHANGE_ARL (Business Object Migration von EKKO nach BUS20xx)

Links

[ABAP] SAP: Terminverwaltung

Klassen

CL_APPOINTMENT (Termin der R/3 Terminverwaltung)
CL_ORGANIZER (Terminverwaltung: Oberfläche für die Terminanzeige)
CL_PLANNER (Terminverwaltung: Planungsoberfläche)
CL_RECA_WB_ORGANIZER (Terminkalender innerhalb der Workbench)
CL_CRM_DATES_ORGANIZER_UI (CRM Scheduler (Kalender und Taskliste))

Tabellen

SCAPPTTYPE (Terminart)
SCAPPT (benutzerspezifische Termine)
SCGENAPPT (generierte Termine (regelmäßige bzw. Gruppentermine))

Typgruppen

SCCON (Terminkalender: Definition von Konstanten)

Programme

RSSC_DEMO_CL_APPOINTMENT_SIMPL
RSSC_DEMO_CL_APPOINTMENT_PERIO
RSSC_DEMO_CL_APPOINTMENT_APPL
RSSC_DEMO_CL_APPOINTMENT
RSSC_DEMO_ICAL
RSSC_TEST_CL_APPOINTMENT_REPLY

Beispiel 1 (cl_reca_wb_organizer)

TRY.
    cl_reca_wb_organizer=>initialize( io_custom_control = cl_gui_container=>default_screen ).
    WRITE: / space.
  CATCH cx_root INTO DATA(e_ext).
ENDTRY.

Beispiel 2 (cl_appointment)

TRY.
    DATA(o_app) = NEW cl_appointment( ).

* Terminart
* siehe Tabelle SCAPPTTYPE (Terminart)
    o_app->set_type( 'MEETING' ).

* Organisator
    o_app->set_organizer( organizer = sy-uname ).

* Teilnehmer hinzufügen
    DATA: lv_part TYPE scspart.
    DATA: lv_address TYPE obj_record.
    lv_address-header = 'OBJH'.
    lv_address-type = 'SWO'.

    DATA: lv_err_msg TYPE swotreturn.

    CALL FUNCTION 'SWO_CREATE'
      EXPORTING
        objtype = 'ADDRESS'
        objkey  = space
      IMPORTING
        object  = lv_address-handle
        return  = lv_err_msg.

    DATA: lv_mail TYPE ad_smtpadr VALUE 'test@test.de'.
    DATA: it_address_container TYPE STANDARD TABLE OF swcont.

* Schreiben eines ABAP/4-Feldes in einen Container
    CALL FUNCTION 'SWC_ELEMENT_SET'
      EXPORTING
        element   = 'AddressString'
        field     = lv_mail
      TABLES
        container = it_address_container.

* Schreiben eines ABAP/4-Feldes in einen Container
    CALL FUNCTION 'SWC_ELEMENT_SET'
      EXPORTING
        element   = 'TypeId'
        field     = 'U'
      TABLES
        container = it_address_container.

* Buisness Objekt Metode aufrufen / Attribute setzen
    CALL FUNCTION 'SWO_INVOKE'
      EXPORTING
        access     = 'C'
        object     = lv_address-handle
        verb       = 'Create'
        persistent = ' '
      TABLES
        container  = it_address_container.

    DATA: lv_objkey TYPE swotobjid.
* Buisiness Objekt Superobjekttyp lesen
    CALL FUNCTION 'SWO_OBJECT_ID_GET'
      EXPORTING
        object = lv_address-handle
      IMPORTING
        objid  = lv_objkey.

    lv_part-objkey = lv_objkey-objkey.
    lv_part-objtype = lv_objkey-objtype.
    lv_part-comm_mode = 'INT'.
    lv_part-send_mail = sccon_part_sndmail_with_ans.

    o_app->add_participant( participant = lv_part ).

* Terminüberschrift / Subject
    DATA: lv_title TYPE sc_txtshor VALUE 'wichtiger Termin'.
    o_app->set_title( lv_title ).

* Ort / Locaton (max. 12 Zeichen --> ggf. noch im iCal-Text unter LOCATION: ersetzen)
    DATA: lv_loc TYPE sc_room VALUE 'Raum 100'.
    o_app->set_location( lv_loc ).
*    o_app->set_location_string( ).

* Zeitpunkt
    DATA(lv_date_from) = CONV sc_datefro( sy-datum ).
    DATA(lv_time_from) = sccon_00.
    DATA(lv_date_to) = CONV sc_dateto( '311299' ).
    DATA(lv_time_to) = sccon_235959.

    o_app->set_date( date_from = lv_date_from
                     date_to   = lv_date_to
                     time_from = lv_time_from
                     time_to   = lv_time_to ).

* Priorität
    o_app->set_priority( sccon_prio_very_high ).

* Status
    o_app->set_status( sccon_status_planned ).

* Anzeigeattribute
    o_app->set_view_attributes( show_on_top = abap_true ).

* Busy-Wert (frei, belegt, ...)
    o_app->set_busy_value( sccon_busy_busy ).

* Klassification (1=öffentlich, 2=privat, 3=geheim)
    o_app->set_classification( sccon_public ).

* Beschreibung
    DATA(it_body_text) = VALUE so_txttab( ( line = 'Text1' ) ( line = cl_abap_char_utilities=>cr_lf )
                                          ( line = 'Text2' ) ( line = cl_abap_char_utilities=>cr_lf )
                                          ( line = 'Text3' ) ).

    o_app->set_text( it_body_text ).

* Änderbarkeit (Berechtigung: 1= alle , 2 = nur Organisator)
    o_app->set_text_authority( '2' ).

* Termin auf der DB sichern
* Note:2413122-- save should only be done after BADI call.
    o_app->save( send_invitation = abap_false ). " Important to set this one to space. Otherwise SAP will send a not user-friendly e-mail

* Mailversand
    DATA(o_req) = o_app->create_send_request( ).
    DATA(o_rec) = cl_cam_address_bcs=>create_internet_address( lv_mail ).
    o_req->add_recipient( i_recipient = o_rec ).

    o_req->set_status_attributes( EXPORTING i_requested_status = 'N'    " Requested Status: N - Never
                                            i_status_mail      = 'N'    " Setting for Which Statuses Are Reported by Mail: N - Never
                                           ).

    o_req->set_send_immediately( abap_true ).

*    IF o_req->send( ) = abap_true.
*      COMMIT WORK AND WAIT.
*    ENDIF.

* iCal-Object holen
* hier ggf. 'METHOD:REQUEST' durch 'METHOD:PUBLISH' ersetzen
* hier ggf. 'LOCATION:' ersetzen mit längerem Raumnamen
    DATA(it_ical_soli_tab) = o_app->as_ical_object( ).

    cl_demo_output=>write_data( it_ical_soli_tab ).
    cl_demo_output=>display( ).

  CATCH cx_root INTO DATA(e_ext).
ENDTRY.

Links

[ABAP] Geschäftspartner: Adressdaten lesen

PARAMETERS: p_bp TYPE bapibus1006_head-bpartner.

DATA: lv_bapibus1006_address TYPE bapibus1006_address.
DATA: lv_bapibus1006_addr_dep_att TYPE bapibus1006_addr_dep_att.
DATA: it_bapiadtel TYPE STANDARD TABLE OF bapiadtel.
DATA: it_bapiadfax TYPE STANDARD TABLE OF bapiadfax.
DATA: it_bapiadttx TYPE STANDARD TABLE OF bapiadttx.
DATA: it_bapiadtlx TYPE STANDARD TABLE OF bapiadtlx.
DATA: it_bapiadsmtp TYPE STANDARD TABLE OF bapiadsmtp.
DATA: it_bapiadrml TYPE STANDARD TABLE OF bapiadrml.
DATA: it_bapiadx400 TYPE STANDARD TABLE OF bapiadx400.
DATA: it_bapiadrfc TYPE STANDARD TABLE OF bapiadrfc.
DATA: it_bapiadprt TYPE STANDARD TABLE OF bapiadprt.
DATA: it_bapiadssf TYPE STANDARD TABLE OF bapiadssf.
DATA: it_bapiaduri TYPE STANDARD TABLE OF bapiaduri.
DATA: it_bapiadpag TYPE STANDARD TABLE OF bapiadpag.
DATA: it_bapiad_rem TYPE STANDARD TABLE OF bapiad_rem.
DATA: it_bapicomrem TYPE STANDARD TABLE OF bapicomrem.
DATA: it_addressusage TYPE STANDARD TABLE OF bapibus1006_addressusage.
DATA: it_bapiadversorg TYPE STANDARD TABLE OF bapiad1vd.
DATA: it_bapiadverspers TYPE STANDARD TABLE OF bapiad2vd.
DATA: it_bapiaduse TYPE STANDARD TABLE OF bapiaduse.
DATA: it_return TYPE STANDARD TABLE OF bapiret2.

* SAP-GP, BAPI: Adresse lesen
CALL FUNCTION 'BAPI_BUPA_ADDRESS_GETDETAIL'
  EXPORTING
    businesspartner       = p_bp
*   ADDRESSGUID           =
*   VALID_DATE            = SY-DATLO
*   RESET_BUFFER          =
  IMPORTING
    addressdata           = lv_bapibus1006_address
    address_dep_attr_data = lv_bapibus1006_addr_dep_att
  TABLES
    bapiadtel             = it_bapiadtel
    bapiadfax             = it_bapiadfax
    bapiadttx             = it_bapiadttx
    bapiadtlx             = it_bapiadtlx
    bapiadsmtp            = it_bapiadsmtp
    bapiadrml             = it_bapiadrml
    bapiadx400            = it_bapiadx400
    bapiadrfc             = it_bapiadrfc
    bapiadprt             = it_bapiadprt
    bapiadssf             = it_bapiadssf
    bapiaduri             = it_bapiaduri
    bapiadpag             = it_bapiadpag
    bapiad_rem            = it_bapiad_rem
    bapicomrem            = it_bapicomrem
    addressusage          = it_addressusage
    bapiadversorg         = it_bapiadversorg
    bapiadverspers        = it_bapiadverspers
    bapiaduse             = it_bapiaduse
    return                = it_return.

cl_demo_output=>write_data( lv_bapibus1006_address ).
cl_demo_output=>write_data( lv_bapibus1006_addr_dep_att ).
cl_demo_output=>write_data( it_bapiadtel ).
cl_demo_output=>write_data( it_bapiadfax ).
cl_demo_output=>write_data( it_bapiadtlx ).
cl_demo_output=>write_data( it_bapiadsmtp ).
cl_demo_output=>write_data( it_bapiadrml ).
cl_demo_output=>write_data( it_bapiadx400 ).
cl_demo_output=>write_data( it_bapiadrfc ).
cl_demo_output=>write_data( it_bapiadprt ).
cl_demo_output=>write_data( it_bapiadssf ).
cl_demo_output=>write_data( it_bapiaduri ).
cl_demo_output=>write_data( it_bapiadpag ).
cl_demo_output=>write_data( it_bapiad_rem ).
cl_demo_output=>write_data( it_bapicomrem ).
cl_demo_output=>write_data( it_addressusage ).
cl_demo_output=>write_data( it_bapiadversorg ).
cl_demo_output=>write_data( it_bapiadverspers ).
cl_demo_output=>write_data( it_bapiaduse ).
cl_demo_output=>write_data( it_return ).
cl_demo_output=>display( ).

[ABAP] HR: Mitarbeiterdaten lesen

TRY.
    DATA(o_eapi) = cl_hcmfab_employee_api=>get_instance( ).

    DATA(lv_pernr) = o_eapi->get_employeenumber_from_user( sy-uname ).
    DATA(lv_name) = o_eapi->get_name( lv_pernr ).
    DATA(lv_details) = o_eapi->get_employee_details( iv_pernr = lv_pernr iv_application_id = if_hcmfab_constants=>gc_application_id-mypersonaldata ).

    cl_demo_output=>write_data( lv_pernr ).
    cl_demo_output=>write_data( lv_name ).
    cl_demo_output=>write_data( lv_details ).
  CATCH cx_root INTO DATA(e_txt).
    WRITE: / e_txt->get_text( ).
ENDTRY.

[SAP] ILM

Transaktionen

ACLA (Definition Archivierungsklassen)
IRMPOL (ILM-Regelwerke)
SARA (Archivverwaltung)
DB15 Datenarchivierung: Datenbank-Tabellen

Tabellen

ARCH_DELE (Objekte mit Tabellen, aus denen Einträge gelöscht werden)
ARCH_DEF (Definition eines Archivierungsobjekts)
ARCH_OBJ (Archivierungsobjekt)
ARCH_OCLAS (Zuordnung der Klassen zu einem Archivierungsobjekt)
ARCH_RPRG (Archivierungsobjekte mit zugehörigen Leseprogrammen)
ARCH_TCODE (Anwendungs-Customizing-Transaktionen)
ARCH_TXT (Bezeichnung der Archivierungsobjekte)

Links