Объединение различных таблиц с использованием «для всех записей» в sap abap - PullRequest
0 голосов
/ 07 января 2020

Я создал метод для извлечения данных из таблиц. Мои параметры импорта - IV_RCP_NO, IV_VERS, IV_ALT, а параметр экспорта - ET_TABLE.

Теперь я использую INNER JOIN для объединения 4 таблиц, но требование говорит, что это должно быть сделано с использованием FOR ВСЕ ЗАЯВКИ пункт.

Может кто-нибудь помочь мне с этим продолжить?

Вот мой код:

  SELECT RCP_TBL~SEARCH_TERM PLNT_TBL~PLANT DESCR_TBL~DESCR RCP_STATUS~DESCR 
     INTO TABLE ET_TABLE
     FROM ESTRH AS ESTRH_TBL
     INNER JOIN /PLMB/RCP_RECIPE AS RCP_TBL
       ON ESTRH_TBL~RECN = RCP_TBL~SUBRECN
     INNER JOIN /PLMB/SAM_NODE_T AS RCP_STATUS
       ON RCP_STATUS~STATUS_ID = RCP_TBL~STATUS
     INNER JOIN /PLMB/RCP_PLNT AS PLNT_TBL
       ON RCP_TBL~RCP_GUID = PLNT_TBL~RCP_GUID
     INNER JOIN /PLMB/RCP_DESCR AS DESCR_TBL
       ON PLNT_TBL~RCP_GUID = DESCR_TBL~OBJECT_GUID 
       AND RCP_TBL~RCP_GUID = DESCR_TBL~OBJECT_GUID
     WHERE SUBID = IV_RCP_NO AND ALT_NO = IV_ALT AND VERS_NO = IV_VERS.

Ответы [ 2 ]

1 голос
/ 07 января 2020

Если объединение можно выполнить без всех записей, сделайте это. Это даст наилучшую производительность.

Для всех записей это инструмент для упрощения запросов, когда у вас уже есть часть данных во внутренней таблице, из некоторого ранее выполненного кода или предварительного вычисления. Это эффективно приводит к ряду независимых выборок, результаты которых объединяются после индивидуального завершения - это означает, что это приводит к нескольким обходам базы данных, что может резко ухудшить производительность.

Если у вас есть определенные c требования для применения ко всем записи, вы должны уточнить, какая часть данных уже существует и должна быть присоединена таким образом. В противном случае любые предложения от StackOverflowers останутся неэффективными догадками.

0 голосов
/ 07 января 2020

Вы можете сослаться на следующий код:

* Local structure
TYPES: BEGIN OF ty_estrth,
        subid TYPE  esesubid,
        recn  TYPE  eserecn,
      END OF ty_estrth.

* Internal table
DATA: lt_estrh TYPE STANDARD TABLE OF ty_estrth.

SELECT subid recn FROM estrh
  INTO TABLE lt_estrh  
  WHERE subid = iv_rcp_no.

IF lt_estrh IS NOT INITIAL.
  SELECT * FROM /plmb/rcp_recipe
    INTO TABLE lt_rcp_recipe    "Internal table of type /PLMB/RCP_RECIPE
    FOR ALL ENTRIES IN lt_estrh
    WHERE subrecn = lt_estrh-recn
      AND alt_no = iv_alt AND vers_no = iv_vers.

  IF lt_rcp_recipe IS NOT INITIAL.
    SELECT * FROM /plmb/sam_node_t
      INTO TABLE lt_sam_node_t     "Internal table of type /PLMB/SAM_NODE_T
      FOR ALL ENTRIES IN lt_rcp_recipe
      WHERE status_id = lt_rcp_recipe-status.

    SELECT * FROM /plmb/rcp_plnt
      INTO TABLE lt_rcp_plnt   " Internal table of type /PLMB/RCP_PLNT
      FOR ALL ENTRIES IN lt_rcp_recipe
      WHERE rcp_guid = lt_rcp_recipe-rcp_guid.

    SELECT * FROM /plmb/rcp_descr
      INTO TABLE lt_rcp_descr    " Internal table of type /PLMB/RCP_DESCR
      FOR ALL ENTRIES IN lt_rcp_recipe
      WHERE rcp_guid = lt_rcp_recipe-rcp_guid.
  ENDIF.
ENDIF.

Вы получите свои данные в следующих внутренних таблицах

lt_rcp_recipe
lt_sam_node_t
lt_rcp_plnt
lt_rcp_descr

Лучше объявить локальную структуру с указанными c полями, которые Вы хотите прочитать, как я объявил выше. После этого вы должны прочитать и заполнить данные в таблице экспорта ET_TABLE.

...