Текущее время: Вс, ноя 19 2017, 23:23

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


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


ВНИМАНИЕ!

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



Начать новую тему Ответить на тему  [ Сообщений: 77 ]  На страницу Пред.  1, 2, 3, 4, 5, 6  След.
Автор Сообщение
 Заголовок сообщения: Считывание записи внутренней таблицы неопределенной структуры по ключу
СообщениеДобавлено: Вт, июн 16 2015, 16:13 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, сен 09 2004, 08:32
Сообщения: 776
Откуда: Москва
Пол: Мужской
Иногда в процедурах приходится иметь дело с разными по структуре внутренними таблицами (в зависимости от параметров обработки), имеющими одинаковые ключевые поля. Ниже пример для иллюстрации такой ситуации, самое интересное - READ TABLE ...
Код:
PARAMETERS: pa_bukrs TYPE bkpf-bukrs,
            pa_belnr TYPE bkpf-belnr,
            pa_gjahr TYPE bkpf-gjahr.

PARAMETERS: rb_bkpf  RADIOBUTTON GROUP sel DEFAULT 'X',
            rb_bsis  RADIOBUTTON GROUP sel,
            rb_other RADIOBUTTON GROUP sel.

DATA: lt_bkpf TYPE STANDARD TABLE OF bkpf,
      lt_bsis TYPE STANDARD TABLE OF bsis.

DATA: t_ref TYPE REF TO data.

FIELD-SYMBOLS: <t_data> TYPE table,
               <w_data> TYPE ANY.

CASE 'X'.
  WHEN rb_bkpf.
    SELECT * INTO CORRESPONDING FIELDS OF TABLE lt_bkpf
      FROM bkpf
      WHERE bukrs = pa_bukrs.
    IF sy-subrc IS INITIAL.
      GET REFERENCE OF lt_bkpf INTO t_ref.
    ENDIF.

  WHEN rb_bsis.
    SELECT * INTO CORRESPONDING FIELDS OF TABLE lt_bsis
      FROM bsis
      WHERE bukrs = pa_bukrs.
    IF sy-subrc IS INITIAL.
      GET REFERENCE OF lt_bsis INTO t_ref.
    ENDIF.

  WHEN rb_other.
*   For test only ...

  WHEN OTHERS.
    RETURN.

ENDCASE.

CHECK t_ref IS NOT INITIAL.

ASSIGN t_ref->* TO <t_data>.

READ TABLE <t_data> ASSIGNING <w_data>
                    WITH KEY ('BUKRS') = pa_bukrs
                             ('BELNR') = pa_belnr
                             ('GJAHR') = pa_gjahr.
IF sy-subrc IS INITIAL.
* Something to do:
*   <w_data> TYPE bkpf OR
*   <w_data> TYPE bsis
ENDIF.

_________________
"Прежде чем сделать что-то, подумай, к чему это может привести..."


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Полезные трюки ABAP
СообщениеДобавлено: Вт, июн 16 2015, 17:09 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Пт, апр 10 2009, 12:13
Сообщения: 1304
Блин, а я всегда выходил из этой ситуации через LOOP... Спасибо!


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Считывание записи внутренней таблицы неопределенной структуры по ключу
СообщениеДобавлено: Ср, июн 17 2015, 10:23 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Вт, авг 31 2004, 15:57
Сообщения: 5082
Откуда: Ростов невеликий
Пол: Мужской
nicky555 писал(а):
Иногда в процедурах приходится иметь дело с разными по структуре внутренними таблицами (в зависимости от параметров обработки), имеющими одинаковые ключевые поля. Ниже пример для иллюстрации такой ситуации, самое интересное -

изящненько ;)
попробую в ближайшей задачке

_________________
Нет сегодняшних проблем -
есть вчерашние ошибки
(с)


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Полезные трюки ABAP
СообщениеДобавлено: Вт, июн 30 2015, 05:52 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Пн, авг 29 2011, 09:54
Сообщения: 317
Откуда: Владивосток, Россия
Пол: Мужской
Я что-то похожее в свое время делал так:

read table <linktab> assigning <result> from <s_linktab> using key (lv_key_name)

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

