Текущее время: Пн, авг 04 2025, 21:50

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


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


ВНИМАНИЕ!

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



Начать новую тему Ответить на тему  [ Сообщений: 16 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Класс сообщений в классе исключений
СообщениеДобавлено: Ср, окт 01 2008, 10:58 
Модератор
Модератор

Зарегистрирован:
Пт, ноя 12 2004, 11:40
Сообщения: 542
Откуда: Москва
Пол: Мужской
Коллеги, всем добрый день.

создал глобальный класс исключений, в его свойствах проставил в нем свой класс сообщений.

пишу тестилку
Code:


data: ls_ex     type ref to zcx, 
      l_t       like if_t100_message=>t100key,
      l_message type string.

try.

    l_t-msgid = 'ZMLO. 
    l_t-msgno = '002'.

    perform raise using l_t.

  catch zcx into ls_ex.

    l_message = ls_ex->get_text( ).
    message l_message type 'I'.

endtry.


form raise using   ps_textid like if_t100_message=>t100key
           raising zcx.

  raise exception type zcx
     exporting textid = ps_textid.

endform.               


всё работает, вот только не понятно зачем надо указывать в textid класс сообщений если я его уже тама прописал...???
очень не удобно, может кто сталкивался подскажите плиз.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, окт 01 2008, 11:17 
Модератор
Модератор
Аватара пользователя

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

Code:
RAISE EXCEPTION TYPE cx_sy_dynamic_osql_semantics
    EXPORTING textid = сx_sy_dynamic_osql_semantics=>unknown_table_name


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

Зарегистрирован:
Сб, сен 25 2004, 16:30
Сообщения: 1368
Откуда: Москва
Пол: Мужской
Класс нужно создавать с галочкой "With message class" на самом первом экране ввода имени нового класса. Тогда в него автоматом добавляется интерфейс IF_T100_MESSAGE.
Затем нужно добавить атрибуты, которые будут параметрами сообщения, когда будете делать RAISE. Эти атрибуты автоматом становятся необязательными параметрами конструктора, и потом они доступны при определении текста сообщения на закладке Texts, только там нужно нажимать кнопку "Message Text" - там укзывается номер и класс сообщения и параметры. Потом,в обработке CATCH номер сообщения можно достать через атрибут IF_T100_MESSAGE~T100KEY.

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


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, окт 01 2008, 11:35 
Модератор
Модератор
Аватара пользователя

Зарегистрирован:
Пт, июн 16 2006, 00:43
Сообщения: 1686
Откуда: Москва <-> Красноярск
Пол: Мужской
Вобще интерфейс IF_T100_MESSAGE не обязателен.
Если его нет, можно пользовать тексты из OTR.
Если же я правильно понял автора, то он и так выполнил все по сценарию. И недоволен только тем, что класс сообщения все равно надо передавать.
Здесь вариант только с атрибутом в классе исключений (собсно про атрибут я и писал). Можно в конструкторе просто указать:

Code:
IF textid IS INITIAL.
   me->textid = атрибут.
ENDIF.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, окт 01 2008, 11:37 
Модератор
Модератор

Зарегистрирован:
Пт, ноя 12 2004, 11:40
Сообщения: 542
Откуда: Москва
Пол: Мужской
Пономарев Артем написал:
Это нормально. Стандартные классы исключений так и живут.
Как вариант можно сделать:

Code:
RAISE EXCEPTION TYPE cx_sy_dynamic_osql_semantics
    EXPORTING textid = сx_sy_dynamic_osql_semantics=>unknown_table_name


Там такая шткука что они передают не как я класс id и мессаже а что то типа '16AA9A3937A9BB56E10000000A11447B' мне не понятно зачем и как они потом текст по этому коду достают? :(



Сергей я так и делал, атрибуты ставил но конструктор закрыт для изменения :(, хотя я заметил что он параметры "подгенеряет" :)
Слона то я и не заметил :))) в смысле закладку Text :)))

спасибо большое пойду попробую.


