Page 1 of 1

PROBLEMAS CON ADO

Posted: Mon Sep 04, 2006 3:57 am
by AntonioCrisostomo
Que tal una vez mas necesito de vuestra ayuda. El dia de ayer baje los ejemplos de coneccion de Ado y MSSql de José Luis Capel.

Bueno para realizar unas prueba, instale MYSQL 5.0 y el conector MYODBC 3.51. Luego cree una base de datos de prueba y una tabla para realizar mis pruebas. Pero al guardar los datos que son capturados en una ventana de dialogo me presenta el siguiente error.

pplication
===========
Path and name: D:\TestAdo\testado.Exe (32 bits)
Size: 595,968 bytes
Time from start: 0 hours 0 mins 25 secs
Error occurred at: 03/09/2006, 22:41:21
Error description: Error ADODB.Recordset/-1 El valor de BOF o EOF es True, o el actual registro se eliminó; la operación solicitada requiere un registro actual.: ADODB.Recordset:BOOKMARK
Args:
[ 1] = O Object
[ 2] = C BOOKMARK
[ 3] = A { ... }


El codigo es el siguiente:

STATIC FUNCTION Grabar(oRs1,oCnx)
local lExis:=.t.
if empty(op:Codigo) .or. empty(op:Nombre)
msginfo('Faltan datos por Capturar...')
return.f.
endif

*--// Grabo en el oRs21 Unicamente (Temporal)
if !oRs21:Find('codigo='+op:Codigo)
oRs21:Append()
oRs21:put('codigo',op:codigo)
lExis:=.f.
endi
oRs21:put('nombre',alltrim(op:nombre))
oRs21:save()
if !lExis
oRs21:oRs:MoveFirst()
endif

*--// Grabo en la Base de Datos
if !oRs1:SeekRs(' SELECT * FROM Clientes WHERE codigo='+op:Codigo,oCnx:oConnection)
oRs1:Append()
oRs1:put('codigo',op:Codigo)
endi
oRs1:Put('nombre',op:Nombre)
oRs1:Put('Direccion',op:Direccion)
oRs1:Put('ruc',op:ruc)
oRs1:save(.t.)
oRs1:close()
return .t.

Soy nuevo trabajando con Ado. Anteriormente estuve realizando alguna u otra aplicacion en Power Builder. Sin embargo, prefiero continuar con fivewin y Xharbour ya tengo varias aplicaciones con esta buena herramienta en tablas dbf pero necesito empezar a trabajar con Ado y Mysql.

Gracias por sus constantes ayudas.

Posted: Tue Sep 05, 2006 6:23 am
by jlcapel
Hola Antonio,

Me aventuro a decir que podría ser que algo está fallando en la lógica de tu programa dado que estás intentado (por la descripción del error) añadir o modificar un registro inválido del recordset. Esto suele pasar cuando estás en BOF o EOF o cuando comienzas a modificar en un registro y te 'mueves' a otro.

No obstante, viendo un poco tu código, veo que programas el acceso a datos a lo xBase cuando estás utilizando un sistema cliente servidor.

Por ejemplo, este código:

Code: Select all

 *--// Grabo en la Base de Datos
if !oRs1:SeekRs(' SELECT * FROM Clientes WHERE codigo='+op:Codigo,oCnx:oConnection)
oRs1:Append()
oRs1:put('codigo',op:Codigo)
endi
oRs1:Put('nombre',op:Nombre)
oRs1:Put('Direccion',op:Direccion)
oRs1:Put('ruc',op:ruc)
oRs1:save(.t.)
Yo empezaría por dejarlo de esta manera:

Code: Select all

LOCAL lResult
Rs1:Append()
oRs1:put('codigo',op:Codigo)
oRs1:Put('nombre',op:Nombre)
oRs1:Put('Direccion',op:Direccion)
oRs1:Put('ruc',op:ruc)
lResult := oRs1:save(.t.)
IF !lResult
   MsgInfo("Ha ocurrido un error: "+oRs1:oError:cDescriptio)
ENDIF
RETURN lResult
En este código no hago ningún tipo de comprobación de existecia o no de duplicidad de registros. Dejo ese trabajo a la base de datos. ¿Como? Pues simplemente añadiendo una restricción tipo PRIMARY KEY que impida tener registros duplicados. En este caso ADO captura el error que arroja la base de datos y puedes actuar en consecuencia (existe una colección Errors así como una serie de propiedades del Recordset que te permiten averiguar el tipo de error). En tu caso concreto puedes capturar el error, ver que se trata de un registro duplicado y, en vez de hacer un append, simplemente modificas el registro (que es lo que creo que quieres hacer).

Espero haberte sido de ayuda.
Saludos,
José Luis Capel