Текущее время: Вс, июл 27 2025, 11:59

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


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


ВНИМАНИЕ!

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



Начать новую тему Ответить на тему  [ Сообщений: 15 ] 
Автор Сообщение
 Заголовок сообщения: Обработка данных динамической структуры
СообщениеДобавлено: Вт, фев 26 2013, 13:45 
Ассистент
Ассистент

Зарегистрирован:
Пт, янв 25 2013, 17:37
Сообщения: 44
Доброго дня господа !

Есть функция которая обрабатывает таблицы, передаваемых в качестве парамтера
Code:
FUNCTION ZSP_FM_MAKE.
*"----------------------------------------------------------------------
*"*"Локальный интерфейс:
*"  CHANGING
*"     REFERENCE(TBVIEW) TYPE  STANDARD TABLE OPTIONAL
*"----------------------------------------------------------------------
DATA: rfTable  TYPE REF TO Cl_Abap_TableDescr,
      rfField  TYPE REF TO Cl_Abap_StructDescr,
      rcList   TYPE        Abap_Compdescr.

rfTable ?= Cl_Abap_TypeDescr=>Describe_By_Data( tbView ).
rfField ?= rfTable->Get_Table_Line_Type( ).
LOOP AT rfField->Components into rcList.
  WRITE /
        rcList-Name.
ENDLOOP.
ENDFUNCTION.


Как визуализировать значения полей ?
Если структура таблицы динамическая ?


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Обработка данных динамической структуры
СообщениеДобавлено: Вт, фев 26 2013, 13:56 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, окт 06 2005, 16:44
Сообщения: 3080
Откуда: Москва
А в чем проблема состоит?
Названия визуализированы.
Теперь осталось вызвать цикл по таблице, внутри него цикл по полученной структуре, Assign component..to <fs> и Write <fs>.

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


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Обработка данных динамической структуры
СообщениеДобавлено: Вт, фев 26 2013, 14:03 
Ассистент
Ассистент

Зарегистрирован:
Пт, янв 25 2013, 17:37
Сообщения: 44
Можно пример привести ?


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Обработка данных динамической структуры
СообщениеДобавлено: Вт, фев 26 2013, 14:24 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, окт 06 2005, 16:44
Сообщения: 3080
Откуда: Москва
Code:
FUNCTION ZSP_FM_MAKE.
*"----------------------------------------------------------------------
*"*"Локальный интерфейс:
*"  CHANGING
*"     REFERENCE(TBVIEW) TYPE  STANDARD TABLE OPTIONAL
*"----------------------------------------------------------------------
DATA: rfTable  TYPE REF TO Cl_Abap_TableDescr,
      rfField  TYPE REF TO Cl_Abap_StructDescr,
      rcList   TYPE        Abap_Compdescr.

FIELD-SYMBOLS: <fs_line> TYPE any,
                         <fs> TYPE any.

rfTable ?= Cl_Abap_TypeDescr=>Describe_By_Data( tbView ).
rfField ?= rfTable->Get_Table_Line_Type( ).
WRITE: / space.
LOOP AT rfField->Components into rcList.
  WRITE: rcList-Name.
ENDLOOP.

LOOP AT tbview ASSIGNING <fs_line>.
  WRITE: / space.
  LOOP AT rfField->Components into rcList.
    ASSIGN COMPONENT rcList-Name OF STRUCTURE <fs_line> TO <fs>.
    CHECK sy-subrc = 0.
    WRITE: <fs>.
  ENDLOOP.
ENDLOOP.

ENDFUNCTION.

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


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Обработка данных динамической структуры
СообщениеДобавлено: Вт, фев 26 2013, 14:33 
Ассистент
Ассистент

Зарегистрирован:
Пт, янв 25 2013, 17:37
Сообщения: 44
Удав написал(а):
А в чем проблема состоит?


В недостатке знаний и навыков общения с ABAP-ом
Спасибо большое.

