SAPфорум.RU
https://sapboard.ru/forum/

Соединение двух внутренних таблиц.
https://sapboard.ru/forum/viewtopic.php?f=13&t=95798
Страница 1 из 2

Автор:  Maksimka [ Пн, ноя 27 2017, 15:16 ]
Заголовок сообщения:  Соединение двух внутренних таблиц.

Добрый день уважаемые ABAP-еры.

Возник, возможно не самый умный вопрос, поэтому заранее прошу сильно не пинать, потому как в ABAP-не сильно шарю. В общем вопрос такой: создал транзакцию отчёт, который через submit одной из стандартных транзакций показывает наличие материалов на заводах в количестве и в текущей цене запаса. Теперь возникла нужда сделать ещё один отчёт, который бы открывался вторым отчётом при нажатии на кнопку в первом отчёте. В общем то с этим всё понятно, но во втором отчёте должна выходить инфа не просто по заводам, но и по складам, ну т.е. номер материала, завод, склад, если же это материал в запасе на проекте (СПП элементе), то и поле СПП элемент должно быть заполнено, ну и количество по каждому складу. Таблички, где лежит запас материалов в свободно используемом запасе лежат в табличке MARD, а запасы материала на проекте лежат в табличке MSPR. Мне нужно всё это отобразить всё в одной табличке, т.е. во втором отчёте. Код приблизительно такой:
Code:
form user_command using v_ucomm   like sy-ucomm
wa_selrow type slis_selfield.
  case v_ucomm.
    when 'SKLAD'.
      refresh sklad.
      refresh sklad2.
      read table itab1 index wa_selrow-tabindex.
      select * from mspr appending corresponding fields of table sklad2 where pspnr = itab1-posid
        and matnr = itab1-matnr and prlab ne '0.000'.
      select * from mard appending corresponding fields of table sklad where matnr = itab1-matnr
        and  werks = itab1-werks and labst ne  '0.000'.

   
       
  endcase.
endform.

Здесь я сразу указал начало кода, с нажатия кнопки SKLAD. Создал две внутренние таблички sklad и sklad2, которые в общем то и заполняются посредством селекта из двух разных таблиц, табличка itab1 уже заполнена посредством sumbit и выводит первый отчёт по заводам, а вот дальше мне не понятно как эти две таблицы в одну таблицу соединить, MOVE-CORRESPONDING друг в друга не годится, потому как различаются структуры внутренних табличек, в общем не хватает малость значий в ABAP, может кто подскажет как там дальше это всё можно сделать?

Автор:  LKU [ Пн, ноя 27 2017, 15:23 ]
Заголовок сообщения:  Re: Соединение двух внутренних таблиц.

Тр. SAT, кнопка tips and trics.
Далее изучать раздел internal tables.
Скорее всего ответ на вой вопрос увидите в подразделе simple algorithms -> joining interrnal tables.

Автор:  Maksimka [ Пн, ноя 27 2017, 16:00 ]
Заголовок сообщения:  Re: Соединение двух внутренних таблиц.

LKU написал:
Тр. SAT, кнопка tips and trics.
Далее изучать раздел internal tables.
Скорее всего ответ на вой вопрос увидите в подразделе simple algorithms -> joining interrnal tables.

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

Автор:  Kuranov.Dmitry [ Пн, ноя 27 2017, 16:05 ]
Заголовок сообщения:  Re: Соединение двух внутренних таблиц.

Дык если они разные, как вы их соедините?

Автор:  Maksimka [ Пн, ноя 27 2017, 16:31 ]
Заголовок сообщения:  Re: Соединение двух внутренних таблиц.

Kuranov.Dmitry написал(а):
Дык если они разные, как вы их соедините?

Мне просто нужно, чтобы содержимое двух таблиц, они по структуре почти одинаковые, за исключением поля СПП элемент и количество. Мне надо, чтобы содержимое двух таблиц отображалось в одном отчёте, т.е. сначала идут данные с одной таблицы, а затем ниже со второй, а эти два поля, которые отличаются могут быть и пустыми. Т.е. если для одного материала есть запас на проекте (с первой таблицы), тогда в этом поле будет стоять СПП элемент и если для этого материала также есть запас свободно используемый (со второй таблицы), т.е. он тоже отображался бы следующей строкой, а поле СПП элемент было бы просто пустым.

Автор:  Kuranov.Dmitry [ Пн, ноя 27 2017, 16:37 ]
Заголовок сообщения:  Re: Соединение двух внутренних таблиц.

