Antes de guardar datos en una tabla de SAP (o en cualquier sistema), es obligatorio validar que la información sea correcta, completa y no duplicada. Hacerlo te evita errores en tiempo de ejecución, datos inconsistentes y quejas de los usuarios.
Este artículo te muestra cómo implementar tres validaciones típicas antes de un guardado masivo (desde un ALV editable o una pantalla):
- Verificar que un campo obligatorio no esté vacío.
- Comprobar que el valor exista en una tabla maestra (integridad referencial).
- Evitar duplicados dentro de la misma tabla de cambios.
Estructura típica de validación
El flujo lógico, antes de llamar a la rutina de guardado (PERFORM save_data), sigue este patrón:
DATA: lv_saved TYPE abap_bool. " Flag que indica si todo es válido
lv_saved = abap_true. " Suponemos que sí
LOOP AT gt_changes ASSIGNING FIELD-SYMBOL(<fs_row>).
" ---------- Validación 1: campo obligatorio ----------
IF <fs_row>-campo IS INITIAL.
MESSAGE 'Campo obligatorio' TYPE 'E' DISPLAY LIKE 'I'.
lv_saved = abap_false.
EXIT.
ENDIF.
" ---------- Validación 2: existencia en tabla maestra ----------
READ TABLE gt_master WITH KEY clave = <fs_row>-campo TRANSPORTING NO FIELDS.
IF sy-subrc <> 0.
MESSAGE 'Valor no existe en maestro' TYPE 'E' DISPLAY LIKE 'I'.
lv_saved = abap_false.
EXIT.
ENDIF.
" ---------- Validación 3: registro duplicado ----------
READ TABLE gt_aux WITH KEY campo = <fs_row>-campo TRANSPORTING NO FIELDS.
IF sy-subrc = 0.
MESSAGE 'Valor duplicado en los datos a guardar' TYPE 'E' DISPLAY LIKE 'I'.
lv_saved = abap_false.
EXIT.
ELSE.
APPEND <fs_row> TO gt_aux. " Acumulamos para detectar futuros duplicados
ENDIF.
ENDLOOP.
IF lv_saved = abap_true.
PERFORM save_data.
ENDIF.
Validar antes de guardar no es opcional. Con este patrón:
- Campo obligatorio →
IS INITIAL. - Existencia en maestro →
READ TABLE ... TRANSPORTING NO FIELDS. - Duplicados en la misma carga → tabla auxiliar.
Con estas tres reglas cubres la mayoría de los casos de negocio y evitas que datos incorrectos lleguen a la base de datos.




