Как пропустить обязательные поля на ABAP

Я хочу, чтобы он пропускал обязательные поля, когда я нажимал кнопку "İptal".

Но я не хочу контролировать обязательные поля без "обязательных". Я хочу видеть галочку в текстовых полях, как скриншот.

Обычно кнопка "İptal" вызывает другой экран, когда нет обязательных полей.

Когда я нажал на кнопку İptal, я хочу пропустить это обязательные поля

Примечание. Экраны являются стандартными экранами выбора.

3 ответа

Способ, которым я решил это, не для того, чтобы сделать поля обязательными в макете, а в вашем коде для создания некоторых условий. У меня есть поле ввода-вывода, называемое ekpo-ebeln:

 IF ekpo-ebeln IS INITIAL.
    CASE ok_code.
      WHEN 'EXIT'.
        LEAVE PROGRAM.
      WHEN 'BACK'.
        CALL SCREEN 100.
    ENDCASE.
    MESSAGE 'Fill both of the fields' TYPE 'I'.

это решило мою проблему, и это работает!

Вы можете сделать следующий трюк для достижения ваших требований.

Предпосылки:

  1. Прежде всего! НЕ объявляйте ваши параметры, используя OBLIGATORY пункт. Это ограничение переопределяет все внутренние проверки и проверки во время обработки экранов выбора.

  2. Здесь я предполагаю, что вы используете стандартный статус GUI с кнопками, активированными на панели инструментов приложения. Стандартная кнопка Выполнить имеет стандартную ONLI fcode, тогда как у İptal IPT,

  3. Для манипулирования целевыми полями нам нужны идентификаторы, присвоенные им:

    PARAMETERS: p_matnr TYPE mara-matnr MODIF ID OBL,
                p_mtart TYPE mara-mtart MODIF ID OBL.
    

Детали решения:

  1. Объявите событие AT SELECTION-SCREEN OUTPUT, в котором будут редактироваться атрибуты полей.

    AT SELECTION-SCREEN OUTPUT.
    
    SET PF-STATUS 'SSCR'.       "<<- our GUI-status
    LOOP AT SCREEN.
     IF screen-group1 = 'OBL'.
       screen-required = '2'.   "<<- default obligatory-like field appearance
       MODIFY SCREEN.
     ENDIF.
    ENDLOOP.
    IF sy-ucomm = 'ONLI'.       "<<- making fields really obligatory
     LOOP AT SCREEN.
      IF screen-group1 = 'OBL'.
       screen-required = '1'.
       MODIFY SCREEN.
      ENDIF.
     ENDLOOP.
    ENDIF.
    
  2. Обработка функциональных кодов в событии AT SELECTION-SCREEN.

    AT SELECTION-SCREEN.
    
     IF sy-ucomm = 'ONLI'.
      LEAVE TO SCREEN 1000.
     ENDIF.
     IF sy-ucomm = 'IPT'.
      "<do whatever you want>
     ENDIF.
    

Пояснение: при запуске программы ваши поля имеют required атрибут установлен в 2, что означает, что у них есть обязательный тик, но на самом деле он не действует как обязательный, то есть это именно то, что вам нужно. Вы можете прекрасно нажать кнопку İptal и запустить любую другую программу.
Однако, если вы хотите включить обязательные ограничения, вы просто нажимаете стандартное Выполнить, и он снова вызывает наш экран выбора (LEAVE TO SCREEN 1000) но с другим кодом (ONLI) на которой required атрибут переопределен и вуаля! Идти дальше невозможно, пока вы не заполните эти поля.

Вам нужно назначить код функции, назначенный кнопке на экране, который имеет тип функции "Выход".

Тогда вы можете использовать событие AT SELECTION-SCREEN ON EXIT-COMMAND в вашем отчете (я предполагаю, что вы говорите об отчете, потому что вы говорите об экранах выбора). Это событие вызывается системой перед проверкой полей на экране. Здесь вы можете реализовать всю необходимую логику.

Тем не менее, единственный способ, которым я могу думать, как это сделать, это скопировать стандартный статус GUI %_00 из программы RSSYSTDB в свою программу и добавьте свой код функции и сделайте его типом "exit". Затем в AT SELECTION-SCREEN OUTPUT Вы можете использовать SET PF-STATUS команда для переопределения стандартного статуса GUI. (В противном случае, если вы назначите функциональный код своей кнопке, но он не получит специальной обработки для запуска ON EXIT-COMMAND событие).

РЕДАКТИРОВАТЬ: я только что попробовал это, и это работает, но не при назначении кода функции для кнопки (используя SELECTION-SCREEN PUSHBUTTON). Вместо этого мне пришлось добавить код функции в виде кнопки на панели инструментов. Тогда это вызывает AT SELECTION-SCREEN OUTPUT событие).

РЕДАКТИРОВАТЬ 2: (Просто скопировал мой комментарий снизу сюда, потому что это важно заметить) Кстати, мне пришлось переименовать статус%_00 GUI в другое, когда я его скопировал. В противном случае, даже если указать дополнение FROM PROGRAM в SET PF-STATUS, оно все равно будет использовать старый статус GUI из RSSYSTDB.

Другие вопросы по тегам