0% found this document useful (0 votes)
100 views12 pages

Query To Local

This document describes a program that allows saving the results of a query locally as a CSV file. It contains declarations of variables and data structures needed to retrieve query information, open the query, process commands, and export the data to a CSV file. The program initializes fields for selection of the query, target path and file name. It then opens the query, retrieves the required data, and writes it row by row to a CSV file.

Uploaded by

Can Başman
Copyright
© Attribution Non-Commercial (BY-NC)
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
Download as txt, pdf, or txt
0% found this document useful (0 votes)
100 views12 pages

Query To Local

This document describes a program that allows saving the results of a query locally as a CSV file. It contains declarations of variables and data structures needed to retrieve query information, open the query, process commands, and export the data to a CSV file. The program initializes fields for selection of the query, target path and file name. It then opens the query, retrieves the required data, and writes it row by row to a CSV file.

Uploaded by

Can Başman
Copyright
© Attribution Non-Commercial (BY-NC)
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
Download as txt, pdf, or txt
Download as txt, pdf, or txt
You are on page 1/ 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

You might also like