Текущее время: Пт, июл 25 2025, 05:56

Часовой пояс: 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 часа


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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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