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

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


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

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


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

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