ABAP: как обрабатывать случай, когда отчет не возвращает никаких данных - PullRequest
0 голосов
/ 30 октября 2018

У меня есть ABAP-код, который отлично работает, если в отчете есть данные.

Но если данные не найдены, я получаю:

GETWA_NOT_ASSIGNED

Ошибка возникает в строке, помеченной "**************"

" Let know the model"
cl_salv_bs_runtime_info=>set(
 EXPORTING
   display  = abap_false
   metadata = abap_false
   data     = abap_true
).

* WERKS = '0557'

data selection_table TYPE TABLE OF RSPARAMS.
data key_value TYPE wdy_key_value.
data selection_row TYPE RSPARAMS.

LOOP AT IV_STATIC_PARAMETER_LIST INTO key_value.
    selection_row-selname = key_value-key.
    selection_row-low = key_value-value.
    selection_row-sign = 'I'.
    selection_row-option = 'EQ'.
    APPEND selection_row to selection_table.
ENDLOOP.


SUBMIT (IV_REPORT_NAME)
   WITH SELECTION-TABLE selection_table
  AND RETURN.


DATA: lo_data        TYPE REF TO data.

cl_salv_bs_runtime_info=>get_data_ref(
      IMPORTING
        r_data = lo_data
).

field-SYMBOLS <lv_data> type any table.
ASSIGN lo_data->* TO <lv_data>.
ev_result_json = /ui2/cl_json=>serialize( 
  data = <lv_data> 
  pretty_name = /ui2/cl_json=>pretty_mode-low_case ). ********

cl_salv_bs_runtime_info=>clear_all( ).

Каков наиболее реальный способ справиться со случаем, когда в отчете отсутствуют данные?

(Другие улучшения приветствуются, я новичок в ABAP)

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

Следующим будет влияние при использовании моего предложения.

  • Код будет выполняться только в том случае, если символ поля назначен, в противном случае очистить все.

  • в таблице есть несколько строк, которые затем переносятся в данные, в противном случае очищаются все.

Вы можете обновить ниже исправленный код после строки ASSIGN lo_data -> * TO.

IF <lv_data> IS ASSIGNED.
 IF lines( <lv_data>[] ) GT 0 .
  ev_result_json = /ui2/cl_json=>serialize( 
  data = <lv_data> 
  pretty_name = /ui2/cl_json=>pretty_mode-low_case ). 
  ELSE.
    cl_salv_bs_runtime_info=>clear_all( ).
  ENDIF.    
ELSE
cl_salv_bs_runtime_info=>clear_all( ).
ENDIF.
0 голосов
/ 30 октября 2018

После назначения проверьте, содержит ли символ поля что-либо:

ASSIGN lo_data->* TO <lv_data>.
IF <lv_data> IS NOT ASSIGNED.
  EXIT.
ENDIF.

Или, перед присвоением, вы можете проверить, привязан ли lo_data:

IF lo_data IS NOT BOUND. 
  EXIT. 
ENDIF.
...