FoxPro/Visual FoxPro - ¿Me pueden ayudar con esto?

   
Vista:

¿Me pueden ayudar con esto?

Publicado por Andrea (325 intervenciones) el 29/06/2008 20:53:25
Hola a todos
Un amigo a quien le hice un programa para facturar en un mercado, me dice que la impresión de los comprobantes tarda mucho (sobre todo REIMPRIMIR el último comprobante)

Después de buscar encontré que el problema se presenta en ciclo

SCAN

ENDSCAN

en una tabla donde guardo cada item facturado (y sus datos).

Luego busco los items facturados en la última factura, los re-imprimo y modifico los campos que guardan la última fecha de impresión.

-¿No es preferible usar un SET FILTER TO en la tabla de MOVIMIENTOS?
-¿o me conviene más hacer un CURSOR a partir de SELECT SQL?
- Si conviene el último caso ¿cómo hago para que al modificar el CURSOR me modifique también la tabla madre?

Un detalle: La tabla en cuestión guarda aproximadamente casi 1 MILLÓN de registros por año

Saludos y gracias por las ayudas!!!

PD: Podría probar cada una de las alternativas, pero como el programa está funcionando tengo miedo de generar problemas.
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:¿Me pueden ayudar con esto?

Publicado por Marvin Emilson Pineda (75 intervenciones) el 29/06/2008 22:41:08
Hola Andrea,

yo me apunto con la segunda opción usar la sentencia SQL tanto para imprimir como para reimprimir la factura... pero!!!... ahi otro punto que considerar... hablas de 1 millon de registros por año!!!!... Wow!!!... que vende eh!!! bueno, volviendo al tema... mmmm... usando sentencias SQL tambien sera lento pero no para imprimir si no para recuperar la información de la tabla lo que cual esta volviendo lento el proceso de reimprimir, te sugiero mejor que utilizes indices estos podrian ajilizar este proceso.

Como?
Imaginate que tienes una tabla de detalle de facturas que en este caso sera la mas grande, estaba debera estar indexada por los sigueinte campo "NumeroFactura" en caso de llamarse asi... y el bloque de código quedari asi

*!! cursor tempora para reimprimir
Create Cursor Temp (Producto c(20), Descripcion c(40), PrecioVenta n(10,2))

*!! buscar detalle de factura
nBuscarFactura = 101
Seek nBuscarFactura Order NumeroFactura In DFactura
IF FOUND("DFactura") then
SCAN WHILE NumeroFactura = nBuscarFactura
INSERT INTO Temp (Producto, Descripcion, PrecioVenta) VALUES (DFactura.Producto, DFactura.Descripcion, DFactura.PrecioVenta)
ENDSCA
ENDIF

La mejoria en la busca la tendras si utilizas indices, mencionas que el ciclo puede ser el problema... podria... si no utilizas indices, prueba ahora con indices a ver como funciona...

espero te sirva
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

Gracias pero...

Publicado por Andrea (325 intervenciones) el 29/06/2008 23:26:15
Gracias EMilson

En realidad, el casi millón de registros se llega en un año ya que son los items facturados (se guardan todos) como dije, es de un supermercado. Son menos de 800 registros diarios por caja

De todas formas, me gustaría ver lo de la reimpresión

- HAGO UNA BÚSQUEDA CON EL ÚLTIMO Nº DE FACTURA Y CAJA

- SI LO ENCUENTRO TOMO ESO DATOS Y LOS GUARDO EN VARIABLES PARA IMPRIMIR

- LUEGO HAGO EL SCAN / ENDSCAN para BUSCAR LOS ITEMS CORRESPONDIENTES A ESA FACTURA
***- esta es la parte que tarda mucho

Por eso pensé en el cursor con una sentecia SQL que me achique los datos pero antes de que haga este cambio NECESITARÍA SABER SI LA TABLA BASE se modifica al modificar el CURSOR. ¿¿¿ ????

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:Gracias pero...

Publicado por Saul (El Guatemalteco) (676 intervenciones) el 30/06/2008 03:28:21
La idea de imprimir algo es
que primero lo guardes, cuando guardas cada item guarda la fecha o todo lo que tengas que guardas..

y guardas en tu encabezado de factura la hora y fecha de impresion no en cada item.

luego haces un selec.

Selec * from DetalleFac;
inner join CabeceraFac on NoDeta=NoCabe;
Into cursor;
Where NoCabe = TuFacActual

Eso te servira para imprimir

Suerte
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:Gracias pero...

Publicado por kong (681 intervenciones) el 30/06/2008 11:03:00
el select sql no modifica la tabla base.
- si necesitas reimprimir frecuentemente la misma factura, porque no guardarla en un cursor o tabla temporal en la terminal y solo tomas los datos guardados de "solo esa factura" y la reimprimes.
- el select sql es bastante rapida, no creo que se demore mas de medio segundo en tomar un grupo de items....... En mi restaurante existe cerca de 300 tickets por dia, y cada una debe de tener 3 o 4 items de promedio, y los resultados son instantaneos.
- lo que hago es cerrar cada jornada (cada dia) y paso los registros a otra tabla historial. Con eso la tabla de los items vendidos resultaria bastante mas liviana.
- y lo mas importante (creo) es que la tabla este indexado por "numero de ticket"
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:Gracias pero...

Publicado por jose camilo (688 intervenciones) el 30/06/2008 15:56:12
estoy de acuerdo con kong
tengo un sistema en un super y al cerrar cada mes se baja a un archivo de historia y eso hace el sistema bien liviano.
tu solucion es pasar a historia cada .T. tiempo quizas cada mes o dos
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:Gracias pero...

Publicado por Marvin Emilson Pineda (75 intervenciones) el 30/06/2008 16:26:02
entiendo... pero fijate bien lo que dices?

dices:

1)
Hago una busqueda con el ultimo numero de factura y caja. la pregunta es, recorres toda la tabla para saber cual es la última... o tienes un form donde preguntas al usuario que numero de factura decea reimprimir? o!!!... muestras una lista de facturas hechas por el cajero del día actual y de alli seleccionas la factura que deceas reimprimir o imprimir como les guste llamarlo.

2)
Luego hago el scan/endscan para buscar los Items correspondientes a esa factura. esto significa que recorres toda la tabla comparando items para saber si son los de la factura que deceas reimprimir?

si es así pues pueda que esto la este volviendo lento... poreso te digo usa indices para buscar la información, los indices son más rapidos aún más rapidos que utilizar una sentencia SQL...

si es como te lo planteo implementa indices, de lo contrario seria buena tener un mejor detalle de como lo estas haciendo...

Saludos y en espera de tus comentarios para seguirte ayudando
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

Gracias a todos... 1 duda más

Publicado por Andrea (325 intervenciones) el 30/06/2008 23:44:34
En verdad les agradezco a todos las sugerencias.
Voy a probar lo que me dicen

No que no me queda claro es cómo actualizar la base madre utilizando cursores.

Imagino que con el otro sistema (índices) es obvio pero no lo sé con cursores.

¿Es más rápido usar SEEK( ) (es decir índices) que Select SQL?

Muchas 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:Gracias a todos... 1 duda más

Publicado por Plinio (7771 intervenciones) el 30/06/2008 23:46:00
Si, el indice es mas rapido. (pero muuuuucho mas rapido)
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