Текущее время: Пт, май 16 2025, 02:42

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


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


ВНИМАНИЕ!

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



Начать новую тему Ответить на тему  [ Сообщений: 14 ] 
Автор Сообщение
 Заголовок сообщения: Поймать exception
СообщениеДобавлено: Ср, ноя 23 2005, 14:00 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Ср, ноя 23 2005, 13:37
Сообщения: 1805
Откуда: ECC 6.0
Пол: Мужской
Можно ли поймать exception, когда вызывается несуществующий экран: CALL SCREEN invalid ?

try catch и catch system-exception не ловят такую ошибку.

Аналогично нужно поймать exception для PERFORM (INVALID) IN PROGRAM 'VALID'.
Если IF FOUND то как понять, успешный вызов или нет?.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, ноя 23 2005, 14:50 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Ср, ноя 23 2005, 13:37
Сообщения: 1805
Откуда: ECC 6.0
Пол: Мужской
Номера экранов можно в D020S подсмотреть.

Если каждая perform будет устанавливать некую глобальную переменную DONE в 'X', то можно вырулить так:
DONE = ''.
perform (INVALID) IN PROGRAM VALID IF FOUND.
IF DONE = 'X'.
Но это не красиво. Может кто знает более прямое решение.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Поймать exception
СообщениеДобавлено: Ср, ноя 23 2005, 15:00 
Гость
1. Запуск экрана с предварительной проверкой на его существование

Code:
REPORT  ZU                .

DATA:      O_D020S LIKE D020S,
           O_D021S LIKE D021S OCCURS 0 WITH HEADER LINE,
           O_D022S LIKE D022S OCCURS 0 WITH HEADER LINE,
           O_D023S LIKE D023S OCCURS 0 WITH HEADER LINE,
           NS LIKE D020S-DNUM.


NS = '0100'.  " Номер экрана

REFRESH: O_D021S,O_D022S, O_D023S.

CALL FUNCTION 'RS_IMPORT_DYNPRO'
  EXPORTING
    DYNAME = SY-REPID
    DYNUMB = NS
  IMPORTING
    HEADER = O_D020S
  TABLES
    FTAB   = O_D021S
    PLTAB  = O_D022S
  EXCEPTIONS
    OTHERS = 99.


IF SY-SUBRC EQ 0.
  CALL SCREEN NS.
ENDIF.


Принять этот ответ
Вернуться к началу
  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, ноя 23 2005, 15:00 
Гость
sibrin написал:
Номера экранов можно в D020S подсмотреть.

Если каждая perform будет устанавливать некую глобальную переменную DONE в 'X', то можно вырулить так:
DONE = ''.
perform (INVALID) IN PROGRAM VALID IF FOUND.
IF DONE = 'X'.
Но это не красиво. Может кто знает более прямое решение.


в спецрегистрах пользовательские подпрограммы обязаны например чистить sy-subrc на выходе, иначе они считаются несуществующими. от флага не уйти наверное. :(


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

Зарегистрирован:
Сб, сен 25 2004, 16:30
Сообщения: 1368
Откуда: Москва
Пол: Мужской
РМщик написал(а):
Code:
CALL FUNCTION 'RS_IMPORT_DYNPRO'
  EXPORTING
    DYNAME = SY-REPID
    DYNUMB = NS
  IMPORTING
    HEADER = O_D020S
  TABLES
    FTAB   = O_D021S
    PLTAB  = O_D022S
  EXCEPTIONS
    OTHERS = 99.

И что, DYNAME = SY-REPID прокатывает? Вроде ведь не должно...
А вообще, не понимаю я, зачем проверять наличие экрана перед вызовом. Если бы общей практикой было его динамическое создание, тогда еще туда-сюда, а так отсутстве экрана - это либо программная ошибка, либо ошибка настройки, и пусть бы дамп выдавался...

_________________
С уважением, Сергей Королев


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, ноя 23 2005, 15:38 
Гость
2. Проверка существования подпрограммы :) :)

=== лучше не надо показывать мой вариант

to Сергей Королев -
да, sy-repid - лучше передавать через переменную,
просто наяваял на скорую руку, но в тесте - прокатило
а проверять - нужно, ибо можно вести настроечную таблицу
для своей проги, где можно будет менять номера экранов


Принять этот ответ
Вернуться к началу
  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, ноя 23 2005, 15:59 
Гость
2. проверка существования подпрограммы

Code:
REPORT  ZU                .

DATA:    MYSYS LIKE SY-SUBRC, IND.

DATA: VALID LIKE SY-REPID VALUE 'ZTEST61',
      INVALID(30) VALUE 'MYPROG1',
      FR LIKE  STOKEN OCCURS 0 WITH HEADER LINE.


CALL FUNCTION 'SWF_FORMS_OF_PROGRAM_GET'
  EXPORTING
    PROGRAM                   = VALID
  TABLES
    FORM_ROUTINES             = FR
  EXCEPTIONS
    PROGRAM_NOT_FOUND         = 1
    CONTAINS_NO_FORM_ROUTINES = 2.