Maksimka написал:
Kuranov.Dmitry написал(а):
Дык если они разные, как вы их соедините?

Мне просто нужно, чтобы содержимое двух таблиц, они по структуре почти одинаковые, за исключением поля СПП элемент и количество. Мне надо, чтобы содержимое двух таблиц отображалось в одном отчёте, т.е. сначала идут данные с одной таблицы, а затем ниже со второй, при чём эти два поля просто были бы пустыми.

Code:

DATA: begin of tab1 occurs 0,
            a(10), " спп
            b(10), "что-то
            c(10), "что-то
            d(10)  "количество
          end of tab1,

         begin of tab2 occurs 0.         
            b(10),
            c(10),
          end of tab2,


// Заполняем tab1.
PERFORM fill_tab1_with_data.
// Заполняем tab2.
PERFORM fill_tab2_with_data.

//сливаем данные в 1 таблицу
//добавляем данные из второй таблицы
LOOP AT tab2.
    CLEAR tab1
    MOVE-CORRESPONDING tab2 TO tab1.
    APPEND tab1.
ENDLOOP.

Автор:  Besa [ Пн, ноя 27 2017, 16:53 ]
Заголовок сообщения:  Re: Соединение двух внутренних таблиц.

Maksimka написал:
Kuranov.Dmitry написал(а):
Дык если они разные, как вы их соедините?

Мне просто нужно, чтобы содержимое двух таблиц, они по структуре почти одинаковые, за исключением поля СПП элемент и количество. Мне надо, чтобы содержимое двух таблиц отображалось в одном отчёте, т.е. сначала идут данные с одной таблицы, а затем ниже со второй, а эти два поля, которые отличаются могут быть и пустыми. Т.е. если для одного материала есть запас на проекте (с первой таблицы), тогда в этом поле будет стоять СПП элемент и если для этого материала также есть запас свободно используемый (со второй таблицы), т.е. он тоже отображался бы следующей строкой, а поле СПП элемент было бы просто пустым.

Почему не делаете appending corresponding fields of table в одну и ту же таблицу?

Автор:  Bimit [ Вт, ноя 28 2017, 06:39 ]
Заголовок сообщения:  Re: Соединение двух внутренних таблиц.

+1

В первом шаге делаете INTO CORRESPONDING
Во втором APPEND CORRESPONDING

Далее сортируете по нужным полям

Автор:  Bimit [ Вт, ноя 28 2017, 06:48 ]
Заголовок сообщения:  Re: Соединение двух внутренних таблиц.

З.Ы. посмотрите может у Вас в системе есть ракурс базы данных V_MMIM_QN там уже в связке таблицы MARD MSPR за один SELECT все выберете

Автор:  Sam Stone [ Вт, ноя 28 2017, 07:31 ]
Заголовок сообщения:  Re: Соединение двух внутренних таблиц.

Bimit написал(а):
З.Ы. посмотрите может у Вас в системе есть ракурс базы данных V_MMIM_QN там уже в связке таблицы MARD MSPR за один SELECT все выберете

Тогда уж можно сразу MARD и MSPR заджойнить

Автор:  Bimit [ Вт, ноя 28 2017, 09:06 ]
Заголовок сообщения:  Re: Соединение двух внутренних таблиц.

Sam Stone написал(а):
Тогда уж можно сразу MARD и MSPR заджойнить


Можно и так :D

Только
Maksimka написал:
Добрый день уважаемые ABAP-еры.

Возник, возможно не самый умный вопрос, поэтому заранее прошу сильно не пинать, потому как в ABAP-не сильно шарю.


ракурс может оказаться удобнее :wink:

Автор:  Daw [ Вт, ноя 28 2017, 10:01 ]
Заголовок сообщения:  Re: Соединение двух внутренних таблиц.

Sam Stone написал(а):
Bimit написал(а):
З.Ы. посмотрите может у Вас в системе есть ракурс базы данных V_MMIM_QN там уже в связке таблицы MARD MSPR за один SELECT все выберете

Тогда уж можно сразу MARD и MSPR заджойнить

Конечно же не заджойнить, а сделать объединение через UNION.

Автор:  Maksimka [ Вт, ноя 28 2017, 11:51 ]
Заголовок сообщения:  Re: Соединение двух внутренних таблиц.

Kuranov.Dmitry написал(а):

//сливаем данные в 1 таблицу
//добавляем данные из второй таблицы
LOOP AT tab2.
CLEAR tab1
MOVE-CORRESPONDING tab2 TO tab1.
APPEND tab1.
ENDLOOP.
[/code]

