[ABAP] Bedingungen abfragen – SWITCH

* ersetzt CASE
* Beispiel 1
DATA: lv_flag TYPE boolean VALUE abap_false.
* Abfrage von lv_flag, Rückgabe von String
DATA(lv_status) = SWITCH string( lv_flag WHEN abap_true THEN 'Wahr.' ELSE 'Falsch.' ).
WRITE: lv_status.

* Beispiel 2
DATA(lv_lang) = SWITCH string( sy-langu WHEN 'D' THEN 'DE'
                                        WHEN 'E' THEN 'EN'
                                        ELSE 'XX' ).

WRITE: / lv_lang.

[ABAP] Email mit PDF-Anhang versenden

* https://www.sapnuts.com/tutorials/Sending-email-with-attachment-in-SAP-ABAP/singlepage.html
* http://www.sapwiki.cl/wiki/index.php?title=SAP_ABAP_CORREO
* http://www.berater-wiki.de/index.php?title=PDF_per_Mail/Fax_verschicken
* https://wiki.scn.sap.com/wiki/display/ABAP/Sending+Mails+-+Home+Page?original_fqdn=wiki.sdn.sap.com#SendingMails-HomePage-CL_BCS
* http://www.apentia-forum.de/viewtopic.php?f=2&t=74925&start=0

PARAMETERS: p_email TYPE adr6-smtp_addr OBLIGATORY DEFAULT 'email@email.com'.     " Email-Adr. des Empfängers
PARAMETERS: p_subj TYPE string DEFAULT 'Testmail.'.                               " Email-Subject
PARAMETERS: p_bdytxt TYPE soli DEFAULT 'Testtext.'.                               " eine Mailtext-Zeile
PARAMETERS: p_pdf TYPE file_table-filename OBLIGATORY DEFAULT 'C:\Temp\Test.pdf'. " PDF-Anhang

* wenn die F4-Hilfe für den Dateinamen aufgerufen wird
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_pdf.
  DATA: lv_rc TYPE i.
  DATA: it_files TYPE filetable.
  DATA: lv_action TYPE i.

* File-Tabelle leeren, da hier noch alte Einträge von vorherigen
* Aufrufen drin stehen können
  CLEAR: it_files.
