Kategorien
-
Neueste Beiträge
- [ABAP] Prüfen, ob ein bestimmer Festwert in einer Domäne vorhanden ist
- [SAP] Drucker für Benutzer festlegen
- [SAP Fiori] Fiori Launchpad erweitern, Systeminformationen im Launchpad anzeigen
- [SAP Gateway] ODATA V4 Service für anonymen Zugriff einrichten
- [ABAP] Varianten eines Reports lesen
- Warum Krebspatienten so viel Gewicht verlieren
- [SAP Fiori] ABAP RESTful Application Programming Model (RAP)
- [SAP] Events und Typkoppelungen
- [SAP Gateway] Daten versenden über einen eventbasierten Aufruf einer OData-Funktion
- [ABAP] SE80: Tricks für den ABAP-Editor
[SAP EWM] ITSmobile Visual Editor
[SAP EWM] SAP EWM Startseite
[SAP EWM] Produktpräsentation für SAP EWM
[ABAP] Excel-Ole Komplexbeispiel
DATA: o_excel TYPE ole2_object. DATA: o_workbook TYPE ole2_object. DATA: o_sheet TYPE ole2_object. DATA: o_cell TYPE ole2_object. DATA: o_range TYPE ole2_object. DATA: o_font TYPE ole2_object. DATA: o_border TYPE ole2_object. DATA: o_column TYPE ole2_object. DATA: o_interior TYPE ole2_object. DATA: o_page TYPE ole2_object. DATA: cell_value TYPE string. PARAMETERS: p_fname TYPE file_table-filename OBLIGATORY DEFAULT 'c:\temp\Test.xlsx'. * wenn die F4-Hilfe für den Dateinamen aufgerufen wird AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_fname. DATA: lv_action TYPE i. DATA: lv_filename TYPE string. DATA: lv_fullpath TYPE string. DATA: lv_path TYPE string. * FileOpen-Dialog aufrufen TRY. cl_gui_frontend_services=>file_save_dialog( EXPORTING default_extension = 'xlsx' default_file_name = |{ p_fname }| file_filter = |MS Excel (*.xlsx)\|*.xlsx\|{ cl_gui_frontend_services=>filetype_all }| prompt_on_overwrite = abap_true CHANGING filename = lv_filename " Dateiname path = lv_path " Pfad fullpath = lv_fullpath " Pfad + Dateiname user_action = lv_action ). " Benutzeraktion IF lv_action EQ cl_gui_frontend_services=>action_ok. p_fname = lv_fullpath. ENDIF. CATCH cx_root INTO DATA(e_text). " Oberklasse für Exceptions abfangen und Kurztext übergeben MESSAGE e_text->get_text( ) TYPE 'I'. " Exception Kurztext ausgeben ENDTRY. START-OF-SELECTION. TRY. * Excel starten CREATE OBJECT o_excel 'Excel.Application'. IF sy-subrc NE 0. WRITE : / 'Fehler.'. ELSE. * Excel sichtbar SET PROPERTY OF o_excel 'Visible' = 1. * Anzahl Sheets setzen SET PROPERTY OF o_excel 'SheetsInNewWorkbook' = 1. * Workbook holen CALL METHOD OF o_excel 'WorkBooks' = o_workbook. * neues Workbook mit einer Sheet hinzufügen CALL METHOD OF o_workbook 'Add'. * 1. Sheet holen CALL METHOD OF o_excel 'Worksheets' = o_sheet EXPORTING #1 = 1. * Sheet activieren CALL METHOD OF o_sheet 'Activate'. * Sheet benennen SET PROPERTY OF o_sheet 'Name' = 'Tabelle mit Testwerten'. * Zelle 1,1 ermitteln CALL METHOD OF o_excel 'Cells' = o_cell EXPORTING #1 = 1 " Zeile #2 = 1. " Spalte * Wert schreiben SET PROPERTY OF o_cell 'Value' = 'Text 1_1'. * Zellen-Objekt wieder freigeben FREE OBJECT o_cell. * Zelle 1,2 ermitteln CALL METHOD OF o_excel 'Cells' = o_cell EXPORTING #1 = 1 " Zeile #2 = 2. " Spalte * Wert schreiben SET PROPERTY OF o_cell 'Value' = 'Text 1_2'. * Zellen-Objekt wieder freigeben FREE OBJECT o_cell. * Zelle 2,1 ermitteln CALL METHOD OF o_excel 'Cells' = o_cell EXPORTING #1 = 2 " Zeile #2 = 1. " Spalte * Wert schreiben SET PROPERTY OF o_cell 'Value' = 'Text 2_1'. * Zellen-Objekt wieder freigeben FREE OBJECT o_cell. * Zelle 2,2 ermitteln CALL METHOD OF o_excel 'Cells' = o_cell EXPORTING #1 = 2 " Zeile #2 = 2. " Spalte * Wert schreiben SET PROPERTY OF o_cell 'Value' = 'Text 2_2'. * Zellen-Objekt wieder freigeben FREE OBJECT o_cell. * Range (Bereich) [A2:B2] definieren CALL METHOD OF o_excel 'Range' = o_range EXPORTING #1 = 'A2' #2 = 'B2'. * Range Schrift setzen GET PROPERTY OF o_range 'Font' = o_font. SET PROPERTY OF o_font 'Bold' = 1. SET PROPERTY OF o_font 'ColorIndex' = 4. SET PROPERTY OF o_font 'Size' = 12. * Font-Objekt wieder freigeben FREE OBJECT o_font. * Rahmen für Range setzen CALL METHOD OF o_range 'Select' . CALL METHOD OF o_range 'BorderAround' EXPORTING #1 = 1 " Stil #2 = 2. " Dicke (1..4) * Zellhintergrund für Range setzen CALL METHOD OF o_range 'Interior' = o_interior. SET PROPERTY OF o_interior 'ColorIndex' = 6. " gelb SET PROPERTY OF o_interior 'Pattern' = 1. * Hintergrund-Objekt wieder freigeben FREE OBJECT o_interior. * Range-Objekt wieder freigeben FREE OBJECT o_range. * Zelle ermitteln CALL METHOD OF o_excel 'Cells' = o_cell EXPORTING #1 = 1 " Zeile #2 = 2. " Spalte * Zellwert holen GET PROPERTY OF o_cell 'Value' = cell_value. * Zell-Objekt wieder freigeben FREE OBJECT o_cell. * Zellwert ausgeben WRITE: / cell_value. * Zelle ermitteln CALL METHOD OF o_excel 'Cells' = o_cell EXPORTING #1 = 2 " Zeile #2 = 2. " Spalte * Font der Zelle holen und Darstellung ändern GET PROPERTY OF o_cell 'Font' = o_font. SET PROPERTY OF o_font 'Name' = 'Courier New'. " Schriftart SET PROPERTY OF o_font 'Bold' = 0. " Schriftstil: 0 - normal, 1 - fett SET PROPERTY OF o_font 'Italic' = 1. " Schriftstil: 0 - normal, 1 - Italic SET PROPERTY OF o_font 'ColorIndex' = 5. " Farbindex: 1=Schwarz, 2=weiss, 3=rot, 4=grün, 5=blau, 6=gelb SET PROPERTY OF o_font 'Size' = 16. " Schriftgröße [px] SET PROPERTY OF o_font 'Underline' = 2. " xlUnderlineStyleSingle * Font-Objekt wieder freigeben FREE OBJECT o_font. * Zell-Objekt wieder freigeben FREE OBJECT o_cell. * Spaltenbreite automatisch anpassen CALL METHOD OF o_excel 'Columns' = o_column. CALL METHOD OF o_column 'Autofit'. * Spalten-Objekt wieder freigeben FREE OBJECT o_column. * Spalte 1 holen CALL METHOD OF o_excel 'Columns' = o_column EXPORTING #1 = 1. " erste Spalte * Spaltenformat festlegen SET PROPERTY OF o_column 'NumberFormat' = '@'. " Format: "Text" * Spalten-Objekt wieder freigeben FREE OBJECT o_column. * " Inhalt der Zwischenablage in die akt. Sheet Zelle 'A1' kopieren * CALL METHOD OF o_excel 'Cells' = o_cell * EXPORTING * #1 = 1 " Zeile * #2 = 1. " Spalte * CALL METHOD OF o_cell 'SELECT'. * CALL METHOD OF o_sheet 'Paste'. * " Objekt wieder freigeben * FREE OBJECT o_cell. * Seitenausrichtung -> Querformat GET PROPERTY OF o_sheet 'PageSetup' = o_page. SET PROPERTY OF o_page 'Orientation' = 2. " xlLandscape SET PROPERTY OF o_page 'PrintGridlines' = 1. " Gitterlinien drucken SET PROPERTY OF o_page 'LeftMargin' = '5.00'. " Seitenränder SET PROPERTY OF o_page 'RightMargin' = '2.00'. SET PROPERTY OF o_page 'TopMargin' = '2.00'. SET PROPERTY OF o_page 'BottomMargin'= '2.00'. * Seiten-Objekt wieder freigeben FREE OBJECT o_page. * Drucken * CALL METHOD OF o_workbook 'PrintOut' . * MessageDialog für Überschreiben einer bestehenden Datei unterdrücken SET PROPERTY OF o_excel 'DisplayAlerts' = 0. * Datei speichern unter ... CALL METHOD OF o_sheet 'SaveAs' EXPORTING #1 = p_fname. * #2 = 1. " Fileformat * Alle Messages in Excel wieder zulassen SET PROPERTY OF o_excel 'DisplayAlerts' = -1. * Workbook schließen CALL METHOD OF o_workbook 'Close'. * Excel schließen CALL METHOD OF o_excel 'Quit'. * Objekte freigeben FREE OBJECT: o_sheet, o_workbook, o_excel. ENDIF. CATCH cx_root INTO DATA(e_text). " Oberklasse für Exceptions abfangen und Kurztext übergeben MESSAGE e_text->get_text( ) TYPE 'I'. " Exception Kurztext ausgeben ENDTRY.
[ABAP] Verfügbare Tabellenfelder einer Tabelle / eines Views und referenzierte Prüftabellen (Fremdschlüssel) lesen
* Tabellen-/Viewname PARAMETERS: p_tname TYPE dd08l-tabname DEFAULT 'LIKPUK'. START-OF-SELECTION. * R/3-DD: Beziehungsdefinitionen SELECT * INTO TABLE @DATA(it_dd08l) FROM dd08l WHERE tabname = @p_tname. IF sy-subrc = 0. cl_demo_output=>display( it_dd08l ). ENDIF.
[MS Word] Seitenzahlen bei Abschnittswechsel
Manchmal kommt es vor, dass durch das Einfügen von Abschnittswechseln die Seitenzahlen seltsam durchnumeriert (z.B. 0/20) sind.
Lösung 1
Seitenzahlen erst. einfügen, wenn das Dokument “fertiggestellt” ist (wenn alle Abschnittswechsel bereits vorher eingefügt worden sind).
Lösung 2
Wenn nachträglich Abschnittswechsel eingefügt wurden, dann kann im Menü mit
Menü -> Einfügen -> Seitenzahl -> Seitenzahlen formatieren ... -> Seitennummerierung -> Fortsetzen mit vorherigem Abschnitt
die Seitenzahlennummerierung pro Abschnitt weitergeführt werden. Es ist dabei darauf zu achten, dass nicht wieder für den allerersten Abschnitt diese Eigenschaft gesetzt wird, da sonst auch auf dem Deckblatt Seitenzahlen stehen.
Alle Seitenzahlen im gesamten Dokument können wieder im Menü über
Menü -> Einfügen -> Seitenzahl -> Seitenzahlen entfernen
entfernt werden.
[ABAP] Dynamische WHERE-Clause für AMDP aus SELECT-OPTIONS / RANGES generieren
Bei Datenbankzugriffen mit AMDP / NATIVE SQL besteht nicht die Möglichkeit einfach RANGES in den SELECT-Statements zu übergeben.
Die RANGES müssen dazu zuerst in einen String umgewandelt werden. Dieser String kann dann in der WHERE-Condition verarbeitet werden.
Variante 1 (cl_shdb_seltab)
DATA: lv_usnam TYPE rkpf-usnam. SELECT-OPTIONS: so_usnam FOR lv_usnam. INITIALIZATION. so_usnam[] = VALUE #( ( sign = 'I' option = 'EQ' low = 'USER1' high = '' ) ( sign = 'I' option = 'EQ' low = 'USER2' high = '' ) ). START-OF-SELECTION. * wandelt ein SELECT-OPTIONS / RANGE in WHERE-String um TRY. * WHERE-Condition ohne fehlerhaft gesetzte Klammern und unnötige Leerzeichen DATA(lv_where) = condense( cl_shdb_seltab=>new( so_usnam[] )->sql_where_condition( 'USNAM' ) ). WRITE: / lv_where. CATCH cx_root INTO DATA(e_txt). ENDTRY.
Variante 2 (cl_shdb_seltab, erzeugt fehlerhaftes WHERE-Statement)
DATA: lv_usnam TYPE rkpf-usnam. SELECT-OPTIONS: so_usnam FOR lv_usnam. INITIALIZATION. so_usnam[] = VALUE #( ( sign = 'I' option = 'EQ' low = 'USER1' high = '' ) ( sign = 'I' option = 'EQ' low = 'USER2' high = '' ) ). START-OF-SELECTION. * wandelt ein oder mehrere SELECT-OPTIONS / RANGE in WHERE-String um TRY. * WHERE-Condition mit fehlerhaft gesetzte Klammern und unnötigen Leerzeichen DATA(lv_where) = cl_shdb_seltab=>combine_seltabs( it_named_seltabs = VALUE #( ( name = 'USNAM' " RKPF-USNAM dref = REF #( so_usnam[] ) " Referenz auf SELECT-OPTIONS / RANGE ) ) ). WRITE: / lv_where. CATCH cx_root INTO DATA(e_txt). ENDTRY.
Variante 3 (cl_lib_seltab, OBSOLET)
DATA: lv_usnam TYPE rkpf-usnam. SELECT-OPTIONS: so_usnam FOR lv_usnam. INITIALIZATION. so_usnam[] = VALUE #( ( sign = 'I' option = 'EQ' low = 'USER1' high = '' ) ( sign = 'I' option = 'EQ' low = 'USER2' high = '' ) ). START-OF-SELECTION. * wandelt ein SELECT-OPTIONS / RANGE in WHERE-String um TRY. * WHERE-Condition ohne fehlerhaft gesetzte Klammern und unnötige Leerzeichen DATA(lv_where) = condense( cl_lib_seltab=>new( so_usnam[] )->sql_where_condition( 'USNAM' ) ). WRITE: / lv_where. CATCH cx_root INTO DATA(e_txt). ENDTRY.
Variante 4 (FREE_SELECTIONS_RANGE_2_WHERE)
DATA: lv_usnam TYPE rkpf-usnam. SELECT-OPTIONS: so_usnam FOR lv_usnam. INITIALIZATION. so_usnam[] = VALUE #( ( sign = 'I' option = 'EQ' low = 'USER1' high = '' ) ( sign = 'I' option = 'EQ' low = 'USER2' high = '' ) ). START-OF-SELECTION. DATA(it_ranges) = VALUE rsds_trange( ( * Tabellenname tablename = 'RKPF' frange_t = VALUE #( ( * Feldname fieldname = 'USNAM' * RANGE aus SELECT-OPTIONS selopt_t = VALUE #( FOR <so> IN so_usnam ( sign = <so>-sign option = <so>-option low = <so>-low high = <so>-high ) ) ) ) ) ). * Rückgabe DATA: it_where TYPE rsds_twhere. * Freie Abgrenzungen: Konvertierung Format RSDS_TRANGE ==> RSDS_TWHERE CALL FUNCTION 'FREE_SELECTIONS_RANGE_2_WHERE' EXPORTING field_ranges = it_ranges IMPORTING where_clauses = it_where. * Ausgabe LOOP AT it_where ASSIGNING FIELD-SYMBOL(<e>). WRITE: / 'Table:', <e>-tablename. LOOP AT <e>-where_tab ASSIGNING FIELD-SYMBOL(<w>). WRITE: / <w>-line. ENDLOOP. ENDLOOP.
Links
[ABAP] Infos zu einem DB-View lesen
PARAMETERS: p_view TYPE ddobjname DEFAULT 'LIKPUK'. * Views mit Texten DATA: lv_dd25v TYPE dd25v. * DD: Technische Einstellungen von Tabellen DATA: lv_dd09l TYPE dd09l. * View auf Basistabellen eines Views aus Tabelle DD26S DATA: it_dd26v_tab TYPE STANDARD TABLE OF dd26v. * View auf Felder eines SAP-Tabellenviews aus Tabelle DD27S DATA: it_dd27p_tab TYPE STANDARD TABLE OF dd27p. * Interne Struktur für Joins von Views DATA: it_dd28j_tab TYPE STANDARD TABLE OF dd28j. * View auf Selektionsbedingung DATA: it_dd28v_tab TYPE STANDARD TABLE OF dd28v. CALL FUNCTION 'DDIF_VIEW_GET' EXPORTING name = p_view IMPORTING dd25v_wa = lv_dd25v dd09l_wa = lv_dd09l TABLES dd26v_tab = it_dd26v_tab dd27p_tab = it_dd27p_tab dd28j_tab = it_dd28j_tab dd28v_tab = it_dd28v_tab EXCEPTIONS illegal_input = 1 OTHERS = 2. IF sy-subrc = 0. cl_demo_output=>write_data( lv_dd25v ). cl_demo_output=>write_data( lv_dd09l ). cl_demo_output=>write_data( it_dd26v_tab ). cl_demo_output=>write_data( it_dd27p_tab ). cl_demo_output=>write_data( it_dd28j_tab ). cl_demo_output=>write_data( it_dd28v_tab ). cl_demo_output=>display( ). ENDIF.
[ABAP] Verfügbare DB-Views zu Tabellen suchen
TYPES : BEGIN OF ty_s_views, viewname TYPE dd26s-viewname, ddtext TYPE dd25t-ddtext, roottab TYPE dd25l-roottab, viewclass TYPE dd02l-viewclass, viewgrant TYPE dd02l-viewgrant, END OF ty_s_views. TYPES: ty_it_views TYPE STANDARD TABLE OF ty_s_views WITH DEFAULT KEY. DATA: it_views TYPE ty_it_views. CLASS lcl_events DEFINITION. PUBLIC SECTION. CLASS-METHODS: on_double_click FOR EVENT double_click OF cl_salv_events_table IMPORTING row column sender. ENDCLASS. CLASS lcl_events IMPLEMENTATION. METHOD on_double_click. DATA(lv_row) = it_views[ row ]. ASSIGN COMPONENT column OF STRUCTURE lv_row TO FIELD-SYMBOL(<cell>). * views mit texten DATA: lv_dd25v TYPE dd25v. * DD: Technische Einstellungen von Tabellen DATA: lv_dd09l TYPE dd09l. * View auf Basistabellen eines Views aus Tabelle DD26S DATA: it_dd26v_tab TYPE STANDARD TABLE OF dd26v. * View auf Felder eines SAP-Tabellenviews aus Tabelle DD27S DATA: it_dd27p_tab TYPE STANDARD TABLE OF dd27p. * Interne Struktur für Joins von Views DATA: it_dd28j_tab TYPE STANDARD TABLE OF dd28j. * View auf Selektionsbedingung DATA: it_dd28v_tab TYPE STANDARD TABLE OF dd28v. CALL FUNCTION 'DDIF_VIEW_GET' EXPORTING name = <cell> IMPORTING dd25v_wa = lv_dd25v dd09l_wa = lv_dd09l TABLES dd26v_tab = it_dd26v_tab dd27p_tab = it_dd27p_tab dd28j_tab = it_dd28j_tab dd28v_tab = it_dd28v_tab EXCEPTIONS illegal_input = 1 OTHERS = 2. IF sy-subrc = 0. cl_demo_output=>write_data( lv_dd25v ). cl_demo_output=>write_data( lv_dd09l ). cl_demo_output=>write_data( it_dd26v_tab ). cl_demo_output=>write_data( it_dd27p_tab ). cl_demo_output=>write_data( it_dd28j_tab ). cl_demo_output=>write_data( it_dd28v_tab ). cl_demo_output=>display( ). ENDIF. ENDMETHOD. ENDCLASS. DATA: lv_tab TYPE dd26s-fortabname. SELECT-OPTIONS: so_tabs FOR lv_tab. INITIALIZATION. so_tabs[] = VALUE #( ( sign = 'I' option = 'EQ' low = 'MARA' high = '' ) ( sign = 'I' option = 'EQ' low = 'MARC' high = '' ) ). START-OF-SELECTION. DATA(lv_lang) = cl_abap_syst=>get_logon_language( ). SELECT s~viewname, t~ddtext, r~roottab, l~viewclass, l~viewgrant INTO TABLE @it_views FROM dd26s AS s INNER JOIN dd02l AS l ON l~tabname = s~viewname INNER JOIN dd25l AS r ON r~viewname = l~tabname INNER JOIN dd25t AS t ON t~viewname = l~tabname WHERE s~fortabname IN @so_tabs AND l~as4local = 'A' AND l~tabclass = 'VIEW' AND t~ddlanguage = @lv_lang. IF sy-subrc = 0. SORT: it_views BY viewname. TRY. DATA: o_salv TYPE REF TO cl_salv_table. cl_salv_table=>factory( IMPORTING r_salv_table = o_salv CHANGING t_table = it_views ). LOOP AT o_salv->get_columns( )->get( ) ASSIGNING FIELD-SYMBOL(<c>). DATA(o_col) = <c>-r_column. o_col->set_short_text( '' ). o_col->set_medium_text( '' ). o_col->set_long_text( |{ o_col->get_columnname( ) } [{ o_col->get_long_text( ) }]| ). ENDLOOP. o_salv->get_functions( )->set_all( abap_true ). o_salv->get_columns( )->set_optimize( abap_true ). o_salv->get_display_settings( )->set_list_header( |Views: { lines( it_views ) }| ). o_salv->get_display_settings( )->set_striped_pattern( abap_true ). o_salv->get_selections( )->set_selection_mode( if_salv_c_selection_mode=>row_column ). SET HANDLER lcl_events=>on_double_click FOR o_salv->get_event( ). o_salv->display( ). CATCH cx_root INTO DATA(e_txt). WRITE: / e_txt->get_text( ). ENDTRY. ENDIF.