Solution based on Oguz's proposal:
TYPES: BEGIN OF ty_result,
matnr TYPE mara-matnr,
mbrsh TYPE mara-mbrsh,
mtart TYPE mara-mtart,
ersda TYPE mara-ersda,
packcode TYPE mara-packcode,
END OF ty_result.
DATA:
lt_result TYPE TABLE OF ty_result,
lo_result_set TYPE REF TO cl_sql_result_set,
lx_sql TYPE REF TO cx_sql_exception.
DATA: QUERY TYPE STRING,
Q2 TYPE STRING,
MAINQUERY TYPE STRING.
QUERY = | SELECT MATNR, MBRSH, MTART, ERSDA, PACKCODE FROM MARA |.
Q2 = | WHERE MBRSH = 'M' |.
CONCATENATE QUERY Q2 INTO MAINQUERY.
TRY.
lo_result_set = NEW cl_sql_statement( )->execute_query( mainquery ).
lo_result_set->set_param_table( REF #( lt_result ) ).
" Get result
lo_result_set->next_package( ).
lo_result_set->close( ).
CATCH cx_sql_exception INTO lx_sql.
" Error handling
WRITE: lx_sql->get_text( ).
ENDTRY.
IF lt_result IS NOT INITIAL.
DATA: o_alv TYPE REF TO cl_salv_table.
DATA: lx_msg TYPE REF TO cx_salv_msg.
TRY.
cl_salv_table=>factory(
IMPORTING
r_salv_table = o_alv
CHANGING
t_table = lt_result ).
CATCH cx_salv_msg INTO lx_msg.
ENDTRY.
ENDIF.
o_alv->display( ).
You should carefully revise your SQL-query as native SQL is highly-dependent on DB-backend. For example, ~
signs in your query are incompatible with most databases, and commas/capitalization is often needed for columns.
There are couple of ways to accomplish this task: you can also use deprecated EXEC SQL
, or generate subroutine pool, but these constructs are strongly discouraged nowadays. ABDC is the most simple and up-to-date, as Oguz wisely stated.