Problema con Inner Join

Colapsar
X
 
  • Tiempo
  • Mostrar
Limpiar Todo
nuevos mensajes
  • Driau
    Senior Member
    • ago
    • 235

    #1

    Problema con Inner Join

    Hola a todos,

    Tengo un pequeño problema con un trocillo de código. Hago un select en el que a través de mi tabla interna it_afko (llena de ordenes de fabricacion) voy a buscar a la tabla RESB los materiales asociados a esa orden de fabricacion. El problema es que se tira 1 minuto para ejecutar éste codigo:

    LOOP AT IT_AFKO.
    SELECT MATNR
    FROM RESB
    INTO CORRESPONDING FIELDS OF TABLE IT_RESB_TMP
    WHERE AUFNR = IT_AFKO-AUFNR.
    LOOP AT IT_RESB_TMP.
    MOVE-CORRESPONDING IT_RESB_TMP TO IT_RESB.
    IT_RESB-IDNRK = IT_AFKO-IDNRK.
    APPEND IT_RESB.
    ENDLOOP.
    ENDLOOP.

    Me podría funcionar un INNER JOIN?? No tengo ni idea de que va ni como és la sintaxis. Alguien me podria echar una mano?

    Os lo agradecería mucho!

    Grácias!
  • crounly
    Senior Member
    • nov
    • 227

    #2
    EL inner join permite emparajear filas de dos o mas tablas sobre una busqueda, para cada una de las filas de una tabla busca las correspondientes filas que cumplan la condicion indicada en la otra tabla

    DATA: BEGIN OF it_join OCCURS 0,
    matnr LIKE mara-mantr,
    maktx LIKE makt.maktx,
    END OF it_join.


    SELECT *
    INTO CORRESPONDING FIELD OF TABLE it_join
    FROM mara AS z
    INNER JOIN makt AS t
    ON mara-matnr EQ makt-matnr
    AND makt-SPRAS EQ 'ES'
    WHERE z~matnr IN p_matnr.

    Esto seleccionaria todas las entradas de la mara que cumplan la condicion y para cada una de ellas buscaria aquella que cumple la condicion especificada en el INNER JOIN en la makt

    AL final en it_join tendriamos el cod de materil, y su texto para español
    http://codigoderetorno.blogspot.com.es/

    Comentario

    • Driau
      Senior Member
      • ago
      • 235

      #3
      Entonces...que seria as eficiente??

      Entonces en el caso de mi ejemplo..el de mas arriba...con la tabla de OF's...que seria lo mas indicado hacer? Porque con un inner join solo puedo trabajar con tablas de base de datos no??? El FOR ALL ENTRIES me serviria??

      Comentario

      • Driau
        Senior Member
        • ago
        • 235

        #4
        Ayuda por favor!

        He intentado optimizar mi código pero no consigo mejorar nada. El trozo de código que me da problemas és el siguiente:

        LOOP AT IT_AFKO.
        SELECT MATNR
        FROM RESB
        INTO CORRESPONDING FIELDS OF TABLE IT_RESB_TMP
        WHERE AUFNR = IT_AFKO-AUFNR.
        LOOP AT IT_RESB_TMP.
        MOVE-CORRESPONDING IT_RESB_TMP TO IT_RESB.
        IT_RESB-IDNRK = IT_AFKO-IDNRK.
        APPEND IT_RESB.
        ENDLOOP.
        ENDLOOP.

        Como veis necesito traer todos los materiales de cada una de las OF's que hay en mi tabla interna it_afko. Podria hacer un select for all entries pero si os habeis fijado, arrastro todo el rato un campo de dumero de material (IDNRK) que si hago el for all entries no puedo reutilizar. Tan mal esta este código???

        Os aseguro que se tira como 30 o 40 segundos. :-(

        Comentario

        • ballan
          Senior Member
          • oct
          • 671

          #5
          SELECT MATNR
          FROM RESB
          INTO CORRESPONDING FIELDS OF TABLE IT_RESB_tmp
          for all entries in it_afko
          WHERE AUFNR = IT_AFKO-AUFNR.

          LOOP AT IT_RESB_TMP.
          MOVE-CORRESPONDING IT_RESB_TMP TO IT_RESB.
          read table it_afko with key ...
          IT_RESB-IDNRK = IT_AFKO-IDNRK.
          APPEND IT_RESB.
          ENDLOOP.

          Comentario

          • Driau
            Senior Member
            • ago
            • 235

            #6
            Gracias por el código!!

            No havia pensado en eso. De hecho si pensé en el FOR ALL ENTRIES el problema es que no sabia como pasar el campo IDNRK. Pero con ésto..me ha ido muy bien. La velocidad de procesado ha mejorado muchísimo!!

            Muchas grácias!!

            Comentario

            • sconoredhot
              Senior Member
              • feb
              • 341

              #7
              Ten en cuenta que el FOR ALL ENTRIES se hizo para reemplazar el select adentro de un loop, que es lo que hacia tu codigo antiperformante, y por consiguiente tardaba demasiado tiempo.
              Sebas

              Desarrollador ABAP.

              Comentario

              • ibecerra

                #8
                Una cosa mas, trata en lo posible no utilizar
                INTO CORRESPONDING FIELDS OF TABLE IT_RESB_TMP
                si solo estas haciendo un select a una tabla, declara los campos q necesitas y solo eso cargas ya que el into corresponding genera una logica de compatibilidad entre campos para poder colocarlo donde es y eso genera mas carga a la memoria.


                ejemplo:

                DATA: BEGIN OF TI_RESB OCCURS 0,
                AUFNR LIKE RESB-AUFNR,
                RSNUM LIKE RESB-RSNUM,
                MATNR LIKE RESB-MATNR,
                POSNR LIKE RESB-POSNR,
                CHARG LIKE RESB-CHARG,
                BDMNG LIKE RESB-BDMNG,
                MEINS LIKE RESB-MEINS,
                ERFMG LIKE RESB-ERFMG,
                ERFME LIKE RESB-ERFME,
                FLAG TYPE C.
                DATA: END OF TI_RESB.


                SELECT
                AUFNR RSNUM MATNR POSNR CHARG
                BDMNG MEINS ERFMG ERFME
                INTO TABLE TI_RESB
                FROM RESB WHERE AUFNR EQ <CAUFV>-AUFNR.

                Comentario

                • DavidXD_XD
                  Moderator
                  • ago
                  • 1255

                  #9
                  Hola, para temas de performance te recomiendo hacer el primer select a la CAUFV con los parametros de AUTYP (Tipo de Orden), y a la vez esa tabla interna que estas insertando tenga llena el campo RSNUM, lo harias de esta manera ....

                  SELECT aufnr rsnum
                  INTO TABLE it_caufv
                  FROM caufv
                  WHERE autyp = '10'. "En el servidor de mi trabajo 10 = Ordenes de fabricacion

                  SELECT rsnum rspos matnr charg bdmng meins
                  INTO TABLE it_resb
                  FROM resb
                  FOR ALL ENTRIES IN it_caufv
                  WHERE rsnum = it_caufv-rsnum.

                  La tabla RESB es una tabla que almacena una inmensidad de datos, para empresas que se dedican a la fabricación, por tal motivo realizar una consulta a la RESB por el campo AUFNR que es el la orden va a demorar un mundo ... espero te sirva
                  David Carballido Córdova

                  Comentario

                  Trabajando...