[vfp] Confusión con CURSOR

171 views
Skip to first unread message

Rita Cecila Restrepo De La Hoz

unread,
Mar 3, 2012, 10:27:02 AM3/3/12
to Comunidad de Visual Foxpro en Español
Hola chicos.

Estoy haciendo (Y es un decir, porque tengo una confusión monumental) un lisbox, pero para no mantener abierta la tabla mientras el usuario consulta, según las reglas básicas de programación, se debe hacer un cursor de la tabla, 

Observación: El Lisbox que tengo con el llamado directo desde la tabla funciona. RowSource = "tabla_01.identifica,nombre,apellido", ;

Entonces trato de hacer el cursor así:

Tabla que contiene la información: tabla_01 alias t01 - Campo1 : Identifica, Campo 2 : Nombre, Campo 3 : Apellido
Cursor: consulta_1

Código:

CREATE CURSOR consulta_1 (c_identifica c(11), c_nombre c(15), c_apellido c(15))
APPEND FROM tabla_01FIELDS Identifica,Nombre,Apellido

Pregunta 1
Con esta sentencia el cursor se llena con la información de la tabla_01?
Observación: Lo que deseo hacer es pasar la información total de la tabla al cursor, lógicamente la información identifica(tabla) al c_identifica(cursor), nombre(tabla) al c_nombre(cursor) y apellido(tabla) al c_apellido(cursor).
Inquietud: También se pasan los registros que están marcados como borrados.

Pregunta 2
Si en la tabla_01 tengo un campo lógico, como podría colocar la condicional en el  APPEND FROM que solamente se copien en el cursor los registros en .T. o .F. solamente.

Pregunta 3
Con esta sentencia el LISBOX me muestra el contenido que necesito; RowSource = "tabla_01.identifica,nombre,apellido", ;
Una vez creado el cursor solo debo cambiar en nombre de la tabla y los campos de la tabla por el nombre del cursor y los campos del cursor?

Gracias.

Rita.





Daniel Sánchez

unread,
Mar 3, 2012, 10:31:51 AM3/3/12
to publice...@googlegroups.com
Al menos para mi mas fácil seria la siguiente instrucción

select * from tabla_01 into cursor consulta_1

si quisiera ciertos campos de la tabla_01 seria así

select identifica, nombre, apellido from tabla_01 into cursor consulta_1

ahora si quisiera hacer este cursor modificable seria así

select identifica, nombre, apellido from tabla_01 into cursor consulta_1 readwrite

Saludos

--
Daniel Sánchez Escobar
Investigación y Desarrollo
Reset Software & Sistemas
Móvil +051-949398047
Trujillo - Perú

Daniel Sánchez

unread,
Mar 3, 2012, 10:35:56 AM3/3/12
to publice...@googlegroups.com
Ahora para tu siguientes pregunta para pasar los datos con cumplan cierta condición seria adicionar el where a la consulta presentada

select * from tabla_01 where micampologico=.t. into cursor consulta_1 

o como es lógico solo con indicar el campo copiaría por defecto todo lo que es verdadero

select * from tabla_01 where micampologico into cursor consulta_1 

Y en cuanto a tu última pregunta pues así es indicando la referencia hacia la nueva tabla debería mostrarte los datos en tu listbox

Jorge Javier Gutierrez

unread,
Mar 3, 2012, 10:48:02 AM3/3/12
to publice...@googlegroups.com
Con respecto a "También se pasan los registros que están marcados como borrados.",
incluye "!deleted()" en la línea del append from:

APPEND FROM tabla_01FIELDS Identifica,Nombre,Apellido for !deleted()

Rita Cecila Restrepo De La Hoz

unread,
Mar 3, 2012, 11:01:02 AM3/3/12
to publice...@googlegroups.com
Hola Daniel, espero que este bien y como te envió, sigo insistiendo que tienes en tu país uno de los pocos lugares mas lindos del planeta. Ojo no lo digo por tratar de congraciarme, lo digo de corazón, ese amanecer y ver pasar los rayos del sol por la ventana del templo es sencillamente espectacular, con un grupo nos pegamos la caminada del siglo en la del frente solo para poder apreciar todas las ruinas en general, pero suspendo porque me dejo llevar por mis recuerdos y esto no es un CHAT y me regañan.

Me dices que con

select identifica, nombre, apellido from tabla_01 into cursor consulta_1