Спасибо за разъяснения Дмитрий, в общем сделал что то вроде
Code:
form user_command using v_ucomm   like sy-ucomm
wa_selrow type slis_selfield.
  case v_ucomm.
    when 'ZAPAS'.
      refresh ZAPAS.
      refresh ZAPAS2.
      read table itab1 index wa_selrow-tabindex.
      select * from mspr appending corresponding fields of table ZAPAS2 where pspnr = itab1-posid
        and matnr = itab1-matnr and prlab ne '0.000'.
      select * from mard appending corresponding fields of table ZAPAZ where matnr = itab1-matnr
        and  werks = itab1-werks and labst ne  '0.000'.

      loop at zapas2.
        clear zapas.
        move-corresponding zapas2 to zapas.
        append zapas.
      endloop.
      loop at zapas.
        if zapas-labst = '0.000'.
          zapas-labst = zapas-prlab.
        endif.
        if zapas-meins = ''.
          zapas-meins = itab1-meins.
        endif.
       zapas-lbkum = zapas-labst.
        translate zapas-lbkum  using ', '.
        condense zapas-lbkum no-gaps.

        select single posid from prps into ( zapas-posid ) where pspnr = zapas-pspnr.
        call function 'CONVERSION_EXIT_ALPHA_OUTPUT'
          exporting
            input  = zapas-matnr
          importing
            output = zapas-matnr2.
        modify zapas.
      endloop.
      perform zapas. (Отображение на экране в виде alv-grid)

  endcase.
endform.

Но возникла опять таки же ещё одна дилемма. В общем при нажатии на кнопку zapas открывается отчёт, но он конечно же открывается в разрезе складов той строки материала, на которую я нажал, т.е. какой сработал read table itab1 index wa_selrow-tabindex, а вот как сделать чтобы при нажатии на кнопку zapas открывался отчёт не только с тем материалом на который я нажал мышкой read table itab1 index wa_selrow-tabindex, а открывался бы отчёт по всем материалам, которые отображаются в первом отчёте, в разрезе складов.

Автор:  Maksimka [ Вт, ноя 28 2017, 11:53 ]
Заголовок сообщения:  Re: Соединение двух внутренних таблиц.

Bimit написал(а):
З.Ы. посмотрите может у Вас в системе есть ракурс базы данных V_MMIM_QN там уже в связке таблицы MARD MSPR за один SELECT все выберете

А мне казалось, что таблички MARD и MSPR совсем ни как друг с другом не связаны, но интереса ради попробую заджойнить V_MMIM_QN

Автор:  Kuranov.Dmitry [ Вт, ноя 28 2017, 11:55 ]
Заголовок сообщения:  Re: Соединение двух внутренних таблиц.

1)Read table заменить на LOOP.
2) В нем аккумулировать данные для отчета
3) Запустить отчет

Code:
when 'ZAPAS'.
      refresh ZAPAS.
      refresh ZAPAS2.
      loop at itab1 .
         select * from mspr appending corresponding fields of table ZAPAS2 where pspnr = itab1-posid
           and matnr = itab1-matnr and prlab ne '0.000'.
         select * from mard appending corresponding fields of table ZAPAZ where matnr = itab1-matnr
           and  werks = itab1-werks and labst ne  '0.000'.

         loop at zapas2.
           clear zapas.
           move-corresponding zapas2 to zapas.
           append zapas.
         endloop.
      endloop.

      loop at zapas.
        if zapas-labst = '0.000'.
          zapas-labst = zapas-prlab.
        endif.
        if zapas-meins = ''.
          read table itab1 with key matnr = zapas-mantnr  werks = zapas-werks. " ПРОВЕРИТЬ КЛЮЧИ! надо по значению из zapas найти строку из itab1
          zapas-meins = itab1-meins.
        endif.
       zapas-lbkum = zapas-labst.
        translate zapas-lbkum  using ', '.
        condense zapas-lbkum no-gaps.

        select single posid from prps into ( zapas-posid ) where pspnr = zapas-pspnr.
        call function 'CONVERSION_EXIT_ALPHA_OUTPUT'
          exporting
            input  = zapas-matnr
          importing
            output = zapas-matnr2.
        modify zapas.
      endloop.
      perform zapas. (Отображение на экране в виде alv-grid)

Страница 1 из 2 Часовой пояс: UTC + 3 часа
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/