La sentencia MODIFY se utiliza con tablas internas y con tablas de base de datos. Esta lección trata de enseñarle cómo utilizar la sentencia MODIFY con tablas de base de datos para modificar un registro.
- Sintaxis
MODIFY target [CLIENT SPECIFIED] FROM source.
La instrucción MODIFY inserta una o más filas especificadas en el origen en la tabla de base de datos especificada en el destino o sobrescribe las filas existentes.
La instrucción UPDATE establece los valores de los campos del sistema SY-SUBRC y SY-DBCNT.
- 0 cuando se declaró un área de trabajo en origen, se insertó o modificó la fila especificada. Cuando se especificó una tabla interna en el origen, se insertaron todas las líneas especificadas, se modificaron o la tabla interna es vacía.
- 2 cuando se especificó una estructura de tipo LOB (Large Object) y los componentes de identificador no LOB (los demás campos que no son objetos grandes) no se modificaron en base de datos.
- 4 cuando se especificó un área de trabajo en el origen, no se procesaron filas o cuando se especificó una tabla interna en el origen, no todas las filas especificadas se procesaron porque ya hay una fila con el mismo índice secundario único en la tabla de base de datos.
La instruccion MODIFY establece en la variable del sistema SY-DBCNT el número de filas modificadas. Si se produce un desbordamiento porque el número o filas es mayor que 2.147.483.647, SY-DBCNT se establece en -1. Si SY-SUBRC es 2, SY-DBCNT también se establece en el valor -1.
Si se utiliza la adición CLIENT SPECIFIED, se respeta el ID del mandante especificado en la fuente. Sin la adición CLIENT SPECIFIED, el entorno de ejecución ABAP no pasa el ID del mandante especificado en el origen al sistema de base de datos, sino que pasa el ID del mandante actual en su lugar.
… dbtab|(dbtab_syntax) [CLIENT SPECIFIED]
Las entradas del “target” determinan, de forma estática o dinámica, la tabla de la base de datos o la vista a la que se accede y el control del manejo del mandante.
Sólo se pueden especificar las vistas que hacen referencia a una tabla de base de datos única y cuyo estado en el diccionario ABAP permite cambios.
En lugar de la especificación estática, se puede especificar un objeto de datos entre paréntesis dbtab_syntax, que debe contener el nombre de la tabla de base de datos o la vista cuando se ejecuta la sentencia. Para el objeto de datos dbtab_syntax se puede especificar un objeto de datos de tipo carácter o una tabla estándar sin claves de tabla secundaria. La sintaxis en dbtab_syntax no es, como en ABAP Editor, sensible a mayúsculas y minúsculas.
Cuando se especifica un área de trabajo wa se busca una fila en la tabla de base de datos que tenga el mismo contenido en la clave principal que la parte de inicio correspondiente al wa. Si no se encuentra esta fila, se inserta una nueva fila de acuerdo con las mismas reglas que para la instrucción INSERT. Si se encuentra una fila, se sobrescribe de acuerdo con las mismas reglas que para la instrucción UPDATE.
Si el cambio conduce a una entrada doble en un índice secundario único, no se ejecuta y la variable del sistema SY-SUBRC se establece en 4.
El manejo automático del mandante se realiza por defecto, lo que significa que no se tiene en cuenta un identificador del mandante especificado en el wa; el mandante actual se utiliza en su lugar. El contenido de wa no se ve afectado.
Notas:
- El área de trabajo wa debe declararse siempre con referencia a la tabla de base de datos o a la vista en el Diccionario ABAP.
- Si la tabla o vista de la base de datos se especifica estáticamente, la especificación del área de trabajo que utiliza FROM wa se puede omitir usando la sentencia TABLES. El sistema complementa la instrucción MODIFY implícitamente para incluir la adición FROM dbtab.
- Aplicación práctica
En la lógica de un programa ejecutable realizamos una lectura de datos en la tabla de base de datos ZSCARRSA00001 obteniendo el registro con la clave CARRID = ‘CO’.
Cambiamos el valor del campo clave CARRID con WZ e insertamos el registro obtenido en la misma tabla sin utilizar la sentencia INSERT.
- Implementamos el código fuente.
- Ejecutamos el programa.
- Visualizamos el registro insertado en la base de datos utilizando la transacción del diccionario de datos SE11.
- Conclusión
La sentencia MODIFY actúa como la sentencia INSERT en cuanto el registro del wa no existe en la tabla y como la sentencia UPDATE en cuanto el registro existe en la tabla y se pueden actualizar los nuevos valores de la columna.
En el ejemplo utilizado hemos modificado el valor de la columna que forma la clave y como en la base de datos relacional no pueden existir dos registros con la misma clave la sentencia MODIFY insertó un nuevo registro. Si modificamos columnas que no forman la clave la sentencia MODIFY actualiza el mismo registro.
- Artículos relacionados:
ABAP Open SQL – Modificar múltiples registros en base de datos utilizando la sentencia MODIFY