PROBLEMAS CON ADO

PROBLEMAS CON ADO

Postby AntonioCrisostomo » Mon Sep 04, 2006 3:57 am

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.
AntonioCrisostomo
 
Posts: 28
Joined: Fri Dec 30, 2005 8:44 pm
Location: Lima-Perù

Postby jlcapel » Tue Sep 05, 2006 6:23 am

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  Expand view  RUN
*--// 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  Expand view  RUN
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
User avatar
jlcapel
 
Posts: 229
Joined: Wed Oct 12, 2005 5:32 pm
Location: Valencia - España


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 44 guests