field-symbols- может кто-то пояснить

Автор Паганель, Грудень 30, 2008, 02:11:57 ПП

Попередня тема - Наступна тема

0 Користувачі і 1 Гість дивляться цю тему.

Паганель

field-symbols: <fs_aktiv> type any.
может кто-то пояснить начинаещему абаперу  :) простыми словами что есть сие, или ссылку даст на нормальное описание

Uukrul

Цитата: Паганель від Грудень 30, 2008, 02:11:57 ПП
field-symbols: <fs_aktiv> type any.
может кто-то пояснить начинаещему абаперу  :) простыми словами что есть сие, или ссылку даст на нормальное описание
Ну <fs_aktiv> может ссылаться в операторе ASSIGN на любую переменную, любого типа, любую структуру и т.д. В общем, типа на что надо на то по ходу и с делают ссылку.

Uukrul

#2
В общем чтобы снова не вспоминать, как достучаться до таблиц через field-symbols, небольшой примерчик. Из концепции, в замещениях FI, нужно было дотянуться до позиций документов ММ. В принципе как бы ясно что в контексте выполнения данные находятся в структурах MSEG и XMSEG, собственно сама таблица позиций это XMSEG, откуда знаю, ну скажем так опыт, так вот есть замещение, сделанное по принципу из этой темы: http://sapforum.biz/index.php/topic,57.0.html (Замещение контрольного счета в MIRO). В этом замещении чтобы получить данные позиций документа ММ, к которому создается документ FI, нужно сделать следующее:

  DATA: l_mseg LIKE mseg,
        lt_mseg LIKE mseg OCCURS 1 WITH HEADER LINE.
  FIELD-SYMBOLS: <fs_mseg> TYPE ANY TABLE.

  ASSIGN ('(SAPMM07M)xmseg[]') TO <fs_mseg>.
  lt_mseg[] = <fs_mseg>[].
  UNASSIGN <fs_mseg>.

Код можно у упростить, но я предпочитаю сразу же полученные данные копировать в свою локальную структуру, ссылку тут же освобождать и дальше уже без проблем работать с локальными данными. В общем после этого кода, в lt_mseg имеем позиции документа материала.

Паганель

Не мог бы ты подробнее обьяснить конструкцию
ASSIGN ('(SAPMM07M)xmseg[]')

Uukrul

Цитата: Паганель від Січень 10, 2009, 04:48:56 ПП
Не мог бы ты подробнее обьяснить конструкцию
ASSIGN ('(SAPMM07M)xmseg[]')
Получает ссылку на внутреннюю таблицу объявленную в  программе SAPMM07M. Т.е. фактически обходится межмодульная защита данныъ кода. В принципе можно с полученной ссылкой сразу и работать, без копирования ее в lt_mseg[], но этим можно нарушить данные программы SAPMM07M и получить просто мифические сбои в работе, поэтому я все таки рекомендую после получения ссылки данные копировать во внутреннюю структуру и уже дальше работать со своей переменной.

Паганель

вау, то есть это похоже на tPerson.SomeMetod() или tPerson.Address[] (масив, табличка),
круто, спасибо ....

Uukrul

Цитата: Паганель від Січень 11, 2009, 01:20:19 ПП
вау, то есть это похоже на tPerson.SomeMetod() или tPerson.Address[] (масив, табличка),
круто, спасибо ....
Не знаю похоже ли это на то что ты написал  ::) но такой штукой пользоваться можно, но осторожно, так как мало ли что будет при апгрейдах на новые версии...

№1

Цитата: Uukrul від Січень 11, 2009, 01:32:38 ПП
Не знаю похоже ли это на то что ты написал  ::) но такой штукой пользоваться можно, но осторожно, так как мало ли что будет при апгрейдах на новые версии...
Будет - проверено ;D
Мой блог

Паганель

отлично,будем пользоватся, век живи- век учись .....

Dmitriy

2 Паганель: про использование еще можно посмотреть последний пост про оптимизацию. Чуть позже опишу как работать, когда <fs_aktiv> в твоем первом посте - рабочая область для работы со внутренними таблицами.

Uukrul

Цитата: Паганель від Січень 13, 2009, 07:50:12 ПП
Спасибо Дима, жду с нетерпением ....  :)
Так я вроде ж как про таблицы и показал?! Или ты имеешь в виду объявление вместо FIELD-SYMBOLS: <fs_mseg> TYPE ANY TABLE., делать такую штуку как:

DATA: lt_mseg LIKE mseg OCCURS 1 WITH HEADER LINE.
FIELD-SYMBOLS: <fs_mseg> STRUCTURE mseg DEFAULT lt_mseg.

ASSIGN ('(SAPMM07M)xmseg[]') TO <fs_mseg>.

LOOP AT lt_mseg.
* Чего надо делаем...
ENDLOOP.

UNASSIGN <fs_mseg>.

Или я что не так понял?

Dmitriy

Цитата: Uukrul від Січень 13, 2009, 09:33:24 ПП
Так я вроде ж как про таблицы и показал?! Или ты имеешь в виду объявление вместо FIELD-SYMBOLS: <fs_mseg> TYPE ANY TABLE., делать такую штуку как:

DATA: lt_mseg LIKE mseg OCCURS 1 WITH HEADER LINE.
FIELD-SYMBOLS: <fs_mseg> STRUCTURE mseg DEFAULT lt_mseg.

ASSIGN ('(SAPMM07M)xmseg[]') TO <fs_mseg>.

LOOP AT lt_mseg.
* Чего надо делаем...
ENDLOOP.

UNASSIGN <fs_mseg>.

Или я что не так понял?
Все правильно ты показал. А я имел ввиду не про считывание из памяти, а про то, как работать с типом ANY, когда это Work area. Чуть позже, как отлажу на системе...

Uukrul

#12
Угадал?  :D

DATA wa2 TYPE c LENGTH 512.
FIELD-SYMBOLS <scarr2> TYPE scarr.

ASSIGN wa2 TO <scarr2> CASTING.
<scarr2>-carrid = '...'.


Dmitriy

Цитата: Uukrul від Січень 13, 2009, 09:53:23 ПП
Угадал?  :D

DATA wa2 TYPE c LENGTH 512.
FIELD-SYMBOLS <scarr2> TYPE scarr.

Почти :)
ASSIGN COMPONENT OF STRUCTURE ..., ну ты понял... ;)
Про динамику, когда с вн. таб. работаем, объявленной через FIELD-SYMBOL. На днях подниму, выложу, счас бы с этим гемором по замещениям оперативно разобраться. :D

P.S. Хех, вместо "Цитировать" кликнул поначалу "Изменить". Ничего не потер из твоего поста?

Паганель

Цитата: Dmitriy від Січень 13, 2009, 09:39:12 ПП
Все правильно ты показал. А я имел ввиду не про считывание из памяти, а про то, как работать с типом ANY, когда это Work area. Чуть позже, как отлажу на системе...

Ну как работать если нужна табличка, вроде бы понятно ... а вот если Work Area ... наверное есть какие-то секреты?  :)

Паганель

#15
хакеры хр... хорошие ...  :)
Вы лучше обьясните какая разница когда ANY используется для таблички и для воркареа ?

Dmitriy

Цитата: Паганель від Січень 13, 2009, 10:10:50 ПП
хакеры хр... хорошие ...  :)
Вы лучше обьясните какая разница когда ANY используется для таблички и для воркареа ?
Для таблички не ANY. Все, в ближайшее время материал соберу, напишу.

Dmitriy

#17
Немного из засоленного. ;)
DATA: lt_table TYPE REF TO data.
FIELD-SYMBOLS: <gt_lvc_fieldcatalog> TYPE lvc_t_fcat, " Каталог полей
                        <gt_lvc_outtab>       TYPE table, " Таблица
                        <ls_lvc_outtab>        TYPE ANY,  " Рабочая область
                        <lv_field_val>           TYPE ANY.  " Значение поля

* ..........Наш код........
* здесь же формируем <gt_lvc_fieldcatalog> для задания структуры динамически генерируемой вн. таблицы

* create dynamic table (according to fieldcatalog)
        CALL METHOD cl_alv_table_create=>create_dynamic_table
                    EXPORTING it_fieldcatalog = <gt_lvc_fieldcatalog>
                    IMPORTING ep_table = lt_table.

        ASSIGN lt_table->* TO <gt_lvc_outtab>.

        LOOP AT <gt_lvc_outtab> ASSIGNING <ls_lvc_outtab>.
        ............
* Если известно расположение поля (№44) относительно начала структуры 
           ASSIGN COMPONENT 44 OF STRUCTURE <ls_lvc_outtab> TO <lv_field_val>.
* Или, если известно имя поля (SUMM44):
           ASSIGN COMPONENT 'SUMM44' OF STRUCTURE <ls_lvc_outtab> TO <lv_field_val>.
        ............
        ENDLOOP.

Dimas

Не претендую на оригинальность (сам недавно за ABAP взялся) но вот такой вариант имеет место быть

field-SYMBOLS <fs> type any table.
data l_t_spfli type TABLE OF spfli.
data l_s_spfli type spfli.

assign l_t_spfli to <fs>.

select single * into l_s_spfli from spfli.
insert l_s_spfli into table <fs>.

loop at <fs> INTO l_s_spfli.
  write l_s_spfli-carrid.
endloop.

Uukrul

Цитата: Dimas від Квітень 16, 2010, 10:13:13 ДП
Не претендую на оригинальность (сам недавно за ABAP взялся) но вот такой вариант имеет место быть
Ну если начали то вот ветка оптимизации ABAP и там этот вопрос раскрыт более подробно зачем так делаеть лучше, ну и вообще веточка получилась полезной:
http://sapforum.biz/index.php/topic,174.msg1919.html#msg1919