// ***************************************************************************** // Computación en Acción, S.A. de C.V. (C) Copyright 2009 // Todos los Derechos Reservados. // // Sistema: CONTPAQ i BANCOS // // Título: Comparativo Real Vs Presupuesto Por Categoría // // Descripción: Presenta un comparativo de saldos por año contra su presupuesto de // acuerdo a la categoría o rango de categorías // seleccionadas. // Este reporte despliega solo saldos reales. // // Fecha: 6/Agosto/2009 // Autor: Diego Anaya // Mantenimiento Daniel Hijar 28/Enero/2010 // ***************************************************************************** // Historial de Revisiones: // Fecha ID-ND/NC Descripción // ***************************************************************************** // ***************************************************************************** // TABLAS A UTILIZAR // ***************************************************************************** UsaEmpresa tEmpresa;'contpaqw1.00' // ***************************************************************************** // CONSULTAS SQL PARA PARÁMETROS // ***************************************************************************** Consulta tEjerciciosEmp = tEmpresa['Select Ejercicio from dbo.Ejercicios group by Ejercicio order by Ejercicio'] //tEmpresa['SELECT Id, Ejercicio FROM Ejercicios'] //Consulta tEjercicio2P = tEmpresa['SELECT Id, Ejercicio FROM Ejercicios'] Consulta tParametrosP = tEmpresa['SELECT EjerActual, EjercicioVigenteBN FROM Parametros'] Consulta tCategoriasP = tEmpresa['SELECT Id, Nombre FROM Categorias WHERE Nivel = \'C\' and presupuesto != \'N\' ORDER BY Nombre'] Consulta tSubCategP = tEmpresa['SELECT Id, Nombre FROM Categorias WHERE Nivel = \'S\' and presupuesto != \'N\' ORDER BY Nombre'] Consulta tMonedasP = tEmpresa['SELECT Codigo, Nombre FROM Monedas ORDER BY Codigo'] // ***************************************************************************** // PARÁMETROS DEL REPORTE // ***************************************************************************** DefFunc fGetEjercicio( ) Si tEmpresa->UsaPeriodosContables Consulta tEjerActual = tEmpresa['SELECT Ejercicio From Ejercicios WHERE Id = ' & tParametrosP('EjerActual')] Si tEjerActual->Encontro Retorna tEjerActual('Ejercicio') SiNo Retorna tParametrosP('EjercicioVigenteBN') FinSi SiNo Retorna tParametrosP('EjercicioVigenteBN') FinSi FinFunc Parametros Titulo 'titulo.1' Pagina 'pagina.1' Parametro pEjeBase = 0 Captura Titulo 'parametro.1' Ayuda 'ayuda.1' Default fGetEjercicio( ) Control CtrlLista Datos Origen tEjerciciosEmp('Ejercicio'); tEjerciciosEmp('Ejercicio') OrdenaPor tEjerciciosEmp('Ejercicio') FinDatos FinCaptura Parametro vacio = 0 Captura Control CtrlVacio FinCaptura Parametro pTipo = 2 Captura Titulo 'parametro.2' Ayuda 'ayuda.2' Control CtrlRadio Datos 'dato.3';2;'dato.1';0;'dato.2';1 FinDatos FinCaptura Parametro vacio = 0 Captura Control CtrlVacio FinCaptura Parametro pNivel = 0 Captura Titulo 'parametro.3' Ayuda 'ayuda.3' Control CtrlLista Datos 'dato.4';0;'dato.5';1;'dato.6';2 FinDatos Dependencia 0; pRangoCategorias= True Dependencia 0; pRangoSubCateg = False Dependencia 1; pRangoCategorias= True Dependencia 1; pRangoSubCateg = False Dependencia 2; pRangoCategorias= False Dependencia 2; pRangoSubCateg = True FinCaptura Parametro pProyectados = true Captura Titulo 'Incluir proyectados' Ayuda 'Incluye saldos proyectados en el reporte' Control CtrlCheckBox FinCaptura //Parametro vacio = 0 Captura // Control CtrlVacio //FinCaptura Parametro pRangoCategorias = 0 Captura Titulo 'parametro.4' Ayuda 'ayuda.4' Control CtrlOpcion Datos Origen tCategoriasP('Nombre');tCategoriasP('Id') OrdenaPor tCategoriasP('Nombre') FinDatos FinCaptura Parametro pRangoSubCateg = 0 Captura Titulo 'parametro.5' Ayuda 'ayuda.5' Control CtrlOpcion Datos Origen tSubCategP('Nombre');tSubCategP('Id') OrdenaPor tSubCategP('Nombre') FinDatos FinCaptura Parametro pMoneda = 0 Captura Titulo 'parametro.6' Ayuda 'ayuda.6' Control CtrlLista Datos Origen tMonedasP('Nombre');tMonedasP('Codigo') OrdenaPor tMonedasP('Codigo') FinDatos FinCaptura FinPagina Pagina 'pagina.2' Parametro pImpFecha = True Captura Titulo 'parametro.7' Ayuda 'ayuda.7' Control CtrlCheckBox Dependencia False; pFechaReporte = False Dependencia True; pFechaReporte = True FinCaptura Parametro pFechaReporte = @Hoy( ) Captura Titulo 'parametro.8' Ayuda 'ayuda.8' Control CtrlFecha FinCaptura FinPagina FinParametros Escoge pTipo Caso 0 pTipo = 'I' FinCaso Caso 1 pTipo = 'E' FinCaso Caso 2 pTipo = 'E\',\'I' FinCaso FinEscoge Escoge pNivel Caso 1 pNivel = 'C' FinCaso Caso 2 pNivel = 'S' FinCaso Caso 0 pNivel = '*' FinCaso FinEscoge Si pRangoCategorias ='' pRangoCategorias = 0 FinSi Si pRangoSubCateg ='' pRangoSubCateg = 0 FinSi Consulta tMoneda = tEmpresa['SELECT Nombre FROM Monedas WHERE Codigo = \'' & pMoneda & '\' '] gNombreMoneda = tMoneda('Nombre') // ***************************************************************************** // Definiciones y asumidos globales para el reporte // ***************************************************************************** // Configuración de la hoja Configuracion Orientacion Horizontal Papel Carta Margen Superior; 1 Margen Inferior; 1 Margen Izquierdo; 1 Margen Derecho; 1 FinConfiguracion Columnas 15;1,1.5,1.8 Usaletra 'Arial' Altura 7 [C2..C14].Coma // ***************************************************************************** // FUNCIONES DE LIBRERÍA // ***************************************************************************** Incluye BibliotecaCheques.rpt Incluye BibliotecaFechas.rpt // ***************************************************************************** // FUNCIONES DEL REPORTE // ***************************************************************************** // ***************************************************************************** // Pasa los saldos de una categoría a la variable usada para imprimirlos // // Argumento - aDatos: Variable para imprimir los saldos, pasada por referencia // Argumento - aCategoria: Nombre de la categoría // Argumento - aSubCategoria: Nombre de la subcategoría // Argumento - aSaldo1: Saldo de enero // Argumento - aSaldo2: Saldo de febrero // Argumento - aSaldo3: Saldo de marzo // Argumento - aSaldo4: Saldo de abril // Argumento - aSaldo5: Saldo de mayo // Argumento - aSaldo6: Saldo de junio // Argumento - aSaldo7: Saldo de julio // Argumento - aSaldo8: Saldo de agosto // Argumento - aSaldo9: Saldo de septiembre // Argumento - aSaldo10:Saldo de octubre // Argumento - aSaldo11:Saldo de noviembre // Argumento - aSaldo12:Saldo de diciembre // ***************************************************************************** DefFunc fLlenaDatos(aDatos; aSubCategoria; aSaldo1; aSaldo2; aSaldo3; aSaldo4; aSaldo5; aSaldo6; aSaldo7; aSaldo8; aSaldo9; aSaldo10; aSaldo11; aSaldo12) aDatos[1] = aSubCategoria aDatos[2] = aSaldo1 aDatos[3] = aSaldo2 aDatos[4] = aSaldo3 aDatos[5] = aSaldo4 aDatos[6] = aSaldo5 aDatos[7] = aSaldo6 aDatos[8] = aSaldo7 aDatos[9] = aSaldo8 aDatos[10] = aSaldo9 aDatos[11] = aSaldo10 aDatos[12] = aSaldo11 aDatos[13] = aSaldo12 aDatos[14] = @Col(aDatos;2)+@Col(aDatos;3)+@Col(aDatos;4)+@Col(aDatos;5)+@Col(aDatos;6)+@Col(aDatos;7)+@Col(aDatos;8)+@Col(aDatos;9)+@Col(aDatos;10)+@Col(aDatos;11)+@Col(aDatos;12)+@Col(aDatos;13) Finfunc //************************************************************************************** // // Busca y llena el saldo proyectado de la subcategoria // //************************************************************************************** DefFunc fLlenaProyectados(aDatos; aIdCategoria) Si pProyectados gStrQuery = 'SELECT sum(total)as TotalMes, Mes from ( ' gStrQuery = gStrQuery & 'SELECT asoCat.total , LEFT( CONVERT(VARCHAR(10), doc.Fecha, 10), 2) as Mes ' gStrQuery = gStrQuery & 'FROM cheques doc ' gStrQuery = gStrQuery & 'JOIN AsocDoctoCategorias asoCat on asoCat.IdDocumento = doc.id and asoCat.IdDocumentoDe = doc.IdDocumentoDe ' gStrQuery = gStrQuery & 'WHERE RIGHT(CONVERT(VARCHAR(10), doc.Fecha, 105), 4) = \''& pEjeBase &'\' and asoCat.IdSubCategoria = '& aIdCategoria &' and doc.esProyectado = 1 ' gStrQuery = gStrQuery & 'Union All ' gStrQuery = gStrQuery & 'SELECT asoCat.total , LEFT( CONVERT(VARCHAR(10), doc.Fecha, 10), 2) as Mes ' gStrQuery = gStrQuery & ' FROM egresos doc ' gStrQuery = gStrQuery & 'JOIN AsocDoctoCategorias asoCat on asoCat.IdDocumento = doc.id and asoCat.IdDocumentoDe = doc.IdDocumentoDe ' gStrQuery = gStrQuery & 'WHERE RIGHT(CONVERT(VARCHAR(10), doc.Fecha, 105), 4) = \''& pEjeBase &'\' and asoCat.IdSubCategoria = '& aIdCategoria &' and doc.esProyectado = 1 ' gStrQuery = gStrQuery & ' Union All ' gStrQuery = gStrQuery & 'SELECT asoCat.total , LEFT( CONVERT(VARCHAR(10), doc.Fecha, 10), 2) as Mes ' gStrQuery = gStrQuery & 'from ingresos doc ' gStrQuery = gStrQuery & 'JOIN AsocDoctoCategorias asoCat on asoCat.IdDocumento = doc.id and asoCat.IdDocumentoDe = doc.IdDocumentoDe ' gStrQuery = gStrQuery & 'WHERE RIGHT(CONVERT(VARCHAR(10), doc.Fecha, 105), 4) = \''& pEjeBase &'\' and asoCat.IdSubCategoria = '& aIdCategoria &' and doc.esProyectado = 1 ' gStrQuery = gStrQuery & 'Union All ' gStrQuery = gStrQuery & 'SELECT asoCat.total , LEFT( CONVERT(VARCHAR(10), doc.Fecha, 10), 2) as Mes ' gStrQuery = gStrQuery & 'FROM ingresosNoDepositados doc ' gStrQuery = gStrQuery & 'JOIN AsocDoctoCategorias asoCat on asoCat.IdDocumento = doc.id and asoCat.IdDocumentoDe = doc.IdDocumentoDe ' gStrQuery = gStrQuery & 'WHERE RIGHT(CONVERT(VARCHAR(10), doc.Fecha, 105), 4) = \''& pEjeBase &'\' and asoCat.IdSubCategoria = '& aIdCategoria &' and doc.esProyectado = 1 ' gStrQuery = gStrQuery & ') q1 ' gStrQuery = gStrQuery & 'GROUP BY mes ' Consulta tProyectadosCatego = tEmpresa[gStrQuery] aDatos = 0.00 aDatos[0] = '' aDatos[1] = 'Proyectado' Si tProyectadosCatego->Encontro Mientras tProyectadosCatego->Encontro aDatos[tProyectadosCatego('Mes')+1] = tProyectadosCatego('TotalMes') tProyectadosCatego.Busca Siguiente FinMientras aDatos[14] = @Col(aDatos;2)+@Col(aDatos;3)+@Col(aDatos;4)+@Col(aDatos;5)+@Col(aDatos;6)+@Col(aDatos;7)+@Col(aDatos;8)+@Col(aDatos;9)+@Col(aDatos;10)+@Col(aDatos;11)+@Col(aDatos;12)+@Col(aDatos;13) FinSi FinSi Finfunc // ********************************************************************* // // // // ********************************************************************* DefFunc fCambiarNegativos(aImportes) [C2].Color @RGB((@Col(aImportes;2) < 0 ? 255 : 0);0;0) [C3].Color @RGB((@Col(aImportes;3) < 0 ? 255 : 0);0;0) [C4].Color @RGB((@Col(aImportes;4) < 0 ? 255 : 0);0;0) [C5].Color @RGB((@Col(aImportes;5) < 0 ? 255 : 0);0;0) [C6].Color @RGB((@Col(aImportes;6) < 0 ? 255 : 0);0;0) [C7].Color @RGB((@Col(aImportes;7) < 0 ? 255 : 0);0;0) [C8].Color @RGB((@Col(aImportes;8) < 0 ? 255 : 0);0;0) [C9].Color @RGB((@Col(aImportes;9) < 0 ? 255 : 0);0;0) [C10].Color @RGB((@Col(aImportes;10) < 0 ? 255 : 0);0;0) [C11].Color @RGB((@Col(aImportes;11) < 0 ? 255 : 0);0;0) [C12].Color @RGB((@Col(aImportes;12) < 0 ? 255 : 0);0;0) [C13].Color @RGB((@Col(aImportes;13) < 0 ? 255 : 0);0;0) [C14].Color @RGB((@Col(aImportes;14) < 0 ? 255 : 0);0;0) FinFunc DefFunc fCambiarPositivos(aImportes) [C2].Color @RGB((@Col(aImportes;2) > 0 ? 255 : 0);0;0) [C3].Color @RGB((@Col(aImportes;3) > 0 ? 255 : 0);0;0) [C4].Color @RGB((@Col(aImportes;4) > 0 ? 255 : 0);0;0) [C5].Color @RGB((@Col(aImportes;5) > 0 ? 255 : 0);0;0) [C6].Color @RGB((@Col(aImportes;6) > 0 ? 255 : 0);0;0) [C7].Color @RGB((@Col(aImportes;7) > 0 ? 255 : 0);0;0) [C8].Color @RGB((@Col(aImportes;8) > 0 ? 255 : 0);0;0) [C9].Color @RGB((@Col(aImportes;9) > 0 ? 255 : 0);0;0) [C10].Color @RGB((@Col(aImportes;10) > 0 ? 255 : 0);0;0) [C11].Color @RGB((@Col(aImportes;11) > 0 ? 255 : 0);0;0) [C12].Color @RGB((@Col(aImportes;12) > 0 ? 255 : 0);0;0) [C13].Color @RGB((@Col(aImportes;13) > 0 ? 255 : 0);0;0) [C14].Color @RGB((@Col(aImportes;14) > 0 ? 255 : 0);0;0) FinFunc // ********************************************************************* // // // // ********************************************************************* DefFunc fGetTipo(aTipo) [C0..C14].Color @RGB(0;0;0) Si aTipo = 'E' retorna pIdioma = 0 ? 'Tipo: Egreso' : 'Type: Outlyn' SiNo retorna pIdioma = 0 ? 'Tipo: Ingreso' : 'Type: Income' FinSi FinFunc // ********************************************************************************** // Obtien el presupuesto acumulado // CALCULO // Asumidos: // (*1)Pres.Acum.(Mes) = Dif.Acum.(Mes-1) + Pres(Mes) // (*2)Dif.Acum.(Mes) = Pres.Acum.(Mes) - Saldo(Mes) - Proyectado(Mes) // Por lo tanto: // (*1)(*2)Pres.Acum.(Mes) = Pres.Acum.(Mes-1) - Saldo(Mes-1) - Proyectado(Mes-1) + Pres(Mes) // ********************************************************************************** DefFunc fImprimePresuAcumulado(lImprime;aPresBase;aSaldo;aProyectado;aTipoSaldo) lImprime[0] = '' lImprime[1] = pIdioma=0?'P. Acumulado':'Accumulated B.' lImprime[2] = @Col(aPresBase;2)// Enero lImprime[3] = @Col(lImprime;2)-@Col(aSaldo;2)-@Col(aProyectado;2)+@Col(aPresBase;3) // Febrero lImprime[4] = @Col(lImprime;3)-@Col(aSaldo;3)-@Col(aProyectado;3)+@Col(aPresBase;4) // Marzo lImprime[5] = @Col(lImprime;4)-@Col(aSaldo;4)-@Col(aProyectado;4)+@Col(aPresBase;5) // Abril lImprime[6] = @Col(lImprime;5)-@Col(aSaldo;5)-@Col(aProyectado;5)+@Col(aPresBase;6) // Mayo lImprime[7] = @Col(lImprime;6)-@Col(aSaldo;6)-@Col(aProyectado;6)+@Col(aPresBase;7) // Junio lImprime[8] = @Col(lImprime;7)-@Col(aSaldo;7)-@Col(aProyectado;7)+@Col(aPresBase;8) // Julio lImprime[9] = @Col(lImprime;8)-@Col(aSaldo;8)-@Col(aProyectado;8)+@Col(aPresBase;9) // Agosto lImprime[10] = @Col(lImprime;9)-@Col(aSaldo;9)-@Col(aProyectado;9)+@Col(aPresBase;10) // Septiembre lImprime[11] = @Col(lImprime;10)-@Col(aSaldo;10)-@Col(aProyectado;10)+@Col(aPresBase;11) // Octubre lImprime[12] = @Col(lImprime;11)-@Col(aSaldo;11)-@Col(aProyectado;11)+@Col(aPresBase;12) // Noviembre lImprime[13] = @Col(lImprime;12)-@Col(aSaldo;12)-@Col(aProyectado;12)+@Col(aPresBase;13) // Diciembre lImprime[14] = @Col(lImprime;13)-@Col(aSaldo;13)-@Col(aProyectado;13) Si aTipoSaldo = 'E' fCambiarNegativos(lImprime) Sino fCambiarPositivos(lImprime) FinSi Lista lImprime Finfunc // ********************************************************************************** // // ********************************************************************************** DefFunc fImprimePorcentajeDifAcum(aDatosPesAcum;aDatosComp;aDatosProyectado;aDatosBase;aTipoCat) Local lTempDif,lTempSaldo // Porcentaje Diferencia acumulada lTempSaldo = aDatosComp + aDatosProyectado[C2..C13] lTempSaldo = lTempSaldo * 100 lTempDif = lTempSaldo / aDatosPesAcum[C2..C13] lTempDif = '"' & lTempDif & '%' lTempDif[0] = '' lTempDif[1] = pIdioma = 0?'"% Dif. Acum.':'"% Accum. Dif.' lTempDif[14] = '"' & ((@Col(aDatosComp;14)+@Col(aDatosProyectado;14))/@Col(aDatosBase;14)*100) & '%' // EL COLOR deberia de cambiar en egresos cuando sea mayor al 100% o sea negativo // para ingreos al ser menor de 100% y ??? [C2..C14].Color @RGB(0;0;0) Lista lTempDif Finfunc // ********************************************************************************** // // ********************************************************************************** DefFunc fImprimeDiferenciaAcumulada(aDatosPesAcum;aDatosComp;aDatosProyectado;aDatosBase;aTipoCat) // Diferencia acumulada lTempDif[0] = '' lTempDif[1] = pIdioma = 0?'"Dif. Acum.':'"Accum. Dif.' lTempDif = aDatosPesAcum - aDatosComp[C2..C13] lTempDif = lTempDif - aDatosProyectado[C2..C13] lTempDif[14] = @Col(aDatosBase;14)-@Col(aDatosComp;14)-@Col(aDatosProyectado;14) Si aTipoCat = 'E' fCambiarNegativos(lTempDif) Sino fCambiarPositivos(lTempDif) FinSi Lista lTempDif fImprimePorcentajeDifAcum(aDatosPesAcum;aDatosComp;aDatosProyectado;aDatosBase;aTipoCat) Finfunc // ********************************************************************************** // // ********************************************************************************** DefFunc fImprimeDiferencia(aDatosBase;aDatosComp;aDatosProyectado;aTipoCat) Local lDiferencia lDiferencia[0] = '' lDiferencia[1] = pIdioma = 0? '"Diferencia': '"Difference' lDiferencia = aDatosBase - aDatosComp[C2..C13] lDiferencia = lDiferencia - aDatosProyectado[C2..C13] lDiferencia[14] = '' Si aTipoCat = 'E' fCambiarNegativos(lDiferencia) Sino fCambiarPositivos(lDiferencia) FinSi Lista lDiferencia Finfunc // ***************************************************************************** // ENCABEZADO DEL REPORTE // ***************************************************************************** Encab fEscribeEncabCheques(tEmpresa->Nombre) Si pIdioma = 0 Texto '^Comparativo Real vs. Presupuesto por Categoría del ' & pEjeBase Si pImpFecha = True Texto '"Fecha: ' & fEditaFecha(pFechaReporte; 0) FinSi Imprime Si pTipo = 'I' Texto '^Categorías de Ingreso' Imprime SiNo Si pTipo = 'E' Texto '^Categorías de Egresos' Imprime FinSi FinSi Texto '^(Saldos Reales en ' & gNombreMoneda & ')' Imprime SubrayaCol Imprime Negritas True Altura 7 Texto C0; 'Categoría' Texto C2; '^Enero' Texto C3; '^Febrero' Texto C4; '^Marzo' Texto C5; '^Abril' Texto C6; '^Mayo' Texto C7; '^Junio' Texto C8; '^Julio' Texto C9; '^Agosto' Texto C10; '^Septiembre' Texto C11;'^Octubre' Texto C12;'^Noviembre' Texto C13;'^Diciembre' Texto C14;'^Total' Imprime Negritas False SubrayaCol Imprime SiNo Texto '^Actuals vs. Budget Comparison by Category ' & pEjeBase Si pImpFecha = True Texto '"Date: ' & fEditaFecha(pFechaReporte; 1) FinSi Imprime Texto '^(Real Balances on ' & gNombreMoneda & ')' Imprime SubrayaCol Imprime Negritas True Altura 7 Texto C0; 'Category' Texto C2; '^January' Texto C3; '^February' Texto C4; '^March' Texto C5; '^April' Texto C6; '^May' Texto C7; '^June' Texto C8; '^July' Texto C9; '^August,' Texto C10; '^September' Texto C11;'^October' Texto C12;'^November' Texto C13;'^December' Texto C14;'^Total' Imprime Negritas False SubrayaCol Imprime FinSi FinEncab // ***************************************************************************** // CODIGO PRINCIPAL DEL REPORTE // ***************************************************************************** lRegistros = falso // Para imprimir categorías de un solo nivel Si pNivel = 'S' gStrQuery = 'SELECT \'Saldo\' AS TipoSaldo, cat.Id, cat.Codigo, cat.Tipo, cat.Nombre, ISNULL(sdo.Ejercicio, ' & pEjeBase & ') AS Ejercicio, ISNULL(sdo.Saldo1,0) AS Saldo1, ' gStrQuery = gStrQuery & ' ISNULL(sdo.Saldo2,0) AS Saldo2, ISNULL(sdo.Saldo3,0) AS Saldo3, ISNULL(sdo.Saldo4,0) AS Saldo4, ISNULL(sdo.Saldo5,0) AS Saldo5, ISNULL(sdo.Saldo6,0) AS Saldo6, ' gStrQuery = gStrQuery & ' ISNULL(sdo.Saldo7,0) AS Saldo7, ISNULL(sdo.Saldo8,0) AS Saldo8, ISNULL(sdo.Saldo9,0) AS Saldo9, ISNULL(sdo.Saldo10,0) AS Saldo10, ' gStrQuery = gStrQuery & ' ISNULL(sdo.Saldo11,0) AS Saldo11, ISNULL(sdo.Saldo12,0) AS Saldo12 ' gStrQuery = gStrQuery & 'FROM Categorias cat ' gStrQuery = gStrQuery & 'LEFT JOIN ' gStrQuery = gStrQuery &'( ' gStrQuery = gStrQuery &'Select * ' gStrQuery = gStrQuery &'From SaldosCategorias ' gStrQuery = gStrQuery &'WHERE Ejercicio = '& pEjeBase &' ' gStrQuery = gStrQuery &') as sdo ON cat.Id = sdo.Idcategoria ' gStrQuery = gStrQuery & 'WHERE cat.Tipo IN (\'' & pTipo & '\') ' gStrQuery = gStrQuery & 'AND LTRIM(RTRIM(cat.CodigoMoneda)) =LTRIM(RTRIM(' & pMoneda & ')) ' gStrQuery = gStrQuery & 'AND cat.Id IN (' & pRangoSubCateg & ') ' gStrQuery = gStrQuery & 'UNION ' gStrQuery = gStrQuery & 'SELECT \'Presupuesto\' AS TipoSaldo, cat.Id, cat.Codigo, cat.Tipo, cat.Nombre, ISNULL(sdo.Ejercicio, ' & pEjeBase & ') AS Ejercicio, ISNULL(sdo.Importe1,0) AS Importe1, ' gStrQuery = gStrQuery & ' ISNULL(sdo.Importe2,0) AS Importe2, ISNULL(sdo.Importe3,0) AS Importe3, ISNULL(sdo.Importe4,0) AS Importe4, ISNULL(sdo.Importe5,0) AS Importe5, ISNULL(sdo.Importe6,0) AS Importe6, ' gStrQuery = gStrQuery & ' ISNULL(sdo.Importe7,0) AS Importe7, ISNULL(sdo.Importe8,0) AS Importe8, ISNULL(sdo.Importe9,0) AS Importe9, ISNULL(sdo.Importe10,0) AS Importe10, ' gStrQuery = gStrQuery & ' ISNULL(sdo.Importe11,0) AS Importe11, ISNULL(sdo.Importe12,0) AS Importe12 ' gStrQuery = gStrQuery & 'FROM Categorias cat ' gStrQuery = gStrQuery & 'LEFT JOIN ' gStrQuery = gStrQuery &'( ' gStrQuery = gStrQuery &'Select * ' gStrQuery = gStrQuery &'from PresupuestosCategorias sdo ' gStrQuery = gStrQuery &'WHERE sdo.Ejercicio = '& pEjeBase &' ' gStrQuery = gStrQuery &') as sdo ON cat.Id = sdo.Idcategoria ' gStrQuery = gStrQuery & 'WHERE cat.Tipo IN (\'' & pTipo & '\') ' gStrQuery = gStrQuery & 'AND LTRIM(RTRIM(cat.CodigoMoneda)) =LTRIM(RTRIM(' & pMoneda & ')) ' Si pNivel = 'C' gStrQuery = gStrQuery & 'AND cat.Id IN (' & pRangoCategorias & ') ' SiNo gStrQuery = gStrQuery & 'AND cat.Id IN (' & pRangoSubCateg & ') ' FinSi gStrQuery = gStrQuery & 'ORDER BY cat.Nombre, Ejercicio DESC ' gIdCatActual = 0 gYaEncBase = False gYaEncComp = False gDatosBase = '' gDatosComp = '' gCategoria = '' gDatosProyectado = '' gDatosPesAcum = '' gTipoCat = '' Consulta tSaldosCat = tEmpresa[gStrQuery] Si tSaldosCat->Encontro lRegistros = verdadero FinSi Mientras tSaldosCat->Encontro gTipoCat = tSaldosCat('Tipo') Si tSaldosCat('Id') != gIdCatActual gCategoria= tSaldosCat('Nombre') & ' ' & fGetTipo(tSaldosCat('Tipo')) Negritas true Texto gCategoria Imprime Negritas false gIdCatActual = tSaldosCat('Id') gYaEncBase = False gYaEncComp = False FinSi Si tSaldosCat('Id') = gIdCatActual Si tSaldosCat('TipoSaldo') = 'Presupuesto' Y gYaEncBase = False fLlenaDatos(&gDatosBase;tSaldosCat('TipoSaldo');tSaldosCat('Saldo1');tSaldosCat('Saldo2');tSaldosCat('Saldo3');tSaldosCat('Saldo4');tSaldosCat('Saldo5');tSaldosCat('Saldo6');tSaldosCat('Saldo7');tSaldosCat('Saldo8');tSaldosCat('Saldo9');tSaldosCat('Saldo10');tSaldosCat('Saldo11');tSaldosCat('Saldo12')) gYaEncBase = True SiNo Si tSaldosCat('TipoSaldo') != 'Presupuesto' Y gYaEncBase = False fLlenaDatos(&gDatosBase;pIdioma=0?'Presupuesto':'Budget';0.00;0.00;0.00;0.00;0.00;0.00;0.00;0.00;0.00;0.00;0.00;0.00) FinSi FinSi Si tSaldosCat('TipoSaldo') = 'Saldo' Y gYaEncComp = False fLlenaDatos(&gDatosComp;tSaldosCat('TipoSaldo');tSaldosCat('Saldo1');tSaldosCat('Saldo2');tSaldosCat('Saldo3');tSaldosCat('Saldo4');tSaldosCat('Saldo5');tSaldosCat('Saldo6');tSaldosCat('Saldo7');tSaldosCat('Saldo8');tSaldosCat('Saldo9');tSaldosCat('Saldo10');tSaldosCat('Saldo11');tSaldosCat('Saldo12')) gYaEncComp = True // Busca el saldo proyectado de la categoria fLlenaProyectados(&gDatosProyectado; tSaldosCat('id')) FinSi FinSi tSaldosCat.Busca Siguiente Si tSaldosCat('Id') != gIdCatActual //Alinea la categoria fCambiarNegativos(gDatosBase ) Lista gDatosBase fImprimePresuAcumulado(&gDatosPesAcum;gDatosBase;gDatosComp;gDatosProyectado;gTipoCat) fCambiarNegativos(gDatosComp) Lista gDatosComp Si pProyectados Lista gDatosProyectado FinSI [C2..C14].Subrayacol Imprime fImprimeDiferencia(gDatosBase;gDatosComp;gDatosProyectado;gTipoCat) // Diferencia acumulada fImprimeDiferenciaAcumulada(gDatosPesAcum;gDatosComp;gDatosProyectado;gDatosBase;gTipoCat) Saltalin gDatosBase = 0.0[C2..C14] gDatosComp = 0.0[C2..C14] FinSi FinMientras Si lRegistros //Imprime la ultima Categoria //Alinea la categoria fCambiarNegativos(gDatosBase ) Lista gDatosBase fImprimePresuAcumulado(&gDatosPesAcum;gDatosBase;gDatosComp;gDatosProyectado;gTipoCat) fCambiarNegativos(gDatosComp) Lista gDatosComp Si pProyectados Lista gDatosProyectado FinSI [C2..C14].Subrayacol Imprime //Calculos fImprimeDiferencia(gDatosBase;gDatosComp;gDatosProyectado;gTipoCat) // Diferencia acumulada fImprimeDiferenciaAcumulada(gDatosPesAcum;gDatosComp;gDatosProyectado;gDatosBase;gTipoCat) Saltalin gDatosBase = 0.0[C2..C14] gDatosComp = 0.0[C2..C14] FinSi // Para imprimir categorías padre con sus hijas SiNo gStrQuery = 'SELECT \'Saldo\' AS TipoSaldo, cat.Tipo AS Tipo, cat.Nombre AS NomCat, cat.Id as idPadre, sub.Nombre AS NomSub, sub.id as idHija, ISNULL(sdo.Ejercicio, ' & pEjeBase & ') AS Ejercicio, ' gStrQuery = gStrQuery &'ISNULL(sdo.Saldo1,0) AS Saldo1, ISNULL(sdo.Saldo2,0) AS Saldo2, ' gStrQuery = gStrQuery &'ISNULL(sdo.Saldo3,0) AS Saldo3, ISNULL(sdo.Saldo4,0) AS Saldo4, ISNULL(sdo.Saldo5,0) AS Saldo5, ' gStrQuery = gStrQuery &'ISNULL(sdo.Saldo6,0) AS Saldo6, ISNULL(sdo.Saldo7,0) AS Saldo7, ISNULL(sdo.Saldo8,0) AS Saldo8, ' gStrQuery = gStrQuery &'ISNULL(sdo.Saldo9,0) AS Saldo9, ISNULL(sdo.Saldo10,0) AS Saldo10, ISNULL(sdo.Saldo11,0) AS Saldo11, ' gStrQuery = gStrQuery &'ISNULL(sdo.Saldo12,0) AS Saldo12 ' gStrQuery = gStrQuery &'FROM AsocCategorias aso ' gStrQuery = gStrQuery &'JOIN Categorias cat ON cat.Id = aso.IdCategoria ' gStrQuery = gStrQuery &'JOIN Categorias sub ON sub.Id = aso.IdSubCategoria ' gStrQuery = gStrQuery &'LEFT JOIN ' gStrQuery = gStrQuery &'( ' gStrQuery = gStrQuery &'Select * ' gStrQuery = gStrQuery &'From SaldosCategorias ' gStrQuery = gStrQuery &'WHERE Ejercicio = '& pEjeBase &' ' gStrQuery = gStrQuery &') as sdo ON sdo.idCategoria = aso.IdSubCategoria ' gStrQuery = gStrQuery &'WHERE cat.Id IN ('& pRangoCategorias &') AND cat.Tipo IN (\'' & pTipo & '\') AND Sub.Nivel = \'S\' ' gStrQuery = gStrQuery & 'AND LTRIM(RTRIM(cat.CodigoMoneda)) =LTRIM(RTRIM(' & pMoneda & ')) ' // gStrQuery = gStrQuery &'AND (sdo.Ejercicio = '& pEjeBase &' OR sdo.Ejercicio IS NULL ) ' gStrQuery = gStrQuery &'UNION ' gStrQuery = gStrQuery &'SELECT \'Presupuesto\' AS TipoSaldo, cat.Tipo AS Tipo, cat.Nombre AS NomCat, cat.Id as idPadre, sub.Nombre AS NomSub, sub.id as idHija, ISNULL(sdo.Ejercicio, '& pEjeBase &') AS Ejercicio, ' gStrQuery = gStrQuery &'ISNULL(sdo.Importe1,0) AS Importe1, ISNULL(sdo.Importe2,0) AS Importe2, ' gStrQuery = gStrQuery &'ISNULL(sdo.Importe3,0) AS Importe3, ISNULL(sdo.Importe4,0) AS Importe4, ISNULL(sdo.Importe5,0) AS Importe5, ' gStrQuery = gStrQuery &'ISNULL(sdo.Importe6,0) AS Importe6, ISNULL(sdo.Importe7,0) AS Importe7, ISNULL(sdo.Importe8,0) AS Importe8, ' gStrQuery = gStrQuery &'ISNULL(sdo.Importe9,0) AS Importe9, ISNULL(sdo.Importe10,0) AS Importe10, ISNULL(sdo.Importe11,0) AS Importe11, ' gStrQuery = gStrQuery &'ISNULL(sdo.Importe12,0) AS Importe12 ' gStrQuery = gStrQuery &'FROM AsocCategorias aso ' gStrQuery = gStrQuery &'JOIN Categorias cat ON cat.Id = aso.IdCategoria ' gStrQuery = gStrQuery &'JOIN Categorias sub ON sub.Id = aso.IdSubCategoria ' gStrQuery = gStrQuery &'LEFT JOIN ' gStrQuery = gStrQuery &'( ' gStrQuery = gStrQuery &'Select * ' gStrQuery = gStrQuery &'from PresupuestosCategorias sdo ' gStrQuery = gStrQuery &'WHERE sdo.Ejercicio = '& pEjeBase &' ' gStrQuery = gStrQuery &') as sdo ON sdo.idCategoria = aso.IdSubCategoria ' gStrQuery = gStrQuery &'WHERE cat.Id IN (' & pRangoCategorias & ') AND cat.Tipo IN (\'' & pTipo & '\') AND Sub.Nivel = \'S\' ' // gStrQuery = gStrQuery &'AND (sdo.Ejercicio = '& pEjeBase &' OR sdo.Ejercicio IS NULL ) ' gStrQuery = gStrQuery &'AND LTRIM(RTRIM(cat.CodigoMoneda)) =LTRIM(RTRIM(' & pMoneda & ')) ' gStrQuery = gStrQuery &'ORDER BY idPadre, idHija, Ejercicio DESC ' gIdCatActual = 0 gIdSubCatActual = 0 //Banderas de acumulacion para hijas gHYaEncBase = False gHYaEncComp = False gDatosBase = '' gDatosProyectado = '' gDatosComp = '' gDatosBaseAcum = '' gDatosCompAcum = '' gDatosProyectadoAcum ='' gDatosPresAcum ='' gCategoriaPadre = '' gCategoriaHija = '' Consulta tSaldosCatHP = tEmpresa[gStrQuery] Si tSaldosCatHP->Encontro lRegistros = verdadero FinSi Mientras tSaldosCatHP->Encontro gTipoCat = tSaldosCatHP('Tipo') Si tSaldosCatHP('idPadre') != gIdCatActual gCategoriaPadre = tSaldosCatHP('NomCat') & ' ' & fGetTipo(tSaldosCatHP('Tipo') ) Negritas true Texto gCategoriaPadre Imprime Negritas false gIdCatActual = tSaldosCatHP('idPadre') //La primera vez siempre inicializa la variable hija, debido a que puedo pertenecer a diferentes padres gHYaEncBase = False gHYaEncComp = False gDatosBaseAcum ='' gDatosCompAcum ='' gDatosProyectadoAcum = '' FinSi Si tSaldosCatHP('idHija') != gIdSubCatActual gCategoriaHija = tSaldosCatHP('NomSub') & ' ' & fGetTipo(tSaldosCatHP('Tipo')) //gCategoriaHija[2] = fGetTipo(tSaldosCatHP('Tipo')) gIdSubCatActual = tSaldosCatHP('idHija') gHYaEncBase = False gHYaEncComp = False FinSi Si tSaldosCatHP('idPadre') = gIdCatActual Si tSaldosCatHP('idHija') = gIdSubCatActual Si tSaldosCatHP('TipoSaldo') = 'Presupuesto' Y gHYaEncBase = False fLlenaDatos(&gDatosBase;tSaldosCatHP('TipoSaldo');tSaldosCatHP('Saldo1');tSaldosCatHP('Saldo2');tSaldosCatHP('Saldo3');tSaldosCatHP('Saldo4');tSaldosCatHP('Saldo5');tSaldosCatHP('Saldo6');tSaldosCatHP('Saldo7');tSaldosCatHP('Saldo8');tSaldosCatHP('Saldo9');tSaldosCatHP('Saldo10');tSaldosCatHP('Saldo11');tSaldosCatHP('Saldo12')) //Acumula los saldos de las categorias en las padres gDatosBaseAcum= gDatosBaseAcum + gDatosBase[C2..C14] gHYaEncBase = True SiNo Si tSaldosCatHP('TipoSaldo') != 'Presupuesto' Y gHYaEncBase = False fLlenaDatos(&gDatosBase;pIdioma=0?'Presupuesto':'Budget';0.00;0.00;0.00;0.00;0.00;0.00;0.00;0.00;0.00;0.00;0.00;0.00) gDatosBaseAcum= gDatosBaseAcum + gDatosBase[C2..C14] FinSi FinSi Si tSaldosCatHP('TipoSaldo') = 'Saldo' Y gHYaEncComp = False fLlenaDatos(&gDatosComp;tSaldosCatHP('TipoSaldo');tSaldosCatHP('Saldo1');tSaldosCatHP('Saldo2');tSaldosCatHP('Saldo3');tSaldosCatHP('Saldo4');tSaldosCatHP('Saldo5');tSaldosCatHP('Saldo6');tSaldosCatHP('Saldo7');tSaldosCatHP('Saldo8');tSaldosCatHP('Saldo9');tSaldosCatHP('Saldo10');tSaldosCatHP('Saldo11');tSaldosCatHP('Saldo12')) // Busca el saldo proyectado de la categoria fLlenaProyectados(&gDatosProyectado; tSaldosCatHP('idHija')) //Acumula los saldos de las categorias en las padres gDatosCompAcum= gDatosCompAcum + gDatosComp[C2..C14] gDatosProyectadoAcum = gDatosProyectadoAcum + gDatosProyectado[C2..C14] gHYaEncComp = True FinSi FinSi FinSi tSaldosCatHP.Busca Siguiente //Imprime las categorias anteriores Si ((tSaldosCatHP('idHija') != gIdSubCatActual)o(tSaldosCatHP('idPadre') != gIdCatActual)) Y pNivel = '*' Si gHYaEncComp = false fLlenaDatos(&gDatosComp;'Saldo';0.00;0.00;0.00;0.00;0.00;0.00;0.00;0.00;0.00;0.00;0.00;0.00) // Busca el saldo proyectado de la categoria fLlenaProyectados(&gDatosProyectado; tSaldosCatHP('idHija')) //Acumula los saldos de las categorias en las padres gDatosCompAcum= gDatosCompAcum + gDatosComp[C2..C14] gDatosProyectadoAcum = gDatosProyectadoAcum + gDatosProyectado[C2..C14] FinSi //Alinea la categoria Texto ' ' & gCategoriaHija Imprime fCambiarNegativos(gDatosBase ) Lista gDatosBase fImprimePresuAcumulado(&gDatosPesAcum;gDatosBase;gDatosComp;gDatosProyectado;gTipoCat) fCambiarNegativos(gDatosComp) Lista gDatosComp Si pProyectados Lista gDatosProyectado FinSI [C2..C14].Subrayacol Imprime fImprimeDiferencia(gDatosBase;gDatosComp;gDatosProyectado;gTipoCat) // Diferencia acumulada fImprimeDiferenciaAcumulada(gDatosPesAcum;gDatosComp;gDatosProyectado;gDatosBase;gTipoCat) Saltalin gDatosBase = 0.0[C2..C14] gDatosComp = 0.0[C2..C14] FinSi Si tSaldosCatHP('idPadre') != gIdCatActual //Cambia Colores Si pNivel = '*' [C1..C14].Subrayacol Imprime FinSi gDatosBaseAcum[1] = pIdioma=0?'Presupuesto':'Budget' fCambiarNegativos(gDatosBaseAcum) Lista gDatosBaseAcum fImprimePresuAcumulado(&gDatosPesAcum;gDatosBaseAcum;gDatosCompAcum;gDatosProyectadoAcum;gTipoCat) gDatosCompAcum[1]= pIdioma = 0 ?'Saldo': 'Balance' fCambiarNegativos(gDatosCompAcum) Lista gDatosCompAcum Si pProyectados gDatosProyectadoAcum[1] = pIdioma = 0 ?'Proyectado':'Projected' Lista gDatosProyectadoAcum FinSI [C2..C14].Subrayacol Imprime fImprimeDiferencia(gDatosBaseAcum;gDatosCompAcum;gDatosProyectado;gTipoCat) // Diferencia acumulada fImprimeDiferenciaAcumulada(gDatosPesAcum;gDatosCompAcum;gDatosProyectadoAcum;gDatosBaseAcum;gTipoCat) Saltalin gDatosBase = 0.0[C2..C14] gDatosComp = 0.0[C2..C14] FinSi FinMientras Si lRegistros Si pNivel = '*' //Imprime Categoria Hija //Alinea la categoria Negritas true Texto gCategoriaHija Imprime Negritas false fCambiarNegativos(gDatosBase ) Lista gDatosBase fImprimePresuAcumulado(&gDatosPesAcum;gDatosBase;gDatosComp;gDatosProyectado;gTipoCat) fCambiarNegativos(gDatosComp) Lista gDatosComp Si pProyectados Lista gDatosProyectado FinSI [C2..C14].Subrayacol Imprime fImprimeDiferencia(gDatosBase;gDatosComp;gDatosProyectado;gTipoCat) // Diferencia acumulada fImprimeDiferenciaAcumulada(gDatosPesAcum;gDatosComp;gDatosProyectado;gDatosBase;gTipoCat) Saltalin gDatosBase = 0.0[C2..C14] gDatosComp = 0.0[C2..C14] //Cambia Colores [C1..C14].Subrayacol Imprime FinSi gDatosBaseAcum[1] = pIdioma=0?'Presupuesto':'Budget' fCambiarNegativos(gDatosBaseAcum) Lista gDatosBaseAcum fImprimePresuAcumulado(&gDatosPesAcum;gDatosBaseAcum;gDatosCompAcum;gDatosProyectadoAcum;gTipoCat) gDatosCompAcum[1]= pIdioma = 0 ?'Saldo': 'Balance' fCambiarNegativos(gDatosCompAcum) Lista gDatosCompAcum Si pProyectados gDatosProyectadoAcum[1] = pIdioma = 0 ?'Proyectado':'Projected' Lista gDatosProyectadoAcum FinSI [C2..C14].Subrayacol Imprime fImprimeDiferencia(gDatosBaseAcum;gDatosCompAcum;gDatosProyectadoAcum;gTipoCat) // Diferencia acumulada fImprimeDiferenciaAcumulada(gDatosPesAcum;gDatosCompAcum;gDatosProyectadoAcum;gDatosBaseAcum;gTipoCat) Saltalin gDatosBase = 0.0[C2..C14] gDatosComp = 0.0[C2..C14] FinSi FinSi Si lRegistros = true si pIdioma = 0 Texto '"*Los importes rojos en diferencias denotan que se sobrepaso el presupuesto para egresos o no se alcanzo para ingresos' Sino Texto '"*The amounts red in diferences denote than the budget for outlay was exceded or not was achieved for incomes' FinSi Imprime FinSi Si lRegistros = falso Lista ' ' FinSi // Fin Reporte