Vous êtes sur la page 1sur 12

*&---------------------------------------------------------------------* *& Report ZQUERYTOLOKAL *& *&---------------------------------------------------------------------* *& *& *&---------------------------------------------------------------------* * Mit diesem Programm kann man das

Ergebnis einer Query * lokal als CSV-Datei speichern. REPORT zquerytolokal LINE-SIZE 1023. * globale Vorlagen TYPE-POOLS: rsr, rzi0, rrx1, rrms, rsbbs, rrkh, rro01, rsdd, rrx2, rsdm4, vrm. INCLUDE: <color>. * Struktur fr Spaltenbreite TYPES: BEGIN OF g_s_col_width, column TYPE rrx1_s_grid-x, width TYPE i, END OF g_s_col_width. TYPES: g_t_col_widths TYPE g_s_col_width OCCURS 0. * Struktur fr interne Tabelle, in der die Inhalte mit * Semikolon getrennt stehen werden. TYPES: BEGIN OF export_type, text TYPE c LENGTH 5120, END OF export_type. * interne Tabelle fr zu bertragende Datenstze DATA: g_t_export TYPE STANDARD TABLE OF export_type. DATA: g_s_export TYPE export_type. * weitere Deklarationen DATA: g_t_grid TYPE DATA: g_t_ranges TYPE DATA: g_s_repkey LIKE DATA: g_handle LIKE DATA: g_handle2 LIKE DATA: g_t_var LIKE DATA: g_t_var2 LIKE DATA: g_x LIKE DATA: g_y LIKE DATA: g_subrc LIKE DATA: g_ucomm LIKE DATA: g_cmdid TYPE DATA: g_t_dim TYPE DATA: g_t_atr TYPE DATA: g_t_mem TYPE DATA: g_t_con TYPE DATA: g_t_fac TYPE DATA: g_t_cel TYPE DATA: g_t_prptys TYPE DATA: g_s_debugflags TYPE DATA: g_t_col_widths TYPE DATA: g_iobjnm TYPE DATA: g_row TYPE DATA: g_row_hide TYPE rrx1_t_grid. rrx1_t_ranges. rszcompkey. "Query-Infos rrx_misc-handle. rrx_misc-handle. rrx_var OCCURS 0. rrx_var OCCURS 0. rrx_grid-x. rrx_grid-y. sy-subrc. sy-ucomm. rrx_menu-cmdid. rrx1_t_dim. rrx1_t_atr. rrx1_t_mem. rrx1_t_con. rrx1_t_fac. rrx1_t_cel. rrx1_t_prptys. rsr_s_debugflags. g_t_col_widths. rs_char30. rsint4. rsint4.

DATA: DATA: DATA: DATA: DATA: DATA: DATA:

g_start_row g_col g_cmd_count g_trace_mode lv_flag lv_count lv_filelength

TYPE TYPE TYPE TYPE TYPE TYPE TYPE

rsint4. rsint4. i. rrx2_trace_mode. c LENGTH 1. i. i.

"Flag "Zhler

DATA: BEGIN OF g_s_200, cnt TYPE REF TO cl_gui_custom_container, tree TYPE REF TO cl_rsr_explain_tree, ref TYPE REF TO cl_rsr_explain_item, END OF g_s_200. * Objekte fr den Export der Datei (OPEN DATASET) DATA: buffer(2048). "Zwischenspeicher DATA: buflen TYPE i. "Breite einer Spalte DATA: target_file_lokal TYPE string. "Pfad+Name der Zieldatei * Variablen fr die Weiterverarbeitung der Parameter DATA: lv_query TYPE c LENGTH 30. DATA: lv_lokal TYPE c LENGTH 200. * Dateiname und -pfad DATA: lv_methfil TYPE DATA: lv_methpat TYPE DATA: lv_methfpa TYPE DATA: lv_datname_c TYPE * Nachrichtentexte DATA: lv_mess01 TYPE DATA: lv_mess02 TYPE DATA: lv_mess03 TYPE DATA: lv_mess04 TYPE DATA: lv_mess05 TYPE DATA: lv_mess06 TYPE DATA: lv_mess07 TYPE DATA: lv_mess08 TYPE DATA: lv_mess09 TYPE DATA: lv_mess10 TYPE DATA: lv_mess11 TYPE string. string. string. c LENGTH 500. "Dateiname "Pfad "Pfad + Dateiname "Dateiname als Char

string. string. string. string. string. string. string. string. string. string. string.

************************************************************************ * Selektionsbild SELECTION-SCREEN BEGIN OF BLOCK datei_erzeugen WITH FRAME TITLE lv_tit_1. PARAMETERS: p_query TYPE rszcompid. PARAMETERS: p_lokal TYPE string. SELECTION-SCREEN END OF BLOCK datei_erzeugen. ************************************************************************ * Initialisierung des Selektionsbilds INITIALIZATION. lv_tit_1 = 'Bitte Query, Pfad und Dateiname auswhlen:'. ************************************************************************ * Wertehilfe fr lokale Verzeichnisauswahl AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_lokal.

DATA: lr_cl_gui_frontend_services TYPE REF TO cl_gui_frontend_services. CREATE OBJECT lr_cl_gui_frontend_services. CALL METHOD cl_gui_frontend_services=>file_save_dialog EXPORTING window_title = 'Bitte geben Sie den Zielpfad und den Dateinamen an :' default_extension = 'csv' default_file_name = 'Export_Datei' * with_encoding = initial_directory = 'Desktop' CHANGING filename = lv_methfil path = lv_methpat fullpath = lv_methfpa EXCEPTIONS cntl_error = 1 error_no_gui = 2 not_supported_by_gui = 3 OTHERS = 4. IF sy-subrc NE 0. lv_mess05 = 'Ungltiger Pfad.'. MESSAGE lv_mess05 TYPE 'S'. EXIT. ENDIF. p_lokal = lv_methfpa. "Eingabefeld fllen ************************************************************************ ** Start der Query-Verarbeitung, dabei auf Trace prfen START-OF-SELECTION. "Nachricht falls keine Query ausgewhlt wurde IF p_query IS INITIAL. lv_mess01 = 'Bitte Query auswhlen.'. MESSAGE lv_mess01 TYPE 'S'. EXIT. ENDIF. "Nachricht falls keine Query ausgewhlt wurde IF p_lokal IS INITIAL. lv_mess02 = 'Bitte Zielpfad und Dateiname angeben.'. MESSAGE lv_mess02 TYPE 'S'. EXIT. ENDIF. "bergabe an Variablen, Umwandlung in Grobuchstaben, Leerzeichen raus lv_query = p_query. TRANSLATE lv_query TO UPPER CASE. CONDENSE lv_query NO-GAPS. "Suffix setzen CLEAR: lv_count. lv_datname_c = lv_methfil. CLEAR lv_methfil. lv_count = strlen( lv_datname_c ). IF lv_count LE '4'. "Dateiname zu kurz => definitiv keine Endung CONCATENATE lv_datname_c '.csv' INTO lv_datname_c.

