FIELD en ABAP: Control de flujo en Dynpros

Kategorie
ABAP-Statements
Veröffentlicht
Autor
Johannes

La sentencia FIELD se utiliza en la logica de flujo de Dynpros (Process Before Output / Process After Input) para controlar el procesamiento de campos de pantalla. Permite vincular campos con modulos de validacion y controlar cuando se ejecutan.

Sintaxis basica

FIELD <nombre_campo> [ MODULE <modulo> [ ON INPUT | ON REQUEST | ON *-INPUT ] ].

Variantes

VarianteComportamiento
MODULE modSiempre ejecuta el modulo
MODULE mod ON INPUTSolo si el campo tiene valor (no inicial)
MODULE mod ON REQUESTSolo si el usuario cambio el campo
MODULE mod ON *-INPUTSolo si el campo tiene * como prefijo

Ejemplos

1. FIELD basico con modulo

En la logica de flujo (Flow Logic):

PROCESS AFTER INPUT.
FIELD: gv_customer MODULE validate_customer.

En el include del modulo:

MODULE validate_customer INPUT.
IF gv_customer IS INITIAL.
MESSAGE e001(zmsg) WITH 'Cliente es obligatorio'.
ENDIF.
" Validar existencia en base de datos
SELECT SINGLE kunnr FROM kna1
WHERE kunnr = @gv_customer
INTO @DATA(lv_kunnr).
IF sy-subrc <> 0.
MESSAGE e002(zmsg) WITH 'Cliente no existe'.
ENDIF.
ENDMODULE.

2. FIELD ON INPUT

PROCESS AFTER INPUT.
" Solo valida si el campo tiene un valor
FIELD: gv_material MODULE validate_material ON INPUT.
MODULE validate_material INPUT.
" Este modulo solo se ejecuta si gv_material no esta vacio
SELECT SINGLE matnr FROM mara
WHERE matnr = @gv_material
INTO @DATA(lv_matnr).
IF sy-subrc <> 0.
MESSAGE e003(zmsg) WITH 'Material no valido'.
ENDIF.
ENDMODULE.

3. FIELD ON REQUEST

PROCESS AFTER INPUT.
" Solo valida si el usuario modifico el campo
FIELD: gv_quantity MODULE check_quantity ON REQUEST.
MODULE check_quantity INPUT.
" Solo se ejecuta si el usuario cambio la cantidad
IF gv_quantity <= 0.
MESSAGE e004(zmsg) WITH 'Cantidad debe ser positiva'.
ENDIF.
" Verificar disponibilidad
IF gv_quantity > get_available_stock( gv_material ).
MESSAGE w005(zmsg) WITH 'Cantidad supera stock disponible'.
ENDIF.
ENDMODULE.

4. CHAIN - Validacion grupal

PROCESS AFTER INPUT.
" Validar grupo de campos juntos
CHAIN.
FIELD: gv_date_from,
gv_date_to.
MODULE validate_date_range.
ENDCHAIN.
MODULE validate_date_range INPUT.
IF gv_date_from > gv_date_to.
" Ambos campos quedan editables para correccion
MESSAGE e006(zmsg) WITH 'Fecha desde debe ser menor que fecha hasta'.
ENDIF.
ENDMODULE.

5. CHAIN con ON INPUT

PROCESS AFTER INPUT.
CHAIN.
FIELD: gv_plant,
gv_storage_loc.
MODULE validate_plant_sloc ON INPUT.
ENDCHAIN.
MODULE validate_plant_sloc INPUT.
" Solo se ejecuta si al menos uno de los campos tiene valor
IF gv_plant IS NOT INITIAL AND gv_storage_loc IS NOT INITIAL.
" Verificar combinacion valida
SELECT SINGLE werks FROM t001l
WHERE werks = @gv_plant
AND lgort = @gv_storage_loc
INTO @DATA(lv_werks).
IF sy-subrc <> 0.
MESSAGE e007(zmsg) WITH 'Combinacion Planta/Almacen invalida'.
ENDIF.
ENDIF.
ENDMODULE.

6. CHAIN con ON REQUEST

