Текущее время: Ср, июл 23 2025, 19:27

Часовой пояс: UTC + 3 часа


Правила форума


ВНИМАНИЕ!

Вопросы по SAP Query и Quick View - сюда



Начать новую тему Ответить на тему  [ Сообщений: 15 ] 
Автор Сообщение
 Заголовок сообщения: Нужен совет по экранам
СообщениеДобавлено: Вт, ноя 22 2011, 16:15 
Специалист
Специалист

Зарегистрирован:
Пн, дек 21 2009, 11:07
Сообщения: 167
Здравствуйте.

Есть у меня экран, на нем расположены 2 поля ввода (1-поле визибл, 2-поле визибл). При выборе определенного значения в поле 1 становиться визибл/инвизибл поле 2. Охота достичь такого, выбрал значение в 1-поле появилось 2-поле и сообщение типа Е, которое выделит два поля красненьким... Можно вообще такое сделать?
Проблема в том, если 2-ое поле еще не видно, а в 1-ом поле выбрать подходящее значение и выдать сообщение типа Е, то до ПБО я так и дойду, а значит и поля 2 мне видать. Посоветуйте плиз, что можно придумать.

У меня сейчас реализовано вот так, не очень красиво если честно:
Code:
* PAI
IF pole1 = '00001'.
LOOP AT SCREEN.
IF screen-name = 'POLE2'.
EXIT.
ENDIF.
ENDLOOP.
IF screen-name = 'POLE2' AND pole2 IS INITIAL.
IF screen-input = 1.
MESSAGE 'Заполните' TYPE 'E'. " Охота чтобы было так
ELSE.
MESSAGE 'Заполните' TYPE 'S' DISPLAY LIKE 'E'.
ENDIF.
ENDIF.

* PBO
LOOP AT SCREEN.
IF screen-name = 'POLE2' AND pole1 <>  '00001'.
screen-invisible = 1.
MODIFY SCREEN.
ENDIF.
ENDLOOP.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Нужен совет по экранам
СообщениеДобавлено: Вт, ноя 22 2011, 16:23 
Модератор
Модератор
Аватара пользователя

Зарегистрирован:
Пт, июн 16 2006, 00:43
Сообщения: 1686
Откуда: Москва <-> Красноярск
Пол: Мужской
Судя по вашему коду достаточно сделать поле 2 обязательным для заполнения (при неких условиях его отображения и значения поля 1). А не городить огород.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Нужен совет по экранам
СообщениеДобавлено: Вт, ноя 22 2011, 16:23 
Старший специалист
Старший специалист

Зарегистрирован:
Сб, июл 28 2007, 20:38
Сообщения: 364
Используйте такую конструкцию
MESSAGE s001(00) WITH 'Test' DISPLAY LIKE 'E'.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Нужен совет по экранам
СообщениеДобавлено: Вт, ноя 22 2011, 16:44 
Специалист
Специалист

Зарегистрирован:
Пн, дек 21 2009, 11:07
Сообщения: 167
Пономарев Артем написал:
Судя по вашему коду достаточно сделать поле 2 обязательным для заполнения (при неких условиях его отображения и значения поля 1). А не городить огород.

Можно и так, но если сделаю его обязательным в пбо то программа будет ругаться пока не заполню поле 2 вне зависимости от значения поля 1. А мне нужно чтобы он ругался при изменении поля 1 (ON CHAIN-REQUEST), если значение поля соответсвует.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Нужен совет по экранам
СообщениеДобавлено: Вт, ноя 22 2011, 16:46 
Специалист
Специалист

Зарегистрирован:
Пн, дек 21 2009, 11:07
Сообщения: 167
__Gennady написал(а):
Используйте такую конструкцию
MESSAGE s001(00) WITH 'Test' DISPLAY LIKE 'E'.

Спасибо. Но такая конструкция не дает нужного результата.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Нужен совет по экранам
СообщениеДобавлено: Вт, ноя 22 2011, 16:52 
Модератор
Модератор
Аватара пользователя

Зарегистрирован:
Пт, июн 16 2006, 00:43
Сообщения: 1686
Откуда: Москва <-> Красноярск
Пол: Мужской
DarZ написал(а):
Можно и так, но если сделаю его обязательным в пбо то программа будет ругаться пока не заполню поле 2 вне зависимости от значения поля 1. А мне нужно чтобы он ругался при изменении поля 1 (ON CHAIN-REQUEST), если значение поля соответсвует.

Мне кажется что в такой постановке, с использованием selection-screen, вы не получите желаемого результата. Нужно переписывать в screen painter.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Нужен совет по экранам
СообщениеДобавлено: Вт, ноя 22 2011, 17:41 
Старший специалист
Старший специалист

