# TSD - ZBR_MAKT_UPDATE: Actualización masiva de descripciones de material

> Ejemplo generado por Dokcraft con `claude-sonnet-5` a partir de
> [ZBR_MAKT_UPDATE](https://github.com/ritschmaster/zbr_makt_update), código público de
> Richard Bäck bajo licencia MIT. Fuente analizada: commit
> `e1399785dee88c3b21ee5fdafdf8dcb6b5354f30` (1.081 líneas, 14 includes).

**Tipo de objeto:** report

## Propósito

El programa ZBR_MAKT_UPDATE permite seleccionar un rango de materiales (MATNR) mediante pantalla de selección, visualizar sus descripciones (MAKT-MAKTX) en un ALV Grid editable (Dynpro 0100), modificarlas y guardarlas mediante la BAPI BAPI_MATERIAL_SAVEREPLICA. El resultado de la operación (test o guardado real) se presenta en un segundo ALV (Dynpro 0101) con un log de mensajes tipo BAPIRET2, incluyendo semáforos de estado y acceso al texto largo del mensaje mediante doble clic. El programa está estructurado como un report clásico con includes separados por tipo (datos, pantalla de selección, clases locales, FORMs, PBO, PAI), documentado explícitamente en la cabecera del main (ZBR_MAKT_UPDATE:1-17) como una convención de mantenimiento donde las subrutinas deben tratarse como funciones (parámetros CHANGING se sobreescriben, no se leen).

_Refs: ZBR_MAKT_UPDATE:2, ZBR_MAKT_UPDATE:10, ZBR_MAKT_UPDATE:14, ZBR_MAKT_UPDATE_F01:9, ZBR_MAKT_UPDATE_F01:122_

## Arquitectura de includes

El main ZBR_MAKT_UPDATE únicamente declara el REPORT y encadena 14 includes en un orden fijo, seguido del START-OF-SELECTION que invoca el FORM MAIN. La estructura sigue el patrón: T01 (cabecera/documentación vacía), T02 (declaración de work area GS_MARA usada por la pantalla de selección), T03 (constantes y datos globales del Dynpro 0100 - ALV editable de materiales), T04 (constantes y datos globales del Dynpro 0101 - ALV de mensajes BAPIRET2), S01 (SELECTION-SCREEN con SELECT-OPTIONS S_MATNR), C01 (clase local ZCL_0100_ALV_EVENT_RECEIVER para el evento DATA_CHANGED_FINISHED del ALV 0100), C02 (clase local ZCL_0101_ALV_EVENT_RECEIVER para el evento DOUBLE_CLICK del ALV 0101), F01 (FORMs de lógica de negocio: MAIN, SELECT_DATA, SET_BAPIE1MATHEADER_MAX_VIEWS, UPDATE_MATERIALS), F02 (FORMs del Dynpro 0100: inicialización, fieldcatalog, conversión ALV/normal, manejo de cambios, reset), F03 (FORMs del Dynpro 0101: inicialización, hotspot, reset), O01/O02 (módulos PBO de los Dynpros 0100 y 0101 respectivamente) e I01/I02 (módulos PAI de los Dynpros 0100 y 0101 respectivamente).

_Refs: ZBR_MAKT_UPDATE:21, ZBR_MAKT_UPDATE:22, ZBR_MAKT_UPDATE:23, ZBR_MAKT_UPDATE:24, ZBR_MAKT_UPDATE:25, ZBR_MAKT_UPDATE:26, ZBR_MAKT_UPDATE:27, ZBR_MAKT_UPDATE:28, ZBR_MAKT_UPDATE:29, ZBR_MAKT_UPDATE:30, ZBR_MAKT_UPDATE:31, ZBR_MAKT_UPDATE:32, ZBR_MAKT_UPDATE:33, ZBR_MAKT_UPDATE:34_

## Resumen técnico

Flujo general: START-OF-SELECTION ejecuta PERFORM MAIN USING S_MATNR[] (ZBR_MAKT_UPDATE:37). El FORM MAIN (ZBR_MAKT_UPDATE_F01:9) llama a SELECT_DATA para obtener materiales/descripciones vía JOIN MARA-MAKT filtrado por el rango de selección, y luego a CALL_SCREEN_0100 (ZBR_MAKT_UPDATE_F02:9) que transforma los datos a formato ALV, los ordena por MATNR/SPRAS y lanza la pantalla 0100. En el Dynpro 0100 (PBO: ZBR_MAKT_UPDATE_O01, PAI: ZBR_MAKT_UPDATE_I01) el usuario edita el campo MAKTX en el grid; al pulsar SAVE o TEST, el FORM 0100_USER_COMMAND (ZBR_MAKT_UPDATE_F02:149) convierte los datos ALV a formato normal y llama a UPDATE_MATERIALS (ZBR_MAKT_UPDATE_F01:122), que construye las tablas BAPI (headdata, clientdata, clientdatax, materialdescription) agrupando por MATNR y determina las vistas activas del material mediante SET_BAPIE1MATHEADER_MAX_VIEWS según T134-PSTAT. Se invoca BAPI_MATERIAL_SAVEREPLICA con TESTRUN según el modo elegido; si hay mensajes de tipo A/E/X se hace ROLLBACK y se sale; en éxito real se hace COMMIT, en modo TEST siempre se hace ROLLBACK. El resultado (BAPIRET2) se muestra en el Dynpro 0101 mediante CALL_SCREEN_0101 (ZBR_MAKT_UPDATE_F03:9), que asigna íconos de semáforo según el tipo de mensaje y detecta disponibilidad de texto largo (DOCU_GET_FOR_F1HELP) para habilitar el hotspot de detalle (HELP_OBJECT_SHOW) mediante doble clic gestionado por la clase ZCL_0101_ALV_EVENT_RECEIVER.

_Refs: ZBR_MAKT_UPDATE:37, ZBR_MAKT_UPDATE_F01:9, ZBR_MAKT_UPDATE_F01:21, ZBR_MAKT_UPDATE_F02:9, ZBR_MAKT_UPDATE_F02:149, ZBR_MAKT_UPDATE_F01:122, ZBR_MAKT_UPDATE_F01:190, ZBR_MAKT_UPDATE_F01:205, ZBR_MAKT_UPDATE_F01:219, ZBR_MAKT_UPDATE_F03:9, ZBR_MAKT_UPDATE_F03:46, ZBR_MAKT_UPDATE_F03:214_

## Lógica de proceso

1) Selección de datos: SELECT_DATA (ZBR_MAKT_UPDATE_F01:21-30) hace SELECT de MAKT INNER JOIN MARA filtrando por IRT_MATNR, cargando MATNR/SPRAS/MAKTX en ET_DATA. 2) Preparación de vistas: SET_BAPIE1MATHEADER_MAX_VIEWS (ZBR_MAKT_UPDATE_F01:41-114) evalúa el string I_PSTAT (de T134) carácter por carácter (K,V,E,D,P,A,F,L,S,Q,B,G) para activar los flags de vista correspondientes en BAPIE1MATHEADER (basic_view, sales_view, purchase_view, mrp_view, forecast_view, work_sched_view, prt_view, storage_view, warehouse_view, quality_view, account_view, cost_view). 3) Actualización: UPDATE_MATERIALS (ZBR_MAKT_UPDATE_F01:122-230) agrupa IT_DATA por MATNR (LOOP...GROUP BY), arma HEADDATA/CLIENTDATA/CLIENTDATAX con function='INS' y MATERIALDESCRIPTION por cada línea agrupada (idioma+texto), luego llama BAPI_MATERIAL_SAVEREPLICA; si algún mensaje de retorno tiene TYPE CA 'AEX' se hace BAPI_TRANSACTION_ROLLBACK y RETURN; si I_TEST=X se hace rollback siempre, si no, BAPI_TRANSACTION_COMMIT WAIT=X. 4) Dynpro 0100: PBO inicializa el custom container y el ALV Grid con fieldcatalog dinámico (LVC_FIELDCATALOG_MERGE sobre la estructura ZBR_MAKT_UPDATE_S_DATA_ALV) habilitando edición solo en MAKTX (ZBR_MAKT_UPDATE_F02:244-266), registra el evento MC_EVT_MODIFIED y el event receiver ZCL_0100_ALV_EVENT_RECEIVER para capturar inserciones de filas vía pegado (Ctrl+V) y eliminarlas si exceden la longitud original (0100_HANDLE_DATA_CHANGED_FIN, ZBR_MAKT_UPDATE_F02:211-241). PAI captura OK_CODE (SAVE/TEST/BACK/EXIT/CANCEL) en 0100_USER_COMMAND. 5) Dynpro 0101: muestra el log BAPIRET2 enriquecido con ícono de estado y disponibilidad de ayuda F1 (columna LT_AVAILABLE), solo lectura (SET_READY_FOR_INPUT 0), con evento DOUBLE_CLICK que abre el texto largo del mensaje vía HELP_OBJECT_SHOW.