PROCESS AFTER INPUT.
CHAIN.
FIELD: gv_price,
gv_currency.
MODULE validate_price ON REQUEST.
ENDCHAIN.
MODULE validate_price INPUT.
" Solo si usuario cambio precio o moneda
IF gv_price < 0.
MESSAGE e008(zmsg) WITH 'Precio no puede ser negativo'.
ENDIF.
IF gv_currency NOT IN gt_valid_currencies.
MESSAGE e009(zmsg) WITH 'Moneda no valida'.
ENDIF.
ENDMODULE.

7. Multiples FIELD para un campo

PROCESS AFTER INPUT.
" Primero verificar formato
FIELD gv_email MODULE check_email_format ON INPUT.
" Luego verificar dominio
FIELD gv_email MODULE check_email_domain ON INPUT.
MODULE check_email_format INPUT.
IF NOT gv_email CS '@'.
MESSAGE e010(zmsg) WITH 'Formato de email invalido'.
ENDIF.
ENDMODULE.
MODULE check_email_domain INPUT.
DATA(lv_domain) = substring_after( val = gv_email sub = '@' ).
IF lv_domain NOT IN gt_allowed_domains.
MESSAGE w011(zmsg) WITH 'Dominio no reconocido'.
ENDIF.
ENDMODULE.

8. FIELD con Table Control

PROCESS AFTER INPUT.
LOOP AT gt_items.
CHAIN.
FIELD gt_items-matnr.
FIELD gt_items-quantity.
MODULE validate_item ON REQUEST.
ENDCHAIN.
ENDLOOP.
MODULE validate_item INPUT.
" Validar linea de tabla
IF gt_items-matnr IS NOT INITIAL
AND gt_items-quantity <= 0.
MESSAGE e012(zmsg) WITH 'Cantidad requerida para material'.
ENDIF.
ENDMODULE.

9. Control de cursor con errores

MODULE validate_customer INPUT.
SELECT SINGLE kunnr FROM kna1
WHERE kunnr = @gv_customer
INTO @DATA(lv_kunnr).
IF sy-subrc <> 0.
" El cursor se posiciona automaticamente en gv_customer
" porque esta en la sentencia FIELD actual
MESSAGE e002(zmsg) WITH 'Cliente no existe'.
ENDIF.
ENDMODULE.

10. Combinacion con funcion

PROCESS AFTER INPUT.
FIELD gv_order_id MODULE validate_order ON INPUT.
PROCESS BEFORE OUTPUT.
FIELD gv_order_id MODULE set_order_defaults.
MODULE set_order_defaults OUTPUT.
" Valor por defecto si esta vacio
IF gv_order_id IS INITIAL.
gv_order_id = get_next_order_number( ).
ENDIF.
" Modificar atributos del campo
LOOP AT SCREEN.
IF screen-name = 'GV_ORDER_ID'.
screen-input = 0. " Solo lectura
MODIFY SCREEN.
ENDIF.
ENDLOOP.
ENDMODULE.

Resumen de comportamiento

SentenciaEjecuta modulo cuando…
FIELD f MODULE mSiempre
FIELD f MODULE m ON INPUTEl campo tiene un valor (no inicial)
FIELD f MODULE m ON REQUESTEl usuario modifico el campo
CHAIN ... ENDCHAINAgrupa campos para validacion conjunta

Manejo de errores

Tipo de mensajeComportamiento
MESSAGE E...Campo queda editable, usuario debe corregir
MESSAGE W...Advertencia, usuario puede continuar
MESSAGE I...Informacion, se muestra popup
MESSAGE S...Exito, aparece en barra de estado

Notas importantes / Mejores practicas

  • FIELD solo funciona en logica de flujo de Dynpro (no en ABAP normal).
  • Usar ON INPUT para campos opcionales que solo se validan si tienen valor.
  • Usar ON REQUEST para evitar revalidacion innecesaria.
  • CHAIN agrupa campos - el error deja todos editables.
  • Los mensajes de error (E) mantienen el campo editable para correccion.
  • En desarrollos modernos, preferir Fiori/UI5 sobre Dynpros clasicos.
  • Los Dynpros no estan disponibles en ABAP Cloud - usar RAP y Fiori Elements.