Performance???

Colapsar
X
 
  • Tiempo
  • Mostrar
Limpiar Todo
nuevos mensajes
  • Rodolfo SAP
    Member
    • jun
    • 89

    #1

    Performance???

    Saludos,

    Bueno necesito de su experiencia Abap y es que tengo un programa (codigo A) que tenia que ser optimizado performance y lo que hice fue lo siguiente (codigo B) por medio de un ciclo va realizando select por cada registro entonces lo que hice fue hacer un select general, exportar a memoria y luego realizar import y read table. lo de import y export lo hice por que las subrutinas son indepedientes.

    CODIGO A

    Código:
    form HR_DIV_PER using    p_in
                    changing p_parm  like /ehr/s71_user_exit_parm
                             p_out.
    
      data: div_per       type HRP1008-PERSA,
            sobid         type HRP1001-SOBID,
            otype         type c               value 'S',
            relat         type string          value '003',
            desc_div_per  type T500P-NAME1.
    
      sobid = p_in.
    
      do 2 times.
    
        select single persa into div_per
                            from hrp1008
                            where objid = sobid and
                                  plvar = '01' and
                                  otype = otype and
                                  begda < sy-datum and
                                  endda > sy-datum.
    
        if sy-subrc = 0.
    
          exit.
    
        else.
    
          do 2 times.
    
            if otype = 'O'.
    
              relat = '008'.
    
            endif.
    
            select single sobid into sobid
                                from hrp1001
                                where otype = 'S' and
                                      objid = p_in and
                                      plvar = '01' and
                                      rsign = 'A' and
                                      relat = relat and
                                      begda < sy-datum and
                                      endda > sy-datum.
    
            if sy-subrc = 0.
    
              otype = 'O'.
              exit.
    
            else.
    
              relat = '008'.
    
            endif.
    
          enddo.
    
        endif.
    
      enddo.
    
      if relat = '008'.
    
        select single werks into div_per
                            from pa0001
                            where pernr = sobid and
                                  begda < sy-datum and
                                  endda > sy-datum.
    
      endif.
    
      select single name1 into desc_div_per
                         from t500p
                         where persa = div_per.
    
      if p_parm-prefix eq 1.
    
        p_out = div_per.
    
      elseif p_parm-prefix eq 2.
    
        p_out = desc_div_per.
    
      endif.
    
    endform.                    " HR_DIV_PER
    Código:
    form HR_REC_TYPE using    p_in
                     changing p_parm  like /ehr/s71_user_exit_parm
                              p_out.
    
      data: stabs type hrp1003-stabs,
            objid type hrp1001-objid.
    
      select single stabs from hrp1003
                          into stabs
                          where plvar = '01' and
                                otype = 'S' and
                                objid = p_in and
                                begda < sy-datum and
                                endda > sy-datum.
    
      if sy-subrc = 0 and stabs = 'X'.
    
        p_out = 'A'.
    
      else.
    
        select single objid from  hrp1001
                            into  objid
                            where otype = 'S' and
                                  objid = p_in and
                                  plvar = '01' and
                                  rsign = 'A' and
                                  relat = '012' and
                                  begda < sy-datum and
                                  endda > sy-datum.
    
        if sy-subrc = 0.
    
          p_out = 'M'.
    
        else.
    
          p_out = 'E'.
    
        endif.
    
      endif.
    
    endform.                    " HR_REC_TYPE
    CODIGO B

    Código:
    FORM hr_div_per USING    p_in
                    CHANGING p_parm  LIKE /ehr/s71_user_exit_parm
                             p_out.
    
      DATA: div_per       TYPE hrp1008-persa,
            sobid         TYPE hrp1001-sobid,
            otype         TYPE c               VALUE 'S',
            relat         TYPE string          VALUE '003',
            desc_div_per  TYPE t500p-name1.
    
    *INICIO Inserta H0000537(RMR) DRDK905694 ...................................... 03.Ago.2009
      DATA: tg_hrp1001 LIKE hrp1001 OCCURS 0 WITH HEADER LINE,
            tg_hrp1008 LIKE hrp1008 OCCURS 0 WITH HEADER LINE,
            tg_pa0001  LIKE pa0001  OCCURS 0 WITH HEADER LINE,
            tg_t500p   LIKE t500p   OCCURS 0 WITH HEADER LINE.
    *   FIN Inserta H0000537(RMR).................................................. 03.Ago.2009
    
      sobid = p_in.
    
      DO 2 TIMES.
    
    *INICIO Modifica H0000537(RMR) DRDK905694 ...................................... 03.Ago.2009
    *    SELECT SINGLE persa INTO div_per
    *                        FROM hrp1008
    *                        WHERE objid = sobid AND
    *                              plvar = '01' AND
    *                              otype = otype AND
    *                              begda < sy-datum AND
    *                              endda > sy-datum.
    
        IMPORT tmp_hr1008 TO tg_hrp1008 FROM MEMORY ID 'tg8'.
        IF tg_hrp1008 IS INITIAL.
          CLEAR tg_hrp1008.
          READ TABLE tg_hrp1008 WITH KEY objid = sobid
                                         plvar = '01'
                                         otype = otype.
    *   FIN Modifica H0000537(RMR) ............................................... 03.Ago.2009
    
          IF sy-subrc = 0.
    *INICIO Inserta H0000537(RMR) DRDK905698 ..................................... 04.Ago.2009
            MOVE: tg_hrp1008-persa TO div_per.
    *   FIN Inserta H0000537(RMR) ................................................ 04.Ago.2009
    
            EXIT.
    
          ELSE.
    
            DO 2 TIMES.
    
              IF otype = 'O'.
    
                relat = '008'.
    
              ENDIF.
    
    *INICIO Modifica H0000537(RMR) DRDK905694 ...................................... 03.Ago.2009
    *          SELECT SINGLE sobid INTO sobid
    *                              FROM hrp1001
    *                              WHERE otype = 'S' AND
    *                                    objid = p_in AND
    *                                    plvar = '01' AND
    *                                    rsign = 'A' AND
    *                                    relat = relat AND
    *                                    begda < sy-datum AND
    *                                    endda > sy-datum.
    
              IMPORT tmp_hr1001 TO tg_hrp1001 FROM MEMORY ID 'tg1'.
              IF tg_hrp1001 IS INITIAL.
                CLEAR tg_hrp1001.
                READ TABLE tg_hrp1001 WITH KEY otype = 'S'
                                               objid = p_in
                                               plvar = '01'
                                               rsign = 'A'
                                               relat = relat.
    *   FIN Modifica H0000537(RMR) ............................................... 03.Ago.2009
                IF sy-subrc = 0.
    *INICIO Inserta H0000537(RMR) DRDK905698 ..................................... 04.Ago.2009
                  MOVE: tg_hrp1001-sobid TO sobid.
    *   FIN Inserta H0000537(RMR) ................................................ 04.Ago.2009
    
                  otype = 'O'.
                  EXIT.
    
                ELSE.
    
                  relat = '008'.
    
                ENDIF.
    
              ENDIF.
    
            ENDDO.
    
          ENDIF.
    
        ENDIF.
    
      ENDDO.
    
      IF relat = '008'.
    
    *INICIO Modifica H0000537(RMR) DRDK905694 ...................................... 03.Ago.2009
    *    SELECT SINGLE werks INTO div_per
    *                        FROM pa0001
    *                        WHERE pernr = sobid AND
    *                              begda < sy-datum AND
    *                              endda > sy-datum.
    
        IMPORT tmp_pa0001 TO tg_pa0001 FROM MEMORY ID 'pa1'.
        IF tg_pa0001 IS INITIAL.
          CLEAR tg_pa0001.
          READ TABLE tg_pa0001 WITH KEY pernr = sobid.
          IF sy-subrc EQ 0.
            MOVE tg_pa0001-werks TO div_per.
          ENDIF.
        ENDIF.
    *   FIN Modifica H0000537(RMR) ................................................. 03.Ago.2009
      ENDIF.
    
    *INICIO Modifica H0000537(RMR) DRDK905694 ...................................... 03.Ago.2009
    *  SELECT SINGLE name1 INTO desc_div_per
    *                     FROM t500p
    *                     WHERE persa = div_per.
    
      IMPORT tmp_t500p TO tg_t500p FROM MEMORY ID 't5p'.
      IF tg_t500p IS INITIAL.
        CLEAR tg_t500p.
        READ TABLE tg_t500p WITH KEY persa = div_per.
        IF sy-subrc EQ 0.
          MOVE tg_t500p-name1 TO desc_div_per.
        ENDIF.
      ENDIF.
    *   FIN Modifica H0000537(RMR) ................................................ 03.Ago.2009
    
      IF p_parm-prefix EQ 1.
    
        p_out = div_per.
    
      ELSEIF p_parm-prefix EQ 2.
    
        p_out = desc_div_per.
    
      ENDIF.
    
    ENDFORM.                    " HR_DIV_PER
    Código:
    FORM hr_rec_type USING    p_in
                     CHANGING p_parm  LIKE /ehr/s71_user_exit_parm
                              p_out.
    
      DATA: stabs TYPE hrp1003-stabs,
            objid TYPE hrp1001-objid.
    
    *INICIO Inserta H0000537(RMR) DRDK905694 ...................................... 03.Ago.2009
      DATA: vg_statout TYPE c,
            vg_statin  TYPE c.
    
      DATA: tg_hrp1003 LIKE hrp1003 OCCURS 0 WITH HEADER LINE,
            tmp_hr1003 LIKE hrp1003 OCCURS 0 WITH HEADER LINE,
            tg_hrp1001 LIKE hrp1001 OCCURS 0 WITH HEADER LINE,
            tmp_hr1001 LIKE hrp1001 OCCURS 0 WITH HEADER LINE,
            tmp_hr1008 LIKE hrp1008 OCCURS 0 WITH HEADER LINE,
            tmp_pa0001 LIKE pa0001  OCCURS 0 WITH HEADER LINE,
            tmp_t500p  LIKE t500p   OCCURS 0 WITH HEADER LINE,
            tmp_hr1010 LIKE hrp1010 OCCURS 0 WITH HEADER LINE.
    
      IMPORT vg_statout TO vg_statin FROM MEMORY ID 'sta'.
    
      IF vg_statin IS INITIAL.
        SELECT * FROM hrp1003 INTO TABLE tmp_hr1003 WHERE plvar = '01'
                                                      AND begda < sy-datum
                                                      AND endda > sy-datum.
        IF sy-subrc EQ 0.
          EXPORT tmp_hr1003 TO MEMORY ID 'tg3'.
        ENDIF.
    
        SELECT * FROM hrp1001 INTO TABLE tmp_hr1001 WHERE plvar = '01'
                                                      AND begda < sy-datum
                                                      AND endda > sy-datum.
        IF sy-subrc EQ 0.
          EXPORT tmp_hr1001 TO MEMORY ID 'tg1'.
        ENDIF.
    
        SELECT * FROM hrp1008 INTO TABLE tmp_hr1008 WHERE plvar = '01'
                                                      AND begda < sy-datum
                                                      AND endda > sy-datum.
        IF sy-subrc EQ 0.
          EXPORT tmp_hr1008 TO MEMORY ID 'tg8'.
        ENDIF.
    
        SELECT * FROM pa0001 INTO TABLE tmp_pa0001 WHERE begda < sy-datum
                                                     AND endda > sy-datum.
        IF sy-subrc EQ 0.
          EXPORT tmp_pa0001 TO MEMORY ID 'pa1'.
        ENDIF.
    
        SELECT * FROM t500p INTO TABLE tmp_t500p.
        IF sy-subrc EQ 0.
          EXPORT tmp_t500p TO MEMORY ID 't5p'.
        ENDIF.
    
    
        SELECT * FROM hrp1010 INTO TABLE tmp_hr1010 WHERE plvar = '01'
                                                      AND otype = 'C'
                                                      AND subty = '0004'
                                                      AND begda < sy-datum
                                                      AND endda > sy-datum.
        IF sy-subrc EQ 0.
          EXPORT tmp_hr1010 TO MEMORY ID 'tg0'.
        ENDIF.
    
        vg_statout = 'X'.
        EXPORT vg_statout TO MEMORY ID 'sta'.
      ENDIF.
    *   FIN Inserta H0000537(RMR).................................................. 03.Ago.2009
    
    *INICIO Modifica H0000537(RMR) DRDK905694 ..................................... 03.Ago.2009
    *  SELECT SINGLE stabs FROM hrp1003
    *                      INTO stabs
    *                      WHERE plvar = '01' AND
    *                            otype = 'S' AND
    *                            objid = p_in AND
    *                            begda < sy-datum AND
    *                            endda > sy-datum.
    
      IMPORT tmp_hr1003 TO tg_hrp1003 FROM MEMORY ID 'tg3'.
      IF tg_hrp1003 IS INITIAL.
        CLEAR tg_hrp1003.
        READ TABLE tg_hrp1003 WITH KEY plvar = '01'
                                       otype = 'S'
                                       objid = p_in.
    *   FIN Modifica H0000537(RMR) DRDK905694 ..................................... 03.Ago.2009
    
        IF sy-subrc = 0 AND tg_hrp1003-stabs = 'X'.
    
          p_out = 'A'.
    
        ELSE.
    
    *INICIO Modifica H0000537(RMR) DRDK905694 ..................................... 03.Ago.2009
    *      SELECT SINGLE objid FROM  hrp1001
    *                          INTO  objid
    *                          WHERE otype = 'S' AND
    *                                objid = p_in AND
    *                                plvar = '01' AND
    *                                rsign = 'A' AND
    *                                relat = '012' AND
    *                                begda < sy-datum AND
    *                                endda > sy-datum.
    
          IMPORT tmp_hr1001 TO tg_hrp1001 FROM MEMORY ID 'tg1'.
          IF tg_hrp1001 IS INITIAL.
            CLEAR tg_hrp1001.
            READ TABLE tg_hrp1001 WITH KEY otype = 'S'
                                           objid = p_in
                                           plvar = '01'
                                           rsign = 'A'
                                           relat = '012'.
    *   FIN Modifica H0000537(RMR) DRDK905694 ..................................... 03.Ago.2009
    
            IF sy-subrc = 0.
    
              p_out = 'M'.
    
            ELSE.
    
              p_out = 'E'.
    
            ENDIF.
    
          ENDIF.
    
        ENDIF.
    
      ENDIF.
    
    ENDFORM.                    " HR_REC_TYPE
    Bueno eso es todo y lo que necesito saber es si hice BIEN o NO, los pro contra, si hay otras formas mmm pero aclaro estas subrutinas y el programa que las manda llamar es estandar.
Trabajando...