_Refs: ZBR_MAKT_UPDATE_F01:21, ZBR_MAKT_UPDATE_F01:41, ZBR_MAKT_UPDATE_F01:122, ZBR_MAKT_UPDATE_F01:135, ZBR_MAKT_UPDATE_F01:190, ZBR_MAKT_UPDATE_F01:205, ZBR_MAKT_UPDATE_F02:27, ZBR_MAKT_UPDATE_F02:112, ZBR_MAKT_UPDATE_F02:211, ZBR_MAKT_UPDATE_F02:244, ZBR_MAKT_UPDATE_F02:149, ZBR_MAKT_UPDATE_F03:74, ZBR_MAKT_UPDATE_F03:111, ZBR_MAKT_UPDATE_F03:214_

## Objetos de datos usados

Tablas estándar: MARA (cabecera de material) y MAKT (descripciones de material) leídas en SELECT_DATA; T134 (tipos de material) consultado en UPDATE_MATERIALS para determinar MTART/MBRSH/PSTAT. Estructuras BAPI: BAPIE1MATHEADER, BAPIE1MARA, BAPIE1MARAX, BAPIE1MAKT (tablas internas LT_HEADDATA, LT_CLIENTDATA, LT_CLIENTDATAX, LT_MATERIALDESCRIPTION) y BAPIRET2_T para el log de retorno. Tipos/estructuras propios del proyecto (no incluidos en el código fuente provisto, se asume diccionario ZBR_MAKT_UPDATE_*): ZBR_MAKT_UPDATE_RT_MATNR (rango de selección), ZBR_MAKT_UPDATE_T_DATA y ZBR_MAKT_UPDATE_T_DATA_ALV (tabla de trabajo/ALV del Dynpro 0100), ZBR_MAKT_UPDATE_T_BAPIRET2 (tabla ALV del Dynpro 0101), ZBR_MAKT_UPDATE_S_DATA_ALV y ZBR_MAKT_UPDATE_S_BAPIRET2 (estructuras usadas como base del fieldcatalog LVC_FIELDCATALOG_MERGE). Variables globales declaradas en los TOP-includes: GS_MARA (T02), constantes/datos del Dynpro 0100 (T03: GC_0100_*, GT_0100_DATA_ALV, G_0100_OKCODE, G_0100_INITED, GOBJ_0100_CC_ALV, GOBJ_0100_ALV) y del Dynpro 0101 (T04: GC_0101_*, GT_0101_DATA_ALV, G_0101_OKCODE, G_0101_INITED, GOBJ_0101_CC_ALV, GOBJ_0101_ALV).