P.S. - искал ответ в типах Cl_Abap_TableDescr,Cl_Abap_StructDescr, Abap_Compdescr !


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Обработка данных динамической структуры
СообщениеДобавлено: Вт, фев 26 2013, 18:11 
Ассистент
Ассистент

Зарегистрирован:
Пт, янв 25 2013, 17:37
Сообщения: 44
Удав, подскажите а как в данном случае обеспечить поиск по ключу
READ TABLE tbFind ASSIGNING <fsRecordEdit> WITH KEY <????????????> = <fsFieldsView>.

Code:

FIELD-SYMBOLS: <fsRecordView> TYPE Any,
               <fsFieldsView> TYPE Any,
               <fsRecordFind> TYPE Any,
               <fsFieldsFind> TYPE Any,
               <fsRecordEdit> TYPE Any,
               <fsFieldsEdit> TYPE Any.

IF tbView IS NOT INITIAL.
  LOOP AT tbView ASSIGNING <fsRecordView>.
    ASSIGN COMPONENT tsView OF STRUCTURE <fsRecordView> TO <fsFieldsView>.
    READ TABLE tbFind ASSIGNING <fsRecordFind> index 1.
    ASSIGN COMPONENT tsFind OF STRUCTURE <fsRecordFind> TO <fsFieldsFind>.
    READ TABLE tbFind ASSIGNING <fsRecordEdit> WITH KEY <????????????> = <fsFieldsView>.
    IF Sy-Subrc = 0.
      <fsFieldsFind> = 'Haйдено'.
    ENDIF.
  ENDLOOP.
  CLEAR tbView.
ENDIF.


Т.е. код функции должен быть эквивалентен указанному ниже
У меня такая комбинация повторяеться достаточно много раз,
но с разными таблицами и разными полями, соответственно, хочу заменить функцией .
Code:
      IF tbEmail IS NOT INITIAL.
        LOOP AT tbEmail INTO rcEmail.
          READ TABLE tbContact ASSIGNING <chContact> WITH KEY CONTACTGUID = rcEmail-CONTACTGUID.
          IF Sy-Subrc = 0.
            IF <chContact>-EMAIL <> ''.
              <chContact>-EMAIL = <chContact>-EMAIL && ','.
            ENDIF.
            <chContact>-EMAIL = <chContact>-EMAIL && rcEmail-EMAIL.
          ENDIF.
        ENDLOOP.
        CLEAR tbEmail.
      ENDIF.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Обработка данных динамической структуры
СообщениеДобавлено: Вт, фев 26 2013, 22:49 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, окт 06 2005, 16:44
Сообщения: 3080
Откуда: Москва
Можно заменить динамической подстановкой поля
Code:
READ .. WITH KEY (field) = <значение>


Но лучше такое не практиковать. Универсальность практически всегда снижает быстродействие и уменьшает читаемость кода.
Повторное использование динамически формируемого кода также ведет к усложнению анализа быстродействия программ.

Как пример - универсальное чтение текстов справочников для SAP Query может привести к увеличению времени работы отчетов в 2 раза.

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


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Обработка данных динамической структуры
СообщениеДобавлено: Ср, фев 27 2013, 11:37 
Ассистент
Ассистент

Зарегистрирован:
Пт, янв 25 2013, 17:37
Сообщения: 44
Code:
FUNCTION ZSP_FM_MAKE.
*"----------------------------------------------------------------------
*"*"Локальный интерфейс:
*"  IMPORTING
*"     VALUE(STWHAT) TYPE  STRING
*"     VALUE(STFIND) TYPE  STRING
*"     VALUE(STLOAD) TYPE  STRING
*"     VALUE(STSAVE) TYPE  STRING
*"  CHANGING
*"     REFERENCE(TBLOAD) TYPE  STANDARD TABLE
*"     REFERENCE(TBSAVE) TYPE  STANDARD TABLE
*"----------------------------------------------------------------------

FIELD-SYMBOLS: <flWhat> TYPE Any,
               <rcLoad> TYPE Any,
               <flLoad> TYPE Any,
               <rcSave> TYPE Any,
               <flSave> TYPE Any.

