No se puede actualizar el objeto cursor

No se puede actualizar el objeto cursor
Tengo un problema en actualizar un cursor, me sale : NO SE PUEDE ACTUALIZAR EL OBJETO CURSOR
Para que me ayuden les doy más datos:
Tengo 2 formularios
1principal
2SELE_DETALLES
El form 1PRINCIPAL, crea el cursor:
curPpf(cdg_prod,des_prod,can_ped,obs_ped ,num_sec)
Y asigna ese cursor con el recordsource a un grid, existe en el form 1PRINCIPAL
un botón de agregar que abre el form 2SELE_DETALLES, ahí se selecciona datos y inserta esos datos al cursor curPpf
Todo bien hasta ahí, lo hace perfectamente.
Ahora bien dentro del form 1PRINCIPAL, tengo una opción para ver registros anteriores al poner el numero del registro, lo cuales cargan con un selec con su respectivo where de la tabla principal y lo insertan al cursor curPpf los datos, y de igual forma lo asigna al grid mediante recordsource
EL PROBLEMA VIENE AQUÍ,
Luego deseo agregar datos a ese registro por lo cual con botón de agregar abro el form 2SELE_DETALLES, selecciona datos e inserta esos datos nuevos y ahí me sale el mensaje: NO SE PUEDE ACTUALIZAR EL OBJETO CURSOR
Es decir que si lo hago uno nuevo si inserta, pero si lee un anterior registro del form principal y quiere agregar datos al cursor ahí sale el mensaje,
Alguna idea de como solucionarlo, estuve investigando y creo que va por el uso del buffer, o el CURSORSETPROP( ), pero no le logro dar.

9 Respuestas

Respuesta
1
Espero poder ayudarte:
Hay varios motivos para este error, pero lo más probable es que te este pasando que al cursor lo creas con select-sql.
Es así: Si lo creas con el siguiente comando, el cursor se crea de lectura y escritura, como una tabla pero temporal:
Create cursor miCursor (nombre c(30), precio n(10,2))
Ahora si los datos esos vienen de una consulta, el cursor que se crea es de solo lectura, si usas el siguiente comando:
select nombre, precio from articulos into cursor miCursor
Para que el cursor que se arma desde un select pueda ser de lectura y escritura, al final del comando agregale ReadWrite:
select nombre, precio from articulos into cursor miCursor readwrite
Ahora, te cuento un truco para que tu grid no quede desafectada del cursor cuando lo volvés a generar:
Si lo vas a tomar de una consulta, hace así:
Supone que el grid tiene dos columnas; a estas columnas le pones nombres; por ejemplo: Nombre y Precio, entonces tu código, donde arma la consulta y muestra de nuevo el grid debería ser así:
with thisform
   with .lista &&suponiendo que se llama lista el grid
         .recordSource=""
         .nombre.controlSource=""
         .precio.controlSource=""
   endwith
   select nombre, precio from articulos into cursor miCursor READWRITE
  with .lista
      .recordSource="miCursor"
      .nombre.controlSource="miCursor.nombre"
      .precio.controlSource="miCursor.precio"
      .refresh
   Endwith
