Página 1 de 1
TDATASET - UPDATE
Publicado: Mié Jul 08, 2009 2:52 pm
por jacaro
Estoy utilizando Dataset para hacer gestión, sobre una tabla de una base de
datos en postgres quiero tomar el control del error que recibe TDataSet:Update
cuando estoy infringiendo una restricción de un campo unique en la tabla,
la idea es que a través de una ventana de mensaje informar al usuario de
lo que esta sucediendo, con palabras comprensibles para él.
Gracias
jacaro
TDATASET - UPDATE
Publicado: Mié Jul 08, 2009 11:37 pm
por Carlos Ortiz
Te comento como lo hacemos acá.
------------------------------------------------------------ --------------------
Con esta funcion CargarError llenamos una variable publica del sistema que es AppData:oSql
//---
FUNCTION CargarError( cMensaje )
// ---
IF "violates foreign key constraint"$cMensaje
cMensaje:="No se puede eliminar, contiene detalle."
ENDIF
IF "violates check constraint"$cMensaje
cMensaje:="Falta algún dato obligatorio, verifique."
ENDIF
IF "duplicate key value violates unique constraint"$cMensaje
cMensaje:="Valor duplicado, verifique."
ENDIF
AppData:oSql:cError:=cMensaje
AppData:oSql:nError:=0
RETURN Nil
------------------------------------------------------------ --------------------
Por otro lado te comento que usamos las llamadas a los metodos por medio de nuestras clases y asi poder redefinir algunas cosas particulares como los mensajes, por ejemplo:
#include "Xailer.ch"
CLASS Sql From TComponent
METHOD EX( cSelect ) // Este metodo llama al execute del lenguaje
PROPERTY cError INIT ""
PROPERTY nError INIT 0
ENDCLASS
//---------------------------------------------------------- --------------------
METHOD EX( cSelect ) CLASS Sql
local ret:=.f.
LimpiarError()
IF empty(cSelect)
CargarError("Falta el comando SQL a ejecutar")
RETURN ret
ENDIF
TRY
ret:=AppData:oOdbcDS:Execute( cSelect ) // Aca llama al Execute de Xailer
IF !ret
CargarError(AppData:oOdbcDS:LastError+CRLF+cSelect,"Try") // Y esta carga el error que verá el usuario
ENDIF
CATCH
CargarError(AppData:oOdbcDS:LastError+CRLF+cSelect,"Catch")
END
RETURN ret
//---------------------------------------------------------- --------------------
Por ende desde nuestras clases por ejemplo para actualizar un dato en el motor llamamos a:
METHOD Actualizar() CLASS Articulos
local ret
ret:=AppData:oSql:EX( "update articulos set ";
+"descripcion='"+::Descripcion+"',";
+"codigo = '"+::Codigo+"',";
+"IDTipoArticulo = "+str(::IDTipoArticulo)+",";
+"exento = '"+::exento+"',";
+"alta = "+dSql(::alta)+",";
+"baja = "+dSql(::baja)+",";
+"idestadoregistro = "+str(::idestadoregistro)+",";
+"idproveedor = "+str(::idproveedor)+" ";
+"where IDArticulo="+str(::IDArticulo) )
RETURN ret
De esta manera, si queremos agregar una nueva funcionalidad a la clase sql lo haremos en un solo lugar.
En resumidas cuentas, es agregar una capa mas entre el motor y los comando de Xailer.
Yo no soy de lo mas experimentado en sql, con ayuda de mi socio (hace unos meses) he ido aprendiendo sobre el tema y ya estoy gestionando tablas usando postgres y la verdad que no quiero volver mas a las DBF.
Espero sea de tu ayuda, Atte. Carlos Ortiz.
--
TDATASET - UPDATE
Publicado: Jue Jul 09, 2009 6:11 pm
por jacaro
carlos, gracias por su colaboracion.. lo que busco es que el .Execute( cSelect
) no dispare ningun mensaje yo pongo el mensaje caulquier que sea. Crei que
estando en un bloque try - catch lo podia hacer, despues del catch pero no.
No se si me hago entender... gracias por lo que me pueda ayudar..
TDATASET - UPDATE
Publicado: Vie Jul 10, 2009 2:15 pm
por jfgimenez
jacaro,
> carlos, gracias por su colaboracion.. lo que busco es que el .Execute(
> cSelect
> ) no dispare ningun mensaje yo pongo el mensaje caulquier que sea. Crei
> que
> estando en un bloque try - catch lo podia hacer, despues del catch pero
> no.
Revisa en la ayuda la propiedad lDisplayErrors de TDataSource
--
Un saludo,
José F. Giménez
http://www.xailer.com
http://www.xailer.info
TDATASET - UPDATE
Publicado: Vie Jul 10, 2009 4:54 pm
por jacaro
Gracias, José F. Giménez y Carlos ortiz con las dos alternativas puede solucionar
mi problema, mejor de lo que esperaba..
Gracias