Universal ODATA Prototype Tester

Bugfix 28.09.2021 : Initial value for Date = '00000000'.
Moin.
Nach vielen Services, die schon erstellt habe, war eines meiner Ziele einen Web - unabhängigen Odata Prototyp Tester zu verwirklichen, da
1.) POST / PATCH / UPDATE Operationen im Gateway client nur mühsam bis gar nicht zu bedienen sind (Thema CSRF-Token).
2.) Eine Möglichkeit vorhanden ist, auch komplett ohne Frontend zu arbeiten und damit Web-seitige Fehlerquellen auszuschließen.
3.) Aufwendigeres RFC Debugging zu umgehen.
Möglich wird das durch die konfektionierten Funktionsbausteine und ihre einheitliche Schnittstelle.
siehe viewtopic.php?f=40&t=20631
e.g.
Die Importparameter :
I_KEYS
I_SELECT_OPT
I_ORDER
I_SELECT_FIELDS
I_PAGING
Die Exportparameter :
O_DATA
O_MSG
so kann der Prototyp tester den Baustein dynamisch aufrufen.
Testwerte können gespeichert und wieder geladen werden (ähnlich Funktionsbaustein DB)
die gelesenen Daten oder Messages werden auch gespeichert, wenn man will.
Das Programm:
Moin.
Nach vielen Services, die schon erstellt habe, war eines meiner Ziele einen Web - unabhängigen Odata Prototyp Tester zu verwirklichen, da
1.) POST / PATCH / UPDATE Operationen im Gateway client nur mühsam bis gar nicht zu bedienen sind (Thema CSRF-Token).
2.) Eine Möglichkeit vorhanden ist, auch komplett ohne Frontend zu arbeiten und damit Web-seitige Fehlerquellen auszuschließen.
3.) Aufwendigeres RFC Debugging zu umgehen.
Möglich wird das durch die konfektionierten Funktionsbausteine und ihre einheitliche Schnittstelle.
siehe viewtopic.php?f=40&t=20631
e.g.
Die Importparameter :
I_KEYS
I_SELECT_OPT
I_ORDER
I_SELECT_FIELDS
I_PAGING
Die Exportparameter :
O_DATA
O_MSG
so kann der Prototyp tester den Baustein dynamisch aufrufen.
Testwerte können gespeichert und wieder geladen werden (ähnlich Funktionsbaustein DB)
die gelesenen Daten oder Messages werden auch gespeichert, wenn man will.
Das Programm:
- Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
- *&---------------------------------------------------------------------*
- *& Report ZODATA_TESTER
- *&
- *&---------------------------------------------------------------------*
- *&
- *&
- *&---------------------------------------------------------------------*
- REPORT zodata_tester.
- " ls_fields TYPE sval,
- lv_rc TYPE c.
- DATA:
- l_repid TYPE syrepid,
- lv_icon_ok TYPE icon-name,
- lv_button1 TYPE svalbutton-buttontext,
- lv_icon1 TYPE icon-name,
- lv_button2 TYPE svalbutton-buttontext,
- lv_icon2 TYPE icon-name.
- <dyn_field> TYPE any,
- <dyn_rec> TYPE any,
- <dyn_tab> TYPE ANY TABLE.
- p_fm TYPE tfdir-funcname OBLIGATORY,
- p_keys TYPE dd02l-tabname,
- p_path TYPE ibipparms-path OBLIGATORY VISIBLE LENGTH 40 DEFAULT 'C:\Temp\Odata_raw',
- p_text AS CHECKBOX DEFAULT 'X',
- p_pop AS CHECKBOX DEFAULT 'X',
- p_msg AS CHECKBOX DEFAULT 'X',
- p_dat AS CHECKBOX DEFAULT 'X'.
- funcname = p_fm AND
- parameter = 'I_KEYS'.
- CALL FUNCTION 'POPUP_GET_VALUES_SET_MAX_FIELD'
- EXPORTING
- number_of_fields = 30
- EXCEPTIONS
- out_of_range = 1.
- lv_icon_ok = icon_test.
- lv_button1 = 'Save Test Data' ##NO_TEXT.
- lv_icon1 = icon_system_save.
- lv_button2 = 'Read Test Data' ##NO_TEXT.
- lv_icon2 = icon_import.
- l_repid = sy-repid.
- DO.
- CLEAR gv_ok_code.
- CALL FUNCTION 'POPUP_GET_VALUES_USER_BUTTONS'
- EXPORTING
- * F1_FORMNAME = ' '
- * F1_PROGRAMNAME = ' '
- * F4_FORMNAME = ' '
- * F4_PROGRAMNAME = ' '
- formname = 'ACTION'
- programname = l_repid
- popup_title = 'Please Enter'
- ok_pushbuttontext = 'Execute'
- icon_ok_push = lv_icon_ok
- first_pushbutton = lv_button1
- icon_button_1 = lv_icon1
- second_pushbutton = lv_button2
- icon_button_2 = lv_icon2
- * QUICKINFO_OK_PUSH = ' '
- * QUICKINFO_BUTTON_1 = ' '
- * QUICKINFO_BUTTON_2 = ' '
- start_column = '2'
- start_row = '2'
- * NO_CHECK_FOR_FIXED_VALUES = ' '
- IMPORTING
- returncode = lv_rc "space/'A'=Abbruch
- fields = lt_fields
- EXCEPTIONS
- error_in_fields = 1
- OTHERS = 2.
- EXIT.
- EXIT.
- CALL FUNCTION 'RPY_TABLE_READ'
- EXPORTING
- * ACTIVATION_TYPE_I = 'M'
- * LANGUAGE = SY-LANGU
- table_name = i_struc
- * WITH_DOCU = ' '
- * DOCUTYPE = 'U'
- * IMPORTING
- * TABL_INF =
- * TABL_TECHNICS =
- * ACTIVATION_TYPE_O =
- tabl_fields = t_field_def
- * DOCU_TABLE_USER =
- * DOCU_TABLE_TECH =
- EXCEPTIONS
- cancelled = 1
- not_found = 2
- permission_error = 3
- illegal_type = 4
- OTHERS = 5.
- EXIT.
- CLEAR ls_fields.
- ls_fields-tabname = i_struc.
- ls_fields-fieldname = s_def-fieldname.
- ls_fields-value = '00000000'.
- ELSE.
- *FIELD_ATTR
- *FIELD_OBL
- *COMP_CODE
- "ls_fields-FIELDTEXT = s_def-SCRTEXT_M.
- ls_fields-fieldtext = s_def-scrtext_m.
- ELSE.
- " CONCATENATE s_def-dtelname s_def-scrtext_m INTO ls_fields-fieldtext SEPARATED BY space.
- ls_fields-fieldtext = s_def-fieldname.
- "COMP_TAB = CHECKTABLE
- "COMP_FIELD
- ls_fields-novaluehlp = ' '.
- ENDFORM .
- PERFORM f4_path.
- typ(1),
- null(1),
- line(120),
- END OF ty_info.
- * für autom. Variante DEFAULT laden
- DATA:
- l_report TYPE raldb_repo ##NEEDED,
- l_variante TYPE raldb_vari ##NEEDED,
- t_info TYPE TABLE OF ty_info ##NEEDED.
- ** Load variant sy-uname
- l_report = sy-repid.
- l_variante = sy-uname.
- CALL FUNCTION 'RS_COVERPAGE_SELECTIONS'
- EXPORTING
- report = l_report
- variant = l_variante
- infotab = t_info
- EXCEPTIONS
- OTHERS = 3 ##FM_SUBRC_OK.
- *&---------------------------------------------------------------------*
- *& Form f4_path
- *&---------------------------------------------------------------------*
- FORM f4_path.
- *== local data
- *== get current value for path
- ls_field = 'P_PATH'.
- CALL FUNCTION 'DYNP_VALUES_READ'
- EXPORTING
- dyname = sy-cprog
- dynumb = sy-dynnr
- dynpfields = lt_fields
- EXCEPTIONS
- OTHERS = 1.
- READ TABLE lt_fields INTO ls_field INDEX 1.
- lv_in = ls_field-fieldvalue.
- *== call popup for directory selection
- CALL METHOD cl_gui_frontend_services=>directory_browse
- EXPORTING
- initial_folder = lv_in
- CHANGING
- selected_folder = lv_out
- EXCEPTIONS
- OTHERS = 4.
- *== set selected path
- p_path = lv_out.
- ELSE.
- *== set origin path
- p_path = lv_in.
- USING p_code
- CHANGING p_error STRUCTURE svale
- p_show_popup.
- gv_ok_code = p_code.
- CASE p_code.
- * WRITE TEST data
- * Read TEST data
- lt_fields[] = pt_fields[].
- READ TABLE lt_fields INTO ls_fields WITH KEY tabname = <p>-tabname fieldname = <p>-fieldname.
- <p>-value = ls_fields-value.
- * Run FM
- l_tstamp = sy-datum.
- l_tstamp+8(1) = '_'.
- l_tstamp+9 = sy-uzeit.
- CALL METHOD cl_gui_frontend_services=>gui_download
- EXPORTING
- * bin_filesize =
- filename = fn
- * filetype = 'ASC'
- * append = SPACE
- * write_field_separator = 'X'
- * header = '00'
- * trunc_trailing_blanks = 'X'
- * write_lf = 'X'
- * col_select = SPACE
- * col_select_mask = SPACE
- * dat_mode = SPACE
- * confirm_overwrite = SPACE
- * no_auth_check = SPACE
- * codepage = SPACE
- * ignore_cerr = ABAP_TRUE
- * replacement = '#'
- * write_bom = SPACE
- * trunc_trailing_blanks_eol = 'X'
- * wk1_n_format = SPACE
- * wk1_n_size = SPACE
- * wk1_t_format = SPACE
- * wk1_t_size = SPACE
- * show_transfer_status = 'X'
- * fieldnames =
- * write_lf_after_last_line = 'X'
- * virus_scan_profile = '/SCET/GUI_DOWNLOAD'
- * IMPORTING
- * filelength =
- CHANGING
- data_tab = pt_fields[]
- 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 = 19
- dataprovider_exception = 20
- control_flush_error = 21
- not_supported_by_gui = 22
- error_no_gui = 23
- OTHERS = 24.
- .
- * Implement suitable error handling here
- DATA:
- filetable TYPE filetable,
- file_line TYPE file_table,
- window_title TYPE string VALUE 'Select',
- file_filter TYPE string,
- initial_directory TYPE string,
- rc TYPE i,
- fn TYPE string.
- file_filter = 'Odata Input (IKEY*.txt)|IKEY*.txt'.
- initial_directory = p_path.
- CALL METHOD cl_gui_frontend_services=>file_open_dialog
- EXPORTING
- window_title = window_title
- * default_extension =
- * default_filename =
- file_filter = file_filter
- * with_encoding =
- initial_directory = initial_directory
- multiselection = abap_false
- CHANGING
- file_table = filetable
- rc = rc
- * user_action =
- * file_encoding =
- EXCEPTIONS
- file_open_dialog_failed = 1
- cntl_error = 2
- error_no_gui = 3
- not_supported_by_gui = 4
- OTHERS = 5.
- EXIT.
- EXIT.
- fn = file_line.
- CALL METHOD cl_gui_frontend_services=>gui_upload
- EXPORTING
- filename = fn
- * filetype = 'ASC'
- * has_field_separator = SPACE
- * header_length = 0
- * read_by_line = 'X'
- * dat_mode = SPACE
- * codepage = SPACE
- * ignore_cerr = ABAP_TRUE
- * replacement = '#'
- * virus_scan_profile =
- * IMPORTING
- * filelength =
- * header =
- CHANGING
- data_tab = pt_fields[]
- * isscanperformed = SPACE
- EXCEPTIONS
- file_open_error = 1
- file_read_error = 2
- no_batch = 3
- gui_refuse_filetransfer = 4
- invalid_type = 5
- no_authority = 6
- unknown_error = 7
- bad_data_format = 8
- header_not_allowed = 9
- separator_not_allowed = 10
- header_too_long = 11
- unknown_dp_error = 12
- access_denied = 13
- dp_out_of_memory = 14
- disk_full = 15
- dp_timeout = 16
- not_supported_by_gui = 17
- error_no_gui = 18
- OTHERS = 19.
- *&---------------------------------------------------------------------*
- *& Form create Structure dynamically
- *&---------------------------------------------------------------------*
- * text
- *----------------------------------------------------------------------*
- DATA:
- l_ref_type_descr_ddic TYPE REF TO cl_abap_typedescr,
- l_ref_type_descr_line TYPE REF TO cl_abap_typedescr,
- l_ref_struct_descr_line TYPE REF TO cl_abap_structdescr,
- l_tab_component TYPE cl_abap_structdescr=>component_table.
- DATA:
- lop_tabledescr TYPE REF TO cl_abap_tabledescr,
- ldp_dynaic_record TYPE REF TO data,
- ldp_dyn_table TYPE REF TO data,
- lop_strucdescr TYPE REF TO cl_abap_structdescr.
- l_ref_type_descr_ddic = cl_abap_typedescr=>describe_by_name( i_tdef ).
- l_ref_struct_descr_line ?= l_ref_type_descr_ddic.
- l_tab_component = l_ref_struct_descr_line->get_components( ).
- lop_strucdescr = cl_abap_structdescr=>create( l_tab_component ).
- CREATE DATA ldp_dynaic_record TYPE HANDLE lop_strucdescr.
- lop_tabledescr ?= cl_abap_tabledescr=>create( p_line_type = lop_strucdescr ).
- CREATE DATA ldp_dyn_table TYPE HANDLE lop_tabledescr.
- UNASSIGN:
- <dyn_field>,
- <dyn_rec>,
- <dyn_tab>.
- CALL FUNCTION 'RPY_TABLE_READ'
- EXPORTING
- table_name = i_tdef
- tabl_fields = t_field_def
- EXCEPTIONS
- cancelled = 1
- not_found = 2
- permission_error = 3
- illegal_type = 4
- OTHERS = 5.
- EXIT.
- DATA:
- ldp_dyn_table TYPE REF TO data,
- lop_tabledescr TYPE REF TO cl_abap_tabledescr,
- ldp_dynaic_record TYPE REF TO data,
- lop_strucdescr TYPE REF TO cl_abap_structdescr,
- ls_component TYPE abap_componentdescr,
- lt_component TYPE abap_component_tab.
- *FIELDNAME OFFSET LENGTH T FIELDTEXT
- *MANDT 000000 000003 C
- *MATNR 000003 000018 C
- *SPRAS 000021 000002 C
- *MAKTX 000023 000040 C
- *MAKTG 000063 000040 C
- * LOOP AT tfields INTO fields.
- * READ TABLE t_field_def INTO s_field_def WITH KEY fieldname = fields-fieldname.
- * Create Description
- * "IF NOT c_head IS INITIAL.
- * MOVE-CORRESPONDING s_field_def TO ls_hdr.
- * APPEND ls_hdr TO lt_hdr.
- * "ENDIF.
- . l_field_length = s_field_def-length.
- ls_component-name = s_field_def-fieldname.
- ls_component-type = cl_abap_elemdescr=>get_c( p_length = l_field_length ).
- l_field_length = s_field_def-length.
- ls_component-name = s_field_def-fieldname.
- ls_component-type = cl_abap_elemdescr=>get_c( p_length = l_field_length ).
- l_field_length = s_field_def-intlength
- . l_decimals = s_field_def-decimals.
- ls_component-name = s_field_def-fieldname.
- ls_component-type = cl_abap_elemdescr=>get_p( p_length = l_field_length p_decimals = l_decimals ).
- l_field_length = s_field_def-length.
- ls_component-name = s_field_def-fieldname.
- ls_component-type = cl_abap_elemdescr=>get_n( p_length = l_field_length ).
- ls_component-name = s_field_def-fieldname.
- ls_component-type ?= cl_abap_elemdescr=>describe_by_data( p_data = lv_int1 ).
- ls_component-type ?= cl_abap_elemdescr=>describe_by_data( p_data = lv_int2 ).
- ls_component-type ?= cl_abap_elemdescr=>describe_by_data( p_data = lv_int4 ).
- l_field_length = s_field_def-length.
- ls_component-name = s_field_def-fieldname.
- ls_component-type = cl_abap_elemdescr=>get_d( ).
- l_field_length = s_field_def-length.
- ls_component-name = s_field_def-fieldname.
- ls_component-type = cl_abap_elemdescr=>get_t( ).
- break jgu025.
- l_field_length = s_field_def-length.
- ls_component-name = s_field_def-fieldname.
- ls_component-type = cl_abap_elemdescr=>get_c( p_length = l_field_length ).
- lop_strucdescr = cl_abap_structdescr=>create( lt_component ).
- CREATE DATA ldp_dynaic_record TYPE HANDLE lop_strucdescr.
- lop_tabledescr ?= cl_abap_tabledescr=>create( p_line_type = lop_strucdescr ).
- CREATE DATA ldp_dyn_table TYPE HANDLE lop_tabledescr.
- l_tstamp = sy-datum.
- l_tstamp+8(1) = '_'.
- l_tstamp+9 = sy-uzeit.
- CALL METHOD cl_gui_frontend_services=>gui_download
- EXPORTING
- filename = fn
- CHANGING
- data_tab = i_msg[]
- 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 = 19
- dataprovider_exception = 20
- control_flush_error = 21
- not_supported_by_gui = 22
- error_no_gui = 23
- OTHERS = 24.
- .
- * Implement suitable error handling here
- FORM write_odata .
- l_tstamp = sy-datum.
- l_tstamp+8(1) = '_'.
- l_tstamp+9 = sy-uzeit.
- CALL METHOD cl_gui_frontend_services=>gui_download
- EXPORTING
- filename = fn
- * filetype = 'ASC'
- * append = SPACE
- write_field_separator = 'X'
- * header = '00'
- trunc_trailing_blanks = 'X'
- * write_lf = 'X'
- * col_select = SPACE
- * col_select_mask = SPACE
- * dat_mode = SPACE
- * confirm_overwrite = SPACE
- * no_auth_check = SPACE
- * codepage = SPACE
- * ignore_cerr = ABAP_TRUE
- * replacement = '#'
- * write_bom = SPACE
- * trunc_trailing_blanks_eol = 'X'
- * wk1_n_format = SPACE
- * wk1_n_size = SPACE
- * wk1_t_format = SPACE
- * wk1_t_size = SPACE
- * show_transfer_status = 'X'
- * fieldnames =
- * write_lf_after_last_line = 'X'
- * virus_scan_profile = '/SCET/GUI_DOWNLOAD'
- CHANGING
- data_tab = <dyn_tab>[]
- 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 = 19
- dataprovider_exception = 20
- control_flush_error = 21
- not_supported_by_gui = 22
- error_no_gui = 23
- OTHERS = 24.
- .
- * Implement suitable error handling here
- "p_fm
- l_fm = p_fm.
- CALL FUNCTION 'FUNCTION_EXISTS'
- EXPORTING
- funcname = l_fm
- EXCEPTIONS
- function_not_exist = 1
- OTHERS = 2.
- .
- EXIT.
- i = sy-tabix.
- <dyn_field> = s_sval-value.
- i = 0.
- CLEAR s_para.
- funcname = l_fm AND
- parameter = 'I_KEYS' AND
- paramtype = 'I'.
- i = 1.
- CLEAR s_para.
- funcname = l_fm AND
- parameter = 'O_DATA' AND paramtype = 'E'.
- i = i + 2.
- funcname = l_fm AND
- parameter = 'O_MSG' AND paramtype = 'E'.
- lmsg_type = 'TTYP'.
- lmsg_type = 'STRU'.
- i = i + 4.
- CASE i.
- CALL FUNCTION l_fm
- EXPORTING
- i_keys = <dyn_rec>.
- CALL FUNCTION l_fm
- EXPORTING
- i_keys = <dyn_rec>
- IMPORTING
- o_data = <dyn_tab>.
- PERFORM write_odata.
- CALL FUNCTION l_fm
- EXPORTING
- i_keys = <dyn_rec>
- IMPORTING
- o_msg = o_msg_tt.
- CALL FUNCTION l_fm
- EXPORTING
- i_keys = <dyn_rec>
- IMPORTING
- o_msg = o_msg_s.
- CALL FUNCTION l_fm
- EXPORTING
- i_keys = <dyn_rec>
- IMPORTING
- o_data = <dyn_tab>
- o_msg = o_msg_tt.
- CALL FUNCTION l_fm
- EXPORTING
- i_keys = <dyn_rec>
- IMPORTING
- o_data = <dyn_tab>
- o_msg = o_msg_s.
- * p_msg AS CHECKBOX DEFAULT 'X',
- * p_dat AS CHECKBOX DEFAULT 'X'.
- cl_demo_output=>display( <dyn_tab> ).
- AT SELECTION-SCREEN ON p_fm.
- funcname = p_fm AND
- parameter = 'I_KEYS'.
- GeSHi ©