Hola,
Tengo un problema con el Update de AdoDataset que no se como solucionar.
Os expongo mi caso.
Sobre una conexión ADO creo un Dataset para añadir un registro. El
SqlQuery se crea sobre un select tipo 'SELECT * FROM miTabla where 1 =
0' para obtener un recordset vacío sobre el cual insertar nuevos registros.
En el formulario tengo distribuidos varios datacontrols y el botón
'añadir' y el botón 'graba cambios'
El usuario hace clic sobre el botón 'Añadir'
el programa hace un ::oSqlQuery1:Addnew() (se comprueba si addnew
devuelve .t.)
El usuario edita los diferentes campos (dtacontrols) y hace click en el
botón 'graba cambios'.
En ese botón lo que se hace es:
IF !::oSqlQuery1:Update()
::oMiPrimerDataControl:SetFocus()
RETURN .F.
ENDIF
El caso es que cuando el update del sqlquery devuelve un .F. porque, por
ejemplo, se incumple algún tipo de restricción, me encuentro con que los
valores introducidos en los datacontrols han desaparecido y han quedado
en blanco. El usuario tiene que volver a introducir esos valores otra vez.
¿Habría alguna forma de que, ante un error devuelto por ::update pueda
continuar con la edición con los datos introducidos? Dicho de otra
manera, que no se pierda la información introducida por el usuario por
que, por ejemplo, se incumpla una restricción de PK o de FK o NULL (dado
que son situaciones que el Sql informa y se pueden corregir).
Saludos y gracias por vuestra ayuda.
José Luis Capel
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 con dataset:Update()
- ignacio
- Site Admin
- Mensajes: 9459
- Registrado: Lun Abr 06, 2015 8:00 pm
- Ubicación: Madrid, Spain
- Contactar:
Problema con dataset:Update()
Prueba a cambiar lo siguiente:
METHOD Update() CLASS XAdoRecords
LOCAL lSuccess := .T.
WITH OBJECT ::oAdo
TRY
:Update()
CATCH
lSuccess := (:Status == adRecOK .OR. :Status == adRecModified )
IF !lSuccess
TRY
:BookMark := :BookMark // Para forzar el error aportando
información
CATCH
// :CancelUpdate() <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< comentado
::NewADOError( "ADODB:RecordSet:Update()" )
END
ENDIF
END
END WITH
::lOnAppend := .F.
RETURN lSuccess
--
Ignacio Ortiz de Zúñiga
[Equipo de Xailer/Xailer team]
http://www.xailer.com
http://www.xailer.info
"José Luis Capel ~ AgSoft" <jose.luis@iaicom.com> escribió en el mensaje de
noticias:4bfe3d76$[email=1@svctag-j7w3v3j....]1@svctag-j7w3v3j....[/email]
> Hola,
>
> Tengo un problema con el Update de AdoDataset que no se como solucionar.
>
> Os expongo mi caso.
>
> Sobre una conexión ADO creo un Dataset para añadir un registro. El
> SqlQuery se crea sobre un select tipo 'SELECT * FROM miTabla where 1 = 0'
> para obtener un recordset vacío sobre el cual insertar nuevos registros.
>
> En el formulario tengo distribuidos varios datacontrols y el botón
> 'añadir' y el botón 'graba cambios'
>
> El usuario hace clic sobre el botón 'Añadir'
>
> el programa hace un ::oSqlQuery1:Addnew() (se comprueba si addnew devuelve
> .t.)
>
> El usuario edita los diferentes campos (dtacontrols) y hace click en el
> botón 'graba cambios'.
>
> En ese botón lo que se hace es:
>
> IF !::oSqlQuery1:Update()
> ::oMiPrimerDataControl:SetFocus()
> RETURN .F.
> ENDIF
>
> El caso es que cuando el update del sqlquery devuelve un .F. porque, por
> ejemplo, se incumple algún tipo de restricción, me encuentro con que los
> valores introducidos en los datacontrols han desaparecido y han quedado en
> blanco. El usuario tiene que volver a introducir esos valores otra vez.
>
> ¿Habría alguna forma de que, ante un error devuelto por ::update pueda
> continuar con la edición con los datos introducidos? Dicho de otra
> manera, que no se pierda la información introducida por el usuario por
> que, por ejemplo, se incumpla una restricción de PK o de FK o NULL (dado
> que son situaciones que el Sql informa y se pueden corregir).
>
> Saludos y gracias por vuestra ayuda.
> José Luis Capel
METHOD Update() CLASS XAdoRecords
LOCAL lSuccess := .T.
WITH OBJECT ::oAdo
TRY
:Update()
CATCH
lSuccess := (:Status == adRecOK .OR. :Status == adRecModified )
IF !lSuccess
TRY
:BookMark := :BookMark // Para forzar el error aportando
información
CATCH
// :CancelUpdate() <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< comentado
::NewADOError( "ADODB:RecordSet:Update()" )
END
ENDIF
END
END WITH
::lOnAppend := .F.
RETURN lSuccess
--
Ignacio Ortiz de Zúñiga
[Equipo de Xailer/Xailer team]
http://www.xailer.com
http://www.xailer.info
"José Luis Capel ~ AgSoft" <jose.luis@iaicom.com> escribió en el mensaje de
noticias:4bfe3d76$[email=1@svctag-j7w3v3j....]1@svctag-j7w3v3j....[/email]
> Hola,
>
> Tengo un problema con el Update de AdoDataset que no se como solucionar.
>
> Os expongo mi caso.
>
> Sobre una conexión ADO creo un Dataset para añadir un registro. El
> SqlQuery se crea sobre un select tipo 'SELECT * FROM miTabla where 1 = 0'
> para obtener un recordset vacío sobre el cual insertar nuevos registros.
>
> En el formulario tengo distribuidos varios datacontrols y el botón
> 'añadir' y el botón 'graba cambios'
>
> El usuario hace clic sobre el botón 'Añadir'
>
> el programa hace un ::oSqlQuery1:Addnew() (se comprueba si addnew devuelve
> .t.)
>
> El usuario edita los diferentes campos (dtacontrols) y hace click en el
> botón 'graba cambios'.
>
> En ese botón lo que se hace es:
>
> IF !::oSqlQuery1:Update()
> ::oMiPrimerDataControl:SetFocus()
> RETURN .F.
> ENDIF
>
> El caso es que cuando el update del sqlquery devuelve un .F. porque, por
> ejemplo, se incumple algún tipo de restricción, me encuentro con que los
> valores introducidos en los datacontrols han desaparecido y han quedado en
> blanco. El usuario tiene que volver a introducir esos valores otra vez.
>
> ¿Habría alguna forma de que, ante un error devuelto por ::update pueda
> continuar con la edición con los datos introducidos? Dicho de otra
> manera, que no se pierda la información introducida por el usuario por
> que, por ejemplo, se incumpla una restricción de PK o de FK o NULL (dado
> que son situaciones que el Sql informa y se pueden corregir).
>
> Saludos y gracias por vuestra ayuda.
> José Luis Capel
Ignacio Ortiz de Zúñiga
[OZ Software]
https://www.ozs.es
--
[Equipo de Xailer / Xailer team]
https://www.xailer.com
[OZ Software]
https://www.ozs.es
--
[Equipo de Xailer / Xailer team]
https://www.xailer.com
Problema con dataset:Update()
Ignacio,
Gracias por la respuesta.
> Prueba a cambiar lo siguiente:
>
> METHOD Update() CLASS XAdoRecords
>
> LOCAL lSuccess := .T.
>
> WITH OBJECT ::oAdo
> TRY
> :Update()
> CATCH
> lSuccess := (:Status == adRecOK .OR. :Status == adRecModified )
> IF !lSuccess
> TRY
> :BookMark := :BookMark // Para forzar el error aportando
> información
> CATCH
> // :CancelUpdate() <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< comentado
> ::NewADOError( "ADODB:RecordSet:Update()" )
> END
> ENDIF
> END
> END WITH
>
> ::lOnAppend := .F.
>
> RETURN lSuccess
>
Funciona estupendamente.
¿¿Esto lo vas a poner en el estándar???
Saludos,
José Luis Capel
Gracias por la respuesta.
> Prueba a cambiar lo siguiente:
>
> METHOD Update() CLASS XAdoRecords
>
> LOCAL lSuccess := .T.
>
> WITH OBJECT ::oAdo
> TRY
> :Update()
> CATCH
> lSuccess := (:Status == adRecOK .OR. :Status == adRecModified )
> IF !lSuccess
> TRY
> :BookMark := :BookMark // Para forzar el error aportando
> información
> CATCH
> // :CancelUpdate() <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< comentado
> ::NewADOError( "ADODB:RecordSet:Update()" )
> END
> ENDIF
> END
> END WITH
>
> ::lOnAppend := .F.
>
> RETURN lSuccess
>
Funciona estupendamente.
¿¿Esto lo vas a poner en el estándar???
Saludos,
José Luis Capel