MYSYS = SY-SUBRC.

CASE MYSYS.
  WHEN 1. WRITE:/ 'Нет такой программы'.
  WHEN 2. WRITE:/ 'В программе нет вообще подпрограмм'.
  WHEN 0.
    READ TABLE FR WITH KEY STR = INVALID.
    IF SY-SUBRC = 0.
      WRITE:/ 'Нужна подпрограммма найдена'.
      PERFORM (INVALID) IN PROGRAM (VALID).
    ELSE.
      WRITE: / INVALID, '????'.
    ENDIF.
ENDCASE.


FORM MYPROG.
  WRITE:/ 'Эту строчку написала подпрограмма'.
ENDFORM.   


Принять этот ответ
Вернуться к началу
  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, ноя 23 2005, 16:09 
Модератор
Модератор

Зарегистрирован:
Пт, ноя 12 2004, 11:40
Сообщения: 542
Откуда: Москва
Пол: Мужской
Цитата:
try catch и catch system-exception не ловят такую ошибку.


даже если catch'ить cx_root?


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, ноя 23 2005, 16:11 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Сб, сен 25 2004, 16:30
Сообщения: 1368
Откуда: Москва
Пол: Мужской
РМщик написал(а):
а проверять - нужно, ибо можно вести настроечную таблицу
для своей проги, где можно будет менять номера экранов

Так я и говорю, что в таком случае это ошибка конфигурации, о которой в любом случае надо что-то сообщить. Ну сообщите вы юзеру, что экрана не хватает, какая-нибудь бухгалтерша схватится за сердце... Я считаю, что подобные ошибки нужно ловить на этапе юнит-теста, и дамп тут очень поможет ;) Хотя, дело хозяйское...

Да и по поводу подпрограмм мне все это концептуально не нравится, уж пардон... Что-то не так в постановке, есть ощущение...

_________________
С уважением, Сергей Королев


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, ноя 23 2005, 16:26 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Ср, ноя 23 2005, 13:37
Сообщения: 1805
Откуда: ECC 6.0
Пол: Мужской
Спасибо, РМщик'у.

Цитата:
Если бы общей практикой было его динамическое создание


Следующий вопрос закономерен: можно ли динамически создать selection-screen ?

PS.
Видимо, вызывать 'RS_IMPORT_DYNPRO' идеологически более правильно, чем просто сделать select from D020S. Это связано с тем, что структура таблиц в будущем может измениться?


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, ноя 23 2005, 16:32 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Ср, ноя 23 2005, 13:37
Сообщения: 1805
Откуда: ECC 6.0
Пол: Мужской
Сергей Королев написал:
Что-то не так в постановке, есть ощущение...


Пишу некий движок для сотрудника, который занимает среднее положение между бухгалтером и программистом. Этот сотрудник ввводит в конфигурацию имена подпрограмм и номера экранов.
Простые подпрограммы этот сотрудник пишет сам, более сложные - заказывает у программиста.

Экраны должны генерироваться динамически на основе настроечной таблицы.

"А почему снег идёт? --- Вот такое хреновое лето..." :)


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, ноя 23 2005, 16:40 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Сб, сен 25 2004, 16:30
Сообщения: 1368
Откуда: Москва
Пол: Мужской
Понятно... Чудны дела твои, Господи...
Для динамического экрана выбора есть ФМ FREE_SELECTIONS_DIALOG, а в нем есть документация с примером.

_________________
С уважением, Сергей Королев


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Поймать exception
СообщениеДобавлено: Ср, ноя 23 2005, 16:43 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, окт 06 2005, 16:44
Сообщения: 3080
Откуда: Москва
sibrin написал:
Аналогично нужно поймать exception для PERFORM (INVALID) IN PROGRAM 'VALID'.
Если IF FOUND то как понять, успешный вызов или нет?.

Можно отследить с помощью SET/GET параметров. Это и есть глобальная переменная :)

SET PARAMETER 'ZFL' FIELD space.
PERFORM someform IN PROGRAM ZSOME_TEST.
data: flg type c.
GET PARAMETER 'ZFL' FIELD flg.
IF flg = 'X'.
*Подпрограмма выполнилась
.....
ENDIF.
...


PROGRAM ZSOME_TEST.
.....
FORM someform.
.....
SET PARAMETER 'ZFL' FIELD 'X'.
....
ENDFORM.

Или через параметр вызываемой процедуры ;)

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


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Поймать exception
СообщениеДобавлено: Ср, ноя 23 2005, 17:10 
Гость
Удав написал(а):
sibrin написал:
Можно отследить с помощью SET/GET параметров. Это и есть глобальная переменная :)


1. А если вызываемая подпрограмма - из стандарта?
2. Правильнее, на мой взгляд, сначала проверить существование,
а потом вызывать.


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

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


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

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


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

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