Anuncio

Colapsar
No hay anuncio todavía.

Duda sencilla (soy principiante)

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

  • Duda sencilla (soy principiante)

    Hola a todos.
    Este es mi primer post, ojala que me vaya bien
    Les comento mi problema: hace poco empece con abap (antes estuve casi 1 año con XI / PI) y hoy me encontre con el siguiente codigo:

    DATA: r_knumv type range of knumv. "char de 10

    [...]

    CHECK r_knumv IS NOT INITIAL.

    SELECT knumv kschl kmprs
    FROM konv
    INTO TABLE it_konv
    WHERE knumv IN r_knumv.

    DELETE it_konv WHERE kmprs IS INITIAL OR kschl(1) NE 'J'.
    SORT it_konv BY knumv.


    Bueno las dudas que tengo son las siguientes:

    1) que significa cuando se declara a una variable con el TYPE RANGE OF?
    2) para que es el CHECK en este codigo? Si no se cumple la condición que sucede?
    3) esta es la pregunta mas importante y la que necesito con mas urgencia para solucionar este problema para mañana: cuando la variable r_knumv posee mas de 3 mil registros, el reporte tira un DUMP. Un chico de BASIS me dijo que esto se da por el IN, y un funcional me dijo que levante los datos a esa tabla interna mediante un INNER JOIN. A alguien se le ocurre como deberia hacer esto, o si hay una forma mas perfomante para realizar esto?
    Les comento que el r_knumv es una especie de it que contiene todos los knumv contra los que debo realizar el select. Obviamente pense en hacerle un LOOP y por cada registro hacer un SELECT a la tabla konv, pero como todos sabran, si hago eso, voy en cana o me mandan a la silla electrica xD

    Bueno espero que algun genio pueda aclararme esto, especialmente lo del punto 3 que me es casi de urgencia.

    Muchas gracias a todos!

  • #2
    Vamos a ver si te ayudo un poco
    Originalmente publicado por Claudioc Ver Mensaje
    Hola a todos.
    Este es mi primer post, ojala que me vaya bien
    Bienvenido al club!
    1) que significa cuando se declara a una variable con el TYPE RANGE OF?
    Lo que estás haciendo es montar una tabla interna con cabecera con los siguientes campos:
    Código:
    sign
    option
    low
    high
    El sign y el option indican si se incluye, excluye es un rango de valores, un valor individual...
    El low y el high te puedes imaginar que son. Cuando haces el select con el IN y el rango lo que hace el sistema es buscar los valores en la tabla del diccionario que cumple las condiciones.
    2) para que es el CHECK en este codigo? Si no se cumple la condición que sucede?
    El check comprueba la condición y si no se cumple termina la ejecución. Puedes verlo con más detalle pulsando F1
    3) esta es la pregunta mas importante y la que necesito con mas urgencia para solucionar este problema para mañana: cuando la variable r_knumv posee mas de 3 mil registros, el reporte tira un DUMP. Un chico de BASIS me dijo que esto se da por el IN, y un funcional me dijo que levante los datos a esa tabla interna mediante un INNER JOIN. A alguien se le ocurre como deberia hacer esto, o si hay una forma mas perfomante para realizar esto
    Para ver el rendimiento deberíamos ver también como recuperas los datos de r_knumv. Lo que puedes hacer es meter esos datos en una ti normal y hacer un for all entries a esa tabla.
    Lo del loop select se puede hacer, otra cosa es que el rendimiento baje, que no siempre es así.

    Pon el código de recuperación e intentamos ponerte un código con mejor rendimiento.

    Saludos
    "Soy el señor Lobo, arreglo problemas"
    http://sapymas.blogspot.com/

    Comentario


    • #3
      Bisonye: muchisimas gracias por tus respuestas.

      Lo he solucionado con el FOR ALL ENTRIES.

      El codigo quedo de la siguiente manera:

      data: vbak_rec type ty_vbak,
      knumv_rec like line of r_knumv.

      move: c_interval to knumv_rec-sign,
      c_equal to knumv_rec-option.

      refresh r_knumv.

      loop at it_vbak into vbak_rec.
      move vbak_rec-knumv to knumv_rec-low.
      append knumv_rec to r_knumv.
      endloop.



      SELECT knumv kschl kmprs
      FROM konv
      INTO TABLE it_konv
      FOR ALL ENTRIES IN it_vbak
      WHERE knumv EQ it_vbak-knumv.


      Lo que figura en italica es el codigo que no agregue previamente!
      Muchisimas gracias nuevamente!

      Comentario


      • #4
        Claudioc no entiendo tu código.
        Si el select es este:
        Código:
        SELECT knumv kschl kmprs
        FROM konv
        INTO TABLE it_konv
        FOR ALL ENTRIES IN it_vbak
        WHERE knumv EQ it_vbak-knumv.
        ¿Para que haces esto?
        Código:
        loop at it_vbak into vbak_rec.
        move vbak_rec-knumv to knumv_rec-low.
        append knumv_rec to r_knumv.
        endloop.
        Esa tabla r_knumv no la estás utilizando en ningún sitio! Estás haciendo un recorrido a la tabla vbak, que según dices es bastante extensa, innecesariamente.

        Saludos
        "Soy el señor Lobo, arreglo problemas"
        http://sapymas.blogspot.com/

        Comentario

        Trabajando...
        X