* FileOpen-Dialog aufrufen
  TRY.
      cl_gui_frontend_services=>file_open_dialog( EXPORTING
                                                    file_filter = |PDF (*.pdf)\|*.pdf\|{ cl_gui_frontend_services=>filetype_all }|
                                                  CHANGING
                                                    file_table  = it_files     " ausgewählte Dateien
                                                    rc          = lv_rc        " Anzahl ausgewählte Dateien, -1 bei Fehler
                                                    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
          p_pdf = it_files[ 1 ]-filename.
        ENDIF.
      ENDIF.
    CATCH cx_root INTO DATA(e_text).
      MESSAGE e_text->get_text( ) TYPE 'S'.
  ENDTRY.

START-OF-SELECTION.
  DATA: lv_pdf_size TYPE i.
  DATA: it_pdf_data_tab TYPE solix_tab.

  TRY.
* PDF-Datei vom lokalen Rechner auf den Appl.-Server hochladen
      cl_gui_frontend_services=>gui_upload( EXPORTING
                                              filename   = |{ p_pdf }|
                                              filetype   = 'BIN'
                                            IMPORTING
                                              filelength = lv_pdf_size
                                            CHANGING
                                              data_tab   = it_pdf_data_tab ).

      IF sy-subrc = 0.
* it_body_txt beinhaltet die Zeilen des Body-Textes
* die Zeilen sind jeweils char255 Zeichen lang
* eine Zeile (line) ist vom Typ SOLI
        DATA(it_body_txt) = VALUE soli_tab( ( line = p_bdytxt ) ).

* Document (Mail) erzeugen
* Email-Subject (i_subject) darf hier max. 50 Zeichen lang sein (Subject-Darstellung in der SOST)
* die "richtige" Übergabe des Email-Subjects erfolgt weiter unten in der Funktion set_message_subject( )
        DATA(o_document) = cl_document_bcs=>create_document( i_type    = 'RAW'
                                                             i_text    = it_body_txt
                                                             i_subject = CONV so_obj_des( p_subj ) ).

* Attachement hinzufügen -> Typen siehe Tabelle TSOTD
* siehe auch: http://www.apentia-forum.de/viewtopic.php?f=2&t=74925&start=0
        o_document->add_attachment( i_attachment_type    = 'EXT'
                                    i_attachment_subject = |{ p_pdf }|
                                    i_att_content_hex    = it_pdf_data_tab ).

* Sendrequest erzeugen
        DATA(o_send_request) = cl_bcs=>create_persistent( ).
* Email-Subject festlegen, ip_subject ist vom Typ String
        o_send_request->set_message_subject( ip_subject = p_subj ).
* Die Mail an den Sendrequest hängen
        o_send_request->set_document( o_document ).

* Sender
* SAP-User als Sender
        DATA(o_sender) = cl_sapuser_bcs=>create( sy-uname ).
* Email-Adresse als Sender
*        DATA(o_sender) = cl_cam_address_bcs=>create_internet_address( i_address_string = 'email@email.com' ).
        o_send_request->set_sender( o_sender ).

* Empfänger -> beachte: u.U. sind Email-Adressen mit Umlauten nicht zulässig -> Exception
        DATA(o_recipient) = cl_cam_address_bcs=>create_internet_address( p_email ).
        o_send_request->add_recipient( i_recipient = o_recipient
                                       i_express = abap_true
                                     " i_copy      = abap_true " CC
                                     " i_blind_copy = abap_true " BCC
                                     ).

* Sofort senden
        o_send_request->set_send_immediately( abap_true ).

* Dokument senden
        IF o_send_request->send( i_with_error_screen = abap_true ) = abap_true.
          WRITE: / 'Email gesendet.'.
        ELSE.
          WRITE: / 'Fehler beim Email-Versand.'.
        ENDIF.

        DATA: lv_in_update_task TYPE sy-subrc.

* Überprüft, ob das Programm im Verbucher abläuft
        CALL FUNCTION 'TH_IN_UPDATE_TASK'
          IMPORTING
            in_update_task = lv_in_update_task.

        IF lv_in_update_task EQ 0.
* Persistenzdienste des Objektes starten, sonst wird ggf. die Mail nicht gesendet
          COMMIT WORK.
        ENDIF.

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

[ABAP] Eigene F4-Suchhilfe anzeigen (Funktionsbaustein)

TYPES: BEGIN OF ty_mara,
         matnr TYPE mara-matnr,
         ernam TYPE mara-ernam,
       END OF ty_mara.

DATA: it_mara TYPE TABLE OF ty_mara.
DATA: it_return TYPE TABLE OF ddshretval.

PARAMETERS: p_matnr TYPE mara-matnr.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_matnr.

  CLEAR: it_mara.

  SELECT matnr, ernam FROM mara
    INTO CORRESPONDING FIELDS OF TABLE @it_mara
    UP TO 20 ROWS
    ORDER BY matnr.

* F4-Hilfe mit Übergabe der anzuzeigenden Werte in interner Tabelle
  CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
    EXPORTING
      retfield        = 'MATNR'       " Spalte der internen Tabelle bei value_tab
      dynpprog        = sy-repid
      dynpnr          = sy-dynnr
      dynprofield     = 'P_MATNR'     " Name des Dynpro-Feldes für die automatische Werterückgabe
      value_org       = 'S'           " Werteübergabe: C: zellenweise, S: strukturiert
      window_title    = 'Auswahl'
    TABLES
      value_tab       = it_mara       " Übergabe-Tabelle mit Werten für die Anzeige und Auswahl
      return_tab      = it_return     " Rückgabe-Tabelle mit den ausgewählten (geklickten) Elementen
    EXCEPTIONS
      parameter_error = 1
      no_values_found = 2
      OTHERS          = 3.

  IF sy-subrc = 0.
    IF lines( it_return ) > 0.
      MESSAGE it_return[ 1 ]-fieldval TYPE 'S'.
    ENDIF.
  ENDIF.

[ABAP] Dateien und Verzeichnisse des lokalen Systems auflisten

DATA: it_file_table TYPE filetable.
DATA: s_file_table TYPE file_table.
DATA: lv_file_count TYPE i.
DATA: lv_folder TYPE string VALUE 'C:\'.

cl_gui_frontend_services=>directory_list_files(
    EXPORTING
      directory                   = lv_folder  " Verzeichnis
      filter                      = '*.*'      " Dateifilter
      files_only                  = abap_false " nur Dateien listen
      directories_only            = abap_false " nur Verzeichnisse listen
    CHANGING
      file_table                  = it_file_table
      count                       = lv_file_count
    EXCEPTIONS
      cntl_error                  = 1
      directory_list_files_failed = 2
      wrong_parameter             = 3
      error_no_gui                = 4
      not_supported_by_gui        = 5
      OTHERS                      = 6 ).

IF sy-subrc = 0.
  WRITE: / 'Anzahl Directory + Files: ', lv_file_count.
  WRITE: /.
  WRITE: / 'Directory:'.
  WRITE: / '----------'.

  LOOP AT it_file_table INTO s_file_table.
    WRITE: / s_file_table-filename.
  ENDLOOP.
ELSE.
  MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.

[ABAP] Oberflächenelemente per Button ausblenden

TABLES: sscrfields.

CONSTANTS: BEGIN OF e_status,
             open  TYPE i VALUE 0,
             close TYPE i VALUE 1,
           END OF e_status.

DATA: status_blk2 TYPE i.

SELECTION-SCREEN: BEGIN OF BLOCK blk1 WITH FRAME TITLE title1.
PARAMETERS: p1 TYPE string.
SELECTION-SCREEN: END OF BLOCK blk1.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN PUSHBUTTON (4) btn_oc USER-COMMAND btn_cmd_oc.
SELECTION-SCREEN COMMENT 6(25) lbl_oc.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN: BEGIN OF BLOCK blk2 WITH FRAME TITLE title2.
PARAMETERS: s1 TYPE string MODIF ID b2.
PARAMETERS: s2 TYPE string MODIF ID b2.
SELECTION-SCREEN: END OF BLOCK blk2.

INITIALIZATION.
  title1 = 'Kundennummer'.
  title2 = 'Eingabe'.

  lbl_oc  = 'Eingabe'.

  status_blk2 = e_status-close.

  PERFORM set_btn_icon USING status_blk2 CHANGING btn_oc.

AT SELECTION-SCREEN OUTPUT.
  LOOP AT SCREEN INTO DATA(wa).
    CASE wa-group1.       " Name der Modifikationsgruppe
      WHEN 'B2'.          " wenn in Modifikationsgruppe 'B2'
        IF status_blk2 = e_status-open.
          wa-active = '1'.
        ELSE.
          wa-active = '0'.
        ENDIF.
    ENDCASE.

    MODIFY SCREEN FROM wa.
  ENDLOOP.

  PERFORM set_btn_icon USING status_blk2 CHANGING btn_oc.

AT SELECTION-SCREEN.
  CASE sscrfields-ucomm.
    WHEN 'BTN_CMD_OC'.
      IF status_blk2 = e_status-open.
        status_blk2 = e_status-close.
      ELSE.
        status_blk2 = e_status-open.
      ENDIF.
  ENDCASE.

FORM set_btn_icon USING iv_status TYPE i CHANGING btn_icon TYPE any.
  CASE iv_status.
    WHEN e_status-close.
      btn_icon = icon_data_area_expand.
    WHEN e_status-open.
      btn_icon = icon_data_area_collapse.
  ENDCASE.
ENDFORM.

[ABAP] SALV-Table – Zeilen farbig anzeigen

TYPES: BEGIN OF ty_s_sflight,
         fldate	   TYPE s_date,
         planetype TYPE s_planetye,
         seatsmax	 TYPE s_seatsmax,
         seatsocc	 TYPE s_seatsocc,
         color     TYPE lvc_t_scol, " Farbspalte
       END OF ty_s_sflight.

TYPES: ty_it_sflight TYPE STANDARD TABLE OF ty_s_sflight WITH DEFAULT KEY.

START-OF-SELECTION.

  DATA(it_sflight) = VALUE ty_it_sflight( ).

  SELECT fldate,
         planetype,
         seatsmax,
         seatsocc
    INTO CORRESPONDING FIELDS OF TABLE @it_sflight
    FROM sflight.

  TRY.
      DATA: o_alv TYPE REF TO cl_salv_table.

      cl_salv_table=>factory( IMPORTING r_salv_table = o_alv
                              CHANGING  t_table      = it_sflight ).

* Farben in der Tabellen-Spalte 'COLOR' setzen
      LOOP AT it_sflight ASSIGNING FIELD-SYMBOL(<f>).
* Wenn >= 370 Belegte Plätze in der Economy Class
        IF <f>-seatsocc >= 370.
* in die Spalte COLOR wird für jede Tabellen-Zeile eine Farbtabelle eingefügt
          <f>-color = VALUE #( ( color-col = 5  " grün
                                 color-int = 0
                                 color-inv = 0
                               )
                             ).
        ENDIF.
      ENDLOOP.

