Filtro por fecha

Hola buen día y feliz año, estoy haciendo el siguiente programa:
SET SAFETY OFF
CLOSE DATABASES
SET CENTURY ON
SET DATE TO british
ncorr=0
IF File("h:\ruta\regventa.dbf")
    DELETE FILE h:\librosvarios\data\temp.dbf
ENDIF
CREATE TABLE h:\librosvarios\data\temp;
( n_corr n(6,0), fec_emi d(8),fec_venc d(8), tipo c(2), serie n(3,0), numero n(8,0),;
tipo_doc c(2), num_doc c(11), cliente c(20), bimponi n(10,2), fact n(10,2), bol n(10,2), igv n(10,2), total n(10,2) )
cTotfa="d:\ruta\A"
USE (cTotfa) SHARED AGAIN
COPY TO d:\ruta\temporal FOR MONTH(fec_emi)= MONTH(DATE()) AND YEAR(fec_emi)=YEAR(DATE())
cTemp="d:\ruta\temporal"
USE (cTemp) SHARED AGAIN
Index On facnro TO (cTemp)
cSfactura="d:\ruta\B"
USE (cSfactura) SHARED AGAIN
COPY TO d:\ruta\temporal1 FOR MONTH(fec_v)=MONTH(DATE()) AND YEAR(fec_v)=YEAR(DATE())
cTemp1="d:\ruta\temporal1"
USE (cTemp1) SHARED AGAIN &&EXCLUSIVE
Index On inscrinrx TO (cTemp1)
cNotas="d:\ruta\C"
USE (cNotas) SHARED AGAIN &&EXCLUSIVE
COPY TO d:\pruebas\sici\catastro\temporal2 FOR MONTH(fec_ven)=MONTH(DATE()) AND YEAR(fec_ven)=YEAR(DATE())
cTemp2="d:\ruta\temporal2"
USE (cTemp2) SHARED AGAIN
Index On inscrinrn TO (cTemp2)
cConexion="d:\ruta\conexion"
USE (cConexion) SHARED AGAIN
Index On inscrinro TO (cConexion)
cReg="h:\librosvarios\data\temp"
USE (cReg) SHARED AGAIN
Index On n_corr TO (cReg)
CLOSE DATABASES
Select 1
Use (cTemp) Index (cTemp)+".idx" Alias t01 Share
Select 2
USE (cTemp1) INDEX (cTemp1)+".idx" ALIAS t02 share
Select 3
USE (cTemp2) INDEX (cTemp2)+".idx" ALIAS t03 share
Select 4
Use (cConexion) Index (cConexion)+".idx" Alias t04 Share
Select 5
Use (cReg) Index (cReg)+".idx" Alias t05 Share
Select 1
Do While !Eof()
     Select 5
     Seek(t01->inscrinrx)
     If !Found()
        Append Blank
        replace n_corr WITH RECNO()
        replace fec_emi With t01->facemifec
        replace fec_venc With t01->facvenfec
        replace tipo WITH "14"
        replace serie WITH t01->facsernro
        replace numero WITH t01->facnro
        replace tipo_doc WITH "1"
        replace cliente WITH IIF( Seek(ALLTRIM(t01.inscrinrx),"t04"), Subst(Alltrim  (t04.clinomx),1,40), "No Hay Cliente")
   replace bimponi WITH t01->factotal
ENDIF
SELECT 1
SKIP
enddo
close databases
Consideraciones:
Como hago para evitar el copy to ya que hago esto para filtrar los registros por mes y año de acuerdo a la fecha del sistema, que sucede si quieren un reporte de un mes pasado tuviera que cambiar la fecha del sistema manualmente, en las tres tablas almacenan registros de todos los años. Quiero colocar dos combos uno para elegir el mes y el otro para el año por ejem elijo mes "11" y 2008 de acuerdo a lo que elijo en los combos tuviera que filtrarlos en las tablas. La tabla A tiene el campo fec_emi, B el campo fec_v y C el campo fec_ven Espero haber sido explicito. Espero tu apoyo. Gracias.

1 Respuesta

