✒️ABAP El evento AT SELECTION-SCREEN y los tipos de mensajes
ABAP El evento AT SELECTION-SCREEN y los tipos de mensajes
Como veo que existen una amplia cantidad de apuntes esquemáticos de la teoría de las lecciones, y algunos muy buenos, a mí me gustaría colaborar con lo que mejor se me da: El código fuente de Programas testados, que amplíen siempre aquellos puntos mostrados en el tema.
En esta ocasión voy a presentar una versión mejorada del código de una pantalla de selección donde se realizan unas validaciones de datos. Espero que os sea útil.
CODIGO FUENTE PARA UNA PANTALLA DE SELECCION
Version 2
- *&---------------------------------------------------------------------*
- *& Report Z*****_PANT_SELECCION_V2
- *&---------------------------------------------------------------------*
- *& Sustituir los ***** por el legajo de cada uno
- *&---------------------------------------------------------------------*
- REPORT z*****_pant_seleccion_v2.
- ****************************************************
- * <----- Copiar desde aqui
- ****************************************************
- CONSTANTS:
- ct_cab_esp(40) TYPE c VALUE 'Estado de cuentas entre',
- ct_cab_eng(40) TYPE c VALUE 'Account balance between',
- ct_y_esp(5) TYPE c VALUE 'y',
- ct_y_eng(5) TYPE c VALUE 'and',
- ct_debe_esp(10) TYPE c VALUE 'debe a',
- ct_debe_eng(10) TYPE c VALUE 'owes to',
- ct_cant_esp(40) TYPE c VALUE 'la cantidad de',
- ct_cant_eng(40) TYPE c VALUE 'the amount of',
- ct_dolar TYPE c VALUE '$',
- ct_euro TYPE c VALUE '€',
- ct_rate_esp(40) TYPE c VALUE 'con la cotización',
- ct_rate_eng(40) TYPE c VALUE 'with exchange rate',
- ct_noeu_esp(100) TYPE c VALUE 'Si selecciona moneda Euro, debe rellenar el campo "Deuda en Euros".',
- ct_noeu_eng(100) TYPE c VALUE 'If you select Euro currency, you must fill "Deuda en Euros" field.',
- ct_nous_esp(100) TYPE c VALUE 'Si selecciona moneda Dolar, debe rellenar el campo "Deuda en Dolares".',
- ct_nous_eng(100) TYPE c VALUE 'If you select Dollar currency, you must fill "Deuda en Dolares" field.',
- ct_valid_esp(100) TYPE c VALUE 'Van a procesarse los datos y presentar el reporte de salida.',
- ct_valid_eng(100) TYPE c VALUE 'Data will be processed and report will be shown.',
- ct_date_esp(40) TYPE c VALUE 'a fecha',
- ct_date_eng(40) TYPE c VALUE 'on date'.
- DATA:
- lc_cambioeu_us TYPE p DECIMALS 5,
- lc_dolar_value TYPE p DECIMALS 2,
- lc_euro_value TYPE p DECIMALS 2,
- lc_formatofecha(10) TYPE c,
- lt_cambioeu_us(11) TYPE c,
- lt_dolar_value(11) TYPE c,
- lt_euro_value(11) TYPE c,
- lt_eur_usd_sort(22) TYPE c,
- lt_cab(120) TYPE c.
- *******************************************************
- INITIALIZATION.
- *******************************************************
- CLEAR:
- lc_cambioeu_us,
- lc_dolar_value,
- lc_euro_value ,
- lc_formatofecha,
- lt_cambioeu_us,
- lt_dolar_value,
- lt_euro_value,
- lt_eur_usd_sort,
- lt_cab.
- *******************************************************
- SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-001.
- *******************************************************
- * Utilizamos begin of line - comment - end of line como espaciador
- SELECTION-SCREEN BEGIN OF LINE.
- SELECTION-SCREEN COMMENT 1(66) text-006.
- SELECTION-SCREEN END OF LINE.
- * Subbloque de fecha y cotizacion
- SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE text-002.
- PARAMETERS: p_fecha LIKE sy-datum OBLIGATORY DEFAULT sy-datum,
- p_rate TYPE p DECIMALS 5 DEFAULT lc_cambioeu_us OBLIGATORY .
- SELECTION-SCREEN END OF BLOCK b2.
- * Subbloque de Deudor y Acreedor
- SELECTION-SCREEN BEGIN OF BLOCK b3 WITH FRAME TITLE text-003.
- PARAMETERS: p_deud(30) TYPE c OBLIGATORY,
- p_acree(30) TYPE c OBLIGATORY.
- SELECTION-SCREEN END OF BLOCK b3.
- * Subbloque de Monedas e Importes
- SELECTION-SCREEN BEGIN OF BLOCK b4 WITH FRAME TITLE text-004.
- PARAMETERS: p_eu RADIOBUTTON GROUP grp2,
- p_us RADIOBUTTON GROUP grp2.
- PARAMETERS: p_euros TYPE p DECIMALS 2 ,
- p_dolar TYPE p DECIMALS 2.
- SELECTION-SCREEN END OF BLOCK b4.
- * Subbloque de Lenguajes
- SELECTION-SCREEN BEGIN OF BLOCK b5 WITH FRAME TITLE text-005.
- PARAMETERS: p_esp AS CHECKBOX DEFAULT 'x',
- p_ing AS CHECKBOX.
- SELECTION-SCREEN END OF BLOCK b5.
- *******************************************************
- SELECTION-SCREEN END OF BLOCK b1.
- *******************************************************
- *******************************************************
- AT SELECTION-SCREEN. " Validamos Datos
- *******************************************************
- IF not p_us IS INITIAL. " Si se ha elegido moneda Dolar
- IF p_dolar IS INITIAL. " Testar Deuda en Dolares
- MESSAGE ct_nous_esp TYPE 'E'.
- ENDIF.
- ENDIF.
- IF not p_eu IS INITIAL. " Si se ha elegido moneda Euro
- IF p_euros IS INITIAL. " Testar Deuda en Euros
- MESSAGE ct_noeu_esp TYPE 'E'.
- ENDIF.
- ENDIF.
- MESSAGE 'Van a procesarse los datos y presentar el reporte de salida' TYPE 'I'.
- *******************************************************
- START-OF-SELECTION.
- *******************************************************
- * Subrutina que formatea la fecha
- PERFORM formatear_fecha USING p_fecha '/' 1
- CHANGING lc_formatofecha.
- IF NOT p_eu IS INITIAL.
- * Si la moneda usada es el euro
- * convertir Euros -> Dolares
- lc_euro_value = p_euros.
- lc_dolar_value = lc_euro_value * p_rate.
- WRITE lc_euro_value TO lt_euro_value. " Pasa Numero a Caracter
- WRITE lc_dolar_value TO lt_dolar_value. " Pasa Numero a Caracter
- ELSE.
- * Si no, la moneda usada es el Dolar
- * convertir Dolares -> Euros
- lc_dolar_value = p_dolar.
- lc_euro_value = lc_dolar_value / p_rate.
- WRITE lc_euro_value TO lt_euro_value. " Pasa Numero a Caracter
- WRITE lc_dolar_value TO lt_dolar_value. " Pasa Numero a Caracter
- ENDIF.
- CONDENSE lt_dolar_value. " Quita los espacios sobrantes
- CONDENSE lt_euro_value. " Quita los espacios sobrantes
- CLEAR lt_eur_usd_sort.
- IF NOT p_eu IS INITIAL.
- * Si la moneda usada es Euro
- * poner primero valor € y luego valor $
- CONCATENATE lt_euro_value ct_euro
- '/' lt_dolar_value ct_dolar INTO lt_eur_usd_sort
- SEPARATED BY ' '.
- ELSE.
- * Si no, la moneda usada es Dolar
- * poner primero valor $ y luego valor €
- CONCATENATE lt_dolar_value ct_dolar
- '/' lt_euro_value ct_euro INTO lt_eur_usd_sort
- SEPARATED BY ' '.
- ENDIF.
- IF NOT p_esp IS INITIAL.
- * Si esta marcado el idioma Español
- * Componer cabecera en Español
- CLEAR lt_cab.
- CONCATENATE ct_cab_esp p_deud ct_y_esp p_acree
- ct_date_esp lc_formatofecha INTO lt_cab
- SEPARATED BY ' '.
- WRITE:/ lt_cab.
- ENDIF.
- * Si esta en dos idiomas separar la cabecera con una linea
- IF NOT p_ing IS INITIAL AND NOT p_esp IS INITIAL.
- ULINE.
- ENDIF.
- IF NOT p_ing IS INITIAL.
- * Si esta marcado el idioma Inglés
- * Componer Cabecera en Inglés
- CLEAR lt_cab.
- CONCATENATE ct_cab_eng p_deud ct_y_eng p_acree
- ct_date_eng lc_formatofecha INTO lt_cab
- SEPARATED BY ' '.
- WRITE:/ lt_cab.
- ENDIF.
- * Separador con linea en medio
- SKIP.
- ULINE.
- SKIP.
- IF NOT p_esp IS INITIAL.
- * Si esta marcado el idioma Español
- * Componer texto en IEspañol
- CLEAR lt_cab.
- CONCATENATE p_deud ct_debe_esp p_acree
- ct_cant_esp lt_eur_usd_sort INTO lt_cab
- SEPARATED BY ' '.
- WRITE:/ lt_cab.
- ENDIF.
- IF NOT p_ing IS INITIAL.
- * Si esta marcado el idioma Inglés
- * Componer texto en Inglés
- CLEAR lt_cab.
- CONCATENATE p_deud ct_debe_eng p_acree
- ct_cant_eng lt_eur_usd_sort INTO lt_cab
- SEPARATED BY ' '.
- WRITE:/ lt_cab.
- ENDIF.
- *&---------------------------------------------------------------------*
- *& Form FORMATEAR_FECHA
- *&---------------------------------------------------------------------*
- * text
- *----------------------------------------------------------------------*
- * -->D_TEXT text fecha nativa (AAAAMMDD)
- * -->C_SEP text Separados a usar (.|/|-)
- * -->I_MODO int 0=AAAAMMDD 1=DDMMAAAA 2=MMDDAAAA
- * <--R_FORMATOFECHA text Fecha formateada con el separador C_SEP
- *----------------------------------------------------------------------*
- FORM formatear_fecha USING value(d_texto)
- value(c_sep)
- value(i_modo)
- CHANGING r_formatofecha.
- DATA: lc_year(4) TYPE c,
- lc_month(2) TYPE c,
- lc_day(2) TYPE c,
- lc_return(10) TYPE c.
- * Separamos Año, Mes y Dia
- WRITE d_texto(4) TO lc_year.
- WRITE d_texto+4(2) TO lc_month.
- WRITE d_texto+6(2) TO lc_day.
- CASE i_modo.
- WHEN 1. "DD MM AAAA con el separador
- CONCATENATE lc_day lc_month lc_year
- INTO lc_return
- SEPARATED BY c_sep.
- WHEN 2. "MM DD AAAA con el separador
- CONCATENATE lc_month lc_day lc_year
- INTO lc_return
- SEPARATED BY c_sep.
- WHEN OTHERS. "AAAA MM DD con el separador
- CONCATENATE lc_year lc_month lc_day
- INTO lc_return
- SEPARATED BY c_sep.
- ENDCASE.
- r_formatofecha = lc_return. "Colocamos el resultado en CHANGING
- ENDFORM. " FORMATEAR_FECHA
- ****************************************************
- * <----- Copiar hasta aqui
- ****************************************************
 
 
 
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