* Namen der Farbspalte setzen
      o_alv->get_columns( )->set_color_column( 'COLOR' ).

* Grid anzeigen
      o_alv->display( ).
    CATCH cx_root INTO DATA(e_text).
      WRITE: / e_text->get_text( ).
  ENDTRY.

Links

[ABAP] Enumerator definieren

ab Release 751

* https://blogs.sap.com/2016/10/10/abap-news-release-7.51-enumerations/ 
TYPES:
  BEGIN OF ENUM e_drive_mode,
    forward,
    backward,
  END OF ENUM e_drive_mode.

DATA: lv_drivemode TYPE e_drive_mode.
lv_drivemode = forward.

DATA: lv_num TYPE i.
lv_num = CONV i( lv_drivemode ).

WRITE: / lv_drivemode, lv_num.

bis Release 750

CONSTANTS: BEGIN OF e_status,
             open      TYPE i VALUE 0,
             close     TYPE i VALUE 1,
             undefined TYPE i VALUE 2,
           END OF e_status.

[ABAP] Dynamische Dokumente mit SALV-Form LayoutGrid / ABAP-Renderer erstellen

START-OF-SELECTION.

* Grid
  DATA(o_grid) = NEW cl_salv_form_layout_grid( ).

* Gridlines
  o_grid->set_grid_lines( if_salv_form_c_grid_lines=>lines ).