ELSE. "Endung knnte angegeben sein, Dateiname auf Endung prfen lv_count = lv_count - 4. "Suffix wurde in Grobuchstaben eingegeben IF lv_datname_c+lv_count(4) EQ '.CSV'. lv_datname_c+lv_count(4) = '.csv'. ENDIF. "Suffix wurde nicht eingegeben, wird nun ergnzt IF lv_datname_c+lv_count(4) EQ '.csv'. ELSE. CONCATENATE lv_datname_c '.csv' INTO lv_datname_c. ENDIF. ENDIF. lv_methfil = lv_datname_c. "Am Ende des Pfades muss ein Backslash stehen IF lv_methpat IS NOT INITIAL. IF lv_count IS NOT INITIAL. CLEAR lv_count. ENDIF. lv_count = strlen( lv_methpat ). lv_count = lv_count - 1. IF lv_methpat+lv_count(1) NE '\'. CONCATENATE lv_methpat '\' INTO lv_methpat. ENDIF. "Zielpfad zusammensetzen CONCATENATE lv_methpat lv_methfil INTO target_file_lokal. ELSE. target_file_lokal = p_lokal. ENDIF. "Ermittlung der bentigten Query-Informationen (Struktur g_s_repkey) "Infos aus Tabelle RSRREPDIR SELECT SINGLE compuid FROM rsrrepdir INTO g_s_repkey-compuid "Schlssel = UID WHERE compid EQ lv_query AND comptype EQ 'REP' AND objvers EQ 'A'. IF sy-subrc NE 0. lv_mess03 = 'Die Query wurd nicht gefunden.'. MESSAGE lv_mess03 TYPE 'S'. ELSE. g_s_repkey-objvers = 'A'. "Objektversion SELECT SINGLE infocube FROM rsrrepdir INTO g_s_repkey-infocube "InfoProvider WHERE compuid EQ g_s_repkey-compuid. CONCATENATE g_s_repkey-infocube '/' "interne Darstellung des lv_query INTO g_s_repkey-genuniid. "Berichtsidentifizierers g_s_repkey-comptype = 'REP'. "Typ der Reporting-Komponente g_s_repkey-compid = lv_query. "technischer Name der Query ENDIF. "Query ffnen IF g_s_repkey-genuniid IS NOT INITIAL. TRY. "auf Tracing prfen * CALL FUNCTION 'RSDDK_STA_TIMING_RESET'. GET PARAMETER ID 'RS_TRACE_MODE' FIELD g_trace_mode. IF g_trace_mode = rrx2_c_trace-off OR g_trace_mode = rrx2_c_trace-on. CALL FUNCTION 'RRX_CURRENT_TRACE_MODE'

IMPORTING e_trace_mode = g_trace_mode. SET PARAMETER ID 'RS_TRACE_MODE' FIELD g_trace_mode. ENDIF. "Prfung, ob die Query existiert CALL FUNCTION 'RRI_REPDIR_READ' CHANGING c_s_repkey = g_s_repkey EXCEPTIONS entry_not_found = 1. IF sy-subrc GT 0. * PERFORM write_mesg. ENDIF. "Trace und RFC-Verbindung - Initialisierung PERFORM init_prptys CHANGING g_t_prptys. CALL FUNCTION 'RRX_SESSION_INITIALIZE' TABLES c_t_prptys = g_t_prptys EXCEPTIONS OTHERS = 1. IF sy-subrc <> 0. * PERFORM write_mesg. ENDIF. "Zugriff auf die Query starten / ffnen der Query CALL FUNCTION 'RRX_REPORT_OPEN' EXPORTING i_genuniid = g_s_repkey-genuniid IMPORTING e_handle = g_handle EXCEPTIONS open_failed = 1 invalid_genuniid = 2 msg_init_failed = 3 inherited_error = 4 x_message = 5 OTHERS = 6. g_subrc = sy-subrc. "ID (auch Funktionscode) eines Eintrags im Excel-Contextmen g_cmdid = 'STRT'. PERFORM cmd_process. ENDTRY. ENDIF. "g_s_repkey-genuniid IS NOT INITIAL.

************************************************************************ ** Es folgen die Unterprogramme ************************************************************************ ************************************************************************ *&--------------------------------------------------------------------* *& Form close *&--------------------------------------------------------------------* FORM close. * Report schliessen CHECK NOT g_handle IS INITIAL. * debug-flags importieren & auswerten CALL FUNCTION 'RRI_QUERY_DEBUGFLAGS_GET' IMPORTING e_s_debugflags = g_s_debugflags.

