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

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


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

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


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

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