No necesito especificar a cuales campos del cursor se pasa la información, lo pasa automáticamente en el mismo orden en que fue creado el cursor?.

identifica, nombre, apellido por ende seria select identifica, nombre, apellido

Pero si quiero el cursor que sea por apellido, nombre e identifica el select seria select apellido, nombre, identifica

Creo que eso es lo que entiendo, estuve buscando sobre creación de cursores en un manual de visual fox, pero solo encontré muy poca información al respecto.

Otra cosa, como hago para que en caso que modifique, ya que tocas el tema con el aparte de modificación, el nombre de un registro del CURSOR, una ves modificado lo pase a la tabla original, sera con tableupdate?

Con esto ya despejo totalmente mis dudas y sigo en tratar de terminar las aplicaciones independientes, para enlazarlas con el form principal y mostrarles el resultado y someterme al escarmiento publico (En el buen sentido de la palabra) Jajaja.

Un saludo afectuoso

Rita

Rita Cecila Restrepo De La Hoz

unread,
Mar 3, 2012, 11:02:54 AM3/3/12
to publice...@googlegroups.com
Daniel se me trabo el teclado no es como te envió sino como te ENVIDIO (pero envidia de la buena) Jajajajajaja

Rita

Antonio Meza

unread,
Mar 3, 2012, 12:11:44 PM3/3/12
to publice...@googlegroups.com
Hola!!! Como te comenta Daniel si pasan los datos en el mismo orden de tu select.

Por otro lado lo que te recomiendo es usar una vista local ya que deseas modificar datos y con la vista local podrás usar el tableupdate o tablerevert, a demás que al diseñar la vista local es como si estuvieras diseñando tu cursor pero mas fácil con el generador de vistas locales.

saludos

Daniel Sánchez

unread,
Mar 3, 2012, 7:44:39 PM3/3/12
to publice...@googlegroups.com
Bueno Rita a mi Colombia me parece también un país espectacular no solo por sus lugares también por su gente y eso es lo más importante que pueda tener un país eso hace que la gente añore tierras así, a parte por supuesto por sus lugares que pueda ofrecer, y no te preocupes a mi me encante leerte siempre así que por mi parte no hay el menor problema por tu parloteo o mejor dicho chateo.

En cuanto al select el orden de los campos que deseas lo puedes indicar tu si utilizas el * te traerá todos los campos de la tabla consultada, también podrías concatenar campos o adicionar campos si necesitas por ejemplo

select alltrim(nombres)+" "+alltrim(apellidos) as nombreyapellido, identifica, 0 as sexo from tabla_1 into cursor consulta_1

ahora el tema de la actualización del cursor creado a la tabla origen pues eso tienes que hacerlo manualmente si trabajas con tablas locales como es tu caso (por ahora), a locales me refiero DBF, podrías al momento de obtener los datos del cursor de la tabla utilizar el numero de fila o registro de la tabla origen por decir

select *, recno("tabla_1") as registro from tabla_1 into cursor consulta_1

en el caso que modifiques el alguna fila del cursor y deseas reflejarlo en la tabla origen al actualizar en el cursor obtienes el numero del registro que hace referencia a la tabla origen ya con ese dato harías lo siguiente

npos=consulta_1.registro
sele tabla_1
go npos
replace .....

los campos a actualizar o algo más fácil estando en el cursor

sele consulta_1
replace ...
replace ...
scatter memo name elregistro    &&con esto toda la información de ese registro pasa a un objeto registro, si no existe dicha variable es creada 
npos=consulta_1.registro
*ahora pasamos a la tabla origen
sele tabla_1
*nos posicionamos en el registro 
go npos
gather name elregistro memo

Y así actualizamos el contenido del registro del cursor en la tabla origen, considera que solo actualizara los campos que coinciden si hay campos de más estos no serán actualizados, tampoco te generara ningún error.

Espero no confundirte más de la cuenta.

TheNewInquirer

unread,
Mar 3, 2012, 8:25:39 PM3/3/12
to Comunidad de Visual Foxpro en Español
Aprovechando el hilo...

Si se crea un cursor con Create Cursor, se vuelve de Lectura
Escritura, es decir, ya no sería necesario especificar Readwrite?...

como sería el caso si se creara el cursor vaciando una consulta select
como ya se indico?..:

select identifica, nombre, apellido from tabla_01 into cursor
consulta_1 readwrite

Funciona para la version 6, o tengo que meterme a los rollos de manejo
de arrays y eso?..