IF tbLoad IS NOT INITIAL.
  LOOP AT tbLoad ASSIGNING <rcLoad>.
    ASSIGN COMPONENT stWhat OF STRUCTURE <rcLoad> TO <flWhat>.
    READ TABLE tbSave ASSIGNING <rcSave> WITH KEY (stFind) = <flWhat>.
    IF Sy-Subrc = 0.
      ASSIGN COMPONENT stLoad OF STRUCTURE <rcLoad> TO <flLoad>.
      ASSIGN COMPONENT stSave OF STRUCTURE <rcSave> TO <flSave>.
      IF <flSave> <> ''.
        <flSave> = <flSave> && ','.
      ENDIF.
      <flSave> = <flSave> && <flLoad>.
    ENDIF.
  ENDLOOP.
  CLEAR tbLoad.
ENDIF.

ENDFUNCTION.


Удав написал(а):
динамически формируемого кода

READ TABLE tbSave ASSIGNING <rcSave> WITH KEY (stFind) = <flWhat>.
Вы имеете в виду (tsSeek) - типа макроподстановка, которая работает
в цикле основной таблицы ? (и каждый раз это строка формируеться динамически ?)
Верно ли понял ?
А других вариантов передать параметров ключа в функцию нет ?

Спасибо ...

Или установить ключ отдельно командой ДО цикла возможно
Code:
  SET TAG = (stFind) FOR tbSave - это я сам придумал такую команду  ???????
  LOOP AT tbLoad ASSIGNING <rcLoad>.
    ASSIGN COMPONENT stWhat OF STRUCTURE <rcLoad> TO <flWhat>.
    READ TABLE tbSave ASSIGNING <rcSave> WITH KEY = <flWhat>. ???????
     .................... 
  ENDLOOP.



Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Обработка данных динамической структуры
СообщениеДобавлено: Ср, фев 27 2013, 13:13 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, окт 06 2005, 16:44
Сообщения: 3080
Откуда: Москва
HOME_X написал(а):
Вы имеете в виду (tsSeek) - типа макроподстановка, которая работает
в цикле основной таблицы ? (и каждый раз это строка формируеться динамически ?)
Верно ли понял ?

Это значит, что перед выполнением каждого оператора READ будет производиться анализ структуры таблицы на наличие поля, указанного в скобках.
HOME_X написал(а):
А других вариантов передать параметров ключа в функцию нет ?

Подумайте сами - если о структуре таблицы по условиям задачи ничего не известно, то как по другому можно выполнять поиск? :?

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


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Обработка данных динамической структуры
СообщениеДобавлено: Ср, фев 27 2013, 13:15 
Ассистент
Ассистент

Зарегистрирован:
Пт, янв 25 2013, 17:37
Сообщения: 44
Или установить ключ отдельно командой ДО цикла возможно
(структура таблице в принипе софту известна)
Code:
SET TAG = (stFind) FOR tbSave - это я сам придумал такую команду  ???????
  LOOP AT tbLoad ASSIGNING <rcLoad>.
    ASSIGN COMPONENT stWhat OF STRUCTURE <rcLoad> TO <flWhat>.
    READ TABLE tbSave ASSIGNING <rcSave> WITH KEY = <flWhat>. ???????
     .................... 
  ENDLOOP.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Обработка данных динамической структуры
СообщениеДобавлено: Ср, фев 27 2013, 14:07 
Ассистент
Ассистент

Зарегистрирован:
Пт, янв 25 2013, 17:37
Сообщения: 44
Может типа так (из Help)
Цитата:
DATA: spfli_tab TYPE SORTED TABLE OF spfli
WITH UNIQUE KEY carrid connid,
spfli_key LIKE LINE OF spfli_tab.

FIELD-SYMBOLS <spfli> TYPE spfli.

...

SELECT *
FROM spfli
INTO TABLE spfli_tab
WHERE carrid = 'LH'.

...

spfli_key-carrid = 'LH'.
spfli_key-connid = '0400'.

