✒️ABAP Los reportes interactivos
ABAP Los reportes interactivos
REPORTE INTERACTIVO MULTINIVEL
Hola Compañeros:
Os dejo aquí el código fuente de un informe interactivo multinivel que hace un uso intensivo de AT LINE SELECTION y analiza la estructura de a linea para presentar diversos niveles de información. Espero que os resulte útil.
- *&---------------------------------------------------------------------*
- *& Report ZGZ57B_DETAILED_IREPORT
- *&
- *&---------------------------------------------------------------------*
- *&
- *&
- *&---------------------------------------------------------------------*
- REPORT zgz57b_detailed_ireport.
- *---------------------------------------------------------------------*
- * Tablas de la Base de Datos SAP
- *---------------------------------------------------------------------*
- TABLES:
- sscrfields, "Tabla Eventos Pantalla (Gracias Ezequiel)
- kna1, "Maestro Clientes
- t005t, "Nombre de los Paises
- vbak, "Cabeceras de Pedido
- vbap. "Lineas de Pedido
- *---------------------------------------------------------------------*
- * Tipos para las Tablas de los Informes
- *---------------------------------------------------------------------*
- TYPES:
- BEGIN OF ty_clientes,
- land1 LIKE kna1-land1, "Codigo Pais
- landx LIKE t005t-landx, "Nombre Pais
- ort01 LIKE kna1-ort01 , "Ciudad
- kunnr LIKE kna1-kunnr , "Codigo Cliente
- name1 LIKE kna1-name1 , "Nombre Cliente
- END OF ty_clientes.
- TYPES:
- BEGIN OF ty_facturas,
- land1 LIKE kna1-land1, "Codigo Pais
- landx LIKE t005t-landx, "Nombre Pais
- ort01 LIKE kna1-ort01 , "Ciudad
- kunnr LIKE kna1-kunnr , "Codigo Cliente
- name1 LIKE kna1-name1 , "Nombre Cliente
- vbeln LIKE vbak-vbeln, "Num.Pedido
- audat LIKE vbak-audat, "Fecha Pedido
- netwr LIKE vbak-netwr, "Valor Pedido
- END OF ty_facturas.
- TYPES:
- BEGIN OF ty_detalle,
- land1 LIKE kna1-land1, "Codigo Pais
- landx LIKE t005t-landx, "Nombre Pais
- ort01 LIKE kna1-ort01 , "Ciudad
- kunnr LIKE kna1-kunnr , "Codigo Cliente
- name1 LIKE kna1-name1 , "Nombre Cliente
- vbeln LIKE vbak-vbeln, "Num.Pedido
- audat LIKE vbak-audat, "Fecha Pedido
- netwr LIKE vbak-netwr, "Valor Pedido
- posnr LIKE vbap-posnr, "Linea de Pedido
- matnr LIKE vbap-matnr, "Cod.Articulo Linea
- arktx LIKE vbap-arktx, "Desc.Articulo Linea
- kbmeng LIKE vbap-kbmeng, "Cant.Articulo Linea
- netpr LIKE vbap-netpr, "Precio Articulo Linea
- END OF ty_detalle.
- *---------------------------------------------------------------------*
- * Tablas Internas y Registros (Workareas)
- *---------------------------------------------------------------------*
- DATA:
- ti_clientes TYPE STANDARD TABLE OF ty_clientes,
- wa_clientes LIKE LINE OF ti_clientes,
- wa_clientes_aux LIKE wa_clientes, " Auxiliar para corte Clientes
- ti_facturas TYPE STANDARD TABLE OF ty_facturas,
- wa_facturas LIKE LINE OF ti_facturas,
- wa_facturas_aux LIKE wa_facturas, " Auxiliar para corte Facturas
- ti_detalle TYPE STANDARD TABLE OF ty_detalle,
- wa_detalle LIKE LINE OF ti_detalle,
- wa_detalle_aux LIKE wa_detalle, " Auxiliar para corte Detalle
- so_ty_city(30) TYPE c,
- gv_t_ini TYPE i,
- gv_t_fin TYPE i,
- gv_records TYPE i,
- gv_mess(60) TYPE c,
- gv_time(10) TYPE c,
- gv_items(10) TYPE c,
- gv_tmp1(20) TYPE c,
- gv_tmp2(10) TYPE c,
- gv_tmp3(200) TYPE c,
- gv_len1 TYPE i,
- gv_len2 TYPE i,
- gv_len3 TYPE i,
- gv_key1 LIKE kna1-kunnr,
- gv_key2 LIKE vbap-vbeln,
- gv_keytxt(40) TYPE c,
- gv_key3 TYPE vbap-posnr,
- gv_key4 TYPE vbap-matnr,
- v_selected LIKE sy-tabix.
- *---------------------------------------------------------------------*
- * Variables de Acumulados de Corte
- *---------------------------------------------------------------------*
- DATA:
- gv_lineas_fra TYPE i, "Lineas en Pedido
- gv_bruto_fra TYPE p DECIMALS 2, "Bruto Pedido (cant x precio)
- gv_fras_cliente TYPE i, "Pedidos por Cliente
- gv_total_cliente TYPE p DECIMALS 2, "Importe Pedidos Cliente
- gv_fras_city TYPE i, "Pedidos por Ciudad
- gv_cli_city TYPE i, "Clientes por Ciudad
- gv_total_city TYPE p DECIMALS 2, "Importe Pedidos Ciudad
- gv_fras_pais TYPE i, "Pedidos por Pais
- gv_cli_pais TYPE i, "Clientes por Pais
- gv_total_pais TYPE p DECIMALS 2, "Importe Pedidos Pais
- gv_fras_total TYPE i, "Pedidos en Total
- gv_cli_total TYPE i, "Clientes en Total
- gv_gran_total TYPE p DECIMALS 2. "Importe Total Pedidos
- *---------------------------------------------------------------------*
- * Pantalla de selección
- *---------------------------------------------------------------------*
- SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-001.
- SELECT-OPTIONS so_pais FOR t005t-land1. "Seleccion Pais
- SELECT-OPTIONS so_cli FOR kna1-kunnr. "Seleccion Cod.Cliente
- SELECT-OPTIONS so_fecha FOR sy-datum "Seleccion Fecha Pedido
- DEFAULT '20000101' TO '20191212'.
- SELECT-OPTIONS so_city FOR (so_ty_city)
- DEFAULT 'A' TO 'ZZ'. "Seleccion Ciudad
- SELECTION-SCREEN END OF BLOCK b1.
- SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE text-002.
- PARAMETERS:
- p_cli RADIOBUTTON GROUP grp1 "Listado Clientes
- USER-COMMAND onchange, "Evento ONCHANGE (Ezequiel)
- p_fra RADIOBUTTON GROUP grp1, "Listado Pedidos
- p_lin RADIOBUTTON GROUP grp1. "Listado Lineas
- *SELECTION-SCREEN PUSHBUTTON 'Actualizar Opciones'.
- SELECTION-SCREEN END OF BLOCK b2.
- SELECTION-SCREEN BEGIN OF BLOCK b3 WITH FRAME TITLE text-003.
- PARAMETERS:
- p_tpais AS CHECKBOX, "Total Pais
- p_tcity AS CHECKBOX, "Total Ciudad
- p_tcli AS CHECKBOX, "Total Cliente
- p_tfra AS CHECKBOX. "Total Pedido
- SELECTION-SCREEN END OF BLOCK b3.
- *---------------------------------------------------------------------*
- AT SELECTION-SCREEN OUTPUT.
- *---------------------------------------------------------------------*
- PERFORM disable_opt USING 'p_tcli'.
- PERFORM disable_opt USING 'p_tfra'.
- PERFORM enable_disable_opts.
- *---------------------------------------------------------------------*
- AT SELECTION-SCREEN ON RADIOBUTTON GROUP grp1.
- *---------------------------------------------------------------------*
- IF sscrfields-ucomm = 'ONCHANGE'.
- IF p_cli IS NOT INITIAL.
- p_tcli = ' '.
- p_tfra = ' '.
- PERFORM disable_opt USING 'p_tcli'.
- PERFORM disable_opt USING 'p_tfra'.
- ELSEIF p_fra IS NOT INITIAL.
- p_tfra = ' '.
- PERFORM enable_opt USING 'p_tcli'.
- PERFORM disable_opt USING 'p_tfra'.
- ELSEIF p_lin IS NOT INITIAL.
- PERFORM enable_opt USING 'p_tcli'.
- PERFORM enable_opt USING 'p_tfra'.
- ENDIF.
- PERFORM enable_disable_opts.
- ENDIF.
- *-------------------------------------------------*
- INITIALIZATION.
- *-------------------------------------------------*
- CLEAR:
- gv_lineas_fra,
- gv_bruto_fra,
- gv_fras_cliente,
- gv_total_cliente,
- gv_fras_city,
- gv_cli_city,
- gv_total_city,
- gv_fras_pais,
- gv_cli_pais,
- gv_total_pais,
- gv_fras_total,
- gv_cli_total,
- gv_t_ini,
- gv_t_fin,
- gv_t_ini,
- gv_t_fin,
- gv_records,
- gv_mess,
- gv_time,
- gv_gran_total.
- CLEAR:
- gv_tmp3,
- gv_keytxt,
- gv_key1,
- gv_key2,
- gv_key3,
- gv_key4.
- *-------------------------------------------------*
- START-OF-SELECTION.
- *-------------------------------------------------*
- GET RUN TIME FIELD gv_t_ini.
- IF p_cli IS NOT INITIAL.
- "Consulta de Pedidos
- "Clientes JOIN Paises
- SELECT c~land1 p~landx c~ort01 c~kunnr c~name1
- INTO CORRESPONDING FIELDS OF TABLE ti_clientes
- FROM kna1 AS c
- INNER JOIN t005t AS p
- ON c~land1 = p~land1
- WHERE p~spras = sy-langu "Nombre de Pais en ES
- AND c~land1 IN so_pais
- AND c~ort01 IN so_city
- AND c~kunnr IN so_cli.
- DESCRIBE TABLE ti_clientes LINES gv_records.
- ENDIF.
- IF p_fra IS NOT INITIAL.
- "Consulta de Pedidos
- "Cabeceras JOIN Clientes JOIN Paises
- SELECT c~land1 p~landx c~ort01 c~kunnr c~name1 f~vbeln
- f~audat f~netwr
- INTO CORRESPONDING FIELDS OF TABLE ti_facturas
- FROM vbak AS f
- INNER JOIN kna1 AS c
- ON c~kunnr = f~kunnr
- INNER JOIN t005t AS p
- ON c~land1 = p~land1
- WHERE p~spras = sy-langu "Nombre de Pais en ES
- AND f~kunnr IN so_cli
- AND c~ort01 IN so_city
- AND f~audat IN so_fecha
- AND c~land1 IN so_pais.
- DESCRIBE TABLE ti_facturas LINES gv_records.
- ENDIF.
- IF p_lin IS NOT INITIAL.
- "Consulta de Lineas de Pedido
- "Lineas JOIN Cabeceras JOIN Clientes JOIN Paises
- SELECT c~land1 p~landx c~ort01 c~kunnr c~name1 f~vbeln
- f~audat f~netwr l~posnr l~matnr l~arktx l~kbmeng l~netpr
- INTO CORRESPONDING FIELDS OF TABLE ti_detalle
- FROM vbap AS l
- INNER JOIN vbak AS f
- ON l~vbeln = f~vbeln
- INNER JOIN kna1 AS c
- ON c~kunnr = f~kunnr
- INNER JOIN t005t AS p
- ON c~land1 = p~land1
- WHERE p~spras = sy-langu "Nombre de Pais en ES
- AND c~land1 IN so_pais
- AND c~ort01 IN so_city
- AND c~kunnr IN so_cli
- AND f~audat IN so_fecha.
- DESCRIBE TABLE ti_detalle LINES gv_records.
- ENDIF.
- * Tiempo de ejecucion
- GET RUN TIME FIELD gv_t_fin.
- gv_t_ini = gv_t_fin - gv_t_ini.
- WRITE gv_t_ini TO gv_time.
- WRITE gv_records TO gv_items.
- CONCATENATE gv_items 'resultados en' gv_time 'microsegundos.'
- INTO gv_mess
- SEPARATED BY ' '.
- MESSAGE gv_mess TYPE 'S'.
- *-------------------------------------------------*
- END-OF-SELECTION.
- *-------------------------------------------------*
- IF p_cli IS NOT INITIAL.
- PERFORM lista_clientes.
- ENDIF.
- IF p_fra IS NOT INITIAL.
- PERFORM lista_facturas.
- ENDIF.
- IF p_lin IS NOT INITIAL.
- PERFORM lista_detalle.
- ENDIF.
- *-------------------------------------------------*
- TOP-OF-PAGE.
- *-------------------------------------------------*
- PERFORM lista_cabecera.
- *-------------------------------------------------*
- END-OF-PAGE.
- *-------------------------------------------------*
- PERFORM lista_pie.
- *-------------------------------------------------*
- AT LINE-SELECTION.
- *-------------------------------------------------*
- gv_tmp3 = sy-lisel.
- * Hay controlar SY-LSIND para no llamar desde el subinforme infinitamente
- CASE sy-lsind.
- WHEN 1. "Llamadas de primer nivel
- IF gv_tmp3(1) = sy-vline(1).
- * Es registro de dato
- IF p_cli IS NOT INITIAL.
- PERFORM get_keys_from_line USING sy-lisel 101
- CHANGING gv_key1 gv_key3 gv_key4 gv_keytxt.
- PERFORM show_cliente USING gv_key1.
- ENDIF.
- IF p_fra IS NOT INITIAL.
- PERFORM get_keys_from_line USING sy-lisel 102
- CHANGING gv_key1 gv_key3 gv_key4 gv_keytxt.
- PERFORM show_pedido USING gv_key1.
- ENDIF.
- IF p_lin IS NOT INITIAL.
- PERFORM get_keys_from_line USING sy-lisel 103
- CHANGING gv_key1 gv_key3 gv_key4 gv_keytxt.
- PERFORM show_detalle USING gv_key1 gv_key3.
- ENDIF.
- ELSE.
- * Es registro de corte (Cabecera o Subtotal)
- * Analizar el tipo de registro
- CONDENSE gv_tmp3.
- CLEAR:
- gv_len1,
- gv_len2,
- gv_len3.
- IF gv_tmp3 CS 'Pedido:' AND
- gv_tmp3 CS 'bruto '.
- gv_len1 = 4. "Click en Subtotal Pedido
- ELSEIF gv_tmp3 CS 'Cliente:' AND
- gv_tmp3 CS 'pedidos '.
- gv_len1 = 3. "Click en Subtotal Cliente
- ELSEIF gv_tmp3 CS 'Cliente:'.
- gv_len1 = 23. "Click en Cabecera Cliente
- ELSE.
- IF gv_tmp3 CS 'Total ' AND
- &am
 
 
 
Sobre el autor
Publicación académica de Carlos Piles Rosell, en su ámbito de estudios para la Carrera Consultor ABAP.
Carlos Piles Rosell
Profesión: Analista de Sistemas y Programador - España - Legajo: GZ57B
✒️Autor de: 24 Publicaciones Académicas
🎓Egresado de los módulos:
Disponibilidad Laboral: PartTime
Certificación Académica de Carlos Piles