Page 1 of 1

Como dice Rene matando pulgas a cañonazos...va mi pregunta

Posted: Thu Feb 15, 2007 5:05 pm
by ACC69
Hola Rene buenos dias como esta maestro, en el caso mio, creo que esta más o menos complicado, pero me gustaria alguna sugerencia tuya o mas fácil o metodo que se pueda decir, te explico yo tengo un programa de contabilidad hecho a la medida de la empresa con su captura de cuenta y referencia de facturas, bueno mes a mes se hace cierre del ejercicio ejemplo enero 2007 con la base de datos creada desde inicio MOVT0107.DBF y al mismo momento se va creando nueva base de datos siguiente MOVT0207.DBF y asi sucesivamente como podras imaginar, tengo desde el año 2002 bases de datos diferentes creados por el cierre del mes contable desde MOVT0902.DBF hasta la MOVT0207.DBF del año en curso, bueno yo tengo que crear archivo temporal al pedir reportes de cuentas auxiliar inicial por ejemplo desde la cuenta: 2106-0002-1601 hasta la cuenta 2106-0002-9999 y con mes y año inicial que es 0902 hasta 0207, he ahi ese detalle que yo creo un archivo temporal para el barrido de todas las cuentas y bases de datos a imprimir o consultar , ahora usted con su experiencia hay otro metodo o forma de hacer esa busqueda mas rapida ? nunca he intentado hacer con set relacion, porque son mas de 54 bases de datos diferentes, espero sugerencias y conocimientos a todos los amigos del foro :)
Saludos
Adriano C. C.
acc69@hotmail.com

Posted: Fri Feb 16, 2007 8:35 am
by Carlos Mora
Adriano,

Creo que el SET RELATION no te va a servir en este caso. Dependiendo del proceso tal vez te convenga conservar un consolidado por año como para ir dejando las cosas más o menos totalizadas, ya que los datos hasta el 2006 no cambian, o bien hacer una rutina que te arme un unico fichero de _ vez que haga falta..
Otra posibilidad sería una rutina que me arme en un temporal el mayor de cada cuenta, recorriendo todas las dbf's, algo mas o menos así:

dBCreate( cFile:= TmpFile( 'DBF' ), { estructura del movim } )
Use (cFile) Alias TempMov Exclusive New
For i:= 2 to Year(Date())%100
For j:= 1 to 12
If File( cMov:= 'MOV'+StrZero(j,2)+StrZero(i,2)+'.dbf' )
Use (cMov) Alias MOVMES Shared ReadOnly New
// Traspasar los movimientos
Close MOVMES
EndIf
EndFor
EndFor

Bueno, no está completo pero el resto seguro lo puedes manejar.

Un saludo,

Carlos

Gracias Carlos

Posted: Fri Feb 16, 2007 3:49 pm
by ACC69
Carlos Mora wrote:Adriano,

Creo que el SET RELATION no te va a servir en este caso. Dependiendo del proceso tal vez te convenga conservar un consolidado por año como para ir dejando las cosas más o menos totalizadas, ya que los datos hasta el 2006 no cambian, o bien hacer una rutina que te arme un unico fichero de _ vez que haga falta..
Otra posibilidad sería una rutina que me arme en un temporal el mayor de cada cuenta, recorriendo todas las dbf's, algo mas o menos así:

dBCreate( cFile:= TmpFile( 'DBF' ), { estructura del movim } )
Use (cFile) Alias TempMov Exclusive New
For i:= 2 to Year(Date())%100
For j:= 1 to 12
If File( cMov:= 'MOV'+StrZero(j,2)+StrZero(i,2)+'.dbf' )
Use (cMov) Alias MOVMES Shared ReadOnly New
// Traspasar los movimientos
Close MOVMES
EndIf
EndFor
EndFor

Bueno, no está completo pero el resto seguro lo puedes manejar.

Un saludo,

Carlos
Gracias Carlos Mora, es mas o menos parecido a la rutina o proceso como usted indica, pero mientras mas base de datos se vaya creando cada mes, mas lento se hace al pedir movimientos de cuentas, en el reporte de balanza no hay problema porque se pide del mes actual, pero la primera parte no le entendi de conservar consolidado por año, en fin busco una rutina con mayor rapidez, aunque no queda de otra que seguir creando archivo temporal, por cada usuario que entre al sistema y con su respectivo clave, se crea la base de datos temporal, este es mi codigo, de como creo mi archivo temporal:

*****************************************************************
*----- TRASPASANDO AUXILIAR DE CUENTAS EN ARCHIVO TEMPORAL -----*
*****************************************************************


Dbf1Tmp := "EMP"+TSTR(xEMP)+TRIM("\R_AUXI"+nStation)+".DBF"
Ntx1Tmp := "EMP"+TSTR(xEMP)+TRIM("\R_AUXI"+nStation)+".NTX"


IF !FILE(Dbf1Tmp)
CreaDbf1 := {{"TIPO " , "C" , 2 , 0 } ,;
{"NUMPOL " , "N" , 5 , 0 } ,;
{"FHAMOV " , "D" , 8 , 0 } ,;
{"CUENTAS" , "C" , 12 , 0 } ,;
{"CTADETA" , "C" , 8 , 0 } ,;
{"REFERE " , "C" , 10 , 0 } ,;
{"CONCEP " , "C" , 60 , 0 } ,;
{"SALCARG" , "N" , 12 , 2 } ,;
{"SALCRED" , "N" , 12 , 2 }}

DbCreate(Dbf1Tmp,CreaDbf1)

USE (Dbf1Tmp) ALIAS TEMP EXCLUSIVE NEW SHARED

