Управление таблицей SAP ABAP

Я новичок в программировании на SAP / ABAP. У меня действительно возникают проблемы с отображением простого элемента управления таблицей из моей внутренней таблицы. Не могли бы вы помочь? В настоящее время, если я ищу курс, вводя идентификатор курса - 10001, отображается пустая таблица. Он должен отображать уже заполненный мной контент. Я следовал именно из этого источника: http://sapabap-4.blogspot.sg/2013/06/simple-table-control.html.

Единственная разница в том, что я поместил все в программу отчетов, а не в модульную программу, как меня просил мой лектор. Также обратите внимание, что нет абсолютно никаких ошибок, элемент управления таблицей просто не отображается.

*-------Declaration of tables for screen fields------------------------*
TABLES: zcms_courses.

*------Declaration of required structures------------------------------*
TYPES: BEGIN OF ty_zcms_courses,
         course_id      TYPE zcms_courses-course_id,
         course_content TYPE zcms_courses-course_content,
         music_genre    TYPE zcms_courses-music_genre,
         options        TYPE zcms_courses-options,
         course_name    TYPE zcms_courses-course_name,
       END OF ty_zcms_courses.

*-----Declaration of user command variables----------------------------*
DATA: OK_CODE TYPE sy-ucomm,
      OK_CODE1 TYPE sy-ucomm.

*-----Declaration of work area & table---------------------------------*
DATA: wa_zcms_courses      TYPE          ty_zcms_courses,
      itab_zcms_courses_hd TYPE TABLE OF ty_zcms_courses.

*---------Declaration of Table Control---------------------------------*
CONTROLS: zcms_courses_tc TYPE TABLEVIEW USING SCREEN 9002.


MODULE status_9001 OUTPUT.
  SET PF-STATUS 'PF_PO_INP'.
  SET TITLEBAR 'PO_TITLE'.

ENDMODULE.                 " status_9001  OUTPUT


MODULE user_command_9001 INPUT.
  "Call screen 9001.
  CASE OK_CODE.
    WHEN 'DISP'.     "Display button
      CALL SCREEN 9002.
      "PERFORM get_po.

    WHEN 'CLR'.      "Clear button
      CLEAR zcms_courses-course_id.

    WHEN 'BACK' OR 'EXIT' OR 'CANCEL'.
      LEAVE PROGRAM.

  ENDCASE.

ENDMODULE.

MODULE status_9003 OUTPUT.
  SET PF-STATUS 'PF_PO_INN'.
  SET TITLEBAR 'PO_TITLE1'.

ENDMODULE.

module user_command_9003 input.
  CASE OK_CODE1.
  WHEN 'ADD'.
      CALL SCREEN 9003.                               endcase.
endmodule.

FORM get_po .

  IF zcms_courses-course_id IS NOT INITIAL.
    REFRESH: itab_zcms_courses_hd .

    SELECT SINGLE course_id course_content music_genre options  course_name
      FROM zcms_courses  INTO wa_zcms_courses
      WHERE course_id = zcms_courses-course_id.

    IF sy-subrc = 0.
      SELECT course_id course_content music_genre options  course_name
        FROM zcms_courses INTO TABLE itab_zcms_courses_hd
        WHERE course_id = wa_zcms_courses-course_id.


      IF sy-subrc = 0.
        SORT itab_zcms_courses_hd.

        "Refreshing the table control to have updated data
        REFRESH CONTROL 'ZCMS_COURSES_TC' FROM SCREEN 9002.
        CALL SCREEN 9002.
      ENDIF.
    ENDIF.
  ENDIF.

ENDFORM.



MODULE STATUS_9002 OUTPUT.
  SET PF-STATUS 'PF_PO_INP'.
  SET TITLEBAR 'PO_TITLE'.
ENDMODULE.

MODULE table_control OUTPUT.
  DESCRIBE TABLE itab_zcms_courses_hd LINES sy-dbcnt.

  zcms_courses_tc-current_line = sy-loopc.

  zcms_courses_tc-lines = sy-dbcnt.

  zcms_courses-course_id = wa_zcms_courses-course_id.
  zcms_courses-course_content = wa_zcms_courses-course_content.
    zcms_courses-music_genre = wa_zcms_courses-music_genre.
  zcms_courses-options = wa_zcms_courses-options.
  zcms_courses-course_name = wa_zcms_courses-course_name.

  CLEAR wa_zcms_courses.

ENDMODULE.



MODULE user_command_9002 INPUT.
  CASE ok_code.
    WHEN 'BACK' OR 'EXIT' OR 'CANCEL'.

      CLEAR ok_code.

      LEAVE LIST-PROCESSING.
      LEAVE TO SCREEN 9001.
  ENDCASE.
ENDMODULE.



MODULE modify_table_control INPUT.

  READ TABLE itab_zcms_courses_hd INTO wa_zcms_courses INDEX
zcms_courses_tc-current_line.

  IF sy-subrc = 0.

    MODIFY itab_zcms_courses_hd FROM wa_zcms_courses INDEX
zcms_courses_tc-current_line.
  ENDIF.
ENDMODULE.


__________________________________________________________________________________

FLOW LOGIC of screen 9002:
PROCESS BEFORE OUTPUT.
  MODULE status_9002.

  LOOP AT itab_zcms_courses_hd INTO wa_zcms_courses WITH CONTROL
zcms_courses_tc.
    MODULE table_control.
  ENDLOOP.

PROCESS AFTER INPUT.

  LOOP AT itab_zcms_courses_hd.
    MODULE modify_table_control.
  ENDLOOP.

  MODULE user_command_9002.

__________________________________________________________________________________
FLOW LOGIC of screen 9001
PROCESS BEFORE OUTPUT.
MODULE STATUS_9001.

PROCESS AFTER INPUT.
MODULE USER_COMMAND_9001.

person Nisha Nisha    schedule 25.01.2018    source источник
comment
Почему бы вам не использовать ALV для отображения таблицы?   -  person Rene MF    schedule 25.01.2018
comment
Вы случайно пропустили часть кода, которая вызывает экран, содержащий элемент управления таблицей, или она отсутствует в вашем коде?   -  person vwegert    schedule 28.01.2018
comment
Я не вижу, где вы вызываете screen 9001, который вызывает все последующие экраны. LEAVE TO SCREEN 9001 помещается в 9002 PAI и никогда не будет выполнен.   -  person Suncatcher    schedule 04.02.2018


Ответы (3)


Если ваша программа представляет собой отчет, вы можете использовать функции ALV.

Это простой учебник. https://wiki.scn.sap.com/wiki/display/ABAP/ALV+easy+tutorial

Или, если вам нужна дополнительная помощь, я могу передать код из своих программ.

person Rene MF    schedule 25.01.2018

Причина, по которой вы не видите ошибок, в основном потому, что все это действительные команды ABAP.

Однако используемая вами логика PAI / PBO (например, MODULE user_command_9001 INPUT) должна быть привязана к SCREEN объектам, а не непосредственно внутри объекта REPORT.

Подумайте об этом так: REPORTs может отображать данные (например, ALV) без необходимости явно создавать объект SCREEN. Проблема здесь в том, что для правильного отображения табличный элемент управления должен быть привязан к SCREEN, поэтому лучше использовать ALV для отображения данных внутри REPORT.

Я знаю, что сначала это может сбивать с толку, но обычно вы будете использовать MODULE POOL, когда требуется интенсивное взаимодействие между пользователем и экраном, и это как раз тот случай с табличным элементом управления.

person maurcz    schedule 26.01.2018