Programación General > Visual FoxPro
Totales Dificiles en Reporte Contable
(1/1)
mebernal:
Buenas tardes,amigos del foro quisiera me ayudaran a solucionar un problema que tengo en un reporte.
tengo una tabla catalogo,como ya saben en los catalogos contables hay cuentas,subcuentas,subsubcuentas,etc
en la tabla seria
cuenta subcuenta nombre
1 xyz
11 1 gjgjgj
111 11 yuiyuiy
111001 111 ygggjn
111001001 111001 iiyyiuyy
para lo alargar hay cuentas de movimientos directo y otras no.
o sea que en el periodo contable,se generan partidas con la cuenta 111001001,la 111001,pero no hay movimientos directos con la 111,11,1......entonces
en un formulario creo un cursor con los movimientos de todas las cuentas ,con sumatorias y agrupacion,etc..y todo bien,una consulta se muestra asi:
cuenta nombre cargos abonos
1 yiyiyy
11 uoioiui
111 uooiuoiu
111001 iyiyii 1,000.00 500.00
111001001 tytu 75.00 15.00
ahora mi problema es : Como hago para que en la cuenta 111 me aparezca la sumatoria de 111001001,111001002,111001003....y asi
para que en la cuenta 112 me aparezca la sumatoria de 112001001,112001002,112001003...etc
y que en la cuenta 11 me aprezca la suma de 111+112+113....etc.
y en cuenta 1 me aparezca la sumatoria de 11,12,13,etc..
no se si me doy a entender...
gracias de antemano,
saludos
ecch1:
Hola
Para sumar las cuentas de acumulacion o cuentas principales debes hacerte una funcion
Supongamos que la estructura de tu catalogo es la siguiente
cuenta Caracter(20)
descripcion Caracter(80)
Nivel Caracter(1)
Y para las cuentas que has definido tienes lo siguiente
cuenta Descripcion Nivel
1 Activo Corriente 1
10 Caja Bancos 2
101 Caja 3
10101 Caja Soles D
104 Bancos Cta Cte. 3
10401 Bancos NNN 4
1040101 Cta. Corriente Soles D
10402 Bancos XXXX 4
1040201 Cta. Cirriente Dolares D
12 Clientes 2
121 Facturas por Cobrar 3
12101 Cliente del Pais 4
1210101 Cliente XXXX D
2 Existencias 1
20 Mercaderias 2
201 Almacen No 1 3
20101 Mercanacia XXXXx D
D significa Nivel Detalle detalle, por esta cuenta vas a ingresar los movimientos "Asientos contables"
Bueno: asi sucesivamente, el Plan Contable es muy extenso lo bueno es que existe una estructura estandar que se denomina Plan Contable General, su contenido total lo puedes encontrar con seguridad buscando en la Web, aqui solo he puesto unas cuentas de memoria es posible que esto haya cambiado pero el concepto Basico es el mismo, yo trabajaba en sistemas contables por los años 1988 al 1992 asi que seguramente el plan ha cambiado mucho.
Como ya habras podido apreciar el Tip del asunto es que tengas definido el Nivel de cada cuenta de esa forma hacer la funcion que acumula cada cuenta padre es secillo de hacer. Pueden haber muchas otras formas, esta es una de las que utilice hace mucho tiempo, tambie hay otras form cuando los niveles se separaban por puntos. Ojo, este codigo lo escribo de memoria asi que puede haber errores ortograficos y de nombres de funciones pero el concepto basico lo expreso aqui
Ejemplo
--- Código: Text ---FUNCTION SumaCtaPARAMETERS cCodCta, cNivel, ldebeLOCAL nImp_Total, cSqlStr* Supongamos que los campo de la tabla donde estan los importes se denomina DEBE y HABERIF cNivel <> 'D' cNivel = STR(VAL(cNivel)+1),1) cSqlStr ="SELECT cuenta FROM DIARIOS WHERE cuenta LIKE '"+cCodCta+"%'"+" AND Nivel='"cNivel+"'" &cSqlStr if Reccount() = 0 cNivel = 'D' endifendif iF ldebe cSqlStr = "SELECT sum(debe) INTO nImp_Total FROM DIARIO WHERE cuenta LIKE '"+cCodCta+"%'"+" AND Nivel='"cNivel+"'"Else cSqlStr= "SELECT sum(haber) INTO nImp_Total FROM DIARIO WHERE cuenta LIKE '"+cCodCta+"%'"+" AND Nivel='"cNivel+"'"ENDiF &cSqlStrif reccount()=0 nImp_Total = 0endif USERETURN nImp_Total
Te dejo la Idea, reitero, se puede hacer de muchas maneras, pero esta se me ocurrio por el momento, espero comentarios
Saludos
ecch
Pd La funcion cuando es posible identificar los niveles de las cuentas con un punto se puede utilizar llamadas recursivas.
xodrf:
Solo si tu plan de cuentas esta agrupada de a dos cifras es decir con 12 digitos 1.01.01.01.001 te doy otra idea: cambia el orden de tus cuentas cuando la recorras es decir empieza por el final
101030101002 CLIENTE 2
101030101001 CLIENTE 1
101030101 ** CLIENTES SECCION REPUESTOS **
1010301 ** CLIENTES CASA CENTRAL **
10103 ** CREDITOS **
10102 ** INVERSIONES TEMPORARIAS **
1010104 ** OTROS VALORES **
101010301001 BANCO XXX CTA 00
101010301 ** BANCOS CASA CENTRAL **
1010103 ** BANCOS **
101010101003 CAJA MONEDAS EXTRANJERAS
101010101002 RECAUDACIONES A DEPOSITAR
101010101001 CAJA MONEDA NACIONAL
101010101 ** CAJAS CASA CENTRAL **
1010101 ** CAJAS **
10101 ** DISPONIBILIDADES **
101 ** ACTIVO CORRIENTE **
1 ** ACTIVO **
** Las cuentas que empiezan por asterisco, son de solo titulo, no imputable, cta integradora y no se que otros nombres se le da.
Con dos bucles anidados podrias sumar los importes de las cuentas hijas
DO WHILE !EOF()
_cuenta=CUENTA &&cuenta en la que comienza
_level =LEN(ALLTRIM(CUENTA))
* suma todas las cuentas que tengan el mismo nivel
DO WHILE !EOF() AND LEN(ALLTRIM(CUENTA))==_level
...
SKIP +1
ENDDO
grabas el monto en la cuenta titular y pasas al siguiente segmento de cuenta
ENDDO
etc.
Ten en cuenta este q tipo de situaciones te puede dar un error o sea que no exista una cuenta integradora para un grupo de cuentas (falta la integradora 101010301 ** BANCOS CASA CENTRAL **), este caso debes tratar de mostrar un error o algo asi.
101010301001 BANCO XXX CTA 00
1010103 ** BANCOS **
Ojala superes el problema!! :mellow:
Navegación
Ir a la versión completa