READ TABLE spfli_tab FROM spfli_key ASSIGNING <spfli>.

IF sy-subrc = 0.
...
ENDIF.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Обработка данных динамической структуры
СообщениеДобавлено: Ср, фев 27 2013, 14:40 
Почетный гуру
Почетный гуру
Аватара пользователя

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

Как пример - универсальное чтение текстов справочников для SAP Query может привести к увеличению времени работы отчетов в 2 раза.

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


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Обработка данных динамической структуры
СообщениеДобавлено: Ср, фев 27 2013, 14:52 
Специалист
Специалист
Аватара пользователя

Зарегистрирован:
Вт, фев 15 2011, 15:02
Сообщения: 122
А еще можно динамически часть кода ФМ генерировать, но это тоже те еще костыли получаются

_________________
Поздравляю тебя, Шарик, ты - балбес!


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Обработка данных динамической структуры
СообщениеДобавлено: Ср, фев 27 2013, 14:56 
Ассистент
Ассистент

Зарегистрирован:
Пт, янв 25 2013, 17:37
Сообщения: 44
Динамика это
READ TABLE tbSave ASSIGNING <rcSave> WITH KEY (stFind) = <flWhat>.
Так как идет макроподстановка "(stFind)"

Здесь разбор ANY типа
READ TABLE spfli_tab FROM spfli_key ASSIGNING <spfli>.

Что считаеться динамикой применительно к ABAPу ?


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Обработка данных динамической структуры
СообщениеДобавлено: Ср, фев 27 2013, 15:08 
Ассистент
Ассистент

Зарегистрирован:
Пт, янв 25 2013, 17:37
Сообщения: 44
Вот в принципе решение .

Только не знаю как загнать пустую структуру
ASSIGN <rcLoad> TO <rcCopy>. "только структуру без данных

Это вроде не динамическое решение ?

Code:
FUNCTION ZSP_FM_MAKE.
*"----------------------------------------------------------------------
*"*"Локальный интерфейс:
*"  IMPORTING
*"     VALUE(STWHAT) TYPE  STRING
*"     VALUE(STFIND) TYPE  STRING
*"     VALUE(STLOAD) TYPE  STRING
*"     VALUE(STSAVE) TYPE  STRING
*"  CHANGING
*"     REFERENCE(TBLOAD) TYPE  STANDARD TABLE
*"     REFERENCE(TBSAVE) TYPE  STANDARD TABLE
*"----------------------------------------------------------------------

FIELD-SYMBOLS: <flWhat> TYPE Any,
               <rcLoad> TYPE Any,
               <flLoad> TYPE Any,
               <rcSave> TYPE Any,
               <flSave> TYPE Any,
               <rcCopy> TYPE Any,
               <flCopy> TYPE Any.

IF tbLoad IS NOT INITIAL.
  LOOP AT tbLoad ASSIGNING <rcLoad>.
    ASSIGN COMPONENT stWhat OF STRUCTURE <rcLoad> TO <flWhat>.
    ASSIGN <rcLoad> TO <rcCopy>. "только структуру без данных
    ASSIGN COMPONENT stWhat OF STRUCTURE <rcCopy> TO <flCopy>.
    <flCopy> = <flWhat>.
    READ TABLE tbSave FROM <rcCopy> ASSIGNING <rcSave>.
    "READ TABLE tbSave ASSIGNING <rcSave> WITH KEY (stFind) = <flWhat>.
    IF Sy-Subrc = 0.
      ASSIGN COMPONENT stLoad OF STRUCTURE <rcLoad> TO <flLoad>.
      ASSIGN COMPONENT stSave OF STRUCTURE <rcSave> TO <flSave>.
      IF <flSave> <> ''.
        <flSave> = <flSave> && ','.
      ENDIF.
      <flSave> = <flSave> && <flLoad>.
    ENDIF.
  ENDLOOP.
  CLEAR tbLoad.
ENDIF.




Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 15 ] 

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


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

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


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

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