S.O.O ABAP por favor ayuda que paso ?

Colapsar
X
 
  • Tiempo
  • Mostrar
Limpiar Todo
nuevos mensajes
  • braschilester

    #1

    S.O.O ABAP por favor ayuda que paso ?

    Err.tmpo.ejec. TIME_OUT
    Fecha y hora 15.01.2010 15:22:00



    Texto breve
    Time limit exceeded.



    ¿Qué ha sucedido?
    The program "ZPRO_004" has exceeded the maximum permitted runtime without
    interruption and has therefore been terminated.




    ¿Qué puede hacer?
    Note down which actions and inputs caused the error.


    To process the problem further, contact you SAP system
    administrator.

    Using Transaction ST22 for ABAP Dump Analysis, you can look
    at and manage termination messages, and you can also
    keep them for a long time.

    Anál.errores
    After a specific time, the program is terminated to make the work area
    available to other users who may be waiting.
    This is to prevent a work area being blocked unnecessarily long by, for
    example:
    - Endless loops (DO, WHILE, ...),
    - Database accesses with a large result set
    - Database accesses without a suitable index (full table scan)

    The maximum runtime of a program is limited by the system profile
    parameter "rdisp/max_wprun_time". The current setting is 3000 seconds. If this
    time limit is
    exceeded, the system attempts to cancel any running SQL statement or
    signals the ABAP processor to stop the running program. Then the system
    waits another 60 seconds maximum. If the program is then still active,
    the work process is restarted.


    Notas para corregir errores
    Programs with long runtime should generally be started as background
    jobs. If this is not possible, you can increase the system profile
    parameter "rdisp/max_wprun_time".

    Depending on the cause of the error, you may have to take one of the
    following measures:
    - Endless loop: Correct program;
    - Dataset resulting from database access is too large:
    Instead of "SELECT * ... ENDSELECT", use "SELECT * INTO internal table
    (for example);
    - Database has unsuitable index: Check index generation.

    If the error occures in a non-modified SAP program, you may be able to
    find an interim solution in an SAP Note.
    If you have access to SAP Notes, carry out a search with the following
    keywords:

    "TIME_OUT" " "
    "ZPRO_004" or "ZPRO_004"
    "CARGA_PROVEEDORES"

    If you cannot solve the problem yourself and want to send an error
    notification to SAP, include the following information:

    1. The description of the current problem (short dump)

    To save the description, choose "System->List->Save->Local File
    (Unconverted)".

    2. Corresponding system log

    Display the system log by calling transaction SM21.
    Restrict the time interval to 10 minutes before and five minutes
    after the short dump. Then choose "System->List->Save->Local File
    (Unconverted)".

    3. If the problem occurs in a problem of your own or a modified SAP
    program: The source code of the program
    In the editor, choose "Utilities->More
    Utilities->Upload/Download->Download".

    4. Details about the conditions under which the error occurred or which
    actions and input led to the error.


    Info posición de cancelación
    Termination occurred in the ABAP program "ZPRO_004" - in "CARGA_PROVEEDORES".
    The main program was "ZPRO_004 ".

    In the source code you have the termination point in line 987
    of the (Include) program "ZPRO_004".


    957 * --> p1 text
    958 * <-- p2 text
    959 *----------------------------------------------------------------------*
    960 FORM CARGA_PROVEEDORES.
    961 *-----------------------------------------------------------------
    962 * PROCESO DE OBTENCION DE LA INFORMACION DESDE LA BASE DE DATOS
    963 *-----------------------------------------------------------------
    964 * Captura de los proveedores :
    965 *----------------------------------
    966 DATA HAY_COMPRAS.
    967 REFRESH S_EKORG.
    968 SELECT * FROM T024E WHERE BUKRS IN S_BUKRS.
    969 CLEAR S_EKORG.
    970 S_EKORG-SIGN = 'I'.
    971 S_EKORG-OPTION = 'EQ'.
    972 S_EKORG-LOW = T024E-EKORG.
    973 APPEND S_EKORG.
    974 ENDSELECT.
    975
    976
    977
    978
    979 SELECT * FROM LFA1 WHERE LIFNR IN S_LIFNR.
    980 * AND bukrs IN s_bukrs ORDER BY lifnr.
    981 * ON CHANGE OF lfb1-lifnr.
    982 SELECT * FROM LFB1 WHERE LIFNR = LFA1-LIFNR
    983 AND BUKRS IN S_BUKRS.
    984 * check sy-subrc EQ 0.
    985 CLEAR HAY_COMPRAS .
    986 SELECT * FROM T024E WHERE BUKRS EQ LFB1-BUKRS.
    >>> SELECT * FROM LFM1 WHERE LIFNR EQ LFB1-LIFNR
    988 AND EKORG EQ T024E-EKORG.
    989
    990
    991 CLEAR TABPRO.
    992 HAY_COMPRAS = 'X'.
    993 *tabpro-banks = ' '. tabpro-bankl = ' '. tabpro-bankn = ' '.
    994 SELECT * FROM LFBK WHERE LIFNR = LFM1-LIFNR.
    995
    996 MOVE-CORRESPONDING LFBK TO TABPRO.
    997
    998 ENDSELECT.
    999
    000 MOVE-CORRESPONDING LFM1 TO TABPRO.
    001 MOVE-CORRESPONDING LFA1 TO TABPRO.
    002 MOVE-CORRESPONDING LFB1 TO TABPRO.
    003
    004 MOVE TABPRO-NAME1 TO I_TEXTO_DEPURADO.
    005 PERFORM DEPURA_TEXTO.
    006 MOVE I_TEXTO_DEPURADO TO TABPRO-NAME1.
  • kreuzigen
    Member
    • feb
    • 53

    #2
    Que que paso?

    Es muy sencillo, tienes anidados 5 selects!!!!!!!

    Es el programa mas ineficiente que he visto; debes contactar al autor de este programa para pedirle que optimize este código.

    La lógica puede ser correcta, sin embargo esta consumiendo al maximo los recursos del servidor.
    Si no sabes desarrollarte a ti mismo, nadie lo hara por ti....

    SAP Certified ABAP Developer

    Comentario

    • braschilester

      #3
      Amigo Gracias - Select

      Amigo eso quier decir qur al tener una cadena de SELECT

      Utiliza mucho recurso en el servidor.-

      CUAL PUEDE SER LA SOLUCION SEGUN TU ???

      YO TENGO Q REALIZA EL CAMBIO EL AUTOR NO ESTA MAS.

      Comentario

      • VLozano
        Senior Member
        • nov
        • 124

        #4
        Lo primero y más importante, mantener la calma.

        Primero la parrafada tocapelotas, y en el mensaje siguiente un poco de ayuda.

        Cuando consigas eso, si el problema persiste y tienes que preguntar en un foro, intenta poner un asunto al hilo que sea relevante. "Ayuda", "No funciona" y cosas así no sirven de nada. O sí, para que la gente NO entre a leer el mensaje y te deje tirado.

        Por ejemplo, este hilo podría "asuntarse": Error de ejecución por Time-out
        Entonces, los que crean que pueden echarte un cable, entrarán a leer el hilo, y los que se crean incapaces de hacerlo, y no quieran entrar a aprender nada, podrán ignorar el mensaje y ahorrar tiempo y ancho de banda.

        Cuando tengas solventado lo del asunto, empieza con el cuerpo del mensaje. Cosas que ayudan:

        1- los mensajes de texto del DUMP ponlos en una cita (tag [ QUOTE]), así distinguiremos el problema del mensaje de error
        2- el código en un bloque de código (tag [ CODE]), así distinguiremos el problema del mensaje del código (excepto como en este caso, cuando el código forme parte del mensaje de error)

        Y a continuación, la respuesta.
        "Porque algunos sabemos que somos parte del problema"
        - Pequeña guía para escribir mensajes en foros técnicos -

        Comentario

        • VLozano
          Senior Member
          • nov
          • 124

          #5
          Y ahora un poco de ayuda específica (el mensaje anterior también es de utilidad, pero más generalizada).

          El problema que tienes es que tu programa ("tu" porque ahora está bajo tu responsabilidad) accede a un montón de datos de la forma menos optimizada posible. Y si ha funcionado hasta ahora probablemente ha sido por casualidad.

          Opciones:

          1- verifica todas las tablas LF* (¿datos de clientes?), busca sus campos comunes (LIFNR probablemente para todas, y luego algunas más específicas) y monta una JOIN (IMPORTANTE: asegúrate de utilizar los índices, o podrías llegar a empeorar el problema)

          2- crea secuencas de SQL llamándolas para rellenar tablas internas (INTO TABLE) y encadenadas con sentencias FOR ALL ENTRIES IN (IMPORTANTE: si vas a usar el FAEI, asegúrate antes de que la tabla interna de referencia tiene datos, o bajarás la tabla entera empeorando el problema)

          Yo en este caso optaría por la opción 1, pero tomaría esa decisión en base a los datos que contienen MIS tablas LF*.
          "Porque algunos sabemos que somos parte del problema"
          - Pequeña guía para escribir mensajes en foros técnicos -

          Comentario

          • VLozano
            Senior Member
            • nov
            • 124

            #6
            Cómo construir la JOIN:
            - haz una lista de las SQL en un papel
            - para cada SQL, anota los campos del WHERE
            - subraya para cada campo WHERE aquellos que apuntan a una SQL anterior
            - construye la nueva SQL con tantas JOIN como hagan falta
            - Nota: las tablas realmente pequeñas (como la T024E, en MI caso) no las metas en la JOIN, esa lectura no afecta realmente al rendimiento, aunque no sea código optimizado.

            Ejemplo:
            Tenemos tres tablas, y buscamos:
            - de la tabla 1, lo campos campo1 y campo2 con unas condiciones
            - de la tabla 2, el campo 3 de aquellos registros que tienen el campo1 de la búsqueda anterior
            - de la tabla 3, el campo 4 de aquellos registros que tienen el campo1 de la primera búsqueda y el campo3 de la anterior
            Tu programa (el feo) sería algo así:
            Código:
            SELECT * FROM tabla1 WHERE condiciones.
              SELECT * FROM tabla2 WHERE campo1 = tabla1-campo1.
                SELECT * FROM tabla 3 WHERE campo1 = tabla1-campo1 AND campo3 = tabla2-campo3.
            *    Aquí se hace algo
                ENDSELECT.
              ENDSELECT.
            ENDSELECT.
            Código:
            DATA: BEGIN OF w_join,
                    campo1 TYPE tabla1-campo1,
                    campo2 TYPE tabla1-campo2,
                    campo3 TYPE tabla2-campo3,
                    campo4 TYPE tabla3-campo4,
                  END OF w_join,
                  t_join LIKE TABLE t_join.
            
            SELECT t1~campo1 t1~campo2 t2~campo3 t3~campo4
              INTO CORRESPONDING FIELDS OF TABLE t_join
              FROM tabla1 AS t1
                   INNER JOIN tabla2 AS t2
                         ON t1~campo1 = t2~campo1
                   INNER JOIN tabla3 AS t3
                         ON t2~campo1 = t3~campo1 AND t2~campo3 = t3~campo3
              WHERE condiciones.
            
            IF sy-subrc <> 0.
            * Ups!
            "Porque algunos sabemos que somos parte del problema"
            - Pequeña guía para escribir mensajes en foros técnicos -

            Comentario

            • VLozano
              Senior Member
              • nov
              • 124

              #7
              Cómo usar el FOR ALL ENTRIES IN:
              En caso de tener muchos datos, y no tener claras las relaciones entre las tablas (pojemplo, campo1 y campo2 no son claves en las otras tablas), el FOR ALL ENTRIES IN es una buena opción.

              IMPORTANTE: antes de cada SQL hay que verificar que la anterior ha devuelto datos. Si usas un FAEI con una tabla vacía, el sistema te devolverá LA TABLA ENTERA, independientemente de lo que haya en el WHERE (en serio, de verdad, aunque no te lo puedas creer).

              Para el mismo ejemplo anterior, el código FAEI sería:
              Código:
              SELECT campo1 campo2
                INTO TABLE t_tabla1
                FROM tabla1
                WHERE condiciones.
              
              IF sy-subrc = 0.
                SELECT campo1 campo3
                  INTO TABLE t_tabla2
                  FROM tabla2
                  FOR ALL ENTRIES IN t_tabla1
                  WHERE campo1 = t_tabla1-campo1.
                IF sy-subrc = 0.
                  SELECT campo1 campo3 campo4
                    INTO TABLE t_tabla3
                    FROM tabla3
                    FOR ALL ENTRIES IN t_tabla2
                    WHERE campo1 = t_tabla2-campo1
                      AND campo3 = t_tabla2-campo3.
                    IF sy-subrc = 0.
              *        Aquí se hace algo con las 3 tablas
              *        Con un LOOP en la 1, haciendo READ TABLE para las otras 2
                    ENDIF.
                  ENDIF.
                ENDIF.
              ENDIF.
              "Porque algunos sabemos que somos parte del problema"
              - Pequeña guía para escribir mensajes en foros técnicos -

              Comentario

              • VLozano
                Senior Member
                • nov
                • 124

                #8
                Cosas a tener en cuenta:

                1- Evita declaraciones tipo TABLES. No representan realmente una mejora, y hacen que el código siga difícil de "leer" para el que no conoce el programa.
                2- Pon siempre una lista de los campos a traer en las SQL, ahorrarás memoria, ancho de banda y algunos motores de BBDD lo agradecerán en sus oraciones nocturnas
                3- No uses declaraciones de tabla usando el OCCURS o el WITH HEADER LINE, hacen los programas más difíciles de seguir

                Esos tres consejos van en contra de la vagancia al teclado, pero un verdadero vago (como yo) los sigue, porque sabe que a la larga te ahorran trabajo.

                Cómo:
                1- Declara variables t_nombretabla TYPE TABLE OF tabla
                2- Usa el "CORRESPONDING" en las sentencias INTO si declaras como en 1, o define las tablas/líneas con un BEGIN o un TYPES
                3- Declara dos variables: una t_xx TYPE TABLE OF xx y una w_xx TYPE xx. Los READ, LOOP y demás hazlos INTO w_xx, y siempre sabrás si estás tratando con la tabla (t_xx) o la línea (w_xx)

                Son tonteridas de vejete, pero ayudan un montón al que viene detrás.

                Suerte.
                "Porque algunos sabemos que somos parte del problema"
                - Pequeña guía para escribir mensajes en foros técnicos -

                Comentario

                • bisonye
                  Senior Member
                  • ago
                  • 635

                  #9
                  Joder Vic, te has quedado a gusto!!
                  http://sapymas.blogspot.com/

                  Comentario

                  • braschilester

                    #10
                    VLozano- gracias

                    VLozano TIENES UN MAIL PARA ENVIARTE UN CODIGO CON UN ERROR

                    ES EL MISMO PROGRAMA YA ESTA SOLUCIONADO EL ERROR PERO AHORA

                    CARGA TODOS LOS ARCHIVOS MENOS UNO..DEJA UNO VACIO SIN DATOS

                    Comentario

                    • Rodolfo SAP
                      Member
                      • jun
                      • 89

                      #11
                      Felicitaciones

                      Respecto al hilo del tema no tengo mas que agregar si no por el contrario quiero felicitar a VLozano por tan eficiente y completa respuesta.

                      Felicidades

                      Saludos.

                      Comentario

                      • VLozano
                        Senior Member
                        • nov
                        • 124

                        #12
                        Originalmente publicado por braschilester
                        VLozano TIENES UN MAIL PARA ENVIARTE UN CODIGO CON UN ERROR

                        ES EL MISMO PROGRAMA YA ESTA SOLUCIONADO EL ERROR PERO AHORA

                        CARGA TODOS LOS ARCHIVOS MENOS UNO..DEJA UNO VACIO SIN DATOS
                        Si me mandas un mensaje de ese tipo, incluye un NIF y una cuenta bancaria donde girar la factura. Aunque probablemente tampoco lo responderé.

                        Yo entro aquí para aprender y para echar un cable a la gente. Si alguien hace una pregunta y yo le respondo aquí, la próxima vez que alguien tenga esa misma pregunta (y use el motor de búsqueda) tendrá la respuesta a mano. Si me haces una pregunta por correo y te la contesto por correo, la próxima vez que alguien tenga esa misma pregunta, o la pondrá en el foro, y tendré que repetir el esfuerzo, o me mandará un correo y además de repetir el esfuerzo acabaré harto.

                        Haz las preguntas que tengas que hacer en el foro, y si puedo echarte una mano (a tí y a quien sea), lo haré en el foro. No para colgarme medallas y decirle al mundo lo mucho que molo (que es mucho, en serio), sino para que los que vengan detrás tengan también esa información y así además de ayudarte a tí (o a quien sea) habré ayudado a esos "que vienen detrás". Es el objetivo (a veces secundario) de este tipo de foros: compartir información para ayudarnos entre todos.

                        Así que en vez de mandarme un mensaje, haces caso de mi primer mensaje en este hilo: redactas un mensaje con la pregunta, le pones un asunto explicativo, le das un formato legible y lo pones aquí.
                        Si puedo, lo leeré, pensaré en el problema si creo que puedo ayudar, y escribiré lo que crea conveniente para que tú y quien venga detrás tengáis más opciones para solventar ese tipo de problemas.

                        Espero que las parrafadas con las que me "he quedado a gusto" hayan sido de utilidad, al menos

                        (por cierto, bisonye, ¿nos conocemos?)
                        "Porque algunos sabemos que somos parte del problema"
                        - Pequeña guía para escribir mensajes en foros técnicos -

                        Comentario

                        • braschilester

                          #13
                          VLozano- gracias- NO SE QUIEN REALIZO ESTE CODE,,SOY NUEVO AQUI EN LA EMPRESA.

                          Form File_tabped.
                          If P_unix Ne Space.
                          Transfer Tabped To P_pedid Length 39.
                          Endif.
                          Append Tabped.
                          Endform. " File_tabped

                          Comentario

                          Trabajando...