Buen día, tengo dos tabla como les voy a mostrar...
CREATE TABLE `productos` (
`PDT_CODIGO` varchar(20) NOT NULL DEFAULT '',
`PDT_TIV_CODIGO` varchar(10) NOT NULL DEFAULT '',
`PDT_DESCRIPCION` varchar(80) NOT NULL DEFAULT '',
`PDT_ESTADO` tinyint(1) NOT NULL DEFAULT '0',
PRIMARY KEY (`PDT_CODIGO`),
UNIQUE KEY `PDT_CODIGO` (`PDT_CODIGO`),
KEY `TIPOIVA_PRODUCTOS` (`PDT_TIV_CODIGO`),
CONSTRAINT `TIPOIVA_PRODUCTOS` FOREIGN KEY
(`PDT_TIV_CODIGO`) REFERENCES `tipoiva` (`TIV_CODIGO`) ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1
CREATE TABLE `tipoiva` (
`TIV_CODIGO` varchar(10) NOT NULL DEFAULT '',
`TIV_DESCRIPCION` varchar(20) NOT NULL DEFAULT '',
PRIMARY KEY (`TIV_CODIGO`),
UNIQUE KEY `TIV_CODIGO` (`TIV_CODIGO`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
....Con esto tengo una clave foránea que relaciona PRODUCTOS e IVA, todo
funciona bien mientras no escriba un CODIGO que no esté
en la tabla tipoiva, es decir si hay 3 valores en tipoiva (GN,RD,NA) y llego
y modifico el DBBrowse y escribo "XX" entonces logicamente
me devuelve un error de foreign key desde MySQL, lo que he tratado es que
dicho error lo pueda atrapar para que no le salga al usuario dicho
error sino un mensaje personal diciendo que no puede utilizar dicha clave ya
que no existe. He intentado con lDisplayErrors en .F. para el TSQLTable
y lAllowProcessMessages en .F. del TMySQLDataSource y no logro atrapar dicho
mensaje, luego de esto y la desesperación he intentado con cada una de las
combinaciones de las propiedades lDisplayErrors, lAbortOnErrors y
lAllowProcessMessages pero nada no logro atrapar el error ni siquiera en el
Evento
OnError del DataSource.
Muchas Gracias a quien me pueda ayudar.
Guillermo García
de las propiedades
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.
Problema Claves For
-
- Mensajes: 18
- Registrado: Mié Dic 02, 2009 4:19 pm
Problema Claves For
Tengo la misma duda, pero con Oracle......
"Guillermo Garcia" <guilleglad@gmail.com> escribió en el mensaje
news:[email=4b17c317@svctag-j7w3v3j....]4b17c317@svctag-j7w3v3j....[/email]
> Buen día, tengo dos tabla como les voy a mostrar...
>
> CREATE TABLE `productos` (
> `PDT_CODIGO` varchar(20) NOT NULL DEFAULT '',
> `PDT_TIV_CODIGO` varchar(10) NOT NULL DEFAULT '',
> `PDT_DESCRIPCION` varchar(80) NOT NULL DEFAULT '',
> `PDT_ESTADO` tinyint(1) NOT NULL DEFAULT '0',
> PRIMARY KEY (`PDT_CODIGO`),
> UNIQUE KEY `PDT_CODIGO` (`PDT_CODIGO`),
> KEY `TIPOIVA_PRODUCTOS` (`PDT_TIV_CODIGO`),
> CONSTRAINT `TIPOIVA_PRODUCTOS` FOREIGN KEY
> (`PDT_TIV_CODIGO`) REFERENCES `tipoiva` (`TIV_CODIGO`) ON UPDATE CASCADE
> ) ENGINE=InnoDB DEFAULT CHARSET=latin1
>
> CREATE TABLE `tipoiva` (
> `TIV_CODIGO` varchar(10) NOT NULL DEFAULT '',
> `TIV_DESCRIPCION` varchar(20) NOT NULL DEFAULT '',
> PRIMARY KEY (`TIV_CODIGO`),
> UNIQUE KEY `TIV_CODIGO` (`TIV_CODIGO`)
> ) ENGINE=InnoDB DEFAULT CHARSET=latin1
>
> ...Con esto tengo una clave foránea que relaciona PRODUCTOS e IVA, todo
> funciona bien mientras no escriba un CODIGO que no esté
> en la tabla tipoiva, es decir si hay 3 valores en tipoiva (GN,RD,NA) y
> llego y modifico el DBBrowse y escribo "XX" entonces logicamente
> me devuelve un error de foreign key desde MySQL, lo que he tratado es que
> dicho error lo pueda atrapar para que no le salga al usuario dicho
> error sino un mensaje personal diciendo que no puede utilizar dicha clave
> ya que no existe. He intentado con lDisplayErrors en .F. para el TSQLTable
> y lAllowProcessMessages en .F. del TMySQLDataSource y no logro atrapar
> dicho mensaje, luego de esto y la desesperación he intentado con cada una
> de las combinaciones de las propiedades lDisplayErrors, lAbortOnErrors y
> lAllowProcessMessages pero nada no logro atrapar el error ni siquiera en
> el Evento
> OnError del DataSource.
> Muchas Gracias a quien me pueda ayudar.
>
> Guillermo García
> de las propiedades
>
"Guillermo Garcia" <guilleglad@gmail.com> escribió en el mensaje
news:[email=4b17c317@svctag-j7w3v3j....]4b17c317@svctag-j7w3v3j....[/email]
> Buen día, tengo dos tabla como les voy a mostrar...
>
> CREATE TABLE `productos` (
> `PDT_CODIGO` varchar(20) NOT NULL DEFAULT '',
> `PDT_TIV_CODIGO` varchar(10) NOT NULL DEFAULT '',
> `PDT_DESCRIPCION` varchar(80) NOT NULL DEFAULT '',
> `PDT_ESTADO` tinyint(1) NOT NULL DEFAULT '0',
> PRIMARY KEY (`PDT_CODIGO`),
> UNIQUE KEY `PDT_CODIGO` (`PDT_CODIGO`),
> KEY `TIPOIVA_PRODUCTOS` (`PDT_TIV_CODIGO`),
> CONSTRAINT `TIPOIVA_PRODUCTOS` FOREIGN KEY
> (`PDT_TIV_CODIGO`) REFERENCES `tipoiva` (`TIV_CODIGO`) ON UPDATE CASCADE
> ) ENGINE=InnoDB DEFAULT CHARSET=latin1
>
> CREATE TABLE `tipoiva` (
> `TIV_CODIGO` varchar(10) NOT NULL DEFAULT '',
> `TIV_DESCRIPCION` varchar(20) NOT NULL DEFAULT '',
> PRIMARY KEY (`TIV_CODIGO`),
> UNIQUE KEY `TIV_CODIGO` (`TIV_CODIGO`)
> ) ENGINE=InnoDB DEFAULT CHARSET=latin1
>
> ...Con esto tengo una clave foránea que relaciona PRODUCTOS e IVA, todo
> funciona bien mientras no escriba un CODIGO que no esté
> en la tabla tipoiva, es decir si hay 3 valores en tipoiva (GN,RD,NA) y
> llego y modifico el DBBrowse y escribo "XX" entonces logicamente
> me devuelve un error de foreign key desde MySQL, lo que he tratado es que
> dicho error lo pueda atrapar para que no le salga al usuario dicho
> error sino un mensaje personal diciendo que no puede utilizar dicha clave
> ya que no existe. He intentado con lDisplayErrors en .F. para el TSQLTable
> y lAllowProcessMessages en .F. del TMySQLDataSource y no logro atrapar
> dicho mensaje, luego de esto y la desesperación he intentado con cada una
> de las combinaciones de las propiedades lDisplayErrors, lAbortOnErrors y
> lAllowProcessMessages pero nada no logro atrapar el error ni siquiera en
> el Evento
> OnError del DataSource.
> Muchas Gracias a quien me pueda ayudar.
>
> Guillermo García
> de las propiedades
>
-
- Mensajes: 420
- Registrado: Sab Ago 16, 2008 9:06 pm
Problema Claves For
Hola
Aqui dejo un ejemplo de como capturar los errores de MySQL usando TRY
.... CATCH
Saludos
Jose Alfonso Suarez Moreno
--
Aqui dejo un ejemplo de como capturar los errores de MySQL usando TRY
.... CATCH
Saludos
Jose Alfonso Suarez Moreno
--
-
- Mensajes: 18
- Registrado: Mié Dic 02, 2009 4:19 pm
Problema Claves For
Ok muchas gracias , el detalle está que yo puedo usar TRY ... CATCH cuando
estoy haciendo las actualizaciones manualmente, es decir, cuando yo Mando a
llamar los Métodos UPDATE por código, mientras que mi problema es que el
DBBrowse se encarga de ejecutar internamente dicho llamado y realizar todas
las operaciones automáticamente sin poder atrapar dichos errores, Gracias de
todas maneras.
Guillermo García
"José Alfonso Suárez Moreno" <jasm.quitaesto@tpvsoft.com> escribió en el
mensaje news:4b17edf8$[email=1@svctag-j7w3v3j....]1@svctag-j7w3v3j....[/email]
> Hola
>
> Aqui dejo un ejemplo de como capturar los errores de MySQL usando TRY
> ... CATCH
>
> Saludos
>
> Jose Alfonso Suarez Moreno
>
estoy haciendo las actualizaciones manualmente, es decir, cuando yo Mando a
llamar los Métodos UPDATE por código, mientras que mi problema es que el
DBBrowse se encarga de ejecutar internamente dicho llamado y realizar todas
las operaciones automáticamente sin poder atrapar dichos errores, Gracias de
todas maneras.
Guillermo García
"José Alfonso Suárez Moreno" <jasm.quitaesto@tpvsoft.com> escribió en el
mensaje news:4b17edf8$[email=1@svctag-j7w3v3j....]1@svctag-j7w3v3j....[/email]
> Hola
>
> Aqui dejo un ejemplo de como capturar los errores de MySQL usando TRY
> ... CATCH
>
> Saludos
>
> Jose Alfonso Suarez Moreno
>
-
- Mensajes: 18
- Registrado: Mié Dic 02, 2009 4:19 pm
Problema Claves For
Bueno utilizando la misma técnica de mi amigo Juan José que me ayudó en otro
problema, sobrecargué la función Replace del Source de Xailer -
MySQLRecords.prg y agregué un Try Catch donde hace la actualización. Gracias
a todos los que me ayudaron.
Guillermo García
//---------------------------------------------------------- --------------------------------------------
METHOD Replace() CLASS XMySQLRecords
LOCAL oField
LOCAL aData
LOCAL cSql, cMod, aParams
LOCAL regreso := .F.
IF !::lDirty
RETURN .T.
ENDIF
::lDirty := .F.
IF !::QueryCurrent( @aData )
::oDataSource:NewError( "Could not retrieve current row values,
'Update' canceled",, ::oDataset )
RETURN .F.
ENDIF
IF Len( aData ) == 0
::oDataSource:NewError( "Row deleted after the 'Edit' operation,
'Update' canceled",, ::oDataset )
RETURN .F.
ENDIF
cSql := ""
cMod := ""
aParams := {}
FOR EACH oField IN ::oDataset:aFields
IF oField:lModified .AND. oField:lEditable
IF !Empty( cSql )
cSql += ", "
ENDIF
cSql += oField:cName + "="
IF oField:cType == "B"
cSql += "?"
AAdd( aParams, oField:VarGet() )
ELSE
cSql += ValToStr( oField:VarGet() )
ENDIF
IF aData[ HB_EnumIndex() ] != oField:FieldGet()
IF !Empty( cMod )
cMod += ", "
ENDIF
cMod += oField:cName
ENDIF
oField:InitValue := oField:Buffer
oField:lModified := .F.
ENDIF
NEXT
IF !Empty( cMod )
::oDataSource:NewError("The fields:" + cMod + " have changed after the
'Edit' operation, 'Update' canceled",, ::oDataset )
RETURN .F.
ENDIF
IF !CheckSQLInjection( cSql ) .AND. !Empty( cSql )
cSql := "UPDATE " + ::cTable + " SET " + cSql + " WHERE " +
::CurrentWhere( .T. )
TRY -------------------------->
Código Mío
WITH OBJECT ::oDataSource
IF IIF( Empty( aParams ), :Execute( cSql ), :Execute2( cSql,,
aParams ) ) .and. :nAffectedRows == 1
::QueryCurrent( ,.T. ) // Actualiza el registro editado por
si acaso
regreso :=
--------------------------> Código Mío
ENDIF
END WITH
CATCH -------------------------->
Código Mío
MsgInfo("Error al Actualizar") -------------------------->
Código Mío
END -------------------------->
Código Mío
RETURN regreso -------------------------->
Código Mío
ENDIF
RETURN .F.
"Guillermo Garcia" <guilleglad@gmail.com> escribió en el mensaje
news:4b181066$[email=1@svctag-j7w3v3j....]1@svctag-j7w3v3j....[/email]
> Ok muchas gracias , el detalle está que yo puedo usar TRY ... CATCH cuando
> estoy haciendo las actualizaciones manualmente, es decir, cuando yo Mando
> a llamar los Métodos UPDATE por código, mientras que mi problema es que el
> DBBrowse se encarga de ejecutar internamente dicho llamado y realizar
> todas las operaciones automáticamente sin poder atrapar dichos errores,
> Gracias de todas maneras.
>
> Guillermo García
>
> "José Alfonso Suárez Moreno" <jasm.quitaesto@tpvsoft.com> escribió en el
> mensaje news:4b17edf8$[email=1@svctag-j7w3v3j....]1@svctag-j7w3v3j....[/email]
>> Hola
>>
>> Aqui dejo un ejemplo de como capturar los errores de MySQL usando TRY
>> ... CATCH
>>
>> Saludos
>>
>> Jose Alfonso Suarez Moreno
>>
>
>
problema, sobrecargué la función Replace del Source de Xailer -
MySQLRecords.prg y agregué un Try Catch donde hace la actualización. Gracias
a todos los que me ayudaron.
Guillermo García
//---------------------------------------------------------- --------------------------------------------
METHOD Replace() CLASS XMySQLRecords
LOCAL oField
LOCAL aData
LOCAL cSql, cMod, aParams
LOCAL regreso := .F.
IF !::lDirty
RETURN .T.
ENDIF
::lDirty := .F.
IF !::QueryCurrent( @aData )
::oDataSource:NewError( "Could not retrieve current row values,
'Update' canceled",, ::oDataset )
RETURN .F.
ENDIF
IF Len( aData ) == 0
::oDataSource:NewError( "Row deleted after the 'Edit' operation,
'Update' canceled",, ::oDataset )
RETURN .F.
ENDIF
cSql := ""
cMod := ""
aParams := {}
FOR EACH oField IN ::oDataset:aFields
IF oField:lModified .AND. oField:lEditable
IF !Empty( cSql )
cSql += ", "
ENDIF
cSql += oField:cName + "="
IF oField:cType == "B"
cSql += "?"
AAdd( aParams, oField:VarGet() )
ELSE
cSql += ValToStr( oField:VarGet() )
ENDIF
IF aData[ HB_EnumIndex() ] != oField:FieldGet()
IF !Empty( cMod )
cMod += ", "
ENDIF
cMod += oField:cName
ENDIF
oField:InitValue := oField:Buffer
oField:lModified := .F.
ENDIF
NEXT
IF !Empty( cMod )
::oDataSource:NewError("The fields:" + cMod + " have changed after the
'Edit' operation, 'Update' canceled",, ::oDataset )
RETURN .F.
ENDIF
IF !CheckSQLInjection( cSql ) .AND. !Empty( cSql )
cSql := "UPDATE " + ::cTable + " SET " + cSql + " WHERE " +
::CurrentWhere( .T. )
TRY -------------------------->
Código Mío
WITH OBJECT ::oDataSource
IF IIF( Empty( aParams ), :Execute( cSql ), :Execute2( cSql,,
aParams ) ) .and. :nAffectedRows == 1
::QueryCurrent( ,.T. ) // Actualiza el registro editado por
si acaso
regreso :=
--------------------------> Código Mío
ENDIF
END WITH
CATCH -------------------------->
Código Mío
MsgInfo("Error al Actualizar") -------------------------->
Código Mío
END -------------------------->
Código Mío
RETURN regreso -------------------------->
Código Mío
ENDIF
RETURN .F.
"Guillermo Garcia" <guilleglad@gmail.com> escribió en el mensaje
news:4b181066$[email=1@svctag-j7w3v3j....]1@svctag-j7w3v3j....[/email]
> Ok muchas gracias , el detalle está que yo puedo usar TRY ... CATCH cuando
> estoy haciendo las actualizaciones manualmente, es decir, cuando yo Mando
> a llamar los Métodos UPDATE por código, mientras que mi problema es que el
> DBBrowse se encarga de ejecutar internamente dicho llamado y realizar
> todas las operaciones automáticamente sin poder atrapar dichos errores,
> Gracias de todas maneras.
>
> Guillermo García
>
> "José Alfonso Suárez Moreno" <jasm.quitaesto@tpvsoft.com> escribió en el
> mensaje news:4b17edf8$[email=1@svctag-j7w3v3j....]1@svctag-j7w3v3j....[/email]
>> Hola
>>
>> Aqui dejo un ejemplo de como capturar los errores de MySQL usando TRY
>> ... CATCH
>>
>> Saludos
>>
>> Jose Alfonso Suarez Moreno
>>
>
>