INDEX ON CUENTAS+DTOS(FHAMOV) TO (Ntx1Tmp)

SET INDEX TO (Ntx1Tmp)
ELSE
USE (Dbf1Tmp) ALIAS TEMP EXCLUSIVE

ZAP

INDEX ON CUENTAS+DTOS(FHAMOV) TO (Ntx1Tmp)

SET INDEX TO (Ntx1Tmp)
ENDIF

MA->(DbSEEK(cMA_Ini))

DO WHILE MA->ANOMES >= cMA_Ini .AND. MA->ANOMES <= cMA_Fin .AND. MA->(!EOF())
Mes_Per := VAL(SUBS((MA->AnoMes,3,2))
Ano_Per := VAL(SUBS((MA->AnoMes,1,2))

UsarDbf("MOVT"+Mes_Per+Ano_Per") // Use: MOVTxMxA.DBF

MOVT->(DbSetOrder(3))
MOVT->(DbGoTop())

MOVT->(SetSeek(CtaIni))

DO WHILE MOVT->(!EOF())
IF MOVT->MV_NCTA > CtaFin
EXIT
ENDIF

TEMP->(DbSeek(MOVT->MV_NCTA))

IF (MOVT->MV_CARG - MOVT->MV_ABON) <>0

TEMP->(DbAppend())

REPLACE TEMP->TIPO WITH MOVT->MV_TIPO ,;
TEMP->NUMPOL WITH MOVT->MV_NUMP ,;
TEMP->FHAMOV WITH MOVT->MV_FHAM ,;
TEMP->CUENTAS WITH MOVT->MV_NCTA ,;
TEMP->CTADETA WITH MOVT->(SUBS(MOVT->MV_NCTA,5,8)) ,;
TEMP->REFERE WITH MOVT->MV_REFE ,;
TEMP->CONCEP WITH MOVT->MV_CONC ,;
TEMP->SALCARG WITH MOVT->MV_CARG ,;
TEMP->SALCRED WITH MOVT->MV_ABON
ENDIF

MOVT->(DbSkip())
ENDDO

MA->(DbSkip())

Cierra_Dbf("MOVT"+Mes_Per+Ano_Per")
ENDDO

Es el procedimiento de barrer todas las bases de datos, desde el mes y año septiembre de 2002 o solo se pide el año actual, que no lleva mucho tiempo de proceso

Ya creado el archivo temporal, el siguiente codigo es donde procede a imprimir cuentas desde inicial al final, asi como mes y año inicial

Espero mas ayuda o experiencia, que alguien haya implementado programa de contabilidad .
Gracias Carlos Mora
Adriano

Posted: Sat Feb 17, 2007 11:43 am
by carlos.mora
Adriano,

Cuando me refiero a 'consolidados' quiero decir una dbf que, por ejemplo, contenga todos los datos hasta el día en que sabemos que ya no se van a cambiar, para no estar buscando en tantas tablas.

Se me ocurren varias optimizaciones, pero me gustaría saber:
1) Cuando se hace la consulta, siempre se traen todos los datos?
2) que informacion viene en la tabla MA? obvimente indica los periodos, pero eso es algo que creo se pueden calcular conociendo la fecha inicial y final de la consulta.
3) No uses tantos indicadores de alias. Es más rapido un select y trabajar en el area actual. Algo como:

Select MA
TEMP->(OrdSetFocus(3))
TEMP->(GoTop())

Es lo mismo que
Select MA
Select Temp
OrdSetFocus(3)
Select MA
Select Temp
TEMP->(GoTop())
Select MA

4) No me doy cuenta para que esta el

TEMP->(DbSeek(MOVT->MV_NCTA))

En fin, creo que se pueden hacer algunas cosas para acelerar el proceso. Tambien hay que ver como se hace y muestra la consulta, ya que si le ponemos una progress bar y le vamos mostrando algo que le indique que el programa esta trabajando seguro que eso le calma la ansiedad.

Saludos,

Carlos.

Posted: Mon Feb 19, 2007 3:47 pm
by ACC69
carlos.mora wrote:Adriano,

Cuando me refiero a 'consolidados' quiero decir una dbf que, por ejemplo, contenga todos los datos hasta el día en que sabemos que ya no se van a cambiar, para no estar buscando en tantas tablas.

Se me ocurren varias optimizaciones, pero me gustaría saber:
1) Cuando se hace la consulta, siempre se traen todos los datos?
2) que informacion viene en la tabla MA? obvimente indica los periodos, pero eso es algo que creo se pueden calcular conociendo la fecha inicial y final de la consulta.
3) No uses tantos indicadores de alias. Es más rapido un select y trabajar en el area actual. Algo como:

Select MA
TEMP->(OrdSetFocus(3))
TEMP->(GoTop())

Es lo mismo que
Select MA
Select Temp
OrdSetFocus(3)
Select MA
Select Temp
TEMP->(GoTop())
Select MA

4) No me doy cuenta para que esta el

TEMP->(DbSeek(MOVT->MV_NCTA))

En fin, creo que se pueden hacer algunas cosas para acelerar el proceso. Tambien hay que ver como se hace y muestra la consulta, ya que si le ponemos una progress bar y le vamos mostrando algo que le indique que el programa esta trabajando seguro que eso le calma la ansiedad.

Saludos,

Carlos.
Hola Carlos Mora, si y no siempre se traen todos los datos, depende el tipo de movimiento que el usuario solicite un reporte, la MA es un alias que se pide mes y año inicial dentro la base de datos, y gracias por el tip y consejos que me indicas Carlos Mora, te lo agradezco amigo y me puede dar alguna sugerencia o un proceso de rutina que se agilise mas la busqueda de cuentas ?
Adriano