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
| Variante | Comportamiento |
|---|---|
MODULE mod | Siempre ejecuta el modulo |
MODULE mod ON INPUT | Solo si el campo tiene valor (no inicial) |
MODULE mod ON REQUEST | Solo si el usuario cambio el campo |
MODULE mod ON *-INPUT | Solo 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
| Sentencia | Ejecuta modulo cuando… |
|---|---|
FIELD f MODULE m | Siempre |
FIELD f MODULE m ON INPUT | El campo tiene un valor (no inicial) |
FIELD f MODULE m ON REQUEST | El usuario modifico el campo |
CHAIN ... ENDCHAIN | Agrupa campos para validacion conjunta |
Manejo de errores
| Tipo de mensaje | Comportamiento |
|---|---|
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
FIELDsolo funciona en logica de flujo de Dynpro (no en ABAP normal).- Usar
ON INPUTpara campos opcionales que solo se validan si tienen valor. - Usar
ON REQUESTpara evitar revalidacion innecesaria. CHAINagrupa 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.