Demo zu Desktop Office Integration Demoprogramme zur Desktop Office Integration. Entwicklungsklasse: SOFFICEINTEGRATION SAPRDEMO_PIVOTINTERFACE SAPRDEMO_SPREADSHEET_INTERFACE SAPRDEMO_TABLES_IN_EXCEL SAPRDEMOEXCELINTEGRATION2 DOI-Demo von Black_Adept Screenshot Excel (inplace) mit Daten füllen Coding * Darstellung Inplace auf Dynpro 9000 in einem Containercontrol namens * CONTAINER_9000 * Minimale Fehlerbehandlung REPORT zzdoidemo. TYPE-POOLS: soi. CONSTANTS: c_containername TYPE text20 VALUE CONTAINER_9000. * Definition der benötigten Controls DATA: cl_container TYPE REF TO cl_gui_custom_container, Container cl_control TYPE REF TO i_oi_container_control, OIContainerCtrl cl_document TYPE REF TO i_oi_document_proxy, Office Dokument cl_spreadsheet TYPE REF TO i_oi_spreadsheet. Spreadsheet
DATA: t_ranges t_contents TYPE soi_range_list, TYPE soi_generic_table. DATA: t_daten TYPE STANDARD TABLE OF d010sinf Demodaten WITH NON-UNIQUE DEFAULT KEY INITIAL SIZE 100, ok_code TYPE syucomm. Für Dynpro 9000 START-OF-SELECTION. *** Demodaten selektieren SELECT * UP TO 100 ROWS INTO TABLE t_daten FROM d010sinf WHERE prog LIKE Z%. END-OF-SELECTION. * 1. Aufbau des Spreadsheet-Interfaces * Version: * Leeres Blatt alternativ kann man auch einen bestehenden * File vom Frontend oder aus dem BOR öffnen. * Kommentar an der relevanten Stelle in der folgenden Routine PERFORM build_spreadsheet_interface. * Die Tabellenkalkulationsschnittstelle arbeitet mit benannten Bereichen * Zur Demo werde ich einen n Zeilen, 5 Spalten großen Bereich * definieren, in den ich nachher dann Daten einfülle PERFORM build_named_areas. * Daten zur Verfügung stellen PERFORM set_data_into_sheet. CALL SCREEN 9000. * Freigabe der Objekte FREE cl_spreadsheet. CLEAR: cl_spreadsheet. IF NOT cl_document IS INITIAL. CALL METHOD cl_document->release_document. FREE: cl_document, cl_control, cl_container. CLEAR: cl_document, cl_control, cl_container.
*& Form build_spreadsheet_interface FORM build_spreadsheet_interface. TYPES: tyt_errors TYPE STANDARD TABLE OF REF TO i_oi_error WITH NON-UNIQUE DEFAULT KEY. DATA: error t_errors TYPE REF TO i_oi_error, TYPE tyt_errors, repid TYPE syrepid, dynnr TYPE sydynnr. * Container erzeugen repid = sy-repid. dynnr = 9000. CREATE OBJECT cl_container container_name = c_containername repid = repid dynnr = dynnr EXCEPTIONS cntl_error = 1 cntl_system_error = 2 create_error = 3 lifetime_error = 4 lifetime_dynpro_dynpro_link = 5 others = 6. IF sy-subrc <> 0. BREAK-POINT.STOP. ************************************************************************ ** Hier geht die DOI-Erzeugung los ************************************************************************ * Instanz des OI-controls erzeugen CALL METHOD c_oi_container_control_creator=>get_container_control control = cl_control * control aufbauen CALL METHOD cl_control->init_control inplace_enabled = X * INPLACE_SHOW_TOOLBARS = r3_application_name = Demo Document Container parent = cl_container
error = error EXCEPTIONS * javabeannotsupported = 1 ex. nicht im Minisap OTHERS = 2. IF sy-subrc <> 0. BREAK-POINT. STOP. * Documentproxy holen CALL METHOD cl_control->get_document_proxy document_type = Excel.Sheet EXCEL * document_type = Word.Document WORD document_proxy = cl_document * Leeres Dokument erzeugen, CALL METHOD cl_document->create_document document_title = Demo für Enno sichtbar wenn nicht inplace open_inplace = X * OPEN_READONLY = * Alternativ: vorhandenes Dokument öffnen: * Mit der Methode cl_document->open_document kann man ein schon * vorhandenes Dokument ( etwa eine Vorlage öffnen ). * Falls du eine lokale Datei öffnen willst: URL muss mit file://' * beginnen dahinter dann gleich der Filename. Beliebt ist auch * eine URL aus dem BOR * Und Spreadsheetinterface drüberlegen CALL METHOD cl_document->get_spreadsheet_interface no_flush = error = error sheet_interface = cl_spreadsheet. sy-subrc = 0. LOOP AT t_errors INTO error. CALL METHOD error->raise_message type = E
EXCEPTIONS message_raised = 1 flush_failed = 2. ENDLOOP. ENDFORM. build_spreadsheet_interface *& Form build_named_areas FORM build_named_areas. DATA: error TYPE REF TO i_oi_error, rows TYPE i, columns TYPE i. columns = 5. DESCRIBE TABLE t_daten LINES rows. * Datenbereich benennen CALL METHOD cl_spreadsheet->insert_range_dim Reicht bei nächstem Aufruf name = ALL left = 2 top = 8 rows = rows columns = columns * Faul sein und Rangestabelle zurückgeben lassen CALL METHOD cl_spreadsheet->get_ranges_names error = error ranges = t_ranges. ENDFORM. build_named_areas *& Form set_data_into_sheet FORM set_data_into_sheet. DATA: error TYPE REF TO i_oi_error, wa_range LIKE LINE OF t_ranges, wa_daten LIKE LINE OF t_daten, wa_content LIKE LINE OF t_contents. * ACHTUNG es müssen ALLE einträge in der Rangelist versorg werden * und dort müssen auch ALLE Zellen ( auch wenn sie leer sind ) einmal * auftauchen DELETE t_ranges WHERE NOT name = ALL. CLEAR t_contents.
LOOP AT t_ranges INTO wa_range. CASE wa_range-name. WHEN ALL. LOOP AT t_daten INTO wa_daten. CLEAR wa_content. * Row und Column beziehen sich auf die linke obere Ecke des Bereichs wa_content-row = sy-tabix. wa_content-column = 1. wa_content-value = wa_daten-prog. wa_content-value = wa_daten-cnam. WRITE wa_daten-cdat TO wa_content-value. WRITE wa_daten-udat TO wa_content-value. WRITE wa_daten-utime TO wa_content-value. ENDLOOP. WHEN OTHERS. BREAK-POINT.STOP. sollte nicht vorkommen, wenn korrekt ENDCASE. ENDLOOP. * ACHTUNG! Formatierung VOR dem Setzen der Daten. Sonst kommt es bei * z.b. Datumsfeldern zu seltsamen Effekten. Zum Testen die * Formatierungsroutine mal HINTER die Datensetzenroutine setzen * und staunen. DATA t_cells TYPE soi_cell_table. DATA wa_cell LIKE LINE OF t_cells. wa_cell-top = 10. wa_cell-left = 3. wa_cell-rows = 5. wa_cell-columns = 2. wa_cell-front = 5. Blau siehe Doku in SAP-Bibliothek wa_cell-back = 27. wa_cell-bold = 1. wa_cell-number = 0. wa_cell-font = Courier New. wa_cell-size = -1. Default APPEND wa_cell TO t_cells. * Und ein paar Zellen formatieren Bereiche lassen sich mit einer * anderen Methode schnell komplett formatieren. CALL METHOD cl_spreadsheet->cell_format
cells = t_cells * Und jetzt die Daten in Spreadsheet schießen CALL METHOD cl_spreadsheet->set_ranges_data ranges = t_ranges contents = t_contents updating = -1 * Spaltenbreiten Optimieren CALL METHOD cl_spreadsheet->fit_widest no_flush = name = ALL ENDFORM. set_data_into_sheet *& Form free_objects FORM free_objects. *** Freigabe der Objekte IF NOT cl_document IS INITIAL. CALL METHOD cl_document->release_document. CALL METHOD cl_document->close_document. FREE cl_document. IF NOT cl_control IS INITIAL. CALL METHOD cl_control->destroy_control. FREE cl_control. FREE: cl_spreadsheet. CLEAR: cl_spreadsheet. FREE: cl_container. CLEAR: cl_container. ENDFORM. *& Module STATUS_9000 OUTPUT MODULE status_9000 OUTPUT.
SET PF-STATUS 9000. SET TITLEBAR 9000. ENDMODULE. STATUS_9000 OUTPUT *& Module USER_COMMAND_9000 INPUT MODULE user_command_9000 INPUT. CASE ok_code. WHEN BACK. PERFORM free_objects. SET SCREEN 0. LEAVE SCREEN. ENDCASE. ENDMODULE. USER_COMMAND_9000 INPUT Ablauflogik Dynpro 9000 PROCESS BEFORE OUTPUT. MODULE STATUS_9000. * PROCESS AFTER INPUT. MODULE USER_COMMAND_9000. Status 9000 Der PF-Status vom Dynpro 9000