P.S. Вообще очень странно что так мало статей на SDN про это и примеров там мало тоже :(


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, окт 01 2008, 12:02 
Модератор
Модератор

Зарегистрирован:
Пт, ноя 12 2004, 11:40
Сообщения: 542
Откуда: Москва
Пол: Мужской
Попробовал, получается что атрибут привязан к номеру сообщения,
это не гуд помоему....:( либо я чего то не понял :(

изначально я хотел просто вот так.

Code:
try.
   
   call method z_very_good_api=>ля_ля_ля( ) , который рейзит кучу разных ексепшинов через вот так
     raise exception type zcx exporting textid = '001'.
     raise exception type zcx exporting textid = '021'.

   
  catch zcx into ls_ex.

тут я их ловлю, и так как я не знаю какой номер сообщения мне пришел всё равно всё должно работать :)

    l_message = ls_ex->get_text( ).
    message l_message type 'I'.

endtry.
     


сначала я думал что он сам поймет что за класс надо использовать раз я ему его прописал. Потом понял что нифига.

идеально было бы просто в конструкторе прописать

textid-msgid = 'ZMESSAGE_CLASS'. или textid-msgid = zcx=>mess_class.

но так сделать нельзя так как конструктор не изменяем :(


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, окт 01 2008, 12:26 
Директор
Директор
Аватара пользователя

Зарегистрирован:
Пн, дек 20 2004, 16:05
Сообщения: 1080
Откуда: 4.0B
Пол: Мужской
ну вообще как то так и есть.
Ты какой атрибут имеешь ввиду?
Атрибут для constructor это то, что потом встанет в message вместо &.

Твой же пример фактически:

Code:
try.

  raise exception type ZCX_TEST
     exporting textid = ZCX_TEST=>first
               first_attr = 'Какое-то значение'.

  catch ZCX_TEST into ls_ex.
    l_message = ls_ex->get_text( ).
    message l_message type 'I'.

endtry.

_________________
Я слышу и забываю,
Я вижу и помню долго,
Я делаю и — понимаю.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, окт 01 2008, 12:28 
Модератор
Модератор

Зарегистрирован:
Пт, ноя 12 2004, 11:40
Сообщения: 542
Откуда: Москва
Пол: Мужской
Пономарев Артем написал:
Вобще интерфейс IF_T100_MESSAGE не обязателен.
Если его нет, можно пользовать тексты из OTR.
Если же я правильно понял автора, то он и так выполнил все по сценарию. И недоволен только тем, что класс сообщения все равно надо передавать.
Здесь вариант только с атрибутом в классе исключений (собсно про атрибут я и писал). Можно в конструкторе просто указать:

Code:
IF textid IS INITIAL.
   me->textid = атрибут.
ENDIF.



в OTR не охота я же у же их храню в классе сообщений, в двух местах хранить не гуд.


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


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

Зарегистрирован:
Сб, сен 25 2004, 16:30
Сообщения: 1368
Откуда: Москва
Пол: Мужской
Ich Will написал:
Code:
try.
   
   call method z_very_good_api=>ля_ля_ля( ) , который рейзит кучу разных ексепшинов через вот так
     raise exception type zcx exporting textid = '001'.
     raise exception type zcx exporting textid = '021'.



На мой взгляд, задумка с эксепшенами была не в том, чтоб можно было генерить кучу разных по номерам сообщений, а в том, чтобы описать внятную иерархию исключений и для конкретной ситуации рэйзить вполне определенное исключение с некоторыми семантически понятными в контексте программы параметрами, а уж то,что оно внутри привязывается к сообщению Т100 - просто лишний бонус.
Лично мне ближе конструкция
Code:
raise exception zcx_error_in_table exporting tabname = 'TAB'

чем
Code:
raise exception zcx_msg_class_error exporting msgclass = 'XXX' msgno = '999' param1 = 'TAB'

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


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

Зарегистрирован:
Сб, сен 25 2004, 16:30
Сообщения: 1368
Откуда: Москва
Пол: Мужской
Ich Will написал:
ограниччение на 4 атрибута... да и вообще механизм конечно... .

Ну вообще-то если не использовать исключения с классами сообщений, то можно тексты параметризовать каким угодно количеством параметров опять же через атрибуты класса сообщений. Имена атрибутов указываются в тексте сообщения в амперсандах: &ATTR& (кажись... :oops:)

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


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, окт 01 2008, 12:33 
Модератор
Модератор

Зарегистрирован:
Пт, ноя 12 2004, 11:40
Сообщения: 542
Откуда: Москва
Пол: Мужской
Lars написал:
ну вообще как то так и есть.
Ты какой атрибут имеешь ввиду?
Атрибут для constructor это то, что потом встанет в message вместо &.

Твой же пример фактически:

Code:
try.

  raise exception type ZCX_TEST
     exporting textid = ZCX_TEST=>first
               first_attr = 'Какое-то значение'.

  catch ZCX_TEST into ls_ex.
    l_message = ls_ex->get_text( ).
    message l_message type 'I'.

endtry.


Володь привет :)

так не проканает :)

делаешь firts type SCX_T100KEY

в класс конструкторе его заполняешь

firts-msgid = 'ZMLO'.
firts-msgno = '001'. " для примера

делаешь raise а в конструкторе а он( first, который подгенериться в параметры ему ) уже пустой :)))


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, окт 01 2008, 12:43 
Модератор
Модератор

