FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour PROBLEMAS CON ADO
Posts: 28
Joined: Fri Dec 30, 2005 08:44 PM
PROBLEMAS CON ADO
Posted: Mon Sep 04, 2006 03: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.

Posts: 229
Joined: Wed Oct 12, 2005 05:32 PM
PROBLEMAS CON ADO
Posted: Tue Sep 05, 2006 06: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:

 *--// 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:
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

Continue the discussion