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

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


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

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


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

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