_________________
У меня два правила:
1. Не говорить всего, что знаю.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Полезные трюки ABAP
СообщениеДобавлено: Чт, июл 16 2015, 20:17 
Модератор
Модератор

Зарегистрирован:
Пн, июн 27 2011, 09:25
Сообщения: 404
За READ - спасибо!!!

Не относится к READ:
для целей отладки есть еще класс CL_DEBUG - полезно использовать.
также в пакете лежит класс CL_ABAP_TOOL с методом MOVE_COMPLEX
документация к классам имеется.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Полезные трюки ABAP
СообщениеДобавлено: Пт, окт 16 2015, 18:42 
Ассистент
Ассистент
Аватара пользователя

Зарегистрирован:
Пн, окт 27 2008, 17:21
Сообщения: 33
Откуда: Москва
Пол: Мужской
внесу свою лепту в раздел.
Если имеем текстовое поле в базе, которое после чтения будем разбирать на подстроки. можно сделать вот так:

Код:
select z as A+0(2)   
       x as A+2(2)   
       y as A+4(2) 
       u as A+6(2)   
       v as B+0(2) 
       w as B+2(2)  FROM dbtab 
       INTO CORRESPONDING FIELDS OF TABLE itab
          WHERE <where condition>.


В итоге, в колонках z,x,y,u будут соответсвующие подстроки табличной колонки A, а в v,w - из колонки B. Не помню с какой версии это работает. в 7.0 работало


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Полезные трюки ABAP
СообщениеДобавлено: Пт, окт 16 2015, 18:47 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, авг 19 2004, 18:37
Сообщения: 1775
Откуда: Москва
Пол: Мужской
_Sipo_ писал:
внесу свою лепту в раздел.
Если имеем текстовое поле в базе, которое после чтения будем разбирать на подстроки. можно сделать вот так:

Код:
select z as A+0(2)   
       x as A+2(2)   
       y as A+4(2) 
       u as A+6(2)   
       v as B+0(2) 
       w as B+2(2)  FROM dbtab 
       INTO CORRESPONDING FIELDS OF TABLE itab
          WHERE <where condition>.


В итоге, в колонках z,x,y,u будут соответсвующие подстроки табличной колонки A, а в v,w - из колонки B. Не помню с какой версии это работает. в 7.0 работало

Использовал такой метод с версии 4.6C и во всех последующих.

_________________
"For all entries" не в SAP-ах, "for all entries" в головах! :)


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Полезные трюки ABAP
СообщениеДобавлено: Пт, окт 23 2015, 13:19 
Специалист
Специалист
Аватара пользователя

Зарегистрирован:
Вт, июн 19 2012, 09:33
Сообщения: 171
Пол: Мужской
Не совсем трюк, а, скажем, предупреждение для молодых абаперов.

При работе с FOR ALL ENTRIES

Код:
clear: lt_result, lt_itab.

select *
  from dbtab
  into table lt_result
  for all entries in lt_itab
  where f1 = lt_itab-f1
  and   f2 = 1000.


Если таблица lt_itab пустая - то второе условие ( f2 = 1000 ) тоже будет проигнорировано и результатом будет select * from dbtab.

