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

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


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


ВНИМАНИЕ!

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



Начать новую тему Ответить на тему  [ Сообщений: 19 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Переменная ЛЮБОГО типа
СообщениеДобавлено: Пн, авг 29 2011, 16:08 
Младший специалист
Младший специалист

Зарегистрирован:
Пн, авг 29 2011, 15:55
Сообщения: 91
Пол: Мужской
Доброго всем дня
Пишу некий универсальный класс, который должен обрабатывать несколько таблиц. В каждый момент времени он обрабатывает только одну таблицу. Требуется в классе создать атрибут, который содержит данные из текущей таблицы (как производится их отбор - здесь неважно). Вопрос: как создать ОДИН атрибут, ко орый может ссылаться на НЕСКОЛЬКО таблиц? Конструкции типа TYPE STANDART TABLE, TYPE ANY TABLE, TYPE TABLE не проходят, т.к. это generic data types, которые в атрибутах использовать нельзя. :(
Аналогичный вопрос - как создать параметр методов данного класса, параметрами которых являются записи текущей таблицы. Соответственно тип параметра должен быть Структура текущей таблицы.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Переменная ЛЮБОГО типа
СообщениеДобавлено: Пн, авг 29 2011, 17:13 
Специалист
Специалист
Аватара пользователя

Зарегистрирован:
Пт, июл 16 2010, 09:57
Сообщения: 106
Откуда: СПб
Пол: Мужской
Может, как-то так?
Code:
CLASS ... DEFINITION.
  PUBLIC SECTION.
    DATA: tab_pointer TYPE REF TO data,
          wa_pointer  TYPE REF TO data.
    ..........

    METHODS:
      constructor
          IMPORTING itab TYPE ANY TABLE
    ..........

CLASS ... IMPLEMENTATION.
  METHOD constructor.
    GET REFERENCE OF itab INTO tab_pointer.
    CREATE DATA wa_pointer LIKE LINE OF itab.
    ..........

  METHOD test_display.
    FIELD-SYMBOLS: <tab_data> TYPE ANY TABLE,
                   <wa_data>  TYPE ANY,
                   <fs>       TYPE ANY.
    ASSIGN wa_pointer->*  TO <wa_data>.
    ASSIGN tab_pointer->*  TO <tab_data>.

    LOOP AT <tab_data> INTO <wa_data>.
      ASSIGN COMPONENT 1 OF STRUCTURE <wa_data> TO <fs>.
      WRITE / <fs>.
    ENDLOOP.
    ..........


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Переменная ЛЮБОГО типа
СообщениеДобавлено: Ср, авг 31 2011, 09:13 
Младший специалист
Младший специалист

Зарегистрирован:
Пн, авг 29 2011, 15:55
Сообщения: 91
Пол: Мужской
Спасибо за идею.
Правда, встал другой вопрос: как описать переменную типа any table?
Код:
DATA: any_table TYPE any table,
any_table_data LIKE LINE OF any_table
также ругается на generic data type :(


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Переменная ЛЮБОГО типа
СообщениеДобавлено: Ср, авг 31 2011, 09:39 
Младший специалист
Младший специалист
Аватара пользователя

Зарегистрирован:
Пн, авг 11 2008, 17:36
Сообщения: 84
Откуда: Moscow
Пол: Мужской
Через field-symbol.
Потом из CL_ABAP_TYPEDESCR получаем описание таблицы и делаем желаемое.

Выше приведён код, который как раз это и делает.

_________________
CONTINUE OBSERVATION OF... INTERRUPTION!


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Переменная ЛЮБОГО типа
СообщениеДобавлено: Ср, авг 31 2011, 13:53 
Специалист
Специалист
Аватара пользователя

Зарегистрирован:
Пт, июл 16 2010, 09:57
Сообщения: 106
Откуда: СПб
Пол: Мужской
swd написал:
Спасибо за идею.
Правда, встал другой вопрос: как описать переменную типа any table?
Код:
DATA: any_table TYPE any table,
any_table_data LIKE LINE OF any_table
также ругается на generic data type :(
Не очень понимаю, где вы пытаетесь это делать. В каком-то методе своего класса? Так не получится.

Если вы посмотрите на мои фрагменты кода, то увидите, что в конструкторе внешняя таблица (точнее, ссылка на нее) принимается в класс через параметр itab, который как раз ANY TABLE. Т.е. предполагается, что таблица передается в класс извне в момент создания объекта вашего класса оператором:
Code:
CREATE OBJECT ВашКласс EXPORTING itab = ВашаКонкретнаяТаблица.

В том же конструкторе переданная таблица сразу обуздывается путем создания указателей: на всю таблицу (tab_pointer) и на одну запись (рабочую область, wa_pointer). Всё! При помощи двух этих параметров вы получаете возможность трогать таблицу в любом методе данного класса. Сама таблица при этом физически в класс не передается и находится "где-то в вызывающей программе".

Далее в конкретном методе вы делаете деРеференс (->*) указателей, превращая их в филд-симболы (<tab_data>,<wa_data>), с которыми уже можно оперировать внутри метода как с обычными таблицами и строками. Дереференс придется делать в каждом методе, который прикасается к таблице. Потому что филд-симболы не могут быть объявлены как аттрибуты класса, но могут быть объявлены в конкретном методе. Запасайтесь терпением, таковы правила игры.

Если я в чем-то неправ (мой ABAP-опыт пока невелик), пусть старшие товарищи меня поправят :)


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Переменная ЛЮБОГО типа
СообщениеДобавлено: Ср, авг 31 2011, 14:52 
Специалист
Специалист
Аватара пользователя

Зарегистрирован:
Пт, июл 16 2010, 09:57
Сообщения: 106
Откуда: СПб
Пол: Мужской
niemda написал:
Потом из CL_ABAP_TYPEDESCR получаем описание таблицы и делаем желаемое.

Да. Чтобы в классе всегда иметь под рукой информацию о структуре текущей таблицы надо:

1. определить аттрибут класса в секции DEFINITION:
Code:
DATA oref_structure TYPE REF TO cl_abap_structdescr.

2. в коде конструктора после определения указателя рабочей области получить ссылку на структуру:
Code:
CREATE DATA wa_pointer LIKE LINE OF itab.
..........
oref_structure ?= cl_abap_typedescr=>describe_by_data_ref( wa_pointer ).

3. далее в конкретном методе использовать, например, цикл для доступа к данным по структуре таблицы; это тоже таблица, в которой каждая строчка представляет собой поле исследуемой таблицы:
Code:
DATA wa_comp TYPE abap_compdescr.

LOOP AT oref_structure->components INTO wa_comp.
    WRITE: / wa_comp-name,      "имя поля
             wa_comp-type_kind, "тип - C,N,I,P,D,T и др.
             wa_comp-length,    "длина - в БАЙТАХ!
             wa_comp-decimals   "знаков после запятой
ENDLOOP.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Переменная ЛЮБОГО типа
СообщениеДобавлено: Ср, авг 31 2011, 15:04 
Начинающий
Начинающий

Зарегистрирован:
Ср, авг 17 2011, 07:41
Сообщения: 10
ABAP - довольно-таки "жесткий" язык и в нём трудно создать сколько-нибудь эффектные динамические конструкции, типа Ваших пожеланий.
В общем, до python'а далековато будет..))
Попробуйте посмотреть на возможности динамической компиляции - это когда "на ходу" составляется и компилится произвольный ABAP-код - в этом коде можно воплотить любые фантазии. Правда, есть некие ограничения.. но, возможно, они для Вас не будут существенными.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Переменная ЛЮБОГО типа
СообщениеДобавлено: Ср, авг 31 2011, 16:06 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, окт 06 2005, 16:44
Сообщения: 3080
Откуда: Москва
x33z77 написал(а):
ABAP - довольно-таки "жесткий" язык и в нём трудно создать сколько-нибудь эффектные динамические конструкции, типа Ваших пожеланий.
В общем, до python'а далековато будет..))

Рабочее решение уже предложено Gustav. Почему Вы считаете его неэффективным?
x33z77 написал(а):
Попробуйте посмотреть на возможности динамической компиляции - это когда "на ходу" составляется и компилится произвольный ABAP-код - в этом коде можно воплотить любые фантазии.

А зачем в данном случае? :?

оффтоп: А что, на python есть крупные ERP-системы? :lol:

_________________
С уважением,
Удав.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Переменная ЛЮБОГО типа
СообщениеДобавлено: Ср, авг 31 2011, 17:34 
Младший специалист
Младший специалист
Аватара пользователя

Зарегистрирован:
Пн, авг 11 2008, 17:36
Сообщения: 84
Откуда: Moscow
Пол: Мужской
Цитата:
Почему Вы считаете его неэффективным?

Эффекта нет. ^___~

Иногда хочется шаблоны и перегрузку. И увидеть объектно-ориентированный API равный хоть BAPI.

_________________
CONTINUE OBSERVATION OF... INTERRUPTION!


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Переменная ЛЮБОГО типа
СообщениеДобавлено: Ср, авг 31 2011, 18:15 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, окт 06 2005, 16:44
Сообщения: 3080
Откуда: Москва
niemda написал:
Эффекта нет.

Приведите свой код.

_________________
С уважением,
Удав.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Переменная ЛЮБОГО типа
СообщениеДобавлено: Ср, авг 31 2011, 18:38 
Младший специалист
Младший специалист
Аватара пользователя

Зарегистрирован:
Пн, авг 11 2008, 17:36
Сообщения: 84
Откуда: Moscow
Пол: Мужской
Удав написал(а):
niemda написал:
Эффекта нет.

Приведите свой код.


Это шутка была. «Эффектно».

_________________
CONTINUE OBSERVATION OF... INTERRUPTION!


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Переменная ЛЮБОГО типа
СообщениеДобавлено: Чт, сен 01 2011, 08:28 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Пт, сен 23 2005, 11:11
Сообщения: 963
swd написал:
Пишу некий универсальный класс, который должен обрабатывать несколько таблиц. В каждый момент времени он обрабатывает только одну таблицу. Требуется в классе создать атрибут, который содержит данные из текущей таблицы (как производится их отбор - здесь неважно). Вопрос: как создать ОДИН атрибут, ко орый может ссылаться на НЕСКОЛЬКО таблиц

недавно перешли на abap?


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Переменная ЛЮБОГО типа
СообщениеДобавлено: Чт, сен 01 2011, 14:47 
Начинающий
Начинающий

Зарегистрирован:
Ср, авг 17 2011, 07:41
Сообщения: 10
Удав написал(а):
Рабочее решение уже предложено Gustav. Почему Вы считаете его неэффективным?

А где я об этом упоминал??? Решение вполне себе работающее. Правда, автору придется думать что ж с этим решением делать дальше?
Ну передал в метод кусок данных с произвольной структурой. Дальше то что? А дальше нужно разбираться что ж там внутри, какие поля, какого типа, как к ним обращаться.. имена полей не будут так легко доступными.. повозиться придется! Может я чего-то не понимаю, но пользу от такой вот гибкости не очень-то видно, и объем кода получим не маленький.
Конечно, нужно смотреть на конкретную решаемую задачу. Но в общем случае, эффективнее не заморачиваться общими решениями с произвольными структурами данных. Всё-таки, в ABAPe при всех его странностях, очень даже приятно сделана интеграция кода со словарем данных и ошибки, связанные со словарем, хорошо ловятся уже при компиляции. )

В конце-концов, можно использовать макросы. Это еще один вариант. Правда типа несовременный и не рекомендуемый "лучшими практиками". Но вполне работающий и способный оччень даже уменьшить объем и сложность кода. Тож можно подумать на эту тему.

Удав написал(а):
оффтоп: А что, на python есть крупные ERP-системы? :lol:

[/quote]

еще один оффтоп:
Питон был приведен только как иллюстрация разного подхода к типизации в разных языках.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Переменная ЛЮБОГО типа
СообщениеДобавлено: Чт, сен 01 2011, 14:59 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, окт 06 2005, 16:44
Сообщения: 3080
Откуда: Москва
x33z77 написал(а):
Но в общем случае, эффективнее не заморачиваться общими решениями с произвольными структурами данных.


Я бы не стал обобщать так категорично.
Если есть 2 разных по структуре таблицы, в которых по одному алгоритму обрабатываются поля с одинаковыми именами, то лучше "заморочится" работой с произвольными структурами данных, чем работать методом copy-paste. ;)

_________________
С уважением,
Удав.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Переменная ЛЮБОГО типа
СообщениеДобавлено: Чт, сен 01 2011, 15:05 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, окт 06 2005, 16:44
Сообщения: 3080
Откуда: Москва
Продолжая оффтоп
x33z77 написал(а):
Питон был приведен только как иллюстрация разного подхода к типизации в разных языках.

Ну совершенных языков программирования нет :wink:
А если и есть, то почему-то мало распостранены.

_________________
С уважением,
Удав.


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

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


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

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


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

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