Por su parte el botn de cancelacin simplemente cierra el formulario, sin actuar sobre los datos. PUBLIC SUB btncancelar_click() Me.close End Insertamos los datos mediante el siguiente cdigo en el evento click de btnaceptar: TRY hconn.EXEC (insert into mitabla values (&1,&2,&3,&4,&5.&6), txtid,txtnombre,txtapellido,txttelefono,txtmovil,txtcumple) ME.close CATCH message.error(Imposible introducir los datos solicitados) END Le pedimos al objeto connection que inserte los datos en la tabla,mediante la instruccin insert intro nombre_de_la_tabla values,el &1 indica que toma el primer valor a continuacin que es txid.text, el &2 el siguiente(txtnombre.text) y as sucesivamente. Si todo va bien el formulario se cierra, si hay un error se captura con catch y nos muestra el mensaje de error. Volvamos ahora al formulario principal y en el evento click de btnnuevo colocamos el siguiente cdigo; PUBLIC SUB Btnnuevo_Click() IF ConectarBase() THEN RETURN fdata.runnew(hconn) cerrarconexion() Form_Open() END Primeros tratamos de conectarnos a nuestra base de datos, si no lo conseguimos nos salimos. Conseguida la conexin llamamos al mtodo runnewde fdata. Como este formulario se muestra en forma modal, el presente cdigo queda a la espera de que ingresemos datos en fdata o simolemente lo cerremos. A continuacin cierra la conexin y llama al metodo form_open que se encarga de recargar los datos para mostrar los cambios realizados. Continuando con el formulario principal, vamos a codificar el mtodo para borrar registros presionando la tecla suprimir. PUBLIC SUB tabla_KeyRelease() IF Key.Code = Key.Delete THEN IF tabla.current = NULL THEN RETURN IF tabla.Current.Selected = FALSE THEN RETURN IF ConectarBase() THEN RETURN TRY hconn.exec(delete from mitabla where id=&1, tabla.Current.Key) IF ERROR THEN Message.Error(Imposible borrar el registro) ELSE tabla.Current.Delete() ENDIF ENDIF END Vemos primero si hay algn elemento en la tabla y si hay algo seleccionado, si no es as salimos del mtodo. Si hay alguno seleccionado tratamos de abrir la coneccin y tras lograrlo, borramos de la base los datos del registro cuya clave coincida con la del registro seleccionado. Si hay un error sale el mensaje informativo, es caso contrario se borra el registro tambin en nuestro colunmview para reflejar el cambio en la base. Aqu vemos que la instruccin sql usada es condicional y la palabra marcada en negrita where antecede a la condicin; TRY hconn.exec(delete from mitabla where id=&1, tabla.Current.Key) Ahora vamos a ver como hacemos para modificar un registro, por ejemplo si un amigo cambia el mvil, basta con editar ese campo. Vamos a aprovechar el evento activitede nuestro control colunmview(tabla) para agregar esta funcionalidad . Dicho evento se dispara al hacer doble click sobre alguna columna de la tabla. PUBLIC SUB tabla_Activate() DIM hresul AS Result IF tabla.Current = NULL THEN RETURN IF ConectarBase() THEN RETURN hresul = hconn.Edit(mitabla, id=&1, tabla.Current.Key) fdata.runedit(hresul) tabla.Current[0] = hresul["id"] tabla.Current[1] = hresul["nombre"] tabla.Current[2] = hresul["apellido"] tabla.Current[3] = hresul["telefono_fijo"] tabla.Current[4] = hresul["telefono_movil"] tabla.Current[5] = hresul["cumple"] cerrarconexion() END La lnea en negrita es la que llama al mtodo runedit de fdata. Como an no hemos creado este mtodo si tratamos de ejecutarlo ahora no funcionar. Volvamos por tanto a fdata y coloquemos las siguientes variables al principio del formulario para que sean accesibles desde todo el formulario. PRIVATE hconn AS Connection PRIVATE hresul AS Result PRIVATE editando AS Boolean y agregamos el mtodo runedit cuyo cdigo es el siguiente: PUBLIC SUB runedit(data AS Result) hresul = data editando = TRUE txtid.text = hresul["id"] txtnombre.text = hresul["nombre"] txtapellido.text = hresul["apellido"] Txttelefono.text = hresul["telefono_fijo"] txtmovil.text = hresul["telefono_movil"] txtcumple.text = hresul["cumple"] ME.ShowModal END Esto nos muestra fdata con los datos del registro seleccionado de modo que podamos editarlo.Y nos pone la variable editando con el valor true. Esto es necesario para que mediante una instruccin condicional al hacer click en btnaceptar distinga entre altas y modificaciones. El nuevo cdigo de btnaceptar es el siguiente. PUBLIC SUB btnaceptar_Click() IF editando THEN TRY hresul["id"] = txtid.text TRY hresul["nombre"] = txtnombre.text TRY hresul["apellido"] = txtapellido.text TRY hresul["telefono_fijo"] = Txttelefono.text TRY hresul["telefono_movil"] = txtmovil.text TRY hresul["cumple"] = txtcumple.text TRY hresul.Update ELSE TRY hconn.EXEC(insert into mitabla values (&1,&2,&3,&4,&5,&6), txtid.text, txtnombre.text, txtapellido.text, Txttelefono.text, txtmovil.text, txtcumple.text) ENDIF ME.Close() CATCH Message.Error(Imposible introducir los datos solicitados) END Si hay una modificacin sita el valor de cada caja de texto con TRY y actualiza la base de datos con hresul.update, si hay un error lo captura con CATCH y muestra el mensaje de error. Si editando es false contina con las intrucciones despes de else que no es ms que la instruccin insert into ya vista en agregar registros.