_Refs: ZBR_MAKT_UPDATE_F01:25, ZBR_MAKT_UPDATE_F01:150, ZBR_MAKT_UPDATE_F01:128, ZBR_MAKT_UPDATE_F01:190, ZBR_MAKT_UPDATE_T02:9, ZBR_MAKT_UPDATE_T03:9, ZBR_MAKT_UPDATE_T03:19, ZBR_MAKT_UPDATE_T04:9, ZBR_MAKT_UPDATE_T04:16, ZBR_MAKT_UPDATE_S01:11_

## Dependencias

BAPIs estándar: BAPI_MATERIAL_SAVEREPLICA (grabación masiva de materiales), BAPI_TRANSACTION_ROLLBACK, BAPI_TRANSACTION_COMMIT. Function modules: LVC_FIELDCATALOG_MERGE (fieldcatalog dinámico ALV en ambos Dynpros), DOCU_GET_FOR_F1HELP (verificación de existencia de texto largo), HELP_OBJECT_SHOW (visualización de texto largo). Clases estándar: CL_GUI_CUSTOM_CONTAINER, CL_GUI_ALV_GRID (con métodos SET_TABLE_FOR_FIRST_DISPLAY, REGISTER_EDIT_EVENT, CHECK_CHANGED_DATA, REFRESH_TABLE_DISPLAY, SET_READY_FOR_INPUT, FREE). Clases locales propias: ZCL_0100_ALV_EVENT_RECEIVER (evento DATA_CHANGED_FINISHED) y ZCL_0101_ALV_EVENT_RECEIVER (evento DOUBLE_CLICK). Dynpros 0100 y 0101 con sus respectivos PF-STATUS/TITLEBAR '0100'/'0101' (definidos en Screen Painter, no incluidos en el código fuente analizado). Tablas de diccionario T134 y MARA/MAKT.