IF g_s_debugflags-show_stat = rs_c_true. CALL FUNCTION 'RSDDK_STA_TIMING_SHOW'. ENDIF. IF cl_rsr_decrypt_bundle=>is_activated( ) = rs_c_true. CALL FUNCTION 'RSR_DECRYPT_OUTPUT_HTML'. ENDIF. CALL FUNCTION 'RRX_REPORT_CLOSE' EXPORTING i_handle = g_handle EXCEPTIONS close_failed = 1 x_message = 2 OTHERS = 3. CLEAR g_handle. * Programm verlassen. LEAVE PROGRAM. ENDFORM. "close ************************************************************************ *---------------------------------------------------------------------* * FORM cmd_process * *---------------------------------------------------------------------* FORM cmd_process. CHECK NOT g_cmdid IS INITIAL. CLEAR sy-lsind. ADD 1 TO g_cmd_count. CALL FUNCTION 'RRX_GRID_CMD_PROCESS' EXPORTING i_handle = g_handle i_cmdid = g_cmdid i_iobjnm = g_iobjnm IMPORTING e_max_x = g_x e_max_y = g_y TABLES i_t_ranges = g_t_ranges e_t_dim = g_t_dim e_t_mem = g_t_mem e_t_cel = g_t_cel c_t_prptys = g_t_prptys e_t_atr = g_t_atr e_t_grid = g_t_grid e_t_ranges = g_t_ranges e_t_con = g_t_con e_t_fac = g_t_fac e_t_var = g_t_var EXCEPTIONS inherited_error = 1 no_record_found = 2 terminated_by_user = 3 no_processing = 4 no_change = 5 dbcl_nosupport = 6 no_authorization = 7 x_message = 8 screen_canceled = 9 launch_url = 10 OTHERS = 11. g_subrc = sy-subrc. CHECK g_subrc NE 4.

PERFORM write_all. ENDFORM.

"cmd_process

************************************************************************ *&--------------------------------------------------------------------* *& Form write_all *&--------------------------------------------------------------------* FORM write_all. CLEAR sy-lsind. SKIP 1. IF g_subrc >= 10000. SUBTRACT 10000 FROM g_subrc. ENDIF. CHECK g_subrc = 0. PERFORM determine_col_widths CHANGING g_t_grid g_t_col_widths. PERFORM write_grid CHANGING g_t_grid. ENDFORM. "cmd_process ************************************************************************ *&---------------------------------------------------------------------* *& Form WRITE_GRID *&---------------------------------------------------------------------* FORM write_grid CHANGING c_t_grid TYPE rrx1_t_grid. DATA: l_s_grid TYPE rrx1_s_grid, l_s_grid2 TYPE rrx1_s_grid, l_s_grid_last TYPE rrx1_s_grid, l_tabix TYPE i, l_s_col_width TYPE g_s_col_width, l_width TYPE i, l_position TYPE i, l_x TYPE i, l_y TYPE i, l_max_x TYPE i, l_max_y TYPE i, l_help_position TYPE i, l_cell_type TYPE c, l_cell_text TYPE c LENGTH 500, l_cell_add TYPE c LENGTH 4. g_start_row = sy-linno. CLEAR: g_t_ranges[]. SORT c_t_grid BY y x. LOOP AT c_t_grid INTO l_s_grid. IF l_s_grid-y > l_max_y. l_max_y = l_s_grid-y. ENDIF. IF l_s_grid-x > l_max_x. l_max_x = l_s_grid-x. ENDIF. ENDLOOP. l_tabix = 1. READ TABLE c_t_grid INTO l_s_grid2 INDEX 1. DO l_max_y TIMES. l_y = sy-index. CLEAR g_s_export. DO l_max_x TIMES. l_x = sy-index. WHILE l_y > l_s_grid2-y

* *

