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 заджойнить Можно и так Только Maksimka написал: Добрый день уважаемые ABAP-еры. Возник, возможно не самый умный вопрос, поэтому заранее прошу сильно не пинать, потому как в ABAP-не сильно шарю. ракурс может оказаться удобнее |
Автор: | 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/ |