* Header (Überschrift), Colspan
  DATA(o_head) = o_grid->create_header_information( row = 1
                                                    column = 1
                                                    text = 'Überschrift'
                                                    colspan = 2 ).

* Header Align Center
  DATA: o_al_head TYPE REF TO cl_salv_form_layout_data_grid.
  o_al_head ?= o_head->get_layout_data( ).
  o_al_head->set_h_align( if_salv_form_c_h_align=>center ).

* Text
  DATA(o_text) = o_grid->create_text( row = 2
                                      column  = 2
                                      text    = 'Right'
                                      tooltip = 'Right' ).

* Text Align Right
  DATA: o_al_text TYPE REF TO cl_salv_form_layout_data_grid.
  o_al_text ?= o_text->get_layout_data( ).
  o_al_text->set_h_align( if_salv_form_c_h_align=>right ).

* GroupBox
  DATA(o_grp1) = NEW cl_salv_form_groupbox( header = 'My Groupbox 1' ).
  o_grid->set_element( row = 3
                       column = 1
                       r_element = o_grp1 ).

  DATA(o_grp_grid) = o_grp1->create_grid( ).
  o_grp_grid->set_grid_lines( if_salv_form_c_grid_lines=>lines ).
  o_grp_grid->create_text( row = 1
                           column = 1
                           text = 'Icon' ).