Зарегистрирован:
Вт, ноя 18 2008, 10:40
Сообщения: 342
Откуда: Пермь
Пол: Мужской
CHAIN на сел. экране делается объединением полей в блок (SELECTION-SCREEN BEGIN OF BLOCK / SELECTION-SCREEN END OF BLOCK) и последующей обработкой события AT SELECTION-SCREEN ON BLOCK. Но так как вы хотите сделать работать оно все равно не будет, т.к. если в PAI написать message с типом E, PBO не отработает, а поменять видимость полей можно только в PBO


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Нужен совет по экранам
СообщениеДобавлено: Вт, ноя 22 2011, 18:03 
Модератор
Модератор
Аватара пользователя

Зарегистрирован:
Пт, июн 16 2006, 00:43
Сообщения: 1686
Откуда: Москва <-> Красноярск
Пол: Мужской
zsap, да, пожалуй что так. Не вчитался в то, что хочет автор. Тогда максимально близкой реализацией будет все же проставление признака обязательного ввода. Если пользователь ввел какое-то конкретное значение первого параметра, подразумевающее заполнение еще одного условия, - пускай вводит. Даже если передумал :)

Как вариант реализации можно предложить следующее:

Показывание/скрытие поля делаем в логике экрана в зависимости от значения pole1. А дальше:
Code:
START-OF-SELECTION.

IF pole1 EQ '00001' AND pole2 IS INITIAL. MESSAE 'ERROR' TYPE 'S' DISPLAY AS 'E'. RETURN. ENDIF.

Дальше - логика программы.


Т.е. пользователь будет обрадован сообщением после нажатия F8. Но так, как вам надо. Если я на этот раз правильно понял.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Нужен совет по экранам
СообщениеДобавлено: Вт, ноя 22 2011, 19:07 
Младший специалист
Младший специалист

Зарегистрирован:
Пн, сен 10 2007, 20:37
Сообщения: 72
Code:
DATA: err TYPE c.

PARAMETERS:
  p1 TYPE bkpf-bukrs,
  p2 TYPE bkpf-bukrs,
  p3 TYPE bkpf-bukrs.

AT SELECTION-SCREEN.
  IF p1 = '0001' AND p2 IS INITIAL.
    MESSAGE 'ERROR' TYPE 'S' DISPLAY LIKE 'E'.
    err = 'X'.
  ELSE.
    err = ''.
  ENDIF.


AT SELECTION-SCREEN OUTPUT.
  LOOP AT SCREEN.
    IF screen-name = 'P2' AND p1 <> '0001'.
      screen-invisible = 1.
      screen-active = 0.
    ENDIF.
    IF err = 'X' AND screen-name <> 'P1' AND screen-name <> 'P2' .
      screen-input = '0'.
    ELSEIF err = 'X'.
      screen-intensified = '1'.
    ENDIF.
    MODIFY SCREEN.
  ENDLOOP.


START-OF-SELECTION.
  IF err = 'X'.
    CALL FUNCTION 'SAPGUI_SET_FUNCTIONCODE'
      EXPORTING
        functioncode           = '/00'
      EXCEPTIONS
        function_not_supported = 1.
    CALL METHOD cl_gui_cfw=>flush.
    RETURN.
  ENDIF.
  WRITE '111'.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Нужен совет по экранам
СообщениеДобавлено: Ср, ноя 23 2011, 10:07 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, окт 06 2005, 16:44
Сообщения: 3080
Откуда: Москва
Как вариант можно (не)выдавать сообщение об ошибке только при определенных командах.
Code:
PARAMETERS: p_test1 TYPE bkpf-bukrs,
            p_test2 TYPE bkpf-gjahr MODIF ID tst.

SELECTION-SCREEN END OF BLOCK b1.
PARAMETERS: p_test3 AS CHECKBOX.

AT SELECTION-SCREEN OUTPUT.
  LOOP AT SCREEN.
    CASE screen-group1.
      WHEN 'TST'.
        IF p_test1 IS INITIAL.
          screen-active = 0.
        ENDIF.
      WHEN OTHERS.
        CONTINUE.
    ENDCASE.
    MODIFY SCREEN.
  ENDLOOP.

AT SELECTION-SCREEN ON BLOCK b1.
  CHECK sy-ucomm <> space.
  IF p_test1 IS NOT INITIAL.
    MESSAGE e208(00) WITH 'Error!'.
  ENDIF.

_________________
С уважением,
Удав.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Нужен совет по экранам
СообщениеДобавлено: Ср, ноя 23 2011, 10:19 
Специалист
Специалист

