Organizar Datos en Layout para ALV - Urgente

Colapsar
X
 
  • Tiempo
  • Mostrar
Limpiar Todo
nuevos mensajes
  • andresf02
    Senior Member
    • nov
    • 190

    #1

    Organizar Datos en Layout para ALV - Urgente

    Buenas Noches.

    Tengo la siguiente situacion:

    Esto trabajando en un reporte (muy similar al listado que genera la CL30N) donde debo desplegar los objetos y el valor de sus caracteristicas. En total hay parametrizadas en el sistema 101 caracteristicas de objeto


    Pero resulta que el la tabla AUSP (valores de las caracteristicas), no todos los objetos tienen la misma cantidad de caracteristicas. Por ejemplo:

    |--OBJEK--|--caract--|--Valor--|
    |--obj_1--|-caract_1-|---v_1--|
    |--obj_1--|-caract_3-|---v_2--|
    |--obj_2--|-caract_1-|---v_3--|
    |--obj_3--|-caract_1-|---v_4--|
    |--obj_3--|-caract_2-|---v_5--|
    |--obj_3--|-caract_3-|---v_6--|

    En este caso el objeto 1 solo tiene 2 caracteristicas con valor, el objeto 2 solamente 1 caracteristica y el objeto 3 tiene 3 caracteristicas.


    Como la tabla AUSP crece vertical, estoy trasponiendola (sin tablas dinamicas, yo mismo llevo el control porque la cantidad de caracteristicas total es finita) para que quede de la siguiente manera:


    |--OBJEK--||-caract_1-|-caract_2-|-caract_3-|
    |--obj_1---|----v_1---|....NULL....|----v_2---|
    |--obj_2---|----v_3---|...NULL.....|....NULL....|
    |--obj_3---|----v_4---|---v_5----|---v_6----|

    Ahora si mi duda:

    Como puedo hacer para que al momento de ir creando la tabla interna traspuesta, saber en que columna debo colocar el valor correcto. por ejemplo para el caso del obj_1, no ir a colocar el valor correspondiente a la caracteristica 3, en el campo de la carateristica 2, sino que se respete las posiciones correctas.


    No soy gran experto en ABAP, pero por ejemplo en lenguaje C o java, seria algo asi como TABLA[i][j] no se si en abap haya algo parecido que me pueda ayudar.


    Gracias en antemano
  • calanis
    Senior Member
    • oct
    • 147

    #2
    Hola

    Veo que sigues con tú lucha del report similar al CL30N desde hace varios dias.
    Je difícil la migración a ABAP, no?

    Bueno, mira la cosa es simple si posees la cantidad finita de Características.
    Ojo esta solución no es la más optima pero si la más comprensible.
    Prueba con el siguiente código:
    Nomenclatura:
    LT:Local Table,también lo veras como it-->Internal Table
    LS:Local Structure,también lo veras como wa-->Work Area

    Que vamos a usar como base?
    LT_AUSP-->tabla interna con los datos |--OBJEK--|--caract--|--Valor--|
    LS_AUSP-->Línea de la tabla interna LT_AUSP
    LT_OBJEK-->Los objetos a tratar, tiene la misma estructura que LT_AUSP
    LT_AUSP_TRASPUESTA-->Tabla de la resultante Traspuesta de LT_AUSP

    *Definición de datos*
    TYPES:
    BEGIN OF lty_datos,
    objek TYPE ausp-objek,"Clave del objeto a clasificar
    caract TYPE ausp-atinn,"Característica interna
    valor TYPE ausp-atwrt,"Valor de la característica
    END OF lty_datos,

    BEGIN OF lty_datos_traspuestos,
    objek TYPE ausp-objek,"Clave del objeto a clasificar
    caract1 TYPE ausp-atwrt,"Valor de la característica 1
    caract2 TYPE ausp-atwrt,"Valor de la característica 2
    caractn TYPE ausp-atwrt,"Valor de la característica n
    END OF lty_datos_traspuestos.

    DATA:
    lt_ausp TYPE TABLE OF lty_datos,
    ls_ausp TYPE lty_datos,
    lt_objek TYPE TABLE OF lty_datos,
    ls_objek TYPE lty_datos,
    lt_ausp_traspuesta TYPE TABLE OF lty_datos_traspuestos,
    ls_ausp_traspuesta TYPE lty_datos_traspuestos.

    *Proceso - Los datos ya están cargados en la LT_AUSP*

    lt_objek[] = lt_ausp[].
    SORT lt_objek BY objek."Ordenamos por los objetos
    DELETE ADJACENT DUPLICATES FROM lt_objek COMPARING objek."Borramos los duplicados

    LOOP AT lt_objek INTO ls_objek.
    CLEAR: ls_ausp_traspuesta.
    LOOP AT lt_ausp INTO ls_ausp WHERE objek = ls_objek-objek.
    CASE ls_ausp-caract.
    WHEN 'caract1'.
    ls_ausp_traspuesta-caract1 = ls_ausp-valor.
    WHEN 'caract2'.
    ls_ausp_traspuesta-caract2 = ls_ausp-valor.
    * ... etc
    WHEN 'caractn'.
    ls_ausp_traspuesta-caractn = ls_ausp-valor.
    ENDCASE.
    ENDLOOP.
    APPEND ls_ausp_traspuesta TO lt_ausp_traspuesta.
    ENDLOOP.
    Mira las mejoras que le puedes hacer por ejemplo, es reemplazar partes de código por Field-Symbols,eventos AT y otras cosas pero te complicaría la existencia de momento y seguirías extrañando otros lenguajes.

    En fin, espero que la data te sea de utilidad.

    Saludos
    Carlos Alanis
    Carlos D. Alanis
    <=<< Compartir conocimiento es una manera de innovar >>=>

    Comentario

    • andresf02
      Senior Member
      • nov
      • 190

      #3
      Carlos,
      De verdad infitas gracais por tu respuesta. Esta supremamente detallada y la verdad me sirve mucho porque apenas estoy conociendo el lenguaje y me tocó enfrentar a este reporte con tabla transpuesta que me tiene botando corriente.

      tal como dices no es la manera mas optima y mas cuando la cantidad de caracteristicas en 101, pero de momento me sirve muchisimo para mostrar algo con lo que se pueda trabajar.

      Voy a probar de esta forma y cuando lo termine comentare.


      De nuevo mil gracias por tu tiempo.

      Comentario

      • richerme
        Junior Member
        • dic
        • 1

        #4
        Tabla transpuesta

        Hola, Carlos.

        Tengo una duda respecto a las tablas internas transpuestas. Como puedo crear mi tabla transpuesta si no se el numero exacto de valores que va a tener. En el ejemplo que mencionas solo manejan 6 valores pero si yo desconozco cuantos valores me arroja mi tabla interna "lt_ausp" como armo mi tabla transpuesta ya que desde la declaración de ésta tengo que manejar el numero de valores que tendra.

        Espero me puedas ayudar con esta inquitud.

        Muchas gracias por tu apoyo.


        Saludos.

        Comentario

        Trabajando...