Текущее время: Пт, мар 29 2024, 00:37

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


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


ВНИМАНИЕ!

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



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

Зарегистрирован:
Чт, сен 09 2004, 07:32
Сообщения: 777
Откуда: Москва
Пол: Мужской
Иногда в процедурах приходится иметь дело с разными по структуре внутренними таблицами (в зависимости от параметров обработки), имеющими одинаковые ключевые поля. Ниже пример для иллюстрации такой ситуации, самое интересное - READ TABLE ...
Code:
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, 16:09 
Почетный гуру
Почетный гуру
Аватара пользователя

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


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

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

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

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


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

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

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

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

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


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

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

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


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

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

Code:
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, 17:47 
Почетный гуру
Почетный гуру
Аватара пользователя

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

Code:
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, 12:19 
Специалист
Специалист
Аватара пользователя

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

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

Code:
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, 15:08 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, сен 09 2004, 07:32
Сообщения: 777
Откуда: Москва
Пол: Мужской
Вы еще не задумывались, в чем разница между обычными одинарными кавычками (') и обратными (`)? Тогда рекомендую посмотреть результат следующего "финта" :lol: :
Code:
  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, 12:04 
Специалист
Специалист

Зарегистрирован:
Чт, мар 25 2010, 09:02
Сообщения: 207
Code:
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, 11:37 
Специалист
Специалист
Аватара пользователя

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

Code:
call function 'ABAP4_CALL_TRANSACTION' starting new task 'NONE'
            exporting tcode = 'TCODE'.

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


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

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


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

Зарегистрирован:
Чт, май 17 2007, 16:31
Сообщения: 40
Откуда: Санкт-Петербург
Недавно столкнулся с тем, что средство поиска на ФМ работает по-разному на разных версиях базиса. Точнее, record_tab предполагает разный порядок полей. Более того, при первом и последующих вызовах порядок тоже может оказаться разный. Пришлось динамически генерировать структуру:
Code:
...
  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, 13:57 
Почетный гуру
Почетный гуру
Аватара пользователя

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

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

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


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

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


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

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


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

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


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

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