_Refs: ZBR_MAKT_UPDATE_F01:190, ZBR_MAKT_UPDATE_F01:209, ZBR_MAKT_UPDATE_F01:226, ZBR_MAKT_UPDATE_F02:245, ZBR_MAKT_UPDATE_F03:46, ZBR_MAKT_UPDATE_F03:237, ZBR_MAKT_UPDATE_F02:112, ZBR_MAKT_UPDATE_F02:152, ZBR_MAKT_UPDATE_F03:111, ZBR_MAKT_UPDATE_C01:9, ZBR_MAKT_UPDATE_C02:9, ZBR_MAKT_UPDATE_F02:144, ZBR_MAKT_UPDATE_F03:194_

## Puntos de mantenimiento

1) Convención documentada explícitamente en cabecera del main: cualquier subrutina nueva debe tratarse como función pura (parámetros CHANGING se sobreescriben/limpian, no se leen como entrada), y el uso de variables globales debe documentarse en el header del FORM y del include (ZBR_MAKT_UPDATE:10-15). 2) SET_BAPIE1MATHEADER_MAX_VIEWS tiene un comentario explícito indicando que NO valida el contenido de CS_HEADDATA, solo ajusta los campos de vista (ZBR_MAKT_UPDATE_F01:36-40); cambios en la lógica de vistas de material deben mantenerse sincronizados con el string PSTAT de T134. 3) UPDATE_MATERIALS usa function='INS' de forma fija para todas las operaciones (altas), lo que sugiere que el programa solo soporta creación/reemplazo de descripciones, no verificado para actualización diferencial de materiales existentes; se recomienda validar este comportamiento con el equipo funcional (posible riesgo si MATNR ya existe). 4) El fieldcatalog del Dynpro 0100 habilita edición únicamente en el campo MAKTX (constante GC_0100_FIELDNAME_MAKTX); cualquier campo adicional a editar requiere ajuste en 0100_FIELDCATALOG. 5) La lógica de 0100_HANDLE_DATA_CHANGED_FIN limpia filas insertadas por el usuario que excedan la longitud original de la tabla, impidiendo altas de nuevas filas vía pegado; si se requiere permitir inserciones, este FORM debe modificarse. 6) Los nombres de estructura para LVC_FIELDCATALOG_MERGE (GC_0100_TABNAME_ALV, GC_0101_TABNAME_ALV) dependen de objetos de diccionario cuya definición completa no fue provista en este análisis.

