Unir datos de 2 tablas internas en 1 sola TI

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

    #1

    Unir datos de 2 tablas internas en 1 sola TI

    Bunas ]Tardes.


    Espero por favor me puedan ayudar.

    He realizado un SELECT y FOR ALL ENTRIES para contruir un reporte que tra informacion relacionado de 2 tablas Z y me la deja en 2 tablas internas respectivamente.

    Para mostrar la informacion por pantalla uso la sentencia WRITE:

    ---------------------------------------------------------------------
    *---------------------- Select para zlibros ---------------------
    SELECT signatura titulo editorial numero_autor
    FROM zlibro
    INTO TABLE it_infolibro
    WHERE signatura IN pa_sign AND
    titulo IN pa_tit AND editorial IN pa_edit.

    IF sy-subrc EQ 0.
    cantidad = sy-dbcnt.
    WRITE: 'La cantidad de registros obtenidos de Libros es: ',cantidad.
    SKIP.

    it_infolibro_aux[] = it_infolibro[].
    SORT it_infolibro_aux BY signatura.


    *---------------------- Select para zautor ---------------------
    SELECT numero_autor nombre apellidos
    FROM zautor
    INTO TABLE it_infoautor
    FOR ALL ENTRIES IN it_infolibro_aux
    WHERE numero_autor = it_infolibro_aux-numero_au
    AND numero_autor IN pa_codau.

    *----------------- Guardando Seleccion de Datos ------------------
    LOOP AT it_infolibro_aux INTO wa_infolibro.

    IF sy-subrc EQ 0.
    READ TABLE it_infoautor INTO wa_infoautor
    WITH KEY numero_au = wa_infolibro-numero_au.

    IF sy-subrc EQ 0.

    WRITE:/ wa_infolibro-signatura COLOR COL_KEY,
    wa_infolibro-titulo COLOR COL_NORMAL,
    wa_infolibro-editorial COLOR COL_NORMAL,
    wa_infoautor-autor_nom COLOR COL_NORMAL,
    wa_infoautor-autor_ape COLOR COL_NORMAL.

    * Hide para guardar en memoria el dato singnatura cuando el
    * usuario haga click en una linea del reporte.
    HIDE wa_infolibro-signatura.

    ENDIF.
    ENDIF.
    ENDLOOP.
    ENDIF.
    -----------------------------------------------------------------------


    El problema es que ahora deseo utilizar una ALV GRID para desplegar por pantalla esa misma informacion pero dicha informacion la tengo en 2 tablas internas por separado (it_infolibro_aux , it_infoautor) relacionados por un campo.

    Por favor me explican como poder juntar la informacion relacionada en las tablas internas it_infolibro_aux y it_infoautor en una nueva tabla interna it_total para pasarsela a la ALV y que me salga por pantalla.


    Muchas Gracias!!!
    Editado por última vez por andresf02; 26/01/2010, 21:00:37.
  • zonanet
    Senior Member
    • mar
    • 195

    #2
    En este loop puedes guardar la información...

    Código:
    *----------------- Guardando Seleccion de Datos ------------------
    LOOP AT it_infolibro_aux INTO wa_infolibro.
    
    IF sy-subrc EQ 0.
    READ TABLE it_infoautor INTO wa_infoautor
    WITH KEY numero_au = wa_infolibro-numero_au.
    
    
    it_total-campo1 = wa_infolibro-campo1.
    .
    .
    .
    it_total-campoN = wa_infoautor-campo2.
    .
    .
    .
    
    append it_total.
    
    IF sy-subrc EQ 0.
    
    WRITE:/ wa_infolibro-signatura COLOR COL_KEY,
    wa_infolibro-titulo COLOR COL_NORMAL,
    wa_infolibro-editorial COLOR COL_NORMAL,
    wa_infoautor-autor_nom COLOR COL_NORMAL,
    wa_infoautor-autor_ape COLOR COL_NORMAL.
    
    * Hide para guardar en memoria el dato singnatura cuando el
    * usuario haga click en una linea del reporte.
    HIDE wa_infolibro-signatura.
    
    ENDIF.
    ENDIF.
    ENDLOOP.
    o bien

    Código:
    LOOP AT it_infolibro_aux INTO wa_infolibro.
    
    IF sy-subrc EQ 0.
    READ TABLE it_infoautor INTO wa_infoautor
    WITH KEY numero_au = wa_infolibro-numero_au.
    
    move-corresponding wa_infolibro to it_total.
    move-corresponding wa_infoautor to it_total.
    
    append it_total.
    
    IF sy-subrc EQ 0.
    
    WRITE:/ wa_infolibro-signatura COLOR COL_KEY,
    wa_infolibro-titulo COLOR COL_NORMAL,
    wa_infolibro-editorial COLOR COL_NORMAL,
    wa_infoautor-autor_nom COLOR COL_NORMAL,
    wa_infoautor-autor_ape COLOR COL_NORMAL.
    
    * Hide para guardar en memoria el dato singnatura cuando el
    * usuario haga click en una linea del reporte.
    HIDE wa_infolibro-signatura.
    
    ENDIF.
    ENDIF.
    ENDLOOP.
    La segunda opción es si los campos de tus tablas internas de origen coinciden con los los nombres de tu tabla destino.
    Saludos.

    Comentario

    • andresf02
      Senior Member
      • nov
      • 190

      #3
      zonanet, mil gracias, me funciono perfecto!!!

      Apenas estoy aprendiendo y cada cosa nueva se la estoy agregando a un super reporte. Emepzo con una consulta simple y ya con tu ayuda puedo comensar a usar en el ALV.

      Gracias de nuevo.

      Comentario

      • VLozano
        Senior Member
        • nov
        • 124

        #4
        Para tablas Z que seguramente tienen pocos registros, intenta utilizar JOINs. Al principio cuestan un poco de leer para el neófito, pero con el tiempo las ves igual que cualquier SQL.

        El problema (largamente discutido en otras partes) es aprender cuándo usar JOINs, cuándo FOR ALL ENTRIES y cuándo LOOPs (en serio, a veces sale a cuenta el LOOP-SELECT SINGLE).

        Lo tuyo sería (más o menos):
        Código:
        SELECT l~signatura l~titulo l~editorial l~numero_autor 
               a~nomber a~apellidos
          INTO TABLE it_join
          FROM zlibro AS l INNER JOIN zautor AS a
             ON l~numero_autor = a~numero_autor
          WHERE l~signatura IN pa_sign 
            AND l~titulo IN pa_tit 
            AND l~editorial IN pa_edit
            AND l~numero_autor IN pa_codau.
        Si conservas tu código original (lo que NO es mala cosa), yo lo afinaría un poco metiéndole la condicion de pa_codau en la primera SQL, a no ser que necesites bajarte todos los libros y sólo los datos de algunos autores.
        "Porque algunos sabemos que somos parte del problema"
        - Pequeña guía para escribir mensajes en foros técnicos -

        Comentario

        Trabajando...