Endwith
De esta manera te aseguras de desaftar el grid del cursor antes de volverlo a hacer.
Espero haberte podido ayudar y si es así, por favor cerrá la pregunta.
Estamos en contacto
Excelente man,
el tema es el readwrite, solo una acotación, solo esta disponible a partir de VPF7.0, yo solo tengo el 6.0, hay una función pa mejorar eso, pero si no fuese mucha molestia puedes pasármelo, por http://rapidshare.com, mi correo es [email protected].
Saludos
Respuesta
1
te recomiendo hacer el cursor con select * from x xx into cursor qweasd readwhite
La propiedad readwhite te deja editar el cursor sin ningún problema, la otra opción es que generes una tabla temporal durante el tiempo de vida del programa y al finalizar este la elimines
Saludos! 11
Respuesta
1
Según lo que mencionas me parece que la primera vez creas el cursor con CREATE CURSOR(todos los campos) y después usas un SELECT de la tabla principal, mi observación es
1. Usas un SELECT y creas otro cursor para luego insertar los registros al cursor Ppf, si usas esta opción no debes tener problemas, ejemplo
Select  [campos] From tablaprincipal Into Cursor xx
Select("ppf")
Append from dbf("xx")
2. Usas un SELECT y creas nuevamente el cursor Ppf aquí puede ser que tengas problemas al no usar REWRITE en el SELECT, usa el siguiente ejemplo
Select [campos] From tablaprincipal Into Cursor ppf ReadWrite
Espero sea lo que necesitas, modifica los ejemplos según tus necesidades
Respuesta
1
Mmm... mira amigo el problema esta en que el cursor no se puede actualizar verdad... entonces mejor usa una tabla... EJ...
select * from tabla 1 where condicion1 and condicion2 order by campo1 asc into table nombre_tabla
para que el resultado aparezca en el grid..
thisform.grid1.recorsourcetype=1
thisform.grid1.recorsource="nombre_tabla"
En el init del form usa:
Set Safety Off && Como se crea una tabla que ya existe te va a pregunta si deseas reemplazarla para evitar eso se aplica este SET...
Espero haberte ayudado un poco...
Para cualquier duda mi e-mail:
[email protected]
Suerte...
Respuesta
1
Amigo se puede pero la verdad deberías escribir mucho código para llegar allá te recomiendo hagas una llave autoincremental que identifique al registro como único y al actualizar el registro corras un update con la condición de esa llave.
¿Estas trabajando tablas de fox o una base de datos externa?
Feliz día!
Respuesta
1
Bueno la verdad no entiendo mucho tu problema, pero mira yo siempre uso un cursor solo para extraer datos que son de solo lectura ya al momento de insertar si uso los datos de ese cursor pero para grabarlos uso generalmente el INSERT y si es de actualizar uso el UPDATE ambas instrucciones sql y de esa manera nunca he tenido problemas, no se si de pronto eso te sirva de ayuda
Gracias por tu respuesta,
El problema que tengo es cuando extraigo datos de una tabla esta la asigno a un cursor, y luego quiero insertar más registros a ese cursor, ¿cómo le hago?
Saludos
Es que justamente los cursores al menos yo los uso solo como consulta más no para insertar datos en ellos, ahí intervienen otras propiedades como CURSORSETPROP() pero si te dan muchos problemas seria mejor probar otra alternativa como por ejemplo crear una tabla temporal con la misma estructura del cursor e insertar los datos en esa tabla temporal usando INSERT
Muchas gracias amigo me distes muchas pautas, pero lo que busco es lo siguiente:
Las consultas son de solo lectura pero a partir de VFP7, puedes adicionarle al final de la consulta READWRITE, que lo hace de lectura y escritura, pero para los que como yo manejo el VFP6.0 hay una super función:
*--------------------------------------------------
FUNCTION _Actualizable(tcAlias)
*--------------------------------------------------
* Hace actualizable un cursor
* USO: _Actualizable("MiCursor")
* PARAMETRO:
*    tcAlias = Alias del cursor
*--------------------------------------------------
LOCAL lcAliasTmp, lcAliasAnt
lcAliasAnt = ALIAS()
IF EMPTY(tcAlias) OR NOT USED(tcAlias)
  WAIT WINDOW NOWAIT " No existe el alias "
  RETURN
ENDIF
lcAliasTmp = SYS(2015)
USE DBF(tcAlias) IN 0 SHARE AGAIN ALIAS (lcAliasTmp)
USE DBF(lcAliasTmp) IN (tcAlias) SHARE AGAIN ALIAS (tcAlias)
USE IN (lcAliasTmp)
IF NOT EMPTY(lcAliasAnt)
  SELECT (lcAliasAnt)
ENDIF
RETURN
endfunc
Y solucionado mi tema, gracias
Respuesta
Bueno yo manejo cursores de otra forma pero si tiene que ver con cursorsetprop() una vez agregues un registro al cursor dale TABLEUPDATE(.t.) bueno antes de registrar uno nuevo.
Respuesta
No capte muy bien la idea.. perdona.. quizás me falto leerlo otra vez. Pero si intente tres veces.
Creo que debo preguntar algunas cosas antes de contestar.
esta utilizando se exclusive off en tu porograma? (si no sabes.. metele la instruccion
set exclusive off, en algun lugar durante el inicio de la forma 1 y si es necesario en la 2.
Si esto anterior te corrige el problema entonces va por ahí la solución, ya que quizás estas utilizando de forma probada la tabla o cursor en la forma 1, y en la forma 2 ya no puede actualizar el cursor.
¿Por otra parte queria preguntar
estas utiilizando Begin transaction y end transaction? Quizas por ahi tambien este el problema. Pero espero tu respuesta para ampliar mas mi diagnostico.
A mi me ha ocurrido esto principalmente porque utilizo las tablas y/o cursores sin especificar que las abro de forma compartida, y es por ello que ocurre el problema, ¿también necesitaría saber
exactamente en que linea de código te envía ese mensaje de error?
Respuesta

Estoy desarrollando una aplicacion con vfp9 y al final del select use el readwrite... gracias pude solucionar mi problema, ahora si puedo hacer modificaciones en el grid

SELECT almaingre.prod_codi, productos.prod_nomb AS PRODUCTO,;

almaingre.prod_solic as solicitado, almaingre.comp_cant as atendida,;
areas.nombarea as quiensolicita,fech_compr as fecha,compfactu,tipo ;
FROM almaingre ;
LEFT OUTER JOIN productos ON almaingre.prod_codi=productos.prod_codi ;
left OUTER JOIN areas ON almaingre.codisecc=areas.codiarea ;
where almaingre.numeorden=xnumerovalesalida and tipo=0 and compfactu=' ' into CURSOR modificavale READWRITE

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas