Archivo

Posts Tagged ‘Tabla interna’

Cómo obtener las propiedades de los campos

Caso: a veces en la lógica cuando se trabaja con field-symbols o queremos optimizar código necesitamos saber de que tipo es cada campo.

Solución: Si son campos del diccionario de datos podemos utilizar la función DDIF_FIELDINFO_GET, si son de una tabla interna podemos usar el siguiente código:

REPORT obtener_info_campos_itab.

TYPES: BEGIN OF typ_itab,
char20(20) TYPE c,
monto type kbetr,
entero type i,
meins type meins,
cantidad type menge_d,
fecha TYPE sy-datum,
type_p TYPE p LENGTH 12 DECIMALS 3,
END OF typ_itab.

DATA: i_itab TYPE TABLE OF typ_itab,
l_tabledescr_ref TYPE REF TO cl_abap_tabledescr,
l_descr_ref TYPE REF TO cl_abap_structdescr,
wa_table TYPE abap_compdescr.

l_tabledescr_ref ?= cl_abap_typedescr=>describe_by_data( i_itab ).
l_descr_ref ?= l_tabledescr_ref->get_table_line_type( ).

LOOP AT l_descr_ref->components INTO wa_table .
WRITE: / wa_table-name,wa_table-type_kind,
wa_table-length,wa_table-decimals.
ENDLOOP.

Mostrar tabla interna en un POPUP ALV

Caso: se busca mostrar en un POPUP un ALV, para visualizar datos de una tabla interna (en mi caso, era el resultado de la ejecución de una BAPI que hace más de un asiento contable).

TYPES BEGIN OF t_asientos.
TYPES belnr TYPE belnr_d.
TYPES bukrs TYPE bukrs.
TYPES gjahr TYPE gjahr.
TYPES belnr_anul TYPE belnr_d.
TYPES bukrs_anul TYPE bukrs.
TYPES gjahr_anul TYPE gjahr.
TYPES END OF t_asientos.

DATA: gt_asientos   TYPE TABLE OF t_asientos,

      lt_fcat       TYPE slis_t_fieldcat_alv.

 

PERFORM crear_catalogo_popup TABLES lt_fcat.

 

CALL FUNCTION ‘REUSE_ALV_GRID_DISPLAY’
EXPORTING
i_callback_program    = sy-repid
it_fieldcat           = lt_fcat
I_CALLBACK_USER_COMMAND = 
‘USER_COMMAND_POPUP’
i_screen_start_column = 
30
i_screen_start_line   = 
7
i_screen_end_column   = 
100
i_screen_end_line     = 
20
TABLES
t_outtab              = gt_asientos
EXCEPTIONS
program_error         = 
1
OTHERS                = 2.

 

 

*&———————————————————————*
*&      Form  CREAR_CATALOGO
*&———————————————————————*
*       Crea el catálogo de campos para el ALV POPUP
*———————————————————————-*
FORM crear_catalogo_popup TABLES pt_fieldcat TYPE slis_t_fieldcat_alv.

DATA: ls_fieldcat TYPE slis_fieldcat_alv.

REFRESH pt_fieldcat.
CLEAR ls_fieldcat.
ls_fieldcat-fieldname = 
‘BELNR’.
ls_fieldcat-tabname   = 
‘GT_ASIENTOS’.
ls_fieldcat-seltext_m = 
‘Doc.Provisión’.
ls_fieldcat-
hotspot   = ‘X’.
APPEND ls_fieldcat TO pt_fieldcat.

CLEAR ls_fieldcat.
ls_fieldcat-fieldname = 
‘GJAHR’.
ls_fieldcat-tabname   = 
‘GT_ASIENTOS’.
ls_fieldcat-seltext_m = 
‘Período’.
APPEND ls_fieldcat TO pt_fieldcat.

CLEAR ls_fieldcat.
ls_fieldcat-fieldname = 
‘BELNR_ANUL’.
ls_fieldcat-tabname   = 
‘GT_ASIENTOS’.
ls_fieldcat-seltext_m = 
‘Doc.Anulación’.
ls_fieldcat-
hotspot   = ‘X’.
APPEND ls_fieldcat TO pt_fieldcat.

CLEAR ls_fieldcat.
ls_fieldcat-fieldname = 
‘GJAHR_ANUL’.
ls_fieldcat-tabname   = 
‘GT_ASIENTOS’.
ls_fieldcat-seltext_m = 
‘Período’.
APPEND ls_fieldcat TO pt_fieldcat.

ENDFORM.                    «crear_catalogo_popup

 

*&———————————————————————*
*&      Form  user_command
*&———————————————————————*
*       User command del popup
*———————————————————————-*
FORM user_command_popup USING r_ucomm LIKE sy-ucomm
rs_selfield 
TYPE slis_selfield.

DATA: lw_asientos TYPE t_asientos.
CASE rs_selfield-fieldname.
WHEN ‘BELNR’.
READ TABLE gt_asientos INTO lw_asientos WITH KEY belnr = rs_selfield-value.
SET PARAMETER ID ‘BLN’ FIELD lw_asientos-belnr.
SET PARAMETER ID ‘BUK’ FIELD lw_asientos-bukrs.
SET PARAMETER ID ‘GJR’ FIELD lw_asientos-gjahr.
CALL TRANSACTION ‘FB03’ AND SKIP FIRST SCREEN.

WHEN ‘BELNR_ANUL’.
READ TABLE gt_asientos INTO lw_asientos WITH KEY belnr_anul = rs_selfield-value.

SET PARAMETER ID ‘BLN’ FIELD lw_asientos-belnr_anul.
SET PARAMETER ID ‘BUK’ FIELD lw_asientos-bukrs_anul.
SET PARAMETER ID ‘GJR’ FIELD lw_asientos-gjahr_anul.
CALL TRANSACTION ‘FB03’ AND SKIP FIRST SCREEN.

WHEN OTHERS.
ENDCASE.

ENDFORM.                    «user_command

El resultado es algo así:

alv