* Icon
  DATA(o_icon) = NEW cl_salv_form_icon( icon = icon_header
                                        tooltip = 'Tooltip for Icon' ).

  o_grp_grid->set_element( row       = 1
                           column    = 2
                           r_element = o_icon ).

* Label, Text
  DATA(o_label) = o_grid->create_label( row = 4
                                        column = 1
                                        text = 'Name:' ).
  o_text = o_grid->create_text( row = 4
                                column = 2
                                text = 'Herr Mayer' ).
  o_label->set_label_for( o_text ).

* Row
  DATA(o_row) = o_grid->add_row( ).
  o_label = o_row->create_label( text = 'Firma:' ).
  o_text = o_row->create_text( text = 'Beier' ).
  o_label->set_label_for( o_text ).

* HTML-Renderer
  DATA(o_form) = NEW cl_salv_form_window_dydos( popup = abap_true     " als modales Fenster anzeigen, nicht verfügbar bei cl_salv_form_window_abap
                                                r_content = o_grid ).

* Status
  DATA(o_status) = o_form->get_status( ).
  o_status->set_titlebar( titlebar       = 'FORM1_TITLE'              " GUI-Titel der Anwendung muss gepflegt sein
                          titlebar_repid = sy-repid ).

* Display
  o_form->display( ).

[ABAP] Anzeige der Toolbar unterdrücken / ausschalten

Variante 1 (cl_abap_list_layout)

PARAMETERS: p_matnr TYPE matnr.

AT SELECTION-SCREEN OUTPUT.
* Unterdrückt die Applikationszeile auf dem Listdynpro
  cl_abap_list_layout=>suppress_toolbar( ).

START-OF-SELECTION.
  WRITE: / p_matnr.

Variante 2 (RPY_DYNPRO_READ, RPY_DYNPRO_INSERT)

PARAMETERS: p_matnr TYPE matnr.

AT SELECTION-SCREEN OUTPUT.

  DATA: lv_header               TYPE rpy_dyhead.
  DATA: it_containers           TYPE dycatt_tab.
  DATA: it_fields_to_containers TYPE dyfatc_tab.
  DATA: it_flow_logic           TYPE swydyflow.

* Lesen eines Dynpros
  CALL FUNCTION 'RPY_DYNPRO_READ'
    EXPORTING
      progname             = sy-cprog
      dynnr                = sy-dynnr
    IMPORTING
      header               = lv_header
    TABLES
      containers           = it_containers
      fields_to_containers = it_fields_to_containers
      flow_logic           = it_flow_logic
    EXCEPTIONS
      cancelled            = 1
      not_found            = 2
      permission_error     = 3
      OTHERS               = 4.

  IF sy-subrc = 0.
* Anzeige der Toolbar prüfen
    IF lv_header-no_toolbar = abap_false.
      lv_header-no_toolbar = abap_true.

* Einfügen eines Dynpros
      CALL FUNCTION 'RPY_DYNPRO_INSERT'
        EXPORTING
          header                 = lv_header
          suppress_exist_checks  = abap_true
        TABLES
          containers             = it_containers
          fields_to_containers   = it_fields_to_containers
          flow_logic             = it_flow_logic
        EXCEPTIONS
          cancelled              = 1
          already_exists         = 2
          program_not_exists     = 3
          not_executed           = 4
          missing_required_field = 5
          illegal_field_value    = 6
          field_not_allowed      = 7
          not_generated          = 8
          illegal_field_position = 9
          OTHERS                 = 10.
    ENDIF.
  ENDIF.

START-OF-SELECTION.
  WRITE: / p_matnr.