En la primera parte aprendimos a añadir un Control Tabla en nuestros dynpros, ahora veremos como usarlos para editar información de una base de datos.
Debido a que en este ejemplo vamos a trabajar con bases de datos primero vamos a crear una tabla Z que contenga un campo llamado código y otro campo llamado estado ambos del tipo de datos que usted desee. Luego debemos declarar una tabla interna en nuestro top include de esta forma:
"Estructura general data: begin of it_campos_auxiliares, mark type c length 1, del type c length 1, new type c length 1, upd type c length 1, icon type c length 132, end of it_campos_auxiliares. data begin of it_tabla_edit occurs 0. include structure Z015. " --- cambiar por el nombre de tu tabla Z include structure it_campos_auxiliares. data end of it_tabla_edit.
Ahora vamos a agregar un Control Tabla mediante el asistente siguiendo los mismos pasos pero ahora la tabla interna sera it_tabla_edit (o la que hayas declarado en el paso anterior), y cuando seleccionemos los campos a mostrar debemos dejar sin marcar los campos MARK, DEL, NEW, UPD e ICON.
En la quinta pantalla dejaremos las opciones como estas:
En las siguientes pantallas dejamos las opciones predeterminadas y definimos los includes en los que deseamos que se guarde el código generado. Ahora en nuestro programa antes de llamar el dynpro vamos a llenar la tabla interna it_tabla_edit con el contenido de nuestra tabla Z.
Al abrir el dynpro veremos que el asistente ha creado un poco de código, vamos a activar la barra de herramientas de SAP y el botón Guardar con el código SAVE.
En el modulo que procesa las entras del usuario, vamos a colocar este código (Debes ajustar las sentencias SQL para que se adapten a tu tabla Z)
DATA: linea_tabla TYPE Z015. save_ok = ok_code. clear ok_code. CASE save_ok. WHEN 'ADD'. "agregar clear it_tabla_edit. it_tabla_edit-new = 'X'. append it_tabla_edit. WHEN 'DEL'. "eliminar LOOP AT it_tabla_edit where mark = 'X'. if it_tabla_edit-del = 'X'. it_tabla_edit-del = space. else. it_tabla_edit-del = 'X'. endif. ENDLOOP. WHEN 'SAVE'. "guardar "Primero vamos a borrar lo que se marco para borrado LOOP AT it_tabla_edit where del = 'X'. "Ajustar este delete a su tabla delete from Z015 "Se borrara la tabla Z015 where codigo = it_tabla_edit-codigo. ENDLOOP. "Limpiar tabla interna delete it_Tabla_edit where del = 'X'. "Ahora vamos a procesar los nuevos registros... LOOP AT it_tabla_edit where new = 'X'. move-corresponding it_tabla_edit to linea_tabla. INSERT into z015 values linea_tabla . clear: it_tabla_edit-new, it_tabla_edit-upd. modify it_tabla_edit. ENDLOOP. "Ahora vamos a procesar las actualizaciones.... LOOP AT it_tabla_edit where upd = 'X'. "Ajustar este delete a su tabla update Z015 "Se borrara la tabla Z015 set estado = it_tabla_edit-estado where codigo = it_tabla_edit-codigo. clear: it_tabla_edit-upd. modify it_tabla_edit. ENDLOOP. WHEN OTHERS. ENDCASE.
Ahora debemos agregar dos botones en nuestro dynpro uno para agregar filas y otro para eliminarlas con los códigos ADD y DEL respectivamente, sin olvidar asignarles un nombre. Hasta este momento nuestro dynpro deberá lucir como este:
Ahora solo nos falta agregar un poco de código para detectar cuando una fila ha sido modificada, para esto abrimos nuestro dynpro y ubicamos el módulo que se activa en el evento ON CHAIN-REQUEST, en este caso es GD_EDIT_MODIFY y hacemos doble clic sobre él
y agregamos una instrucción para marcar la fila como modificada.
MODULE GD_EDIT_MODIFY INPUT. IT_TABLA_EDIT-upd = 'X'. "Linea a agregar MODIFY IT_TABLA_EDIT INDEX GD_EDIT-CURRENT_LINE. ENDMODULE.
Ahora tenemos listo un mantenimiento básico para nuestras tablas Z.
Notas:
Cuando mostramos datos para editar en el control tabla y la tabla interna esta vacía, parecerá como que el usuario puede ingresar datos, pero al presionar la tecla Enter se borrará todo lo que se ha digitado, para prevenir esto debemos insertar una linea vacía cuando la tabla interna no tiene filas.
Ejercicio:
Modificar el botón ADD para que al presionarlo se muestre una ventana de tipo modal y solicite un código y un estado y que al presionar un botón de aceptar en esta ventana deberá agregar un registro nuevo en el control tabla. Luego modificar el control tabla para que el campo de código sea de solo lectura.