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.

edit-control-tabla-04

En la quinta pantalla dejaremos las opciones como estas:

edit-control-tabla-05

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.

codigo-generado-control-tabla

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:

dynpro-control-tabla

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 modulo que se activa en el evento ON CHAIN-REQUEST, en este caso es GD_EDIT_MODIFY y hacemos doble clic sobre él

chain-request-control-tabla

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.