_________________
crusty писал(а):
Логистика - понятие растяжимое


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Полезные трюки ABAP
СообщениеДобавлено: Ср, окт 28 2015, 16:08 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, сен 09 2004, 08:32
Сообщения: 776
Откуда: Москва
Пол: Мужской
Вы еще не задумывались, в чем разница между обычными одинарными кавычками (') и обратными (`)? Тогда рекомендую посмотреть результат следующего "финта" :lol: :
Код:
  DATA: ld_output TYPE string.

  CONCATENATE `123    ` `321` INTO ld_output. WRITE / ld_output.
  CONCATENATE '123    ' '321' INTO ld_output. WRITE / ld_output.

Смысл простой: тип последовательности символов в одинарных кавычках (') определяется как CHAR, в обратных кавычках (`) - как STRING ...

_________________
"Прежде чем сделать что-то, подумай, к чему это может привести..."


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Полезные трюки ABAP
СообщениеДобавлено: Пн, ноя 02 2015, 13:04 
Специалист
Специалист

Зарегистрирован:
Чт, мар 25 2010, 10:02
Сообщения: 192
Код:
READ TABLE <t_data> ASSIGNING <w_data>
                    WITH KEY ('BUKRS') = pa_bukrs
                                   ('BELNR') = pa_belnr
                                   ('GJAHR') = pa_gjahr


Такая конструкция работает в несколько раз медленнее обычного READ, особенно заметно при доступе к хэш-таблицам (через WITH TABLE KEY). Замедление составляет где-то 3..9 раз в засимости от количества полей по которым идет поиск. Наверное на конструкциях WITH KEY будет не так заметно, потому что большую часть времени идет поиск записи в таблице а не анализ условия поиска.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Полезные трюки ABAP
СообщениеДобавлено: Пт, ноя 06 2015, 12:37 
Специалист
Специалист
Аватара пользователя

Зарегистрирован:
Вт, июн 19 2012, 09:33
Сообщения: 171
Пол: Мужской
Как сделать call transaction в новом окне?

Код:
call function 'ABAP4_CALL_TRANSACTION' starting new task 'NONE'
            exporting tcode = 'TCODE'.

_________________
crusty писал(а):
Логистика - понятие растяжимое


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Полезные трюки ABAP
СообщениеДобавлено: Чт, дек 03 2015, 11:55 
Ассистент
Ассистент

Зарегистрирован:
Чт, май 17 2007, 17:31
Сообщения: 40
Откуда: Санкт-Петербург
При ведении таблиц, структур:
.INCLU-xxx - позволяет вставить структуры с суффиксом полей (.INCLU-001 BKPF_KEY)
Например можно использовать для вставки одинаковых комплектов полей для дебиторов и кредиторов, и т.д.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Полезные трюки ABAP
СообщениеДобавлено: Чт, дек 03 2015, 13:48 
Ассистент
Ассистент

Зарегистрирован:
Чт, май 17 2007, 17:31
Сообщения: 40
Откуда: Санкт-Петербург
Недавно столкнулся с тем, что средство поиска на ФМ работает по-разному на разных версиях базиса. Точнее, record_tab предполагает разный порядок полей. Более того, при первом и последующих вызовах порядок тоже может оказаться разный. Пришлось динамически генерировать структуру:
Код:
...
  DATA: lo_struct       TYPE REF TO data.

  FIELD-SYMBOLS:
        <fs_struct>     TYPE ANY,
        <fs_fld>        TYPE ANY,
        <fs_record_tab> LIKE LINE OF record_tab.

  REFRESH record_tab.

  PERFORM make_struct USING shlp CHANGING lo_struct.
  ASSIGN lo_struct->* TO <fs_struct>.
  ...
  LOOP AT prps_tab.
    CLEAR <fs_struct>.
    MOVE-CORRESPONDING prps_tab TO <fs_struct>.
    ...
    ASSIGN COMPONENT 'POST1_H' OF STRUCTURE <fs_struct> TO <fs_fld>.
    <fs_fld> = prps_tab-post1.
    ...
    APPEND INITIAL LINE TO record_tab ASSIGNING <fs_record_tab>.
    <fs_record_tab>-string = <fs_struct>.
    IF callcontrol-maxrecords = LINES( record_tab ).
      EXIT.
    ENDIF.
  ENDLOOP.

*&---------------------------------------------------------------------*
*&      Form  make_struct
*&---------------------------------------------------------------------*
FORM make_struct USING    shlp     TYPE shlp_descr_t
                 CHANGING p_struct TYPE REF TO data.

  DATA: lo_type         TYPE REF TO cl_abap_elemdescr,
        lo_struct       TYPE REF TO cl_abap_structdescr,
        lt_comp         TYPE cl_abap_structdescr=>component_table,
        i_length        TYPE i,
        i_decimals      TYPE i.

  FIELD-SYMBOLS:
        <fs_fieldprop>  LIKE LINE OF shlp-fieldprop,
        <fs_fielddescr> LIKE LINE OF shlp-fielddescr,
        <fs_comp>       LIKE LINE OF lt_comp.

  LOOP AT shlp-fieldprop ASSIGNING <fs_fieldprop>
                         WHERE NOT shlplispos IS INITIAL.

    READ TABLE shlp-fielddescr ASSIGNING <fs_fielddescr>
               WITH KEY fieldname = <fs_fieldprop>-fieldname.

    IF sy-subrc = 0.

*     i_length   = <fs_fielddescr>-leng. " при повторном вызове LENG увеличивается в 2 раза :(
      i_length   = <fs_fielddescr>-intlen.
      PERFORM unicode_byte2char(saplsdsd) CHANGING i_length.

      i_decimals = <fs_fielddescr>-decimals.

      FREE lo_type.
      CASE <fs_fielddescr>-inttype.
        WHEN cl_abap_typedescr=>typekind_string.  lo_type = cl_abap_elemdescr=>get_string( ).
        WHEN cl_abap_typedescr=>typekind_xstring. lo_type = cl_abap_elemdescr=>get_xstring( ).
        WHEN cl_abap_typedescr=>typekind_int.     lo_type = cl_abap_elemdescr=>get_i( ).
        WHEN cl_abap_typedescr=>typekind_float.   lo_type = cl_abap_elemdescr=>get_f( ).
        WHEN cl_abap_typedescr=>typekind_date.    lo_type = cl_abap_elemdescr=>get_d( ).
        WHEN cl_abap_typedescr=>typekind_time.    lo_type = cl_abap_elemdescr=>get_t( ).
        WHEN cl_abap_typedescr=>typekind_char.    lo_type = cl_abap_elemdescr=>get_c( p_length = i_length ).
        WHEN cl_abap_typedescr=>typekind_num.     lo_type = cl_abap_elemdescr=>get_n( p_length = i_length ).
        WHEN cl_abap_typedescr=>typekind_hex.     lo_type = cl_abap_elemdescr=>get_x( p_length = i_length ).
        WHEN cl_abap_typedescr=>typekind_packed.  lo_type = cl_abap_elemdescr=>get_p( p_length = i_length p_decimals = i_decimals ).
      ENDCASE.

      IF lo_type IS BOUND.
        APPEND INITIAL LINE TO lt_comp ASSIGNING <fs_comp>.
        <fs_comp>-name       = <fs_fieldprop>-fieldname.
        <fs_comp>-type       = lo_type.
*       <fs_comp>-as_include
        <fs_comp>-suffix     = <fs_fielddescr>-offset. " <fs_fieldprop>-shlplispos.
      ENDIF.

    ENDIF.
  ENDLOOP.

* отсортировать поля в порядке вывода на экран
  SORT lt_comp BY suffix.

  LOOP AT lt_comp ASSIGNING <fs_comp>.
    CLEAR <fs_comp>-suffix.
  ENDLOOP.

* Create new type from component table
  lo_struct = cl_abap_structdescr=>create( lt_comp ).

* Create dynamic structure and assign to Field Symbol
*  FIELD-SYMBOLS: <fs_struct>  TYPE ANY.
  CREATE DATA p_struct TYPE HANDLE lo_struct.
*  ASSIGN lo_struct->* TO <fs_struct>.

ENDFORM.                    "make_struct


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Полезные трюки ABAP
СообщениеДобавлено: Чт, дек 03 2015, 14:57 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, сен 09 2004, 08:32
Сообщения: 776
Откуда: Москва
Пол: Мужской
Stenj_90 писал(а):
Недавно столкнулся с тем, что средство поиска на ФМ работает по-разному на разных версиях базиса. Точнее, record_tab предполагает разный порядок полей. Более того, при первом и последующих вызовах порядок тоже может оказаться разный..

Мне казалось, ФМ-ов группы функций SF4U для подобных целей достаточно :roll:
Например, ФМ F4UT_RESULTS_MAP.

_________________
"Прежде чем сделать что-то, подумай, к чему это может привести..."


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Полезные трюки ABAP
СообщениеДобавлено: Вт, окт 04 2016, 11:04 
Ассистент
Ассистент

Зарегистрирован:
Вт, сен 13 2016, 21:18
Сообщения: 49
Чтобы сдвинуть блок кода вправо, зажав альт выделяем колонку перед блоком, и затем пробелами или табляцией двигается весь блок


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 77 ]  На страницу Пред.  1, 2, 3, 4, 5, 6  След.

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


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

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


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

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