Текущее время: Пт, июл 18 2025, 20:20

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


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


ВНИМАНИЕ!

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



Начать новую тему Ответить на тему  [ Сообщений: 17 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Как дин. создать объект и вызвать метод?
СообщениеДобавлено: Пт, сен 15 2006, 09:11 
Менеджер
Менеджер

Зарегистрирован:
Вт, дек 06 2005, 17:52
Сообщения: 559
Собственно, сабж.
Имеем:

DATA name_of_class TYPE string .
DATA name_of_method TYPE string.

Затем, естественно, этим переменным присваиваются соответствующие значения.

Как создать экземпляр этого класса и вызвать метод? Можно ли это в принципе? Рыл в направлении field-symbols & assign - ничего не нарыл. Если можно, с примером кода.


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

Зарегистрирован:
Ср, май 04 2005, 16:29
Сообщения: 687
Откуда: Нижневартовск->Москва
Пол: Мужской
Не совсем всё динамическое, но..
Code:
DATA: ref TYPE REF TO object.
DATA: class TYPE string VALUE 'CL_GUI_DOCKING_CONTAINER',
      method TYPE string VALUE 'FLOAT'.

PARAMETERS: dummy.

INITIALIZATION.
  CREATE OBJECT ref TYPE (class).
  CALL METHOD ref->(method)
    EXPORTING
      do_float = 1.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт, сен 15 2006, 09:56 
Почетный гуру
Почетный гуру

Зарегистрирован:
Вт, авг 17 2004, 10:45
Сообщения: 550
Откуда: SAP_BASIS 640
Меня опередили :)
Code:
TYPE-POOLS abap.

*----------------------------------------------------------------------*
*       CLASS lc_dynamic_call DEFINITION
*----------------------------------------------------------------------*
CLASS lc_dynamic_call DEFINITION.
  PUBLIC SECTION.
    METHODS dynamic_method
      IMPORTING
        e_dynamic_value TYPE string.
ENDCLASS.                    "lc_dynamic_call DEFINITION

*----------------------------------------------------------------------*
*       CLASS lc_dynamic_call IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS lc_dynamic_call IMPLEMENTATION.
  METHOD dynamic_method.
*      IMPORTING
*        e_dynamic_value TYPE string.
    WRITE / e_dynamic_value.
  ENDMETHOD.                    "dynamic_method
ENDCLASS.                    "lc_dynamic_call IMPLEMENTATION


DATA:
  g_class_name      TYPE string VALUE 'LC_DYNAMIC_CALL',
  g_method_name     TYPE string VALUE 'DYNAMIC_METHOD',
  g_param_name      TYPE string VALUE 'E_DYNAMIC_VALUE',
  g_param_value     TYPE string VALUE 'This is dynamic passed parameter'
,
  gs_param          TYPE abap_parmbind,
  gt_param          TYPE abap_parmbind_tab,
  grc_generic_class TYPE REF TO object
.

START-OF-SELECTION.

  TRY.
      CREATE OBJECT grc_generic_class TYPE (g_class_name).
    CATCH cx_sy_create_object_error.
      MESSAGE 'Instance create error' TYPE 'I'.
      RETURN.
  ENDTRY.

  TRY.
      CALL METHOD grc_generic_class->(g_method_name)
        EXPORTING
          e_dynamic_value = 'This is static passed parameter'.

      gs_param-name = g_param_name.
      gs_param-kind = cl_abap_objectdescr=>exporting.
      GET REFERENCE OF g_param_value INTO gs_param-value.
      INSERT gs_param INTO TABLE gt_param.
      CALL METHOD grc_generic_class->(g_method_name)
        PARAMETER-TABLE
          gt_param.
    CATCH cx_sy_dyn_call_illegal_method.
      MESSAGE 'Method call error' TYPE 'I'.
    CATCH cx_sy_dyn_call_param_missing.
      MESSAGE 'Parameter pass error' TYPE 'I'.
  ENDTRY.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт, сен 15 2006, 10:08 
Модератор
Модератор
Аватара пользователя

Зарегистрирован:
Пт, июн 16 2006, 00:43
Сообщения: 1686
Откуда: Москва <-> Красноярск
Пол: Мужской
TRY ........ ENDTRY
я бы убрал. Мало ли какая у автора вопроса версия?
И ENDCATCH отсутствует.


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

Зарегистрирован:
Сб, сен 25 2004, 16:30
Сообщения: 1368
Откуда: Москва
Пол: Мужской
Артем, это верный синтаксис, начиная с 4.7. ENDCATCH там не нужен.

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


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