Зарегистрирован:
Пн, дек 21 2009, 11:07
Сообщения: 167
Пономарев Артем написал:
DarZ написал(а):
Можно и так, но если сделаю его обязательным в пбо то программа будет ругаться пока не заполню поле 2 вне зависимости от значения поля 1. А мне нужно чтобы он ругался при изменении поля 1 (ON CHAIN-REQUEST), если значение поля соответсвует.

Мне кажется что в такой постановке, с использованием selection-screen, вы не получите желаемого результата. Нужно переписывать в screen painter.

Рассматривал вариант со screen painter-ом. Но боюсь что там будет такая же проблема...


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Нужен совет по экранам
СообщениеДобавлено: Ср, ноя 23 2011, 11:27 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Пн, авг 03 2009, 15:37
Сообщения: 292
Откуда: Алматы
Пол: Мужской
DarZ написал(а):
Рассматривал вариант со screen painter-ом. Но боюсь что там будет такая же проблема...

Это не совсем то, но как вариант в screen painter: можно выводить сообщение DISPLAY LIKE 'E' в пай логике экрана, а подсвечивать поля в пбо INTENSIFIED = 1 ACTIVE = 1. Просто навешивать проверки придется дважды и пай и в пбо).

_________________
Все в этом мире стоит под сомнением, над сомнением – только google...


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Нужен совет по экранам
СообщениеДобавлено: Ср, ноя 23 2011, 12:54 
Младший специалист
Младший специалист

Зарегистрирован:
Пн, сен 10 2007, 20:37
Сообщения: 72
Code:
TABLES: sscrfields.
DATA: err TYPE c.

PARAMETERS:
  p1 TYPE bkpf-bukrs,
  p2 TYPE bkpf-bukrs,
  p3 TYPE bkpf-bukrs.

AT SELECTION-SCREEN.
  IF p1 = '0001' AND p2 IS INITIAL.
    MESSAGE 'ERROR' TYPE 'S' DISPLAY LIKE 'E'.
    err = 'X'.
    CLEAR sscrfields-ucomm.
  ELSE.
    err = ''.
  ENDIF.

AT SELECTION-SCREEN OUTPUT.
  LOOP AT SCREEN.
    IF screen-name = 'P2' AND p1 <> '0001'.
      screen-active = 0.
    ENDIF.
    IF err = 'X' AND screen-name <> 'P1' AND screen-name <> 'P2' .
      screen-input = '0'.
    ELSEIF err = 'X'.
      screen-intensified = '1'.
    ENDIF.
    MODIFY SCREEN.
  ENDLOOP.

START-OF-SELECTION.
  WRITE '111'.

Так в START-OF-SELECTION не заходит.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Нужен совет по экранам
СообщениеДобавлено: Ср, ноя 23 2011, 13:22 
Старший специалист
Старший специалист

Зарегистрирован:
Сб, июл 28 2007, 20:38
Сообщения: 364
zsap написал:
Но так как вы хотите сделать работать оно все равно не будет, т.к. если в PAI написать message с типом E, PBO не отработает, а поменять видимость полей можно только в PBO


Видимо попробовать message S... dispay like E никто не удосужился.
Единственный недочет - остальные поля не делаются "серыми" как при полноценной ошибке типа Е, но это тоже можно допилить.

Code:
SELECTION-SCREEN BEGIN OF BLOCK b1.
PARAMETERS p_para1 MODIF ID p1.
PARAMETERS p_para2 MODIF ID p2.
SELECTION-SCREEN END OF BLOCK b1.
PARAMETERS p_para3 MODIF ID p33.

AT SELECTION-SCREEN OUTPUT .
  IF p_para1 IS INITIAL.
    LOOP AT SCREEN.
      CHECK screen-group1 = 'P2'.
      screen-active = 0.
      MODIFY SCREEN.
    ENDLOOP.
  ENDIF.

AT SELECTION-SCREEN ON BLOCK b1.
  IF NOT p_para1 IS INITIAL AND p_para2 IS INITIAL.
    MESSAGE s001(00) WITH 'Заполните оба поля' DISPLAY LIKE 'E'.
  ENDIF.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Нужен совет по экранам
СообщениеДобавлено: Ср, ноя 23 2011, 15:07 
Младший специалист
Младший специалист

Зарегистрирован:
Пн, сен 10 2007, 20:37
Сообщения: 72
Добавьте код к своему и запустите программу без явного вызова PAI(Enter).
Code:
START-OF-SELECTION.
  WRITE '111'.

+ "выделение полей красненьким" отсутствует.


Принять этот ответ
Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 15 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot]


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB