como hacer que las consultas hechas en foxpro sean rapidas?

175 views
Skip to first unread message

magdalena concepcion cañete fretes

unread,
Oct 23, 2010, 7:01:13 PM10/23/10
to Comunidad de Visual Foxpro en Español
hola amigos.....
quisiera saber como optimizar el foxpro en cuanto a las consultas
hechas en postgres....desde la bd es rapidisimo por mas que tenga
muchos registros. ahora a la hora de querer consultar por ejemplo
inventario de todos los productos pertenecientes a un proveedor , me
trae pero con lentitud como puedo hacer para solucionar ese
inconveniente.....hago un select y todos los datos que corresponden a
lo que quiero lo cargo en un cursor y el mismo al reporte....

Walter R. Ojeda Valiente

unread,
Oct 23, 2010, 7:06:58 PM10/23/10
to publice...@googlegroups.com
Hola Maggie

Lo aconsejable en estos casos es ir yendo por partes (como decía don Jack).

O sea, primero haces un SELECT *, luego le vas agregando opciones, hasta encontrar el cuello de botella.

En general, las consultas son lentas cuando no se usan índices o los índices no son los correctos.

Saludos.

Walter.

magdalena concepcion cañete fretes

unread,
Oct 23, 2010, 7:10:25 PM10/23/10
to Comunidad de Visual Foxpro en Español
Hola Walter......
la consulta lo genero en postgres en en un flash me traen los
datos ...ahora el problema en el foxpro cuando quiero traer registros
que deseos esto tarda y no se como solucionarlo Walter....este es el
codigo que utilizo...

vprov = thisform.text1.Value
vresp = MESSAGEBOX("¿Desea imprimir inventario?",1+32+0,"Blue")
vu = thisform.text10.Value
IF vresp = 1
sql1 = " select
p.prod_cod,p.prod_descripcion,m.saldo_stock,m.venci_1,m.venci_2,m.venci_3 ,pro.prov_nom,la.lab_nom,
"+;
" p.proveedor_prov_cod,p.detalle_prov_div_lab_cod "+;
" from producto p "+;
" inner join proveedor pro on pro.prov_cod = p.proveedor_prov_cod
"+;
" inner join detalle_prov_div la on p.detalle_prov_div_lab_cod =
la.lab_cod "+;
" inner join maestro_stock m on p.prod_cod = m.producto_prod_cod
and p.proveedor_prov_cod = ?vprov order by p.prod_descripcion"

bd = SQLConnect("PostgreSQL30")
SQLEXEC(bd,sql1,"vprovinven")
SQLDisconnect(bd)

SELECT vprovinven
COUNT
IF _tally = 0
=MESSAGEBOX("No existe datos para inventario","Blue")
thisform.text1.Value = 0
thisform.text2.Value = " "
thisform.command1.SetFocus
RETURN .f.
ELSE
SELECT vprovinven
GO top
vfecha = DATE()
vhora = dateTIME()
DO WHILE !EOF()
vprod = prod_cod
vcanti = saldo_stock
sql33 = " insert into
inventario(fecha,fecha_grabacion,producto_prod_cod,canti,usuario_usuario_cod)"
sql34 = " values(?vfecha,?vhora,?vprod,?vcanti,?vu)"
sql35 = sql33+sql34
bd = SQLConnect("PostgreSQL30")
SQLEXEC(bd,sql35)
SQLDisconnect(bd)

SELECT vprovinven
SKIP
enddo

REPORT FORM info_inventario.frx to printer prompt prEVIEW
thisform.text1.Value = 0
thisform.text2.Value = " "
thisform.command1.SetFocus
SELECT vprovinven
USE
ENDIF
ELSE
thisform.text1.Value = 0
thisform.text2.Value = " "
thisform.command1.SetFocus
ENDIF

Walter R. Ojeda Valiente

unread,
Oct 23, 2010, 7:16:39 PM10/23/10
to publice...@googlegroups.com
Hola Maggie

¿Por qué te estás conectando y desconectando a cada rato de la Base de Datos? Eso no es instantáneo, toma su tiempo. Si los registros son muchos, el tiempo de estar conectándose y reconectándose puede ser grande.