Por otro lado, que tan necesario sería el uso de un cursor en este
caso de Rita..?

Pienso que la tabla se puede dañar cuanto son muchos los datos que se
tienen abiertos en la ram y tal no sea el caso de cuando se tienen
abiertos solo datos estrictamente necesarios y relativamente pocos.
Tal vez me equivoque...

Saludos!

Daniel Sánchez

unread,
Mar 3, 2012, 9:50:55 PM3/3/12
to publice...@googlegroups.com
Así es cuando creas un cursor usando create cursor creas una tabla tipo cursor listo para adicionar, modificar y eliminar registros.
Y si con el select y poniendo al final readwrite el cursor generado de la consulta se vuelve actualizable.
En cuanto si funciona con la versión 6 no te podría decir pero podrías trabajar con into table , la diferencia radica que tendrías que eliminarlo al terminar de usarlo ya que es perenne o persistente una vez creado.
En cuanto a la otra pregunta se lo dejo a rita...

TheNewInquirer

unread,
Mar 3, 2012, 10:15:29 PM3/3/12
to Comunidad de Visual Foxpro en Español
Gracias Daniel,

Pareces ser una persona que sabe mucho y que explica de forma
práctica.

Te agradezco tu tiempo y que compartas tus conocimientos.

Al parecer estaré llevando un Curso de titulación en la uni, tal vez
sea de C# o VB.NET..

Solo por curiosidad, sabes algo de PHP, JAVA, C# o VB.NET..

Quizas pueda hacerte alguna pregunta privada de vez en cuando..

O a lo mejor hagamos algún grupo Web/Movil por ahi, cuando ya sepa más
sobre el tema, claro..jeje

Ahorita todavía me hago enredos con los conceptos como Back End, Front
End, Jquery, JSON, DOM, etc.. pero ya empecé a leer más sobre el tema.

Saludos!

TheNewInquirer

unread,
Mar 3, 2012, 10:16:28 PM3/3/12
to Comunidad de Visual Foxpro en Español

Carlos Miguel FARIAS

unread,
Mar 4, 2012, 10:17:28 AM3/4/12
to publice...@googlegroups.com
Algunas observaciones, muy completas por cierto, a lo que propone Daniel.
Acceder por numero de registro aunque es muy rápido (lo más rápido), si hay muchos usuarios concurrentes, puede que se produzcan algunos problemas. Además esa lógica no es portable si luego quiero pasar mi sistema a un SGBD.
Aunque algunos SGBD permiten el acceso por # de registro, el número de registro puede cambiar, porque generalmente los datos se almacenan en un arbol B (no B+) armado en función de la clave primaria, o sea los datos mantienen fisicamente, la ubicación que les da la clave primaria. Si llegan a insertar registros de clave primaria previos al valor con el que estas trabajando, los números se desplazan.
Si estoy usando SELECT, por que no usar los otros comandos de SQL para manejar los datos, lo único que debo tener cuidado es que cuando actualizo o borro, asegurarme que estoy accediendo por clave primaria (eso es en el WHERE).
Esto lo planteo para los que van encarando proyectos nuevos o estan aprendiendo, porque aunque es posible que VFP se pueda usar un monton de años más como capa visual y negocios, creo que a nivel datos urge migrar a SGBD externos (hay facil 10 muy buenos y muchos gratis).
Por supuesto que todo el manejo entre cursores (que son locales) e interfaz, se puede usar el fox xbase, que es práctico y simple.
Saludos: Miguel, La Pampa (RA)

Daniel Sánchez

unread,
Mar 4, 2012, 12:18:46 PM3/4/12
to publice...@googlegroups.com
Así es Carlos F. lo comentado o sugerido es en base a tablas locales DBF, en el caso de un SGBD lo recomendado es trabajar con claves primarias o números únicos dado por el mismo SGB ademas de poder utilizar otros campos de la tabla a actualizar dentro de un where.

Walter R. Ojeda Valiente

unread,
Mar 4, 2012, 2:22:09 PM3/4/12
to publice...@googlegroups.com
En un buen diseño de la Base de Datos todas, pero absolutamente TODAS las tablas deben tener una clave primaria generada por el mismo SGBD.

Saludos.

Walter.




Date: Sun, 4 Mar 2012 12:18:46 -0500
Subject: Re: [vfp] Re: Confusión con CURSOR
From: resets...@gmail.com
To: publice...@googlegroups.com
Reply all
Reply to author
Forward
0 new messages