Текущее время: Вс, авг 03 2025, 23:18

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


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

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


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

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