Текущее время: Чт, июн 26 2025, 16:24

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


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


ВНИМАНИЕ!

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



Начать новую тему Ответить на тему  [ Сообщений: 8 ] 
Автор Сообщение
 Заголовок сообщения: ASSIGN ... с заранее неизвестным TYPE
СообщениеДобавлено: Вт, май 16 2006, 20:18 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Вт, авг 17 2004, 08:55
Сообщения: 331
Откуда: Украина, г.Мариуполь
Пол: Мужской
Присваиваю <fs1> табличку (p1000). В программе объявлена табличка s1000 типа hrinnnn. Делаю ей присвоение <fs2>. Эта табличка пустая.
Далее есть рабочая область wa типа hrinnnn и цикл по 1-й табличке:
Code:
LOOP AT <fs1> ASSIGNING <fs_s>.
* здесь нужно сделать что-то, вроде
  MOVE-CORRESPONDING <fs_s> TO wa.
  APPEND wa TO <fs2>.
ENDLOOP.

Проблема в том, что <fs_s> не является типизированным, и MOVE-CORRESPONDING не работает - ошибка при активации. Мне нужно как-то сделать приведение филд-символа <fs_s> к типу p1000. Это нужно потому, что таких пар - табличка ИТ-табличка hrinnnn с таким же номером, как и ИТ, штук много. А программа не моя - клиенту ее чела 4 делали в разное время. В этом месте надо исправить, но как сделать то, о чем я спрашивал, не знаю...


Последний раз редактировалось RoadRunner Вт, май 16 2006, 20:58, всего редактировалось 1 раз.

Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ASSIGN ... с заранее неизвестным TYPE
СообщениеДобавлено: Вт, май 16 2006, 20:56 
Директор
Директор
Аватара пользователя

Зарегистрирован:
Ср, апр 12 2006, 12:43
Сообщения: 863
Откуда: СССР
Пол: Мужской
RoadRunner написал:
Присваиваю <fs1> табличку (p1000). В программе объявлена табличка s1000 типа hrinnnn. Делаю ей присвоение <fs2>. Эта табличка пустая.
Далее есть рабочая область wa типа hrinnnn и цикл по 1-й табличке:
Code:
LOOP AT <fs1> ASSIGNING <fs_s>.
* здесь нужно зделать что-то, вроде
  MOVE-CORRESPONDING <fs_s> TO wa.
  APPEND wa TO <fs2>.
ENDLOOP.

Проблема в том, что <fs_s> не является типизированным, и MOVE-CORRESPONDING не работает - ошибка при активации. Мне нужно как-то сделать приведение филд-символа <fs_s> к типу p1000. Это нужно потому, что таких пар - табличка ИТ-табличка hrinnnn с таким же номером, как и ИТ, штук много. А программа не моя - клиенту ее чела 4 делали в разное время. В этом месте надо исправить, но как сделать то, о чем я спрашивал, не знаю...

Попробуйте так:

Code:
TYPES:
   BEGIN OF LINE_TABLE,
       FIELD1 TYPE TYPE_XXX,             
       FIELD2 TYPE TYPE_YYY,
       FIELD3 TYPE TYPE_ZZZ,
  END OF LINE_TABLE,

  IT_TABLE TYPE STANDARD TABLE OF LINE_TABLE.

или если p1000 тип структуры, то
Code:
TYPES:
   LINE_TABLE LIKE p1000,
   IT_TABLE TYPE STANDARD TABLE OF LINE_TABLE.


далее:

Code:
FIELD-SYMBOLS:
    <FS_TABLE> TYPE IT_TABLE,
    <FS_LINE>    TYPE LINE_TABLE.

ASSIGN A_TABLE TO <FS_TABLE>.

LOOP AT <FS_TABLE> ASSIGNING <FS_LINE>.
* здесь нужно зделать что-то, вроде
  MOVE-CORRESPONDING <fs_s> TO wa.
  APPEND wa TO <fs2>.
ENDLOOP.



Удачи.


Последний раз редактировалось hoar Вт, май 16 2006, 21:01, всего редактировалось 1 раз.

Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт, май 16 2006, 20:57 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Вт, авг 17 2004, 08:55
Сообщения: 331
Откуда: Украина, г.Мариуполь
Пол: Мужской
Пока сделал вариант:
Code:
DATA: ref_descr TYPE REF TO CL_ABAP_STRUCTDESCR.
...
    ref_descr ?= cl_abap_typedescr=>describe_by_name( inft_nam ).
    LOOP AT <fs1> ASSIGNING <fs1line>.
      LOOP AT ref_descr->components ASSIGNING <fdl>.
        ASSIGN COMPONENT <fdl>-name OF STRUCTURE wa TO <fs2fld>.
        CHECK sy-subrc = 0.
        ASSIGN COMPONENT <fdl>-name OF STRUCTURE <fs1line> TO <fs1fld>.
        <fs2fld> = <fs1fld>.
      ENDLOOP.
      APPEND wa TO <fs2>.
    ENDLOOP.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ASSIGN ... с заранее неизвестным TYPE
СообщениеДобавлено: Ср, май 17 2006, 11:15 
Гуру-эксперт
Гуру-эксперт

