Текущее время: Пн, июл 21 2025, 01:33

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


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


ВНИМАНИЕ!

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



Начать новую тему Ответить на тему  [ Сообщений: 12 ] 
Автор Сообщение
 Заголовок сообщения: Выкатка названий полей из прозрачных таблиц во внутр. таблицу.
СообщениеДобавлено: Чт, фев 22 2007, 16:41 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Чт, авг 10 2006, 08:44
Сообщения: 320
Откуда: Odessa
Данный пример выкачивает не имена полей а имена элементов данных :(

Code:

      DATA DBTABNAME(25) VALUE 'VBAK'.
     

      DATA          : ref_d TYPE REF TO data.
      FIELD-SYMBOLS : <ft> TYPE INDEX TABLE,
                      <fd> TYPE ANY,
                      <ff> TYPE ANY.
        DATA : ref_descr TYPE REF TO cl_abap_typedescr,
               ref_eldsc TYPE REF TO cl_abap_elemdescr,
               name      TYPE string.

        CREATE DATA ref_d TYPE STANDARD TABLE OF (DBTABNAME).
        ASSIGN ref_d->* TO <ft>.
        SELECT * FROM (DBTABNAME) INTO TABLE <ft> UP TO 100 ROWS.
        READ TABLE <ft> ASSIGNING <fd> INDEX 1.
        DO.
           ASSIGN COMPONENT sy-index OF STRUCTURE <fd> TO <ff>.
          IF sy-subrc NE 0.
            EXIT.
          ENDIF.
          ref_descr = cl_abap_typedescr=>DESCRIBE_BY_DATA( <ff> ).
          ref_eldsc ?= ref_descr.
          name = ref_eldsc->get_relative_name( ).

         if name <> 'MANDT'.
            CLEAR FIELD_DBTAB.
            FIELD_DBTAB-FIELDNAME = name.
             APPEND FIELD_DBTAB.
            clear FIELD_DBTAB.
         endif.
        ENDDO.


Пробывал поменять DESCRIBE_BY_DATA( <ff> ) на DESCRIBE_BY_NAME( <ff> ) летит в дамп: 'Exception condition "TYPE_NOT_FOUND" raised.'
Может кто-то че-то подскажет?


Последний раз редактировалось Primat Пн, фев 26 2007, 10:57, всего редактировалось 2 раз(а).

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

Зарегистрирован:
Чт, авг 10 2006, 08:44
Сообщения: 320
Откуда: Odessa
[quote ="Lars"]
ну, может

LVC_FIELDCATALOG_MERGE

Иля я не понял чего :(
[/quote]

Не, это не ALV :)

Результатом данной программы является внутр. таб. FIELD_DBTAB.
C cодержание полей VBAK:

FIELDNAME |
______________________________
VBELN_VA
ERDAT
ERZET
ERNAM
ANGDT_V
BNDDT
AUDAT
VBTYP
TRVOG
AUART
AUGRU
GWLDT
..........
.....
..


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Выкачка названий полей во внутр. таблицу из таблицы репозитария.
СообщениеДобавлено: Чт, фев 22 2007, 18:48 
Гуру-эксперт
Гуру-эксперт

Зарегистрирован:
Вт, сен 07 2004, 17:47
Сообщения: 2988
Primat написал(а):
Данный пример выкачивает не имена полей а имена элементов данных :(

Code:

...
        DATA : ref_descr TYPE REF TO cl_abap_typedescr,
               ref_eldsc TYPE REF TO cl_abap_elemdescr,
               name      TYPE string.
....


Пробывал поменять DESCRIBE_BY_DATA( <ff> ) на DESCRIBE_BY_NAME( <ff> ) летит в дамп: 'Exception condition "TYPE_NOT_FOUND" raised.'
Может кто-то че-то подскажет?

Непонятно - почему ref_eldsc cl_abap_elemdescr, а не cl_abap_datadescr?
И почему понадобилось вручную разбирать структуру, а не разбирать сразу <ft>, <fd> или просто по имя DBTABNAME?

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


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт, фев 23 2007, 15:09 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Чт, авг 10 2006, 08:44
Сообщения: 320
Откуда: Odessa
Все, разобрался сам :)
Code:
      FIELD-SYMBOLS : <ff> TYPE ANY.
      DATA : ref_descr TYPE REF TO cl_abap_structdescr,
             name      TYPE string,
             lt_comp   TYPE abap_compdescr_tab,
             ls_comp   TYPE abap_compdescr.

          DBTABNAME = 'VBAK'.
          ASSIGN (DBTABNAME) TO <ff>.
          ref_descr ?= cl_abap_tabledescr=>DESCRIBE_BY_DATA( <ff> ).
          lt_comp = ref_descr->components.

      LOOP AT lt_comp INTO ls_comp.
           name = ls_comp-name.
         if name <> 'MANDT'.
            CLEAR FIELD_DBTAB.
            FIELD_DBTAB-FIELDNAME = name.
             APPEND FIELD_DBTAB.
         endif.
       ENDLOOP.

:)


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

Зарегистрирован:
Чт, авг 10 2006, 08:44
Сообщения: 320
Откуда: Odessa
Help !!!

Выпадает в дамп :(

на ref_descr ?= cl_abap_tabledescr=>DESCRIBE_BY_DATA( <ff> ) из выше указаного кода.

Пишет: Field symbol has not yet been assigned.

Причем выпадает, если имена таблиц DBTABNAME с подчеркиванием: ZSD_CO_002.
Если имена без подчерк-й: VBAK то работает.
:(
Что это может быть?

DBTABNAME TYPE TABNAME16.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: re
СообщениеДобавлено: Пн, фев 26 2007, 11:05 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Пт, сен 23 2005, 11:11
Сообщения: 963
tables: ZSD_CO_002.

?


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн, фев 26 2007, 11:16 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Чт, авг 10 2006, 08:44
Сообщения: 320
Откуда: Odessa
Да работает :) Но я имя таблицы передаю динамически, тоесть у меня есть переменная импорта DBTABNAME в ФМ. Что мне тогда делать если я могу подствить любую таблицу в DBTABNAME, которой может и небыть в структуре СД группы функц-й где находится данный ФМ?


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: re
СообщениеДобавлено: Пн, фев 26 2007, 11:32 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Пт, сен 23 2005, 11:11
Сообщения: 963
data: ref type ref to data.

create data ref type (dbtabname).
assign ref->* to <ff>.

...

ps:
оказывается есть метод describe_by_name


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн, фев 26 2007, 12:30 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Чт, авг 10 2006, 08:44
Сообщения: 320
Откуда: Odessa
Да понедельник день тяжелый :?
Примного благодарен :)


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн, фев 26 2007, 12:47 
Младший специалист
Младший специалист

Зарегистрирован:
Пт, июн 02 2006, 09:59
Сообщения: 67
Пол: Мужской
Конструкция типа
Code:
  data: struct_type type ref to cl_abap_structdescr.
  translate tablename to upper case.         
  struct_type ?= cl_abap_typedescr=>describe_by_name( tablename ).

прекрасно работает и в 4.6 и в 4.7


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн, фев 26 2007, 15:57 
Директор
Директор
Аватара пользователя

Зарегистрирован:
Пн, дек 20 2004, 16:05
Сообщения: 1080
Откуда: 4.0B
Пол: Мужской
[quote="Primat"]

Не, это не ALV :)

quote]

Да понятно, что не ALV, только кто ей запрещает пользоваться вне ALV ?


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, фев 28 2007, 12:34 
Специалист
Специалист

Зарегистрирован:
Чт, июн 23 2005, 18:05
Сообщения: 119
Я читаю имена полей так:
Code:
DATA: td TYPE sydes_desc
      ,gs_tp TYPE sydes_typeinfo
      ,gs_tp2 TYPE sydes_typeinfo
      ,gs_nm TYPE sydes_nameinfo
      ,l_str(30)
      .
  FIELD-SYMBOLS:  <ft_types> TYPE table
                 ,<ft_names> TYPE table
                 ,<ft_idx>
                 ,<ft_nam>
                 ,<usertp>
                 ,<fs>
                 ,<from>
                 ,<to>
                 .
  DESCRIBE FIELD stru INTO td.

  ASSIGN td-types TO <ft_types>.
  ASSIGN td-names TO <ft_names>.

  LOOP AT <ft_types> INTO gs_tp.
    IF gs_tp-idx_name > 0.
      READ TABLE <ft_names> INDEX gs_tp-idx_name INTO gs_nm.
      l_str = gs_nm-name.
      IF  gs_tp-from is initial and gs_tp-to is initial.
        tbl-name = l_str.
        APPEND tbl.
      ELSE.
*пока ограничиваемся двухуровневым вложением поле-поле.
*в случае если потребуется больше поле-поле-поле и т.д, - нужна будет рекурсия.
        LOOP AT <ft_types> INTO gs_tp2 FROM gs_tp-from TO gs_tp-to.
          READ TABLE <ft_names> INDEX gs_tp2-idx_name INTO gs_nm.
          IF sy-subrc = 0.
            CONCATENATE l_str gs_nm-name INTO tbl-name SEPARATED BY '-'.
            APPEND tbl.
          ENDIF.
        ENDLOOP.
      ENDIF.
    ENDIF.
  ENDLOOP.


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

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


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

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


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

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