METHOD if_http_extension~handle_request. ************************************************************************ * Title : IF_HTTP_EXTENSION~HANDLE_REQUEST * * Author Name : Jimmy Rubio/Venu Kambhampati * * Create Date : 05/13/14 * * Reference Number : * * Specification Name: Web Service Application * * Purpose : * * Developer Notes : This Web Service Application will be used to * * handle the bex query output for mobile apps * *----------------------------------------------------------------------* * Revision History * * Date Programmer Name Reference Number * ************************************************************************ ************************************************************************ INCLUDE z_bex_qry_json_xml_output. ************************************************************************ * T Y P E S ************************************************************************ TYPES: BEGIN OF ty_celldata_copy, column_n(8) TYPE c, count(8) TYPE c, value TYPE bapi6111cd-value, END OF ty_celldata_copy. TYPES: BEGIN OF ty_axis_data_copy, row(6) TYPE n, tuple_ordinal TYPE rrx_axis_data-tuple_ordinal, chanm TYPE rrx_axis_data-chanm, chavl TYPE rrx_axis_data-chavl, caption TYPE rrx_axis_data-caption, END OF ty_axis_data_copy. TYPES: BEGIN OF ty_filter_table, name TYPE string, value TYPE string, label TYPE string, data(1) TYPE c, groupby TYPE string, END OF ty_filter_table. ************************************************************************ * I N T E R N A L T A B L E S ************************************************************************ DATA: t_cell_data_copy TYPE STANDARD TABLE OF ty_celldata_copy, wa_cell_data_copy LIKE LINE OF t_cell_data_copy. DATA: t_axis_data_copy TYPE STANDARD TABLE OF ty_axis_data_copy, wa_axis_data_copy LIKE LINE OF t_axis_data_copy, wa_axis_data_copy2 LIKE LINE OF t_axis_data_copy. DATA: t_filter_table TYPE STANDARD TABLE OF ty_filter_table, wa_filter_table LIKE LINE OF t_filter_table. DATA: label TYPE string, data TYPE string. DATA: data_filter TYPE RANGE OF string, wa_data_filter LIKE LINE OF data_filter. DATA: groupby_filter TYPE RANGE OF string, wa_groupby LIKE LINE OF data_filter. DATA: t_filter_val TYPE string. DATA: column_count TYPE i. DATA: row_count(6) TYPE n, loop_counter TYPE i. DATA: counter2 TYPE i. DATA: remainder TYPE i, start_counter TYPE i, end_counter TYPE i. DATA: var_charno_copy(5) TYPE n. DATA: loop_count2 TYPE i. DATA: offset TYPE i, total_char TYPE i, total_keyfg TYPE i, counter_flag(1) TYPE c. DATA: date(6) TYPE c, int TYPE i. DATA: label_counter TYPE i. DATA: lt_messages TYPE STANDARD TABLE OF smesg, wa_messages LIKE LINE OF lt_messages. CALL METHOD server->response->set_cdata( data = 'Service OK!' ). * Retrieving the request method (POST, GET, PUT, DELETE) l_action = server->request->get_header_field( name = '~request_method' ). * Retrieving the parameters passed in the URL l_path_info = server->request->get_header_field( name = '~PATH_INFO' ). "URL path l_bex_query = server->request->get_form_field( name = 'CMD' ). "Query Name l_whole_url = server->request->get_header_field( '~request_uri' ). "Whole URL display_format = server->request->get_form_field( name = 'DISPLAYFORMAT' ). "display format table_type = server->request->get_form_field( name = 'TABLE' ). "table type groupby = server->request->get_form_field( name = 'GROUPBY' ). "group by version = server->request->get_form_field( name = 'VERSION' ). "version type output = server->request->get_form_field( name = 'OUTPUT' ). "output * convert to uppercase TRANSLATE l_whole_url TO UPPER CASE. TRANSLATE version TO UPPER CASE. * get count of filters by getting count of name in the URL REPLACE ALL OCCURRENCES OF 'NAME' IN l_whole_url WITH 'NAME' : REPLACEMENT COUNT cnt. * begin of do loop for parameters/filters passed to query * get label information CLEAR: do_count. DO cnt TIMES. do_count = sy-index. CLEAR: filter_name, filter_value, name, value. **** if label is not provided name will be used **** value return from the query will be used if not provided in the URL CONCATENATE 'VAR_NAME_' do_count INTO filter_name. CONCATENATE 'VAR_VALUE_EXT_' do_count INTO filter_value. CONCATENATE 'NAME' do_count INTO name. CONCATENATE 'VALUE' do_count INTO value. CONCATENATE 'LABEL' do_count INTO label. CONCATENATE 'DATA' do_count INTO data. CONCATENATE 'GROUPBY' do_count INTO groupby. CLEAR wa_i_t_parameter. wa_i_t_parameter-name = filter_name. wa_i_t_parameter-value = server->request->get_form_field( name = name ). wa_filter_table-name = wa_i_t_parameter-value. TRANSLATE wa_i_t_parameter-value TO UPPER CASE. IF do_count = 1. name1 = wa_i_t_parameter-value. ENDIF. IF wa_i_t_parameter-name IS NOT INITIAL AND wa_i_t_parameter-value IS NOT INITIAL. APPEND wa_i_t_parameter TO lt_parameter. ENDIF. CLEAR wa_i_t_parameter. wa_i_t_parameter-name = filter_value. wa_i_t_parameter-value = server->request->get_form_field( name = value ). * change the week format from the URL * ex 282014 to 201428 int = strlen( wa_i_t_parameter-value ) . IF int = 6. IF wa_i_t_parameter-value NA 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' AND wa_i_t_parameter-value NA 'abcdefghijklmnopqrstuvwxyz' . IF wa_i_t_parameter-value+0(4) LT 2099 AND wa_i_t_parameter-value+0(4) GT 1985. IF wa_i_t_parameter-value+4(2) GT 0 AND wa_i_t_parameter-value+4(2) LT 54. CONCATENATE wa_i_t_parameter-value+4(2) wa_i_t_parameter-value+0(4) INTO date. wa_i_t_parameter-value = date. ENDIF. ENDIF. ENDIF. ENDIF. TRANSLATE wa_i_t_parameter-value TO UPPER CASE. wa_filter_table-value = wa_i_t_parameter-value. IF do_count = 1. value1 = wa_i_t_parameter-value. ENDIF. IF wa_i_t_parameter-name IS NOT INITIAL AND wa_i_t_parameter-value IS NOT INITIAL. APPEND wa_i_t_parameter TO lt_parameter. ENDIF. wa_filter_table-label = server->request->get_form_field( name = label ). TRANSLATE wa_filter_table-label TO UPPER CASE. wa_filter_table-data = server->request->get_form_field( name = data ). TRANSLATE wa_filter_table-data TO UPPER CASE. IF wa_filter_table-data = 'N'. wa_data_filter-sign = 'I'. wa_data_filter-option = 'EQ'. wa_data_filter-low = wa_filter_table-value. APPEND wa_data_filter TO data_filter. ENDIF. wa_filter_table-groupby = server->request->get_form_field( name = groupby ). TRANSLATE wa_filter_table-groupby TO UPPER CASE. IF wa_filter_table-groupby IS NOT INITIAL.. wa_data_filter-sign = 'I'. wa_data_filter-option = 'EQ'. wa_data_filter-low = wa_filter_table-value. APPEND wa_data_filter TO data_filter. ENDIF. APPEND wa_filter_table TO t_filter_table. ENDDO. IF ( l_action NE 'GET' ). CALL METHOD server->response->set_status( code = '405' reason = 'Method not allowed' ). CALL METHOD server->response->set_header_field( name = 'Allow' value = 'GET' ). EXIT. ENDIF. CALL METHOD server->response->set_header_field( name = 'Access-Control-Allow-Origin' value = '*' ). * FM to get BEX data l_path = l_bex_query. CALL FUNCTION 'RS_VC_GET_QUERY_VIEW_DATA_FLAT' EXPORTING i_query = l_path i_max_rows = -1 TABLES i_t_parameter = lt_parameter e_t_cell_data = lt_celldata e_t_axis_info = lt_axisinfo e_t_axis_chars = lt_axischars e_t_axis_attrs = lt_axisattrs e_t_axis_data_columns = lt_axisdatacol e_t_axis_data_rows = lt_axisdatarow e_t_axis_data_slicer = lt_axisdataslicer e_t_attr_data_rows = lt_attrdatarows e_t_attr_data_columns = lt_ttrdatacols e_t_text_symbols = lt_textsymbols EXCEPTIONS no_applicable_data = 1 invalid_variable_values = 2 no_authority = 3 abort = 4 invalid_input = 5 invalid_view = 6 OTHERS = 7. CLEAR string. * handle exceptions from the FM and display it in JSON format CASE sy-subrc. WHEN '1'. CONCATENATE '?' quote 'Error' quote ':' quote 'No Applicable Data. Check query and filter values in = ' l_path quote quote '^' INTO string. APPEND string TO t_string. WHEN '2'. CLEAR column_count. CLEAR string. DATA: err_ctr(2) TYPE n. LOOP AT lt_messages INTO wa_messages. IF wa_messages-msgty = 'E' OR wa_messages-msgty = 'A'. "ST11795 error_flag = 'X'. err_ctr = err_ctr + 1. CONCATENATE string quote 'Filter' quote ',' quote wa_messages-msgv1 quote ',' INTO string. ENDIF. ENDLOOP. IF string IS NOT INITIAL. w_len = strlen( string ). w_len = w_len - 1. string = string+0(w_len). CONCATENATE '[' string ']' INTO string. ENDIF. CONCATENATE '?' quote 'Error' quote ':' string '^' INTO string. APPEND string TO t_string. WHEN '3'. CONCATENATE '?' quote 'Error' quote ':' quote 'You have no Authority for Query = ' l_path quote '^' INTO string. APPEND string TO t_string. WHEN '4'. CONCATENATE '?' quote 'Error' quote ':' quote 'Abort error in query =' l_path quote '^' INTO string. APPEND string TO t_string. WHEN '5'. CONCATENATE '?' quote 'Error' quote ':' quote 'Invalid Query Name = ' ' ' l_path quote '^' INTO string. APPEND string TO t_string. WHEN '6'. CONCATENATE '?' quote 'Error' quote ':' quote 'Invalid View for Query = ' l_path quote quote '^' INTO string. APPEND string TO t_string. WHEN '7'. CONCATENATE '?' quote 'Error' quote ':' quote 'Others' quote '^' INTO string. APPEND string TO t_string. ENDCASE. CLEAR column_count. * loop to get keyfigures and char number of records LOOP AT lt_axisinfo INTO wa_axisinfo. IF wa_axisinfo-axis = 000. *Number of key figures in the report. var_keyfigno = wa_axisinfo-ncoords. ELSEIF wa_axisinfo-axis = 001. *Number of records in the query output var_noofrecords = wa_axisinfo-ncoords. var_charno = wa_axisinfo-nchars. ENDIF. ENDLOOP. * change to uppercase since user could enter lowercase 'row', 'chart', etc... TRANSLATE display_format TO UPPER CASE. var_charno_copy = var_charno - 1. * parameter for which version of data the mobile app team wants to retrieve. * option of old format and new format. * old format is the json format before changes to link pulse and bubble view * new is new changes to link pulse and bubble view IF version = 'NEW'. * begin on data format for json IF display_format = 'ROW'. IF lt_celldata IS NOT INITIAL. * begin of loop LOOP AT lt_axischars INTO wa_axischars. CONCATENATE quote wa_axischars-caption quote INTO wa_axischars-caption. IF wa_axischars-axis = '000'. LOOP AT lt_axisdatacol INTO wa_axisdatacol. CONCATENATE quote wa_axisdatacol-caption quote INTO wa_axisdatacol-caption. IF wa_axischars-chanm = wa_axisdatacol-chanm. * - Get the Description of Key Figures header into a string CONCATENATE ls_keyfigheader wa_axisdatacol-caption lv_separator INTO ls_keyfigheader. ENDIF. ENDLOOP. * - Get the Description of the characteristics header into a string ELSEIF wa_axischars-axis = '001'. column_count = column_count + 1. CONCATENATE ls_rowheader wa_axischars-caption lv_separator INTO ls_rowheader. ENDIF. ENDLOOP. * - Concatenate the characteristics and key figure header CONCATENATE ls_rowheader ls_keyfigheader INTO ls_rowheader. w_len = strlen( ls_keyfigheader ). w_len = w_len - 1. ls_keyfigheader = ls_keyfigheader+0(w_len). CONCATENATE '[' ls_keyfigheader ']' INTO ls_keyfigheader. * create a temp table of lt_axisdatarow LOOP AT lt_axisdatarow INTO wa_axisdatarow. REPLACE ALL OCCURRENCES OF '''' IN wa_axisdatarow-chavl WITH '!'. REPLACE ALL OCCURRENCES OF '"' IN wa_axisdatarow-chavl WITH ' INCH'. loop_counter = loop_counter + 1. wa_axis_data_copy-row = loop_counter. wa_axis_data_copy-tuple_ordinal = wa_axisdatarow-tuple_ordinal. wa_axis_data_copy-chanm = wa_axisdatarow-chanm. wa_axis_data_copy-chavl = wa_axisdatarow-chavl. * wa_axis_data_copy-caption = wa_axisdatarow-caption. APPEND wa_axis_data_copy TO t_axis_data_copy. IF column_count = loop_counter. CLEAR loop_counter. ENDIF. ENDLOOP. CLEAR string. CLEAR counter. offset = var_charno - 1. total_char = var_charno. total_keyfg = var_keyfigno. CLEAR counter. counter = 0. label_counter = 1. " { [ put this into the output json buffer CLEAR wa_axis_data_copy. * add to the last row of t_axis_data_copy so that when it checks chavl it will add the last records to the output wa_axis_data_copy-chavl = 'THEEND'. APPEND wa_axis_data_copy TO t_axis_data_copy. LOOP AT t_axis_data_copy INTO wa_axis_data_copy. counter = counter + 1. IF counter <= offset. IF counter_flag = 'X'. start_counter = sy-tabix - offset. end_counter = sy-tabix - ( total_char - offset ). * LOOP AT t_axis_data_copy INTO wa_axis_data_copy2 FROM start_counter TO end_counter. LOOP AT t_axis_data_copy INTO wa_axis_data_copy2 WHERE tuple_ordinal EQ wa_axis_data_copy-tuple_ordinal AND row <= offset. LOOP AT t_filter_table INTO wa_filter_table FROM label_counter TO label_counter. CONCATENATE string quote wa_filter_table-label quote ':' quote wa_axis_data_copy2-chavl quote ',' INTO string. ENDLOOP. label_counter = label_counter + 1. ENDLOOP. counter = counter + offset. CLEAR: counter_flag. ELSE. LOOP AT t_filter_table INTO wa_filter_table FROM label_counter TO label_counter. CONCATENATE string quote wa_filter_table-label quote ':' quote wa_axis_data_copy-chavl quote ',' INTO string. ENDLOOP. label_counter = label_counter + 1. CONTINUE. ENDIF. ENDIF. CLEAR string2. CONCATENATE string2 quote wa_axis_data_copy-chavl quote INTO string2. IF wa_axis_data_copy-row NE var_charno. * check if retailer or pl changed and if they did, you are done concatenating calweek IF string CS string2. CONTINUE. ENDIF. IF string IS NOT INITIAL. w_len = strlen( string ). w_len = w_len - 1. string = string+0(w_len). CONCATENATE '?' string ',' quote 'Data' quote ':[' ls_keyfigheader INTO string. APPEND string TO t_string. ENDIF. counter = counter - offset. counter = counter . IF string3 IS NOT INITIAL. w_len = strlen( string3 ). w_len = w_len - 1. string3 = string3+0(w_len). CONCATENATE '[' string3 ']' INTO string3. APPEND string3 TO t_string. ENDIF. IF string5 IS NOT INITIAL. w_len = strlen( string5 ). w_len = w_len - 1. string5 = string5+0(w_len). CONCATENATE string5 ']' '^' INTO string5. APPEND string5 TO t_string. ENDIF. CLEAR: string, string2, string3, string4, string5. label_counter = 1. counter = 0. counter_flag = 'X'. CONTINUE. ENDIF. "build the next tuple of the calweek. CONCATENATE string4 quote wa_axis_data_copy-chavl quote ',' INTO string4. LOOP AT lt_celldata INTO wa_celldata FROM 1 TO counter. loop_count2 = loop_count2 + 1. CONCATENATE string4 quote wa_celldata-value quote ',' INTO string4. DELETE lt_celldata INDEX sy-tabix. IF loop_count2 = total_keyfg. EXIT. ENDIF. ENDLOOP. CLEAR loop_count2. IF string4 IS NOT INITIAL. w_len = strlen( string4 ). w_len = w_len - 1. string4 = string4+0(w_len). CONCATENATE string5 '[' string4 ']' ',' INTO string5. CLEAR string4. ENDIF. ENDLOOP. ENDIF. ELSEIF display_format = 'CHART'. IF lt_celldata IS NOT INITIAL. LOOP AT lt_axischars INTO wa_axischars. CONCATENATE quote wa_axischars-caption quote INTO wa_axischars-caption. IF wa_axischars-axis = '000'. LOOP AT lt_axisdatacol INTO wa_axisdatacol. CONCATENATE quote wa_axisdatacol-caption quote INTO wa_axisdatacol-caption. IF wa_axischars-chanm = wa_axisdatacol-chanm. * - Get the Description of Key Figures header into a string CONCATENATE ls_keyfigheader wa_axisdatacol-caption lv_separator INTO ls_keyfigheader. ENDIF. ENDLOOP. * - Get the Description of the characteristics header into a string ELSEIF wa_axischars-axis = '001'. column_count = column_count + 1. CONCATENATE ls_rowheader wa_axischars-caption lv_separator INTO ls_rowheader. ENDIF. ENDLOOP. ENDIF. * create temp table of lt_axisdatarow LOOP AT lt_axisdatarow INTO wa_axisdatarow. REPLACE ALL OCCURRENCES OF '''' IN wa_axisdatarow-chavl WITH '!'. REPLACE ALL OCCURRENCES OF '"' IN wa_axisdatarow-chavl WITH ' INCH'. loop_counter = loop_counter + 1. wa_axis_data_copy-row = loop_counter. wa_axis_data_copy-tuple_ordinal = wa_axisdatarow-tuple_ordinal. wa_axis_data_copy-chanm = wa_axisdatarow-chanm. wa_axis_data_copy-chavl = wa_axisdatarow-chavl. * wa_axis_data_copy-caption = wa_axisdatarow-caption. APPEND wa_axis_data_copy TO t_axis_data_copy. IF column_count = loop_counter. CLEAR loop_counter. ENDIF. ENDLOOP. CLEAR counter. LOOP AT lt_celldata INTO wa_celldata . counter = counter + 1. wa_cell_data_copy-column_n = counter. wa_cell_data_copy-count = sy-tabix. wa_cell_data_copy-value = wa_celldata-value. APPEND wa_cell_data_copy TO t_cell_data_copy. CLEAR wa_cell_data_copy. IF counter = var_keyfigno. CLEAR counter. ENDIF. ENDLOOP. SORT t_cell_data_copy BY column_n count. CLEAR string. CLEAR counter. offset = var_charno - 1. total_char = var_charno. total_keyfg = var_keyfigno. CLEAR counter. counter = 0. label_counter = 1. * add to the last row of t_axis_data_copy so that when it checks chavl it will add the last records to the output CLEAR wa_axis_data_copy. wa_axis_data_copy-chavl = 'THEEND'. APPEND wa_axis_data_copy TO t_axis_data_copy. LOOP AT t_axis_data_copy INTO wa_axis_data_copy. counter = counter + 1. IF counter <= offset. IF counter_flag = 'X'. * CONCATENATE string3 quote wa_axis_data_copy-chavl quote ',' INTO string3. start_counter = sy-tabix - offset. end_counter = sy-tabix - ( total_char - offset ). * LOOP AT t_axis_data_copy INTO wa_axis_data_copy FROM start_counter TO end_counter. LOOP AT t_axis_data_copy INTO wa_axis_data_copy2 WHERE tuple_ordinal EQ wa_axis_data_copy-tuple_ordinal AND row <= offset. LOOP AT t_filter_table INTO wa_filter_table FROM label_counter TO label_counter. CONCATENATE string quote wa_filter_table-label quote ':' quote wa_axis_data_copy2-chavl quote ',' INTO string. ENDLOOP. label_counter = label_counter + 1. ENDLOOP. counter = counter + offset. CLEAR: counter_flag. ELSE. LOOP AT t_filter_table INTO wa_filter_table FROM label_counter TO label_counter. CONCATENATE string quote wa_filter_table-label quote ':' quote wa_axis_data_copy-chavl quote ',' INTO string. ENDLOOP. label_counter = label_counter + 1. CONTINUE. ENDIF. ENDIF. CLEAR string2. CONCATENATE string2 quote wa_axis_data_copy-chavl quote INTO string2. IF wa_axis_data_copy-row NE var_charno. " check if retailer or pl changed and if they did, you are done concatenating calweek IF string CS string2. CONTINUE. ENDIF. IF string IS NOT INITIAL. w_len = strlen( string ). w_len = w_len - 1. string = string+0(w_len). CONCATENATE '?' string ',' quote 'Data' quote ':[' INTO string. ENDIF. IF string3 IS NOT INITIAL. w_len = strlen( string3 ). w_len = w_len - 1. string3 = string3+0(w_len). CONCATENATE '[' quote 'X' quote ',' string3 ']' INTO string3. CONCATENATE string string3 INTO string. APPEND string TO t_string. counter = counter - offset. counter = counter / total_char. ENDIF. LOOP AT lt_axisdatacol INTO wa_axisdatacol. CONCATENATE string4 quote wa_axisdatacol-caption quote ',' INTO string4. LOOP AT t_cell_data_copy INTO wa_cell_data_copy WHERE column_n = sy-tabix." FROM 1 TO counter. loop_count2 = loop_count2 + 1. CONCATENATE string4 quote wa_cell_data_copy-value quote ',' INTO string4. DELETE t_cell_data_copy INDEX sy-tabix. IF loop_count2 = counter. EXIT. ENDIF. ENDLOOP. CLEAR loop_count2. IF string4 IS NOT INITIAL. w_len = strlen( string4 ). w_len = w_len - 1. string4 = string4+0(w_len). ENDIF. IF sy-tabix NE total_keyfg. CONCATENATE '[' string4 ']' INTO string4. ELSE. CONCATENATE '[' string4 ']' ']' '^' INTO string4. ENDIF. APPEND string4 TO t_string. CLEAR string4. ENDLOOP. CLEAR: string, string2, string3, string4. label_counter = 1. counter = 0. counter_flag = 'X'. CONTINUE. ENDIF. "build the next tuple of the calweek. CONCATENATE string3 quote wa_axis_data_copy-chavl quote ',' INTO string3. ENDLOOP. ELSEIF display_format = 'DEFAULT'. IF lt_celldata IS NOT INITIAL. LOOP AT lt_axischars INTO wa_axischars. CONCATENATE quote wa_axischars-caption quote INTO wa_axischars-caption. IF wa_axischars-axis = '000'. LOOP AT lt_axisdatacol INTO wa_axisdatacol. CONCATENATE quote wa_axisdatacol-caption quote INTO wa_axisdatacol-caption. IF wa_axischars-chanm = wa_axisdatacol-chanm. * - Get the Description of Key Figures header into a string CONCATENATE ls_keyfigheader wa_axisdatacol-caption lv_separator INTO ls_keyfigheader. ENDIF. ENDLOOP. * - Get the Description of the characteristics header into a string ELSEIF wa_axischars-axis = '001'. column_count = column_count + 1. CONCATENATE ls_rowheader wa_axischars-caption lv_separator INTO ls_rowheader. ENDIF. ENDLOOP. ENDIF. * create temp table of lt_axisdatarow LOOP AT lt_axisdatarow INTO wa_axisdatarow. REPLACE ALL OCCURRENCES OF '''' IN wa_axisdatarow-chavl WITH '!'. REPLACE ALL OCCURRENCES OF '"' IN wa_axisdatarow-chavl WITH ' INCH'. loop_counter = loop_counter + 1. wa_axis_data_copy-row = loop_counter. wa_axis_data_copy-tuple_ordinal = wa_axisdatarow-tuple_ordinal. wa_axis_data_copy-chanm = wa_axisdatarow-chanm. wa_axis_data_copy-chavl = wa_axisdatarow-chavl. * wa_axis_data_copy-caption = wa_axisdatarow-caption. APPEND wa_axis_data_copy TO t_axis_data_copy. IF column_count = loop_counter. CLEAR loop_counter. ENDIF. ENDLOOP. CLEAR counter. LOOP AT lt_celldata INTO wa_celldata . counter = counter + 1. wa_cell_data_copy-column_n = counter. wa_cell_data_copy-count = sy-tabix. wa_cell_data_copy-value = wa_celldata-value. APPEND wa_cell_data_copy TO t_cell_data_copy. CLEAR wa_cell_data_copy. IF counter = var_keyfigno. CLEAR counter. ENDIF. ENDLOOP. SORT t_cell_data_copy BY column_n count. CLEAR string. CLEAR counter. offset = var_charno - 0. total_char = var_charno. total_keyfg = var_keyfigno. CLEAR counter. counter = 0. label_counter = 1. * add to the last row of t_axis_data_copy so that when it checks chavl it will add the last records to the output CLEAR wa_axis_data_copy. wa_axis_data_copy-chavl = 'THEEND'. APPEND wa_axis_data_copy TO t_axis_data_copy. LOOP AT t_axis_data_copy INTO wa_axis_data_copy. counter = counter + 1. IF counter <= offset. * get column header names and add to json output LOOP AT t_filter_table INTO wa_filter_table FROM label_counter TO label_counter. CONCATENATE string quote wa_filter_table-label quote ':' quote wa_axis_data_copy-chavl quote ',' INTO string. ENDLOOP. label_counter = label_counter + 1. IF counter NE total_char. CONTINUE. ENDIF. ENDIF. IF string IS NOT INITIAL. * add keyfigures to string LOOP AT lt_axisdatacol INTO wa_axisdatacol. CONCATENATE string quote wa_axisdatacol-caption quote ':' INTO string. LOOP AT t_cell_data_copy INTO wa_cell_data_copy FROM 1 TO 1. CONCATENATE string quote wa_cell_data_copy-value quote ',' INTO string. DELETE t_cell_data_copy INDEX sy-tabix. EXIT. ENDLOOP. CLEAR loop_count2. ENDLOOP. w_len = strlen( string ). w_len = w_len - 1. string = string+0(w_len). CONCATENATE '?' string '^' INTO string. ENDIF. APPEND string TO t_string. CLEAR: string, string2, string3, string4. label_counter = 1. counter = 0. ENDLOOP. ENDIF. ELSEIF version = 'OLD'. * begin on data format for json IF display_format = 'ROW'. IF lt_celldata IS NOT INITIAL. * begin of loop LOOP AT lt_axischars INTO wa_axischars. CONCATENATE quote wa_axischars-caption quote INTO wa_axischars-caption. IF wa_axischars-axis = '000'. LOOP AT lt_axisdatacol INTO wa_axisdatacol. CONCATENATE quote wa_axisdatacol-caption quote INTO wa_axisdatacol-caption. IF wa_axischars-chanm = wa_axisdatacol-chanm. * - Get the Description of Key Figures header into a string CONCATENATE ls_keyfigheader wa_axisdatacol-caption lv_separator INTO ls_keyfigheader. ENDIF. ENDLOOP. * - Get the Description of the characteristics header into a string ELSEIF wa_axischars-axis = '001'. column_count = column_count + 1. CONCATENATE ls_rowheader wa_axischars-caption lv_separator INTO ls_rowheader. ENDIF. ENDLOOP. * - Concatenate the characteristics and key figure header CONCATENATE ls_rowheader ls_keyfigheader INTO ls_rowheader. w_len = strlen( ls_keyfigheader ). w_len = w_len - 1. ls_keyfigheader = ls_keyfigheader+0(w_len). CONCATENATE '[' ls_keyfigheader ']' INTO ls_keyfigheader. * create a temp table of lt_axisdatarow LOOP AT lt_axisdatarow INTO wa_axisdatarow. REPLACE ALL OCCURRENCES OF '''' IN wa_axisdatarow-chavl WITH '!'. REPLACE ALL OCCURRENCES OF '"' IN wa_axisdatarow-chavl WITH ' INCH'. loop_counter = loop_counter + 1. wa_axis_data_copy-row = loop_counter. wa_axis_data_copy-tuple_ordinal = wa_axisdatarow-tuple_ordinal. wa_axis_data_copy-chanm = wa_axisdatarow-chanm. wa_axis_data_copy-chavl = wa_axisdatarow-chavl. * wa_axis_data_copy-caption = wa_axisdatarow-caption. APPEND wa_axis_data_copy TO t_axis_data_copy. IF column_count = loop_counter. CLEAR loop_counter. ENDIF. ENDLOOP. CLEAR string. CLEAR counter. offset = var_charno - 1. total_char = var_charno. total_keyfg = var_keyfigno. CLEAR counter. counter = 0. label_counter = 1. " { [ put this into the output json buffer CLEAR wa_axis_data_copy. * add to the last row of t_axis_data_copy so that when it checks chavl it will add the last records to the output wa_axis_data_copy-chavl = 'THEEND'. APPEND wa_axis_data_copy TO t_axis_data_copy. LOOP AT t_axis_data_copy INTO wa_axis_data_copy. counter = counter + 1. IF counter <= offset. IF counter_flag = 'X'. start_counter = sy-tabix - offset. end_counter = sy-tabix - ( total_char - offset ). * LOOP AT t_axis_data_copy INTO wa_axis_data_copy2 FROM start_counter TO end_counter. LOOP AT t_axis_data_copy INTO wa_axis_data_copy2 WHERE tuple_ordinal EQ wa_axis_data_copy-tuple_ordinal AND row <= offset. LOOP AT t_filter_table INTO wa_filter_table FROM label_counter TO label_counter. CONCATENATE string quote wa_filter_table-label quote ':' quote wa_axis_data_copy2-chavl quote ',' INTO string. ENDLOOP. label_counter = label_counter + 1. ENDLOOP. counter = counter + offset. CLEAR: counter_flag. ELSE. LOOP AT t_filter_table INTO wa_filter_table FROM label_counter TO label_counter. CONCATENATE string quote wa_filter_table-label quote ':' quote wa_axis_data_copy-chavl quote ',' INTO string. ENDLOOP. label_counter = label_counter + 1. CONTINUE. ENDIF. ENDIF. CLEAR string2. CONCATENATE string2 quote wa_axis_data_copy-chavl quote INTO string2. IF wa_axis_data_copy-row NE var_charno. * check if retailer or pl changed and if they did, you are done concatenating calweek IF string CS string2. CONTINUE. ENDIF. IF string IS NOT INITIAL. w_len = strlen( string ). w_len = w_len - 1. string = string+0(w_len). CONCATENATE '?' string ',' quote 'Data' quote ':[' ls_keyfigheader INTO string. APPEND string TO t_string. ENDIF. counter = counter - offset. counter = counter . IF string3 IS NOT INITIAL. w_len = strlen( string3 ). w_len = w_len - 1. string3 = string3+0(w_len). CONCATENATE '[' string3 ']' INTO string3. APPEND string3 TO t_string. ENDIF. IF string5 IS NOT INITIAL. w_len = strlen( string5 ). w_len = w_len - 1. string5 = string5+0(w_len). CONCATENATE string5 ']' '^' INTO string5. APPEND string5 TO t_string. ENDIF. CLEAR: string, string2, string3, string4, string5. label_counter = 1. counter = 0. counter_flag = 'X'. CONTINUE. ENDIF. "build the next tuple of the calweek. CONCATENATE string4 quote wa_axis_data_copy-chavl quote ',' INTO string4. LOOP AT lt_celldata INTO wa_celldata FROM 1 TO counter. loop_count2 = loop_count2 + 1. CONCATENATE string4 quote wa_celldata-value quote ',' INTO string4. DELETE lt_celldata INDEX sy-tabix. IF loop_count2 = total_keyfg. EXIT. ENDIF. ENDLOOP. CLEAR loop_count2. IF string4 IS NOT INITIAL. w_len = strlen( string4 ). w_len = w_len - 1. string4 = string4+0(w_len). CONCATENATE string5 '[' string4 ']' ',' INTO string5. CLEAR string4. ENDIF. ENDLOOP. ENDIF. ELSEIF display_format = 'CHART'. IF lt_celldata IS NOT INITIAL. LOOP AT lt_axischars INTO wa_axischars. CONCATENATE quote wa_axischars-caption quote INTO wa_axischars-caption. IF wa_axischars-axis = '000'. LOOP AT lt_axisdatacol INTO wa_axisdatacol. CONCATENATE quote wa_axisdatacol-caption quote INTO wa_axisdatacol-caption. IF wa_axischars-chanm = wa_axisdatacol-chanm. * - Get the Description of Key Figures header into a string CONCATENATE ls_keyfigheader wa_axisdatacol-caption lv_separator INTO ls_keyfigheader. ENDIF. ENDLOOP. * - Get the Description of the characteristics header into a string ELSEIF wa_axischars-axis = '001'. column_count = column_count + 1. CONCATENATE ls_rowheader wa_axischars-caption lv_separator INTO ls_rowheader. ENDIF. ENDLOOP. ENDIF. * create temp table of lt_axisdatarow LOOP AT lt_axisdatarow INTO wa_axisdatarow. REPLACE ALL OCCURRENCES OF '''' IN wa_axisdatarow-chavl WITH '!'. REPLACE ALL OCCURRENCES OF '"' IN wa_axisdatarow-chavl WITH ' INCH'. loop_counter = loop_counter + 1. wa_axis_data_copy-row = loop_counter. wa_axis_data_copy-tuple_ordinal = wa_axisdatarow-tuple_ordinal. wa_axis_data_copy-chanm = wa_axisdatarow-chanm. wa_axis_data_copy-chavl = wa_axisdatarow-chavl. * wa_axis_data_copy-caption = wa_axisdatarow-caption. APPEND wa_axis_data_copy TO t_axis_data_copy. IF column_count = loop_counter. CLEAR loop_counter. ENDIF. ENDLOOP. CLEAR counter. LOOP AT lt_celldata INTO wa_celldata . counter = counter + 1. wa_cell_data_copy-column_n = counter. wa_cell_data_copy-count = sy-tabix. wa_cell_data_copy-value = wa_celldata-value. APPEND wa_cell_data_copy TO t_cell_data_copy. CLEAR wa_cell_data_copy. IF counter = var_keyfigno. CLEAR counter. ENDIF. ENDLOOP. SORT t_cell_data_copy BY column_n count. CLEAR string. CLEAR counter. offset = var_charno - 1. total_char = var_charno. total_keyfg = var_keyfigno. CLEAR counter. counter = 0. label_counter = 1. * add to the last row of t_axis_data_copy so that when it checks chavl it will add the last records to the output CLEAR wa_axis_data_copy. wa_axis_data_copy-chavl = 'THEEND'. APPEND wa_axis_data_copy TO t_axis_data_copy. LOOP AT t_axis_data_copy INTO wa_axis_data_copy. counter = counter + 1. IF counter <= offset. IF counter_flag = 'X'. * CONCATENATE string3 quote wa_axis_data_copy-chavl quote ',' INTO string3. start_counter = sy-tabix - offset. end_counter = sy-tabix - ( total_char - offset ). * LOOP AT t_axis_data_copy INTO wa_axis_data_copy FROM start_counter TO end_counter. LOOP AT t_axis_data_copy INTO wa_axis_data_copy2 WHERE tuple_ordinal EQ wa_axis_data_copy-tuple_ordinal AND row <= offset. LOOP AT t_filter_table INTO wa_filter_table FROM label_counter TO label_counter. CONCATENATE string quote wa_filter_table-label quote ':' quote wa_axis_data_copy2-chavl quote ',' INTO string. ENDLOOP. label_counter = label_counter + 1. ENDLOOP. counter = counter + offset. CLEAR: counter_flag. ELSE. LOOP AT t_filter_table INTO wa_filter_table FROM label_counter TO label_counter. CONCATENATE string quote wa_filter_table-label quote ':' quote wa_axis_data_copy-chavl quote ',' INTO string. ENDLOOP. label_counter = label_counter + 1. CONTINUE. ENDIF. ENDIF. CLEAR string2. CONCATENATE string2 quote wa_axis_data_copy-chavl quote INTO string2. IF wa_axis_data_copy-row NE var_charno. " check if retailer or pl changed and if they did, you are done concatenating calweek IF string CS string2. CONTINUE. ENDIF. IF string IS NOT INITIAL. w_len = strlen( string ). w_len = w_len - 1. string = string+0(w_len). CONCATENATE '?' string ',' quote 'Data' quote ':[' INTO string. ENDIF. IF string3 IS NOT INITIAL. w_len = strlen( string3 ). w_len = w_len - 1. string3 = string3+0(w_len). CONCATENATE '[' quote 'X' quote ',' string3 ']' INTO string3. CONCATENATE string string3 INTO string. APPEND string TO t_string. counter = counter - offset. counter = counter / total_char. ENDIF. LOOP AT lt_axisdatacol INTO wa_axisdatacol. CONCATENATE string4 quote wa_axisdatacol-caption quote ',' INTO string4. LOOP AT t_cell_data_copy INTO wa_cell_data_copy WHERE column_n = sy-tabix." FROM 1 TO counter. loop_count2 = loop_count2 + 1. CONCATENATE string4 quote wa_cell_data_copy-value quote ',' INTO string4. DELETE t_cell_data_copy INDEX sy-tabix. IF loop_count2 = counter. EXIT. ENDIF. ENDLOOP. CLEAR loop_count2. IF string4 IS NOT INITIAL. w_len = strlen( string4 ). w_len = w_len - 1. string4 = string4+0(w_len). ENDIF. IF sy-tabix NE total_keyfg. CONCATENATE '[' string4 ']' INTO string4. ELSE. CONCATENATE '[' string4 ']' ']' '^' INTO string4. ENDIF. APPEND string4 TO t_string. CLEAR string4. ENDLOOP. CLEAR: string, string2, string3, string4. label_counter = 1. counter = 0. counter_flag = 'X'. CONTINUE. ENDIF. "build the next tuple of the calweek. CONCATENATE string3 quote wa_axis_data_copy-chavl quote ',' INTO string3. ENDLOOP. ENDIF. ENDIF. * convert output to uppercase TRANSLATE output TO UPPER CASE. IF output CS 'XML'. l_output_type = 'xml'. ELSE. l_output_type = 'json'. ENDIF. TRANSLATE l_output_type TO LOWER CASE. * transformation to create xml or json format IF l_output_type EQ 'xml'. CALL TRANSFORMATION id SOURCE retailer = t_string OPTIONS xml_header = 'NO' RESULT XML output_xml. CALL METHOD server->response->set_header_field EXPORTING name = 'Content-Type' value = 'text/xml; charset=utf-8'. conv_to_utf8 = cl_abap_conv_out_ce=>create( encoding = 'UTF-8' ). conv_to_utf8->write( data = output_xml ). output_xml_utf8 = conv_to_utf8->get_buffer( ). CALL METHOD server->response->set_data( data = output_xml_utf8 ). ENDIF. * when output is json, we have to make changes in the bytemode * reason being that the transformation converts part of the string * to the wrong format, so we change the bytes to the correct output IF l_output_type EQ 'json'. writer_json = cl_sxml_string_writer=>create( type = if_sxml=>co_xt_json ). writer ?= writer_json. writer->set_option( option = if_sxml_writer=>co_opt_linebreaks ). writer->set_option( option = if_sxml_writer=>co_opt_indent ). CALL TRANSFORMATION id SOURCE retailer = t_string OPTIONS xml_header = 'NO' RESULT XML writer_json. output_json = writer_json->get_output( ). CLEAR string. * convert all the special characters to correct character in byte mode SPLIT output_json AT hex_5b INTO xstring xstring2 IN BYTE MODE. SPLIT xstring2 AT hex_22 INTO xstring4 xstring5 IN BYTE MODE. REPLACE ALL OCCURRENCES OF hex_c5 IN output_json WITH hex_00 IN BYTE MODE. REPLACE ALL OCCURRENCES OF hex_22 IN xstring5 WITH hex_00 IN BYTE MODE. REPLACE ALL OCCURRENCES OF hex_7b IN xstring5 WITH hex_00 IN BYTE MODE. REPLACE ALL OCCURRENCES OF hex_7d IN xstring5 WITH hex_00 IN BYTE MODE. REPLACE ALL OCCURRENCES OF hex_3f IN xstring5 WITH hex_7b IN BYTE MODE. REPLACE ALL OCCURRENCES OF hex_5e IN xstring5 WITH hex_7d IN BYTE MODE. CONCATENATE hex_5b xstring5 INTO xstring3 IN BYTE MODE. output_json = xstring3. REPLACE ALL OCCURRENCES OF hex_27 IN output_json WITH hex_22 IN BYTE MODE. REPLACE ALL OCCURRENCES OF hex_21 IN output_json WITH hex_27 IN BYTE MODE. * junk data in string, causing issues in the JSON output. Adding it to a blank space to fix REPLACE ALL OCCURRENCES OF hex_000a20 IN output_json WITH hex_blank IN BYTE MODE. REPLACE ALL OCCURRENCES OF hex_0a00 IN output_json WITH hex_blank IN BYTE MODE. CALL METHOD server->response->set_data( data = output_json ). ENDIF. ENDMETHOD.