Зарегистрирован:
Вт, сен 07 2004, 17:47
Сообщения: 2988
RoadRunner написал:
Присваиваю <fs1> табличку (p1000). В программе объявлена табличка s1000 типа hrinnnn. Делаю ей присвоение <fs2>. Эта табличка пустая.
Далее есть рабочая область wa типа hrinnnn и цикл по 1-й табличке:
...
Проблема в том, что <fs_s> не является типизированным, и MOVE-CORRESPONDING не работает - ошибка при активации. Мне нужно как-то сделать приведение филд-символа <fs_s> к типу p1000. ...

Может стоит присмотреться к методам класса CL_HR_PNNNN_TYPE_CAST?

_________________
"После" - не значит "вследствие"


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, май 17 2006, 21:08 
Гуру-модератор
Гуру-модератор
Аватара пользователя

Зарегистрирован:
Пн, окт 11 2004, 13:16
Сообщения: 1790
Цитата:
Может стоит присмотреться к методам класса CL_HR_PNNNN_TYPE_CAST

Хороший вариант.
Еще должно помочь использование дополнительного типизированного FIELD-SYMBOL'а и ASSIGN ... CASTING.

По крайней мере примеры приведения к структуре инфо-типа используют этот прием.

_________________
/nex


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт, май 19 2006, 17:49 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Вт, авг 17 2004, 08:55
Сообщения: 331
Откуда: Украина, г.Мариуполь
Пол: Мужской
Я бы с удовольствием сделал типизированные филд-символы, но в том-то и дело, что заранее неизвестно, какой тип будет у ИТ, передаваемого в процедуру.
Окончательно сделал так (железно работает):
Code:
FORM movcort USING p_from TYPE table
             CHANGING p_to TYPE table.

  DATA: ref_descr TYPE REF TO cl_abap_structdescr.
  DATA: fromwa TYPE REF TO data, towa TYPE REF TO data.

  FIELD-SYMBOLS: <fs_from>, <fs_to>, <fs_fromcomp>, <fs_tocomp>,
                 <fdl> TYPE abap_compdescr.

  CHECK NOT p_from[] IS INITIAL.

  CREATE DATA fromwa LIKE LINE OF p_from.
  CREATE DATA towa LIKE LINE OF p_to.
  ASSIGN: fromwa->* TO <fs_from>, towa->* TO <fs_to>.
  ref_descr ?= cl_abap_typedescr=>describe_by_data( <fs_from> ).
  REFRESH p_to.
  LOOP AT p_from ASSIGNING <fs_from>.
    LOOP AT ref_descr->components ASSIGNING <fdl>.
      ASSIGN COMPONENT <fdl>-name OF STRUCTURE <fs_to>
                    TO <fs_tocomp>.
      CHECK sy-subrc = 0.
      ASSIGN COMPONENT <fdl>-name OF STRUCTURE <fs_from>
                    TO <fs_fromcomp>.
      <fs_tocomp> = <fs_fromcomp>.
    ENDLOOP.
    APPEND <fs_to> TO p_to.
  ENDLOOP.
  FREE ref_descr.
ENDFORM.

Т.е., обошелся вообще без привязки к каким-либо типам. Правда, здесь еще не хватает извращений с вложенными структурами/таблицами и обработкой ошибок (напр., присвоение текста полю типа "р"), но это уже на доработку общественности ;)
А за класс спасибо - посмотрю обязательно.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн, май 22 2006, 09:59 
Гуру-эксперт
Гуру-эксперт

Зарегистрирован:
Вт, сен 07 2004, 17:47
Сообщения: 2988
RoadRunner написал:
Code:
FORM movcort USING p_from TYPE table
             CHANGING p_to TYPE table.

  DATA: ref_descr TYPE REF TO cl_abap_structdescr.
  DATA: fromwa TYPE REF TO data, towa TYPE REF TO data.

  FIELD-SYMBOLS: <fs_from>, <fs_to>, <fs_fromcomp>, <fs_tocomp>,
                 <fdl> TYPE abap_compdescr.

  CHECK NOT p_from[] IS INITIAL.

  CREATE DATA fromwa LIKE LINE OF p_from.
  CREATE DATA towa LIKE LINE OF p_to.
  ASSIGN: fromwa->* TO <fs_from>, towa->* TO <fs_to>.
  ref_descr ?= cl_abap_typedescr=>describe_by_data( <fs_from> ).
  REFRESH p_to.
  LOOP AT p_from ASSIGNING <fs_from>.
    LOOP AT ref_descr->components ASSIGNING <fdl>.


а принципе шаманство с ref_descr здесь излишне, достаточно
просто
move-corresponding <fs_from> to <fs_to>.
RoadRunner написал:
Code:
    ENDLOOP.
    APPEND <fs_to> TO p_to.
  ENDLOOP.
  FREE ref_descr.
ENDFORM.


_________________
"После" - не значит "вследствие"


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн, май 22 2006, 10:57 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Вт, авг 17 2004, 08:55
Сообщения: 331
Откуда: Украина, г.Мариуполь
Пол: Мужской
В 4.6с не прокатывает. Я сразу так и сделал, но активировать не смог. Весь этот изврат из-за 4.6с и делался. Только что проверил на 4.7 - действительно, проходит.


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

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


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

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


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

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