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

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


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

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


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

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