Зарегистрирован:
Сб, сен 25 2004, 16:30
Сообщения: 1368
Откуда: Москва
Пол: Мужской
Простите зануду за придирки :oops: Но я бы вот так изложил :)
EGF написал(а):
Code:
  TRY.
      CREATE OBJECT grc_generic_class TYPE (g_class_name).

      CALL METHOD grc_generic_class->(g_method_name)
        EXPORTING
          e_dynamic_value = 'This is static passed parameter'.

      gs_param-name = g_param_name.
      gs_param-kind = cl_abap_objectdescr=>exporting.
      GET REFERENCE OF g_param_value INTO gs_param-value.
      INSERT gs_param INTO TABLE gt_param.
      CALL METHOD grc_generic_class->(g_method_name)
        PARAMETER-TABLE
          gt_param.

    CATCH cx_sy_create_object_error.
      MESSAGE 'Instance create error' TYPE 'I'.
      RETURN.
    CATCH cx_sy_dyn_call_illegal_method.
      MESSAGE 'Method call error' TYPE 'I'.
    CATCH cx_sy_dyn_call_param_missing.
      MESSAGE 'Parameter pass error' TYPE 'I'.
  ENDTRY.

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


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

Зарегистрирован:
Пт, июн 16 2006, 00:43
Сообщения: 1686
Откуда: Москва <-> Красноярск
Пол: Мужской
:oops:
Я сейчас на 4.6С сижу, сорри. Но насколько я помню 4.7 на endcatch ругаться не должен.
В любом случае автору лучше было указать версию системы ;)


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт, сен 15 2006, 10:45 
Почетный гуру
Почетный гуру

Зарегистрирован:
Вт, авг 17 2004, 10:45
Сообщения: 550
Откуда: SAP_BASIS 640
Сергей Королев написал:
Простите зануду за придирки :oops: Но я бы вот так изложил :)


В данном контексте этот вариант, конечно, более правильный. Обычно же между созданием объекта и вызовом его методов много чего происходит, поэтому, как-то они у меня разделились :).

Пономарев Артем написал:
И ENDCATCH отсутствует.


Вы, по-моему, путаете обработку разных типов исключений. ENDCATCH нужен при обработке SYSTEM-EXCEPTION, при обработке же блока TRY - ENDTRY ENDCATCH не нужен.


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

Зарегистрирован:
Пт, июн 16 2006, 00:43
Сообщения: 1686
Откуда: Москва <-> Красноярск
Пол: Мужской
Вопрос с ENDCATCH'ем уже решили :)
В 4.6 нет блока TRY...ENDTRY.

Теперь по сабжу. Если вызываемый класс не создается на коленке (сиречь в теле программы), а сделан в class builder'е, то считаю более правильным следующий метод:

Перед попыткой создать лучше проверить, а не ловить ошибки.
Code:
FORM class_check USING class_name method_name.
  DATA:
        l_dref  TYPE REF TO cl_abap_typedescr,
        l_clref TYPE REF TO cl_abap_classdescr.

   CALL METHOD cl_abap_typedescr=>describe_by_name
              EXPORTING  p_name         = class_name
              RECEIVING  p_descr_ref    = l_dref
              EXCEPTIONS type_not_found = 1.
             
*тут пишем месседж о том что класса нету, если 1 в sy-subrc             
   
   l_clref ?= l_dref.
 
   READ TABLE l_clref->methods WITH KEY name = method_name
       TRANSPORTING NO FIELDS.

* если sy-subrc не 0, пишем что метода такого нету.       

ENDFORM.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт, сен 15 2006, 12:46 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Вс, окт 17 2004, 14:20
Сообщения: 326
Откуда: Москва
Пономарев Артем написал:
Перед попыткой создать лучше проверить, а не ловить ошибки.

Как результат - лишние действия в штатной (класс и метод имеются) ситуации... Отсутствие класса или метода это все же исключительная ситуация, поэтому и обрабатывать ее лучше посредством исключений.


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

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

Кстати, это системный код САПы. Так что программисты SAP AG с тобой, ABC, несогласны ;)


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

Зарегистрирован:
Сб, сен 25 2004, 16:30
Сообщения: 1368
Откуда: Москва
Пол: Мужской
Пономарев Артем написал:
Кстати, это системный код САПы. Так что программисты SAP AG с тобой, ABC, несогласны ;)

Тогда у них еще не было OO-exceptions 8)
Впрочем, наличие OO-exceptions их тоже не спасает :)

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


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт, сен 15 2006, 13:19 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Вс, окт 17 2004, 14:20
Сообщения: 326
Откуда: Москва
Пономарев Артем написал:
Кстати, это системный код САПы. Так что программисты SAP AG с тобой, ABC, несогласны ;)

Точно знаю, что как минимум один программист САП со мной согласен ;)


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

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

Цитата:
Впрочем, наличие OO-exceptions их тоже не спасает

:D


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

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

Кстати, я проверял, даже блог на эту тему в SDN есть, получается, что накладные минимальны (если экземпляр класс-исключения не создавать, да даже и в этом случае накладными можно пренебречь).
Лично мне больше нравится TRY...ENDTRY и кстати в ОО-исключениях механизм передачи сообщений вполне пристойный, гибче MESSAGE.

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


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

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


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

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


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

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