+ Sapforum.Biz » Инструменты » ABAP - Инструментальные средстваТема:
|- Соединение двух внутренних таблиц




Автор Тема: Соединение двух внутренних таблиц  (Прочитано 1347 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн themax

  • Newbie
  • *
  • Сообщений: 224
  • Reputation Power: 0
  • themax has no influence.
  • YearsYearsYearsYearsYearsYears
Соединение двух внутренних таблиц
« : Ноябрь 27, 2017, 02:18:15 pm »
Доброго времени суток уважаемые ABAP-еры.

Возник, возможно не самый умный вопрос, поэтому заранее прошу сильно не пинать, потому как в ABAP-не сильно шарю. В общем вопрос такой: создал транзакцию отчёт, который через submit одной из стандартных транзакций показывает наличие материалов на заводах в количестве и в текущей цене запаса. Теперь возникла нужда сделать ещё один отчёт, который бы открывался вторым отчётом при нажатии на кнопку в первом отчёте. В общем то с этим всё понятно, но во втором отчёте должна выходить инфа не просто по заводам, но и по складам, ну т.е. номер материала, завод, склад, если же это материал в запасе на проекте (СПП элементе), то и поле СПП элемент должно быть заполнено, ну и количество по каждому складу. Таблички, где лежит запас материалов в свободно используемом запасе лежат в табличке MARD, а запасы материала на проекте лежат в табличке MSPR. Мне нужно всё это отобразить всё в одной табличке, т.е. во втором отчёте. Код приблизительно такой:
Код: You are not allowed to view links. Register or Login
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, может кто подскажет как там дальше это всё можно сделать?


Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 689
  • Reputation Power: 2
  • Uukrul barely matters.Uukrul barely matters.
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
Re: Соединение двух внутренних таблиц
« Ответ #1 : Ноябрь 27, 2017, 09:06:38 pm »
Ну структура не совсем разная, ключевые поля + код СПП, а дальше поля ну подумаешь в одной PRLAB а в другой LABST, ну сделайте одну таблицу и значения перенесите в ручную типа MARD-LABST = MSPR-PRLAB и будет тебе счастье, можешь вообще сделать выборку из второй таблицы сразу в первую используя переопределение выбираемых данных типа:

SELECT PRLAB as LABST
APPENDING ... sklad

так даже проще будет.

Оффлайн themax

  • Newbie
  • *
  • Сообщений: 224
  • Reputation Power: 0
  • themax has no influence.
  • YearsYearsYearsYearsYearsYears
Re: Соединение двух внутренних таблиц
« Ответ #2 : Ноябрь 28, 2017, 08:09:32 am »
You are not allowed to view links. Register or Login
Ну структура не совсем разная, ключевые поля + код СПП, а дальше поля ну подумаешь в одной PRLAB а в другой LABST, ну сделайте одну таблицу и значения перенесите в ручную типа MARD-LABST = MSPR-PRLAB и будет тебе счастье, можешь вообще сделать выборку из второй таблицы сразу в первую используя переопределение выбираемых данных типа:

SELECT PRLAB as LABST
APPENDING ... sklad

так даже проще будет.
Спасибо Uukrul за разъяснения в общем сделал что то вроде
Код: You are not allowed to view links. Register or Login
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, а открывался бы отчёт по всем материалам, которые отображаются в первом отчёте, в разрезе складов.

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 689
  • Reputation Power: 2
  • Uukrul barely matters.Uukrul barely matters.
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
Re: Соединение двух внутренних таблиц
« Ответ #3 : Ноябрь 28, 2017, 02:43:02 pm »
You are not allowed to view links. Register or Login
Но возникла опять таки же ещё одна дилемма. В общем при нажатии на кнопку zapas открывается отчёт, но он конечно же открывается в разрезе складов той строки материала, на которую я нажал, т.е. какой сработал read table itab1 index wa_selrow-tabindex, а вот как сделать чтобы при нажатии на кнопку zapas открывался отчёт не только с тем материалом на который я нажал мышкой read table itab1 index wa_selrow-tabindex, а открывался бы отчёт по всем материалам, которые отображаются в первом отчёте, в разрезе складов.
Вот тут честно я ничего не понял. У тебя же сейчас выборка ограничивается одним кодом материала - правильно? У тебя стоит везде такой вот код: matnr = itab1-matnr, ну или загони материалы в RANGES чтобы написать matnr IN rn_matnr или в цикле прочитай и выбери данные по всем материалам которые есть в itab[] из первого отчета.

Оффлайн themax

  • Newbie
  • *
  • Сообщений: 224
  • Reputation Power: 0
  • themax has no influence.
  • YearsYearsYearsYearsYearsYears
Re: Соединение двух внутренних таблиц
« Ответ #4 : Ноябрь 29, 2017, 07:43:47 am »
You are not allowed to view links. Register or Login
Вот тут честно я ничего не понял. У тебя же сейчас выборка ограничивается одним кодом материала - правильно? У тебя стоит везде такой вот код: matnr = itab1-matnr, ну или загони материалы в RANGES чтобы написать matnr IN rn_matnr или в цикле прочитай и выбери данные по всем материалам которые есть в itab[] из первого отчета.
Спасибо ещё раз за разъяснения, сделал в общем так, вроде бы работает
Код: You are not allowed to view links. Register or Login
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.
      loop at tt001w.
        refresh listtab2.
*   refresh listtabusd.
        refresh ascilistkzt2.
*    refresh ascilistusd.
*    refresh itkzt2.
        p_werks = tt001w-bwkey.
        export listobject = listtab2 to memory id '%_LIST'.
        submit rm07mlbs with matnr in r_matnr with werks = p_werks with kzlso = 'X'
      with seneg ne 'X' with mb52_xmchb = 'X' with kznul = 'X' with mb52_noval ne 'X'
      with mb52_alv_flt = 'X' exporting list to memory and return.

        call function 'LIST_FROM_MEMORY'
          tables
            listobject         = listtab2
          exceptions
            empty_list         = 1
            list_index_invalid = 2
            others             = 3.
        if sy-subrc = 0.
          read table listtab2 index 1.
          if sy-subrc = 0.
            refresh ascilistkzt2.
            call function 'LIST_TO_ASCI'
              tables
                listasci           = ascilistkzt2
                listobject         = listtab2
              exceptions
                empty_list         = 1
                list_index_invalid = 2
                others             = 3.
            if sy-subrc <> 0.
              message id sy-msgid type sy-msgty number sy-msgno
              with sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.

            endif.
            clear:  x11.
            loop at ascilistkzt2.
              if sy-tabix = 4.
                refresh itkzt2.
                split ascilistkzt2-line at '|' into table itkzt2.
                x11 = 'X'.
                loop at itkzt2.
                  if sy-tabix = 2.
                    x12 = itkzt2-x.
                    shift x12 left by 1 places.
                    sklad-matnr = x12.
                  elseif sy-tabix = 3.
                    sklad-werks = itkzt2-x.
                  elseif sy-tabix = 4.
                    sklad-lgort = itkzt2-x.
                  elseif sy-tabix = 7.
                    sklad-posid = itkzt2-x.
                  elseif sy-tabix = 10.
                    sklad-meins = itkzt2-x.
                  elseif sy-tabix = 11.
                    sklad-labst = itkzt2-x.
*                    shift x13 left by 5 places.
*                    sklad-labst = x13.

                  endif.
                endloop.
                append sklad.
              endif.
            endloop.
          endif.
        endif.
      endloop.
endcase.
endform.
Вдруг кому понадобится.

Оффлайн themax

  • Newbie
  • *
  • Сообщений: 224
  • Reputation Power: 0
  • themax has no influence.
  • YearsYearsYearsYearsYearsYears
Re: Соединение двух внутренних таблиц
« Ответ #5 : Декабрь 04, 2017, 06:55:01 am »
Доброго времени суток уважаемые Abaper-ы. Возникла ещё одна небольшая проблеммка с этим отчётом, который я вызываю submit-ом. Я в своём отчёте submit -ом вызываю транзакцию mb52 и этот стандартный отчёт можно настраивать, каждый юзер запускает его как хочет в плане того что на селекционном экране ставит те галочки которые ему нужны, я пытаюсь в submit передать какое какие параметры, чтобы галочки на select button при запуске select-option проставились  вот так к примеру mb52_alv_flt = 'X, но программа игнорирует передачу галочек в моём отчёте и берёт те настройки который были проставлены юзером при последнем пользовании транзакцией MB52. Может кто работал с submit и знает как передать на select button нужные мне значения?

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 689
  • Reputation Power: 2
  • Uukrul barely matters.Uukrul barely matters.
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
Re: Соединение двух внутренних таблиц
« Ответ #6 : Декабрь 04, 2017, 03:56:30 pm »
Ну внутри они себя как-то так вызывают:
Код: You are not allowed to view links. Register or Login
      SUBMIT rm07mlbs                                       "n1590783
       WITH matnr    IN matnr                               "n1590783
       WITH werks    IN werks                               "n1590783
       WITH lgort    IN lgort                               "n1590783
       WITH charg    IN charg                               "n1590783
       WITH matart   IN matart                              "n1590783
       WITH matkla   IN matkla                              "n1590783
       WITH ekgrup   IN ekgrup                              "n1590783
       WITH pa_sond  =  pa_sond                             "n1590783
       WITH so_sobkz IN so_sobkz                            "n1590783
       WITH negativ  =  negativ                             "n1590783
       WITH xmchb    = xmchb                                "n1590783
       WITH nozero   = nozero                               "n1590783
       WITH novalues = novalues                             "n1590783
       WITH pa_hsq   = pa_hsq                               "n1590783
       WITH pa_flt   = pa_flt                               "n1590783
       WITH p_vari   = p_vari                               "n1590783
       VIA SELECTION-SCREEN.                                "n1590783

Оффлайн themax

  • Newbie
  • *
  • Сообщений: 224
  • Reputation Power: 0
  • themax has no influence.
  • YearsYearsYearsYearsYearsYears
Re: Соединение двух внутренних таблиц
« Ответ #7 : Декабрь 07, 2017, 06:36:02 am »
You are not allowed to view links. Register or Login
Ну внутри они себя как-то так вызывают:
Я перепутал, не правильно указал поля на селекционном экране, надо было не поле таблицы mb52_alv_flt указывать, а поле экрана pa_flt, в итоге указал все поля селекционного экрана и всё стало передаваться.
Код: You are not allowed to view links. Register or Login
submit rm07mlbs with matnr in r_matnr with werks = p_werks with pa_sond = 'X'
      with negativ = '' with xmchb = 'X' with nozero = 'X' with novalues = ''
      with pa_flt = 'X' with pa_hsq = '' exporting list to memory and return.