_Refs: ZBR_MAKT_UPDATE:10, ZBR_MAKT_UPDATE_F01:36, ZBR_MAKT_UPDATE_F01:144, ZBR_MAKT_UPDATE_F01:162, ZBR_MAKT_UPDATE_F02:258, ZBR_MAKT_UPDATE_F02:211, ZBR_MAKT_UPDATE_T03:17_

## Includes del programa

- `ZBR_MAKT_UPDATE_T01` — other
- `ZBR_MAKT_UPDATE_T02` — other
- `ZBR_MAKT_UPDATE_T03` — other
- `ZBR_MAKT_UPDATE_T04` — other
- `ZBR_MAKT_UPDATE_S01` — selection_screen
- `ZBR_MAKT_UPDATE_C01` — class
- `ZBR_MAKT_UPDATE_C02` — class
- `ZBR_MAKT_UPDATE_F01` — forms
- `ZBR_MAKT_UPDATE_F02` — forms
- `ZBR_MAKT_UPDATE_F03` — forms
- `ZBR_MAKT_UPDATE_O01` — pbo
- `ZBR_MAKT_UPDATE_O02` — pbo
- `ZBR_MAKT_UPDATE_I01` — pai
- `ZBR_MAKT_UPDATE_I02` — pai

## Objetos relacionados

- MARA
- MAKT
- T134
- BAPI_MATERIAL_SAVEREPLICA
- BAPI_TRANSACTION_ROLLBACK
- BAPI_TRANSACTION_COMMIT
- LVC_FIELDCATALOG_MERGE
- DOCU_GET_FOR_F1HELP
- HELP_OBJECT_SHOW
- CL_GUI_ALV_GRID
- CL_GUI_CUSTOM_CONTAINER
- ZBR_MAKT_UPDATE_RT_MATNR
- ZBR_MAKT_UPDATE_T_DATA
- ZBR_MAKT_UPDATE_T_DATA_ALV
- ZBR_MAKT_UPDATE_T_BAPIRET2
- ZBR_MAKT_UPDATE_S_DATA_ALV
- ZBR_MAKT_UPDATE_S_BAPIRET2

## Advertencias

- No se proporcionó el código fuente de los objetos de diccionario ZBR_MAKT_UPDATE_RT_MATNR, ZBR_MAKT_UPDATE_T_DATA, ZBR_MAKT_UPDATE_T_DATA_ALV, ZBR_MAKT_UPDATE_T_BAPIRET2, ZBR_MAKT_UPDATE_S_DATA_ALV, ZBR_MAKT_UPDATE_S_BAPIRET2; su estructura de campos exacta se infiere solo por el uso en el código y no puede documentarse con certeza.
- No se proporcionó la definición de los Dynpros 0100 y 0101 (Screen Painter: campos, flow logic completo más allá de los módulos referenciados), por lo que la disposición visual exacta no puede confirmarse.
- No se proporcionaron los textos de PF-STATUS '0100'/'0101' ni TITLEBAR, por lo que los comandos de usuario disponibles se infieren únicamente de las constantes GC_0100_SAVE/TEST/BACK/EXIT/CANCEL y GC_0101_BACK/EXIT/CANCEL usadas en el código.
- No se proporcionó el texto TEXT-bl1 de la pantalla de selección, se asume que corresponde al bloque de selección de materiales por el contexto.
- El comportamiento exacto de BAPI_MATERIAL_SAVEREPLICA con function='INS' sobre materiales ya existentes no está documentado en el código analizado; se señala como riesgo funcional en Puntos de mantenimiento pero no se afirma su comportamiento real sin evidencia adicional.
