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

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


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

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


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

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