Respuesta
1
He leído tu programa y no lo entiendo,
usas mucho USE (archivo) AGAIN, no necesitas emplear esta instrucción a cada momento o ¿estas usando FOXBASE?
1) En lugar de CREATE TABLE usa CREATE CURSOR,
y elimina las sentencias
IF File("h:\ruta\regventa.dbf")
DELETE FILE h:\librosvarios\data\temp.dbf
Endif
Ya que el cursor se borra cuando termina el programa
2) Para seleccionar un periodo de fechas usa
SELECT * FROM (tabla_x);
WHERE BETWEEN(tabla_x.fecha,fecha_desde, fecha_hasta);
INTO CURSOR cTabla_y READWRITE
En donde fecha_desde y fecha_hasta son campos fecha tomados de un formulario
si puedes proporcionarme más información para una mejor ayuda.
Hola, haber como te explico tengo un formulario con dos cajas de texto uno para ingresar el mes y otro para ingresar el año la idea es abrir las tablas si es que vale el termino de acuerdo a lo que elijo en las cajas de texto por ejem si dígito "11" y "08" las tablas (A, B, C,) tuviera que filtrarlas para noviembre del 2008, he agregado un option group (grupo de opciones) una opción para elegir vista preliminar y la otra para enviar a la impresora, cada vez que hago clic en una de estas opciones llamo aun método (thisform. Ventas), tengo dos botones de comando aceptar y cancelar cuando pulso aceptar puedo ver la vista preliminar o el envío a la impresora dependiendo de la opción que haya elegido.
En conclusión cargo el formnulario ingreso mes y año en las cajas luego elijo uno de las dos opciones vista preliminar o envío a la impresora, el método ventas me genera un archivo final (temp) y a partir de ese archivo temp genero mi reporte y también envío a la impresora.
Los campos fecha de las tablas son fec_emi - tabla A, Fec_v - Tabla B y fec_ven - Tabla C
El método ventas contiene estas lineas:
close databases
SET CENTURY ON
SET DATE TO british
ncorr=0
IF File("h:\ruta\temp.dbf")  &&Esta es la tabla final para vista preliminar o impresora
DELETE FILE h:\librosvarios\data\temp.dbf
ENDIF
CREATE TABLE h:\librosvarios\data\temp;
( n_corr n(6,0), fec_emi d(8),fec_venc d(8), tipo c(2), serie n(3,0), numero n(8,0),;
tipo_doc c(2), num_doc c(11), cliente c(20), bimponi n(10,2), fact n(10,2), bol n(10,2), igv n(10,2), total n(10,2) )
cTotfa="d:\ruta\A" && Abro la tabla principal
USE (cTotfa) SHARED AGAIN
COPY TO d:\ruta\temporal FOR MONTH(fec_emi)= MONTH(DATE()) AND YEAR(fec_emi)=YEAR(DATE()) && Hago un copy de acuerdo a la fecha del sistema, lo mismo para las demas tablas.
cTemp="d:\ruta\temporal"
USE (cTemp) SHARED AGAIN
Index On facnro TO (cTemp)
cSfactura="d:\ruta\B" &&Tabla principal
USE (cSfactura) SHARED AGAIN
COPY TO d:\ruta\temporal1 FOR MONTH(fec_v)=MONTH(DATE()) AND YEAR(fec_v)=YEAR(DATE())
cTemp1="d:\ruta\temporal1"
USE (cTemp1) SHARED AGAIN &&EXCLUSIVE
Index On inscrinrx TO (cTemp1)
cNotas="d:\ruta\C" &&Tabla principal
USE (cNotas) SHARED AGAIN &&EXCLUSIVE
COPY TO d:\pruebas\sici\catastro\temporal2 FOR MONTH(fec_ven)=MONTH(DATE()) AND YEAR(fec_ven)=YEAR(DATE())
cTemp2="d:\ruta\temporal2"
USE (cTemp2) SHARED AGAIN
Index On inscrinrn TO (cTemp2)
cConexion="d:\ruta\conexion"
USE (cConexion) SHARED AGAIN
Index On inscrinro TO (cConexion)
cReg="h:\librosvarios\data\temp" &&Tabla final a partir de esta tabla genero el reporte o envio a la impresora
USE (cReg) SHARED AGAIN
Index On n_corr TO (cReg)
CLOSE DATABASES
&&Abro las tablas con sus indices
Select 1
Use (cTemp) Index (cTemp)+".idx" Alias t01 Share
Select 2
USE (cTemp1) INDEX (cTemp1)+".idx" ALIAS t02 share
Select 3
USE (cTemp2) INDEX (cTemp2)+".idx" ALIAS t03 share
Select 4
Use (cConexion) Index (cConexion)+".idx" Alias t04 Share
Select 5
Use (cReg) Index (cReg)+".idx" Alias t05 Share
Select 1 && Tabla A
Do While !Eof()
Select 5   && Tabla temp
Seek(t01->inscrinrx)
If !Found()
Append Blank
replace n_corr WITH RECNO()
replace fec_emi With t01->facemifec
replace fec_venc With t01->facvenfec
replace tipo WITH "14"
replace serie WITH t01->facsernro
replace numero WITH t01->facnro
replace tipo_doc WITH "1"
replace cliente WITH IIF( Seek(ALLTRIM(t01.inscrinrx),"t04"), Subst(Alltrim (t04.clinomx),1,40), "No Hay Cliente")
replace bimponi WITH t01->factotal
ENDIF
SELECT 1
SKIP
ENDDO
CLOSE DATABASES
Si solo necesitas usar archivos temporales
los cursores son archivos que se borran cuando finaliza tu programa,
según tu explicación las siguientes lineas mejoran tu programa,
Saludos.
*** Genera el archivo temporal en donde acumulas los datos y lo indexas
CREATE CURSOR cTemp( n_corr n(6,0), fec_emi d(8),fec_venc d(8),;
tipo c(2), serie n(3,0), numero n(8,0),;
tipo_doc c(2), num_doc c(11), cliente c(20),;
Bimponi n(10,2), fact n(10,2), bol n(10,2), igv n(10,2), total n(10,2))
INDEX ON n_corr TAG codigo ADDITIVE
*** Selecciona la informacion de acuerdo al mes y año
*** mi_year y mi_mes son los campos de tu formulario, ambos deben ser numericos
SELECT * FROM TablaA;
INTO CURSOR cTablaA;
WHERE YEAR(fec_emi)=mi_year .AND.;
MONTH(fec_emi)=mi_mes
** Aqui indexas la tabla A
SELECT * FROM TablaB;
INTO CURSOR cTablaB;
WHERE YEAR(fec_v)=mi_year .AND.;
MONTH(fec_v)=mi_mes
** Aqui indexas la tabla B
SELECT * FROM TablaC;
INTO CURSOR cTablaC;
WHERE YEAR(fec_ven)=mi_year .AND.;
MONTH(fec_ven)=mi_mes
** Aqui indexas la tabla C
** Seleccionas la tabla A y lees, esto en lugar de DO WHILE
SELECT("cTablaA")
SCAN
IF !SEEK(t01.codigo,"cTemp","codigo")
APPEND BLANK IN cTemp
REPLACE n_corr WITH RECNO();
fec_emi WITH cTablaA.facemifec;
fec_venc WITH cTablaA.facvenfec;
tipo WITH "14";
serie WITH cTablaA.facsernro;
numero WITH cTablaA.facnro;
tipo_doc WITH "1";
bimponi WITH cTablaA.factotal;
cliente WITH IIF( Seek(ALLTRIM(t01.inscrinrx),"t04"), Subst(Alltrim (t04.clinomx),1,40), "No Hay Cliente");
IN cTemp
Endif
Endscan
*** luego borras los temporales que no necesitas
USE IN(SELECT("cTablaA"))
USE IN(SELECT("cTablaB"))
USE IN(SELECT("cTablaC"))
*** Despues de imprimir o salir de tu programa borras el archivo final
USE IN(SELECT("cTemp"))
*********
Según lo que he observado abres 3 tablas y solo utilizas una
en ese caso puedes usar lo siguiente:
SELECT facemifec AS fec_emi,;
facvenfec AS fec_venc,;
"14" AS tipo,;
facsernro AS serie,;
facnro AS numero,;
"1" AS tipo_doc,;
factotal AS bimponi;
FROM TablaA;
INTO CURSOR cTemp READWRITE;
WHERE YEAR(fec_emi)=mi_year .AND.;
MONTH(fec_emi)=mi_mes
esto te genera un cursor con los datos de la tablaA
*******************************************************************
Hola buen día, estuve haciendo lo sisuiente: he creado dos variables publicas en el evento init del formulario nMes y nAño y las he igualado a cero.
Public nMes, nAño
Store 0 to nMes, nAño
He creado dos cajas de texto uno para el año y el otro para el mes
txtAño      evento valid
nAño=val(this.value)
txtMes       evento valid
nMes=val(this.value)
Pero no me graba nada en el archivo cTemp..
CREATE CURSOR ("h:\librosvarios\data\cTemp");
( n_corr n(6,0), fec_emi d(8),fec_venc d(8),;
tipo c(2), serie n(3,0), numero n(8,0),;
tipo_doc c(2), num_doc c(11), cliente c(20),;
bimponi n(10,2), igv n(10,2), total n(10,2) )
INDEX ON n_corr TAG codigo ADDITIVE
SELECT * FROM ("d:\pruebas\sici\catastro\totfac");
INTO CURSOR cTablaA;
WHERE YEAR(facfecfac)=nAño .AND.;
MONTH(facfecfac)=nMes ORDER BY facnro
SELECT * FROM ("d:\pruebas\sici\sfactura");
INTO CURSOR cTablaB;
WHERE YEAR(fscfecv)=nAño .AND.;
MONTH(fscfecv)=nMes ORDER BY inscrinrx
SELECT * FROM ("d:\pruebas\sici\catastro\notas");
INTO CURSOR cTablaC;
WHERE YEAR(notfecha)=nAño .AND.;
MONTH(notfecha)=nMes ORDER BY inscrinrn
SELECT * FROM ("d:\pruebas\sici\catastro\conexion");
INTO CURSOR cTablaD ORDER BY inscrinro
SELECT("cTablaA")
SCAN
IF !SEEK(cTablaA.inscrinrx,"cTemp","codigo")
APPEND BLANK IN cTemp
REPLACE n_corr WITH RECNO();
fec_emi WITH cTablaA.facemifec;
fec_venc WITH cTablaA.facvenfec;
tipo WITH "14";
serie WITH cTablaA.facsernro;
numero WITH cTablaA.facnro;
tipo_doc WITH "1";
total WITH cTablaA.factotal;
cliente WITH IIF( Seek(ALLTRIM(cTablaA.inscrinrx),"cTablaD"), Subst(Alltrim (cTablaD.clinomx),1,40), "No Existe Cliente");
IN cTemp
ENDIF
ENDSCAN
BROWSE
USE IN(SELECT("cTablaA"))
USE IN(SELECT("cTablaB"))
USE IN(SELECT("cTablaC"))
USE IN(SELECT("cTablaD"))
En los TextBox el evento valid dejalo en blanco
en la propiedad Value coloca 0
En ControlSource de TxtAño coloca nAño
En ControlSource de TxtMes coloca nMes
Prueba y me avisas
Hola bueno ahora si me filtra la tabla de acuerdo a lo ingresado en las cajas de texto pero a lka hora de grabar al temporal me dice "table has no index order set" y el error apunta a esta linea: "REPLACE n_corr WITH RECNO();
"
SELECT("cTablaA")
SCAN
IF !SEEK(cTablaA.facnro,"cTemp","codigo")
APPEND BLANK IN cTemp
REPLACE n_corr WITH RECNO();
fec_emi WITH cTablaA.facemifec;
fec_venc WITH cTablaA.facvenfec;
tipo WITH "14";
serie WITH cTablaA.facsernro;
numero WITH cTablaA.facnro;
tipo_doc WITH "1";
total WITH cTablaA.factotal;
cliente WITH IIF( Seek(ALLTRIM(cTablaA.inscrinrx),"cTablaD"), Subst(Alltrim (cTablaD.clinomx),1,40), "No Existe Cliente");
IN cTemp
ENDIF
ENDSCAN
En la primera tabla primer selec he probado index on facnro tag tablaA additive pero el error sigue:
SELECT * FROM ("d:\pruebas\sici\catastro\totfac");
INTO CURSOR cTablaA;
WHERE MONTH(facemifec)=nMes AND YEAR(facemifec)=nAño AND MONTH(facvenfec)=nMes AND YEAR(facvenfec)=nAño;
order BY facnro 
inde on facnro tag cTablaA additive   &&Aqui he colocado este indice
El error es que RECNO() indica la posición relativa del registro en el archivo, no es un contador de registros
En lugar de RECNO() utiliza un contador independiente, por ejemplo recnro que lo vas incrementando cada vez que adicionas un registro.
Bueno he usado un contador independiente y sale el mismo error "table has no index order set".
Parece que falta el indice de la tablaD en el SEEK()
SEEK(variable, archivo, Indice)
Bueno si he indexado todas las tablas y ahora si me guarda en el temporal, solo he guardado en el temporal registros de la tabla cTablaA, ahora quiero guardar o añadir registros de la tabla cTablaB, ¿cTablaC a la tabla temporal como podría hacer?
Lo mismo que haces con la tabla A

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas