Текущее время: Вс, июл 20 2025, 21:59

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


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

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


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

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