codigo ejemplo para unir dos tablas cabecera y detalles de un ALV

Colapsar
X
 
  • Tiempo
  • Mostrar
Limpiar Todo
nuevos mensajes
  • jeanficetola
    Member
    • sep
    • 64

    #1

    codigo ejemplo para unir dos tablas cabecera y detalles de un ALV

    Buenos Dias,

    alguien tendra un ejemplo de un codigo unir la tabla cabecera y detalleen una sola estructura.

    gracias
    Jean Carlos Hernandez Ficetola

    Consultor ABAP
    INFOGESA S.A , Venezuela
  • Jonathan Barrio Rodriguez
    Senior Member
    • oct
    • 199

    #2
    ok, ok, una vez nos lo pidieron y no encontré la solución.

    El caso es que sí que pasa por ejemplo en la Transaccion de libro diario (no me acuerdo del código de transaccion ahora mismo), despues de pintarlo por
    pantalla, puedes exportarlo a excell... y exporta dos tablas internas... intenté debugearlo pero fué casi imposible... aunque realmente creo que acbe viendo que lo metía todo en una tabla con un solo campo de 300 caracteres...

    El tema es interesante. A ver si alguien sabe algo.
    Barrio Rodriguez, Jonathan.
    _____________________________________
    "No sigas a quien haya encontrado la verdad sino a quien la busque"

    Comentario

    • Jonathan Barrio Rodriguez
      Senior Member
      • oct
      • 199

      #3
      La Transaccio Del Libro Diario Es S_alr_87012287
      Barrio Rodriguez, Jonathan.
      _____________________________________
      "No sigas a quien haya encontrado la verdad sino a quien la busque"

      Comentario

      • sconoredhot
        Senior Member
        • feb
        • 341

        #4
        Tienes que usar un ALV en bloques.
        Sebas

        Desarrollador ABAP.

        Comentario

        • Jonathan Barrio Rodriguez
          Senior Member
          • oct
          • 199

          #5
          Hola, sconoredhot,

          Imagino que con lo del alv en bloques te refieres a un solo
          alv que mediante alguna variante de la llamada a la función o
          al catálogo le indicas más de una tabla.

          Podrías indicarnoslo, por favor.

          Gracias y un saludo.
          Barrio Rodriguez, Jonathan.
          _____________________________________
          "No sigas a quien haya encontrado la verdad sino a quien la busque"

          Comentario

          • bisonye
            Senior Member
            • ago
            • 635

            #6
            Originalmente publicado por jeanficetola
            Buenos Dias,

            alguien tendra un ejemplo de un codigo unir la tabla cabecera y detalleen una sola estructura.

            gracias
            Jo pues o estoy muy espeso o no entiendo la pregunta.
            Si tienes una tabla cabecera y otra detalle y quieres sacarla en una sola estructura recorres la cabecera y recorres el detalle con la clave de la cabecera. Lo guardas en otra tabla y a correr.
            http://sapymas.blogspot.com/

            Comentario

            • Jonathan Barrio Rodriguez
              Senior Member
              • oct
              • 199

              #7
              Jeancifetola, ¿Podrías concretar cual es tu modificación?
              Solo se me ocurre esto...

              DATA: BEGIN OF INTAB_FINAL WITH HEADER LINE,
              FILA(60) TYPE C.
              DATA: END OF INTAB_FINAL.

              DATA: INTAB_HEADER TYPE STANDARD TABLE OF TABDB_CABECERA,
              INTAB_POSICION TYPE STANDARD TABLE OF TABDB_POSICIONES.

              LOOP AT INTAB_HEADER.

              CONCATENATE INTAB_HEADER-CAMPO1+0(longitud del campo1)
              INTAB_HEADER-CAMPO2+longitud del campo1(longitud campo2) into INTAB_FINAL SEPARATED BY space.

              APPEND INTAB_FINAL.

              LOOP AT INTAB_POSICIONES WHERE CAMPO1 = INTAB_HEADER-CAMPO1.

              CONCATENATE INTAB_POSICIONES-CAMPO1+0(longitud del campo1)
              INTAB_POSICIONES-CAMPO2+longitud del campo1(longitud campo2) into INTAB_FINAL SEPARATED BY space.

              APPEND INTAB_FINAL.

              ENDLOOP. "INTAB_POSICIONES
              ENDLOOP. "INTAB_HEADER

              No sé si se entiend muy bien... Jeanficetola, pregunta en lo que tengas duda.

              Seguramente ya habrías visto esta posibilidad y el inconveniente de después de no poder seleccionar campo... si quieres hacer un loop a la tabla final.

              Bisonyé... el problema aquí creo, es que las tablas tienen diferente estructura...

              ej.
              header
              Campo 1 (8 caracteres) Campo 2 (10 numéricos)
              Posiction
              cmapo1 (4 numéricos) campo2 (3 caracteres) campo 3 (2 caracteres)
              cmapo1 (4 numéricos) campo2 (3 caracteres) campo 3 (2 caracteres)

              Osea...

              ________ __________
              |1234abcd|1234567890|
              |1234|12a|ab|

              Alguien sabe si se puede construir tablas internas con estructura diferente en sus filas...??
              Barrio Rodriguez, Jonathan.
              _____________________________________
              "No sigas a quien haya encontrado la verdad sino a quien la busque"

              Comentario

              • bisonye
                Senior Member
                • ago
                • 635

                #8
                Pero si es una estructura cabecera - posición deben tener algún campo que las relacione, aunque sea parte del campo.

                Por ejemplo: Cabecera 12345abc - hhhhh
                Linea 12345 -fff-hhh-jjj

                Sería :
                Código:
                loop at cabecera.
                loop at linea where campo1 = cabecera-campo1(5).
                append estructura_final.
                endloop.
                endloop.
                Si lo que decís es que las líneas no tengan la información de cabecera y vicecersa lo que se puede hacer es no rellenar los campos según corresponda.
                http://sapymas.blogspot.com/

                Comentario

                • Jonathan Barrio Rodriguez
                  Senior Member
                  • oct
                  • 199

                  #9
                  Originalmente publicado por bisonye
                  Pero si es una estructura cabecera - posición deben tener algún campo que las relacione, aunque sea parte del campo.

                  Por ejemplo: Cabecera 12345abc - hhhhh
                  Linea 12345 -fff-hhh-jjj

                  ***
                  jajaja, tienes toda la razón, se me pasó el pequeño detalle del ccampo clave.

                  Ok, el tema es que en una misma tabla... tiene que aparecer
                  Linea 1--> Todos los campos del registro nº1 de la BKPF .
                  linea 2--> posicion de Bseg de registro nº1 de la BKPF.
                  linea 3--> posicion de Bseg de registro nº1 de la BKPF.
                  Linea 4--> Todos los campos del registro nº2 de la BKPF .
                  linea 5--> posicion de Bseg de registro nº2 de la BKPF.
                  linea 6--> posicion de Bseg de registro nº2 de la BKPF.


                  Ýo entiendo que es así, ¿no, Jeanficetola?.
                  Barrio Rodriguez, Jonathan.
                  _____________________________________
                  "No sigas a quien haya encontrado la verdad sino a quien la busque"

                  Comentario

                  • bisonye
                    Senior Member
                    • ago
                    • 635

                    #10
                    Eso es tan sencillo como montar una tabla interna con todos los registros de las dos tablas (me parece una burrada pero si es lo que piden...) y hacer el loop que he comentado antes.

                    Sigo sin ver los inconvenientes ni el problema
                    http://sapymas.blogspot.com/

                    Comentario

                    • sconoredhot
                      Senior Member
                      • feb
                      • 341

                      #11
                      Este seria la parte de un ejemplo de un alv en bloques, espero que te pueda llegar a servir.

                      PERFORM f_init_block.
                      PERFORM f_cargar_layout.
                      PERFORM f_cargar_fieldcat TABLES i_fieldcat.
                      PERFORM f_cargar_fieldcat2 TABLES i_fieldcat2.
                      PERFORM f_cargar_fieldcat3 TABLES i_fieldcat3.
                      PERFORM f_cargar_eventos.
                      PERFORM f_append_alv1.
                      PERFORM f_append_alv3.
                      PERFORM f_append_alv2.
                      PERFORM f_listar_block.


                      FORM f_cargar_fieldcat TABLES pt_fieldcat TYPE slis_t_fieldcat_alv.

                      DATA: l_posicion TYPE i.

                      CLEAR pt_fieldcat.
                      REFRESH pt_fieldcat.

                      pt_fieldcat-col_pos = l_posicion.
                      pt_fieldcat-fieldname = 'CUIT'.
                      pt_fieldcat-seltext_l = 'CUIT'.
                      pt_fieldcat-tabname = 'I_SALIDA'.
                      APPEND pt_fieldcat.
                      CLEAR pt_fieldcat.

                      pt_fieldcat-col_pos = l_posicion.
                      pt_fieldcat-fieldname = 'LIFNR'.
                      pt_fieldcat-seltext_l = 'Acreedor'.
                      pt_fieldcat-tabname = 'I_SALIDA'.
                      APPEND pt_fieldcat.
                      CLEAR pt_fieldcat.

                      pt_fieldcat-col_pos = l_posicion.
                      pt_fieldcat-fieldname = 'BUKRS'.
                      pt_fieldcat-tabname = 'I_SALIDA'.
                      pt_fieldcat-seltext_l = 'Sociedad'.
                      APPEND pt_fieldcat.
                      CLEAR pt_fieldcat.

                      pt_fieldcat-col_pos = l_posicion.
                      pt_fieldcat-fieldname = 'NAME1'.
                      pt_fieldcat-seltext_l = 'Razon Social'.
                      pt_fieldcat-tabname = 'I_SALIDA'.
                      APPEND pt_fieldcat.
                      CLEAR pt_fieldcat.

                      pt_fieldcat-col_pos = l_posicion.
                      pt_fieldcat-fieldname = 'MENSAJE'.
                      pt_fieldcat-tabname = 'I_SALIDA'.
                      pt_fieldcat-seltext_l = 'Log'.
                      APPEND pt_fieldcat.
                      CLEAR pt_fieldcat.

                      ENDFORM. " f_cargar_fieldcat_1
                      Y otros dos forms mas iguales a este...

                      FORM f_init_block.

                      CALL FUNCTION 'REUSE_ALV_BLOCK_LIST_INIT'
                      EXPORTING
                      i_callback_program = g_repid
                      i_callback_pf_status_set = 'SET-PF-STATUS'.

                      ENDFORM. "f_init_block

                      FORM f_append_alv1.
                      DATA l_tabname TYPE slis_tabname VALUE 'I_SALIDA'.

                      CALL FUNCTION 'REUSE_ALV_BLOCK_LIST_APPEND'
                      EXPORTING
                      is_layout = i_layout
                      it_fieldcat = i_fieldcat[]
                      i_tabname = l_tabname
                      it_events = i_eventos
                      TABLES
                      t_outtab = i_salida.
                      IF sy-subrc <> 0.
                      MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
                      WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
                      ENDIF.

                      ENDFORM. "f_append_alv1

                      FORM f_append_alv2.
                      DATA l_tabname TYPE slis_tabname VALUE 'I_JD'.

                      CALL FUNCTION 'REUSE_ALV_BLOCK_LIST_APPEND'
                      EXPORTING
                      is_layout = i_layout
                      it_fieldcat = i_fieldcat2[]
                      i_tabname = l_tabname
                      it_events = i_eventos_2
                      TABLES
                      t_outtab = i_jd.

                      IF sy-subrc <> 0.
                      MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
                      WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
                      ENDIF.

                      ENDFORM. "f_append_alv2

                      FORM f_listar_block.

                      CALL FUNCTION 'REUSE_ALV_BLOCK_LIST_DISPLAY'
                      EXCEPTIONS
                      program_error = 1
                      OTHERS = 2.
                      IF sy-subrc <> 0.
                      MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
                      WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
                      ENDIF.

                      ENDFORM. "f_listar_block

                      FORM f_cargar_eventos .

                      DATA: l_eventos TYPE slis_alv_event.
                      *
                      CALL FUNCTION 'REUSE_ALV_EVENTS_GET'
                      EXPORTING
                      i_list_type = 0
                      IMPORTING
                      et_events = i_eventos.

                      CLEAR l_eventos.
                      READ TABLE i_eventos WITH KEY name = 'TOP_OF_PAGE'
                      INTO l_eventos.
                      IF sy-subrc = 0.
                      * Asignar subrutina al evento TOP-OF-PAGE
                      MOVE 'TOP-OF-PAGE' TO l_eventos-form.
                      APPEND l_eventos TO i_eventos.
                      ENDIF.

                      CLEAR l_eventos.
                      READ TABLE i_eventos WITH KEY name = 'TOP_OF_PAGE'
                      INTO l_eventos.
                      IF sy-subrc = 0.
                      * Asignar subrutina al evento TOP-OF-PAGE BLOQUE 2
                      MOVE 'TOP-OF-PAGE-2' TO l_eventos-form.
                      APPEND l_eventos TO i_eventos_2.
                      ENDIF.

                      CLEAR l_eventos.
                      READ TABLE i_eventos WITH KEY name = 'TOP_OF_PAGE'
                      INTO l_eventos.
                      IF sy-subrc = 0.
                      * Asignar subrutina al evento TOP-OF-PAGE BLOQUE 3
                      MOVE 'TOP-OF-PAGE-3' TO l_eventos-form.
                      APPEND l_eventos TO i_eventos_3.
                      ENDIF.

                      ENDFORM. " f_cargar_eventos

                      (Para este form debes hacer antes 3 top of page)

                      FORM f_append_alv3 .

                      DATA l_tabname TYPE slis_tabname VALUE 'I_SALIDA2'.

                      CALL FUNCTION 'REUSE_ALV_BLOCK_LIST_APPEND'
                      EXPORTING
                      is_layout = i_layout
                      it_fieldcat = i_fieldcat3[]
                      i_tabname = l_tabname
                      it_events = i_eventos_3
                      TABLES
                      t_outtab = i_salida2.
                      IF sy-subrc <> 0.
                      MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
                      WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
                      ENDIF.

                      espero que te sirva saludos...
                      Sebas

                      Desarrollador ABAP.

                      Comentario

                      • mcarrasco
                        Member
                        • jul
                        • 71

                        #12
                        Amigo...

                        Te recomiendo que crees una estructura con los campos que requieres de las 2 tablas y crees luego una tabla interna de esta estructura.

                        creas el catalogo según la estructura y le mandas esta tabla a la funcion que muestra el alv.

                        Atte. Marcos Carrasco...

                        Comentario

                        Trabajando...