Зарегистрирован:
Пт, ноя 12 2004, 11:40
Сообщения: 542
Откуда: Москва
Пол: Мужской
Сергей Королев написал:
На мой взгляд, задумка с эксепшенами была не в том, чтоб можно было генерить кучу разных по номерам сообщений, а в том, чтобы описать внятную иерархию исключений и для конкретной ситуации рэйзить вполне определенное исключение с некоторыми семантически понятными в контексте программы параметрами


Это точно! И это получилось нормально.

Сергей Королев написал:
а уж то,что оно внутри привязывается к сообщению Т100 - просто лишний бонус.


Вот я за него и зацепился думал легко будет :)

Сергей Королев написал:

Лично мне ближе конструкция
Code:
raise exception zcx_error_in_table exporting tabname = 'TAB'

чем
Code:
raise exception zcx_msg_class_error exporting msgclass = 'XXX' msgno = '999' param1 = 'TAB'


Это я не очень понял :) у меня же задача простая в одном классе исключений куча разных ошибок как сделать малой кровью :))) чтобы всё работало :)


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, окт 01 2008, 12:43 
Директор
Директор
Аватара пользователя

Зарегистрирован:
Пн, дек 20 2004, 16:05
Сообщения: 1080
Откуда: 4.0B
Пол: Мужской
:) Привет Ром, я, видимо, тупо не понимаю.
Зачем first делать каким-то типом ?

Это же просто имя эксепшена. Оно атрибут-константа в твоем классе.
Типизированная с конкретным значением пула меседжей и номером его.

Я тебе рабочий кусок кода-то кинул :)

_________________
Я слышу и забываю,
Я вижу и помню долго,
Я делаю и — понимаю.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, окт 01 2008, 12:56 
Модератор
Модератор

Зарегистрирован:
Пт, ноя 12 2004, 11:40
Сообщения: 542
Откуда: Москва
Пол: Мужской
Lars написал:
:) Привет Ром, я, видимо, тупо не понимаю.
Зачем first делать каким-то типом ?

Это же просто имя эксепшена. Оно атрибут-константа в твоем классе.
Типизированная с конкретным значением пула меседжей и номером его.

Я тебе рабочий кусок кода-то кинул :)


Кажися, кажися я понял что ты предлагаешь
это механизм через OTR только не вручную тексты вбивать а подтягивать из класса сообщений.

а как ты будешь управлять номером сообщения?

а вот это у тебя как работает first_attr = 'Какое-то значение'. ?
типа сообщениие - & ляля и получается - "Какое-то значение ляля" так?

а я маленько другого хотел :)


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, окт 01 2008, 13:00 
Директор
Директор
Аватара пользователя

Зарегистрирован:
Пн, дек 20 2004, 16:05
Сообщения: 1080
Откуда: 4.0B
Пол: Мужской
Ich Will написал:
Lars написал:
:) Привет Ром, я, видимо, тупо не понимаю.
Зачем first делать каким-то типом ?

Это же просто имя эксепшена. Оно атрибут-константа в твоем классе.
Типизированная с конкретным значением пула меседжей и номером его.

Я тебе рабочий кусок кода-то кинул :)


Кажися, кажися я понял что ты предлагаешь
это механизм через OTR только не вручную тексты вбивать а подтягивать из класса сообщений.

а как ты будешь управлять номером сообщения?

а вот это у тебя как работает first_attr = 'Какое-то значение'. ?
типа сообщениие - & ляля и получается - "Какое-то значение ляля" так?

а я маленько другого хотел :)


Ну да именно так.
Что ты имеешь ввиду под управлением номером ?
textid = ZCX_TEST=>first - это и есть номер сообщения, как бы.
если посмотреть его описание в классе, то увидим...

Code:
    begin of FIRST,
      msgid type symsgid value 'ZFI',
      msgno type symsgno value '017',
      attr1 type scx_attrname value 'FIRST_ATTR',
      attr2 type scx_attrname value '',
      attr3 type scx_attrname value '',
      attr4 type scx_attrname value '',
    end of FIRST .



ты когда в текстах заводил сообщение, жал потом на его изменение? там можно указать messge id и номер его.
Нужен будет second :) заведем second.
Я вот и думаю, что ты хотел что-то другое, но пока не понял :)

_________________
Я слышу и забываю,
Я вижу и помню долго,
Я делаю и — понимаю.


Принять этот ответ
Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 16 ]  На страницу 1, 2  След.

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


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

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


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

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