Prueba conectándote una sola vez (al principio de tu rutina) y desconectándote una sola vez (al final) y me avisas si mejoró la velocidad.

Saludos.

Walter.

magdalena concepcion cañete fretes

unread,
Oct 23, 2010, 7:28:52 PM10/23/10
to Comunidad de Visual Foxpro en Español
Walter cambie un poquito mi codigo....esta muchisimo mas rapido en
serio ...gracias amiguitoooooo....voy a seguir probando otros mas...

vprov = thisform.text1.Value
vresp = MESSAGEBOX("¿Desea imprimir inventario?",1+32+0,"Blue")
vu = thisform.text10.Value
bd = SQLConnect("PostgreSQL30")
IF vresp = 1
sql1 = " select
p.prod_cod,p.prod_descripcion,m.saldo_stock,m.venci_1,m.venci_2,m.venci_3 ,pro.prov_nom,la.lab_nom,
"+;
" p.proveedor_prov_cod,p.detalle_prov_div_lab_cod "+;
" from producto p "+;
" inner join proveedor pro on pro.prov_cod = p.proveedor_prov_cod
"+;
" inner join detalle_prov_div la on p.detalle_prov_div_lab_cod =
la.lab_cod "+;
" inner join maestro_stock m on p.prod_cod = m.producto_prod_cod
and p.proveedor_prov_cod = ?vprov order by p.prod_descripcion"
SQLEXEC(bd,sql1,"vprovinven")

SELECT vprovinven
COUNT
IF _tally = 0
=MESSAGEBOX("No existe datos para inventario","Blue")
thisform.text1.Value = 0
thisform.text2.Value = " "
thisform.command1.SetFocus
RETURN .f.
Else
REPORT FORM info_inventario.frx to printer prompt prEVIEW

SELECT vprovinven
GO top
vfecha = DATE()
vprov = thisform.text1.Value
vhora = dateTIME()
DO WHILE !EOF()
vprod = prod_cod
vcanti = saldo_stock
sql33 = " insert into
inventario(fecha,fecha_grabacion,producto_prod_cod,canti,usuario_usuario_cod)"
sql34 = " values(?vfecha,?vhora,?vprod,?vcanti,?vu)"
sql35 = sql33+sql34
SQLEXEC(bd,sql35)

SELECT vprovinven
SKIP
enddo

thisform.text1.Value = 0
thisform.text2.Value = " "
thisform.command1.SetFocus
SELECT vprovinven
USE
ENDIF
ELSE
thisform.text1.Value = 0
thisform.text2.Value = " "
thisform.command1.SetFocus
ENDIF
SQLDisconnect(bd)

Walter R. Ojeda Valiente

unread,
Oct 23, 2010, 7:35:05 PM10/23/10
to publice...@googlegroups.com
Hola Maggie

Puedes mejorar un poco más la velocidad (aunque quizás la ganancia de tiempo sea muy pequeña) usando un SCAN en lugar del DO WHILE.

Saludos.

Walter.

magdalena concepcion cañete fretes

unread,
Oct 23, 2010, 7:42:28 PM10/23/10
to Comunidad de Visual Foxpro en Español
en serio Walter entonces como lo haria .....seria algo asi.
SCAN
vprod = prod_cod
vcanti = saldo_stock
sql33 = " insert into
inventario(fecha,fecha_grabacion,producto_prod_cod,canti,usuario_usuario_cod)"
sql34 = " values(?vfecha,?vhora,?vprod,?vcanti,?vu)"
sql35 = sql33+sql34
SQLEXEC(bd,sql35)

SELECT vprovinven
SKIP
SCANIF

Walter R. Ojeda Valiente

unread,
Oct 23, 2010, 8:11:23 PM10/23/10
to publice...@googlegroups.com
Hola Maggie

Cuando usas SCAN no usas el SKIP, eso te permite ahorrar algunos milisegundos que si hay muchos registros puede ser significativo.

La sintaxis es:

SCAN [NOOPTIMIZE] [Scope] [FOR lExpression1] [WHILE lExpression2]
  [Commands]
  [LOOP]
  [EXIT]
ENDSCAN

Saludos.

Walter.

Reply all
Reply to author
Forward
0 new messages