OR ( l_y = l_s_grid2-y AND l_x > l_s_grid2-x ). ADD 1 TO l_tabix. READ TABLE c_t_grid INTO l_s_grid2 INDEX l_tabix. IF sy-subrc NE 0. EXIT. ENDIF. ENDWHILE. IF l_s_grid2-y = l_y AND l_s_grid2-x = l_x. l_s_grid = l_s_grid2. ELSE. CLEAR: l_s_grid. l_s_grid-x = l_x. l_s_grid-y = l_y. l_s_grid-content = 'NN'. ENDIF. IF l_s_grid_last-y < l_s_grid-y. g_row_hide = l_s_grid_last-y. HIDE g_row_hide. CLEAR l_position. NEW-LINE. ENDIF. READ TABLE g_t_col_widths INTO l_s_col_width INDEX l_s_grid-x. l_width = l_s_col_width-width. l_position = l_position + l_width. Ausgabeattribute in Abhngigkeit vom Cell-style setzen. l_help_position = l_position + 20. CHECK l_help_position LT sy-linsz. l_cell_type = l_s_grid-content+1(1). Eingefgt zur Anzeige von Whrung/Menge. CLEAR l_cell_add. CASE l_s_grid-mwkz. WHEN 'M'. IF l_s_grid-y NE 1. "keine Zahlen in Zeile 1 l_cell_add = l_s_grid-unit. ENDIF. WHEN 'W'. IF l_s_grid-y NE 1. "keine Zahlen in Zeile 1 l_cell_add = l_s_grid-currency. ENDIF. WHEN OTHERS. CLEAR l_cell_add. ENDCASE. CONCATENATE l_s_grid-data l_cell_add INTO l_cell_text SEPARATED BY ' '. Ende Eingefgt IF l_s_grid-x EQ 1. WRITE l_s_grid-drillstate. ENDIF. bei Textfelder muss das erste Zeichen (Hochkomma) abgeschnitten werden - bei Kennzahlwerten nicht! IF ( l_cell_text+0(1) EQ '0' OR l_cell_text+0(1) EQ '1' OR l_cell_text+0(1) EQ '2' OR l_cell_text+0(1) EQ '3' OR l_cell_text+0(1) EQ '4' OR l_cell_text+0(1) EQ '5' OR l_cell_text+0(1) EQ '6' OR l_cell_text+0(1) EQ '7' OR l_cell_text+0(1) EQ '8'

OR l_cell_text+0(1) EQ '9' ). CONCATENATE g_s_export-text ';' l_cell_text INTO g_s_export-text. ELSE. CONCATENATE g_s_export-text ';' l_cell_text+1 INTO g_s_export-text. ENDIF. l_s_grid_last = l_s_grid. ENDDO. APPEND g_s_export TO g_t_export. ENDDO. g_row_hide = l_s_grid_last-y. HIDE g_row_hide. "Ergebnis aufbereiten "#-Zeichen lschen REPLACE ALL OCCURRENCES OF '#' IN TABLE g_t_export WITH ''. "weitere Anpassungen CLEAR g_s_export. LOOP AT g_t_export INTO g_s_export. "fhrendes Semikolon lschen, um keine Leerspalte zu bekommen IF g_s_export-text IS NOT INITIAL. g_s_export-text = g_s_export-text+1. MODIFY g_t_export FROM g_s_export. ENDIF. ENDLOOP. "Erzeugen der Zieldatei fr Client IF target_file_lokal IS NOT INITIAL. DATA: lr_cl_gui_frontend_services TYPE REF TO cl_gui_frontend_services. CREATE OBJECT lr_cl_gui_frontend_services. CALL METHOD cl_gui_frontend_services=>gui_download EXPORTING filename = target_file_lokal filetype = 'ASC' ignore_cerr = abap_true replacement = '#' IMPORTING filelength = lv_filelength CHANGING data_tab = g_t_export EXCEPTIONS file_write_error = 1 no_batch = 2 gui_refuse_filetransfer = 3 invalid_type = 4 no_authority = 5 unknown_error = 6 header_not_allowed = 7 separator_not_allowed = 8 filesize_not_allowed = 9 header_too_long = 10 dp_error_create = 11 dp_error_send = 12 dp_error_write = 13 unknown_dp_error = 14 access_denied = 15 dp_out_of_memory = 16 disk_full = 17 dp_timeout = 18

file_not_found dataprovider_exception control_flush_error not_supported_by_gui error_no_gui OTHERS

= = = = = =

19 20 21 22 23 24.

ENDIF. CASE sy-subrc. WHEN 0. EXIT. WHEN 1. lv_mess06 = 'Fehler beim Schreiben der Datei.'. MESSAGE lv_mess06 TYPE 'I'. EXIT. WHEN 2. lv_mess07 = 'Kein Batchbetrieb mglich, nur Dialog.'. MESSAGE lv_mess07 TYPE 'I'. EXIT. WHEN 3. lv_mess08 = 'GUI-Fehler.'. MESSAGE lv_mess08 TYPE 'I'. EXIT. WHEN 5. lv_mess09 = 'Sie haben keine Berechtigung fr diese Aktion.'. MESSAGE lv_mess09 TYPE 'I'. EXIT. WHEN 15. lv_mess10 = 'Zugriff nicht mglich.'. MESSAGE lv_mess10 TYPE 'I'. EXIT. WHEN 17. lv_mess10 = 'Ihre lokale Festplatte ist voll.'. MESSAGE lv_mess10 TYPE 'I'. EXIT. WHEN OTHERS. lv_mess04 = 'Die Datei konnte nicht angelegt werden.'. MESSAGE lv_mess04 TYPE 'I'. EXIT. ENDCASE. ENDFORM. " WRITE_GRID

************************************************************************ *&---------------------------------------------------------------------* *& Form DETERMINE_COL_WIDTHS *&---------------------------------------------------------------------* FORM determine_col_widths CHANGING c_t_grid TYPE rrx1_t_grid c_t_col_widths TYPE g_t_col_widths. DATA: l_s_grid TYPE rrx1_s_grid, l_s_grid_last TYPE rrx1_s_grid, l_s_col_width TYPE g_s_col_width, l_len TYPE i, l_maxwidth TYPE i VALUE 25. SORT c_t_grid BY x. LOOP AT c_t_grid INTO l_s_grid. AT NEW x. CLEAR: l_s_grid_last, l_s_col_width. l_s_col_width-column = l_s_grid-x.

ENDAT. l_len = strlen( l_s_grid-data ). * Lnge wird abhngig vom mwkz erweitert CASE l_s_grid-mwkz. WHEN 'M'. IF l_s_grid-y NE 1. "Keine Zahlen in Zeile 1 l_len = l_len + 5. ENDIF. WHEN 'W'. IF l_s_grid-y NE 1. "Keine Zahlen in Zeile 1 l_len = l_len + 4. ENDIF. WHEN OTHERS. l_len = l_len + 0. ENDCASE. * Ende einfgen IF l_len GT l_s_col_width-width. IF l_len GE l_maxwidth. l_s_col_width-width = l_maxwidth. ELSE. l_s_col_width-width = l_len. ENDIF. ENDIF. AT END OF x. APPEND l_s_col_width TO c_t_col_widths. ENDAT. l_s_grid_last = l_s_grid. ENDLOOP. ENDFORM. " DETERMINE_COL_WIDTHS ************************************************************************ *&---------------------------------------------------------------------* *& Form init_prptys *&---------------------------------------------------------------------* FORM init_prptys CHANGING c_t_prptys TYPE rrx1_t_prptys. DATA: l_s_global_settings TYPE rrxgblset, l_s_prptys TYPE rrx1_s_prptys. CALL FUNCTION 'RRSV_GLOBAL_SETTINGS_GET' IMPORTING e_s_global_settings = l_s_global_settings. l_s_prptys-id = rrx1_c_prptys_id-percentfrac. l_s_prptys-value = l_s_global_settings-percntfrac. APPEND l_s_prptys TO c_t_prptys. l_s_prptys-id = rrx1_c_prptys_id-mask_date. l_s_prptys-value = l_s_global_settings-mask_date. APPEND l_s_prptys TO c_t_prptys. l_s_prptys-id = rrx1_c_prptys_id-mask_time. l_s_prptys-value = l_s_global_settings-mask_time. APPEND l_s_prptys TO c_t_prptys. l_s_prptys-id = rrx1_c_prptys_id-dcpchar. l_s_prptys-value = l_s_global_settings-dcpchar. APPEND l_s_prptys TO c_t_prptys. l_s_prptys-id = rrx1_c_prptys_id-signprsnt. l_s_prptys-value = l_s_global_settings-signprsnt. IF l_s_prptys-value IS INITIAL. l_s_prptys-value = '1'. ENDIF. APPEND l_s_prptys TO c_t_prptys. l_s_prptys-id = rrx1_c_prptys_id-formatted_values.

l_s_prptys-value = 'X'. APPEND l_s_prptys TO c_t_prptys. ENDFORM. "init_prptys

Vous aimerez peut-être aussi