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
In order for this site to work correctly we need to store a small file (called a cookie) on your computer. Most every site in the world does this, however since the 25th of May 2011, by law we have to get your permission first. Please abandon the forum if you disagree.
Para que este foro funcione correctamente es necesario guardar un pequeño fichero (llamado cookie) en su ordenador. La mayoría de los sitios de Internet lo hacen, no obstante desde el 25 de Marzo de 2011 y por ley, necesitamos de su permiso con antelación. Abandone este foro si no está conforme.
Para que este foro funcione correctamente es necesario guardar un pequeño fichero (llamado cookie) en su ordenador. La mayoría de los sitios de Internet lo hacen, no obstante desde el 25 de Marzo de 2011 y por ley, necesitamos de su permiso con antelación. Abandone este foro si no está conforme.
TDATASET - UPDATE
- Carlos Ortiz
- Mensajes: 873
- Registrado: Mié Jul 01, 2009 5:44 pm
- Ubicación: Argentina - Córdoba
- Contactar:
TDATASET - UPDATE
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.
--
------------------------------------------------------------ --------------------
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.
--
@dbfarma
www.dbfarma.com.ar
www.dbfarma.com.ar
TDATASET - UPDATE
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..
) 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
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
> 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
Gracias, José F. Giménez y Carlos ortiz con las dos alternativas puede solucionar
mi problema, mejor de lo que esperaba..
Gracias
mi problema, mejor de lo que esperaba..
Gracias