FoxPro/Visual FoxPro - optimizar cursor...

 
Vista:
sin imagen de perfil

optimizar cursor...

Publicado por neo (1604 intervenciones) el 17/07/2008 19:03:28
Le ha pasado que al crear una Consulta mediante Select,

Ej:

Select *from mi_tabla where id=thisform.text1.value into cursor My_cursor
If Found()
browse
endif

en aplicaciones multiusuario se crea muy lento...como unos 8 seg

Es normal??

Gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:optimizar cursor...

Publicado por sergio (737 intervenciones) el 17/07/2008 19:34:36
Preguntas por if found()

Me parece que le estas errando el found() es para ver si encontro algo

mejor preguntyaria si el cursor tiene resultatados
por eje con el reccount() que te da la cantidad de registros

o _tally para ver si arrojo resultados

puede ser eso lo que te esta enlenteciendo no el select
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

RE:optimizar cursor...

Publicado por neo (1604 intervenciones) el 17/07/2008 19:52:45
Ok. Gracias, me confundí con el Select * el If Found() lo utilizo con la funcion Seek
Ejemplo:

Select mi_tabla
Set order to clave
x1=Thisform.txtclave.value
Seek x1
If Found()

condicion si encontró algo

else
falso
endif

*******************************************

El asunto es en las consultas SQL

Ejemplo de consultas:

SELECT *from base WHERE sector==ALLTRIM(Thisform.combo1.Value) INTO CURSOR cQuer1

Nota:
en la pc local o "server" funciona bien la consulta la realiza rapido. pero en una terminal se tarda como 1 minuto y medio...mas o menos.
La tabla tiene como 30,000 registros, tengo activado el shared. todo la aplicacion funciona bien nada de lentitud, solo en las consultas SQL into cursor es donde se pone lento. por eso utilizo el "BROWSE FIELDS" en lugar de cursor...
►►Aunque insisto que algo estoy haciendo mal con los cursores.

Pero si lo hago asi:

Select mi_tabla
Set order to clave
x1=Thisform.txtclave.value
Seek x1
If Found()
Browse Fields clave, nombre noedit nodelete
Si funciona de maravilla

Mi Pregunta es:
¿porque el Browse es mas rapido que el Select *from into cursor??

Y como solucionar el asunto del Cursor en Red.

¿Cual sería la mejor forma de trabajar con Consultas en Red??


Gracias de nuevo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:optimizar cursor...

Publicado por enrique (1041 intervenciones) el 17/07/2008 21:25:40
El tema es que el Select vuelve a consultar las tablas en el equipo origen por lo tanto vuelve a traer todos los registros, pero a pesar de eso me parece que tenes problemas con la conexión de red.

La manera que yo utilizo para consultas es :
- crear un Form
- dentro del Form crear un Grid donde pones los datos que necesitas de tu tabla
- poner el Grid como ReadOnly

y listo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

RE:optimizar cursor...

Publicado por neo (1604 intervenciones) el 18/07/2008 17:02:56
Gracias compañero, pero no utilizo grids por el espacio en el formulario, y la verdad se me hace mas sencillo que en el mismo formulario vean las consultas para que el usuario tome una desicion, y no tener que sacarlo del formulario para ver una consulta y despues regresarlo.

Te explico la función de la pantalla:

1.- El cursor se posiciona en un textbox llamado id
2.- El usuario escanea por medio de codigo de barras y en el textbox tengo la funcion Seek para buscar el numero escaneado.
3.- Si el nombre ya se capturó anteriormente, debe aparecer un mensaje diciendo que el nombre ya se registro y le hace una pregunta "Desea ver los datos del nombre?
4.- Si el usuario dice si, ES AHI DONDE HAGO LA CONSULTA Y CREO EL CURSOR, con la finalidad de que muestre solo el nombre capturado.

5.- Si no está el nombre capturado, entonces extrae por medio de la funcion Seek los datos del nombre.

6. Guarda y listo.

Si observas, te darás cuenta que el Cursor lo necesito solo para hacer referencia a lo YA CAPTURADO, y que solo aparezca el dato en cuestion.
Pero me he topado que el Select *From ....se tarda un poco, mas si en cambio con el Browse Fields funciona perfecto, pero con el inconveniente que muestra todos los datos, pero claro está seleccionando el nombre capturado.

Y yo solo deseo que muestre el nombre buscado.

Gracias...

Si desean les paso una imagen de como está estructurado la pantalla.

Voy a postear el codigo de busqueda para que le den una revisada

Gracias►
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:optimizar cursor...

Publicado por Plinio (7841 intervenciones) el 17/07/2008 22:24:07
Ya probaste poniendo SET OPTIMIZE ON en tu programa principal?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

RE:optimizar cursor...

Publicado por neo (1604 intervenciones) el 18/07/2008 16:53:11
No, aun no lo he probado

Pero lo que no termino de entender es:

Porqué si funciona bien el Seek y luego el Browse Fields y el
Select *from Mi_tabla where id=Thisform.clave.value into cursor My_cursor ...
ESTÁ LENTISIMO!!

Es normal SI o NO?? Diganme por fa, si es normal o no..
(Se tarda como minimo unos 15 segundos)

Nota: Trabajo con VFP9, Computadora Server, con 4 Terminales (Todas Nuevas)
Con procesador Intel Core2. La Red es inalambrica...

Pero como dije antes, no puede ser ni la red, ni las pcs, porque todo el programa funciona muy bien, solo el Select *From Mi_tabla Where..... Es lento...

Otra cosa, para poder contar en red que otra funcion es similar a Count??

O como puedo contar registros por criterios?? en red??

Gracias...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

RE:optimizar cursor...

Publicado por neo (1604 intervenciones) el 18/07/2008 16:53:12
No, aun no lo he probado

Pero lo que no termino de entender es:

Porqué si funciona bien el Seek y luego el Browse Fields y el
Select *from Mi_tabla where id=Thisform.clave.value into cursor My_cursor ...
ESTÁ LENTISIMO!!

Es normal SI o NO?? Diganme por fa, si es normal o no..
(Se tarda como minimo unos 15 segundos)

Nota: Trabajo con VFP9, Computadora Server, con 4 Terminales (Todas Nuevas)
Con procesador Intel Core2. La Red es inalambrica...

Pero como dije antes, no puede ser ni la red, ni las pcs, porque todo el programa funciona muy bien, solo el Select *From Mi_tabla Where..... Es lento...

Otra cosa, para poder contar en red que otra funcion es similar a Count??

O como puedo contar registros por criterios?? en red??

Gracias...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:optimizar cursor...

Publicado por Dario (96 intervenciones) el 19/07/2008 02:34:50
Yo en particular lo realizao asi ;
Por ejemplo en una base donde tengo las facturas de compras de los proveedores (mas de 150000 registros), y quiero ver las facturas de un proveedor determinado ;

SET ORDER TO CODIGO &&STR(EMPRESA,3)+TIPO+STR(PROVEEDOR,6)+LETRA+STR(SUCURSAL,4)+STR(NUMERO,8)

seek str(1,3)+'FAC'+STR(1210,6)
do while proveedor=proveedor and !eof()
copio lo que necesito al cursor
skip
enddo

De esta forma solo recorro una pequeña parte de la base

Espero se entienda y te ayude

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar