Ejemplo n.º 1
0
        public void RelacionAnalitica()
        {
            var cuentasFiltro = new CuentasFiltro
            {
                IdCuenta = new Guid("02bcd575-75ec-48bb-af43-c517fe65af4f")
            };

            var saldosFiltro = new SaldoFiltro
            {
                FechaIni = new DateTime(2018, 12, 1),
                FechaFin = new DateTime(2018, 12, 31)
            };

            var cuentas    = QueryCuentasDetalle(cuentasFiltro);
            var saldosDet  = QuerySaldosDetalle(cuentas, saldosFiltro);
            var acumulados = QueryAcumularSaldosDetalle(saldosDet);

            var saldos = QuerySaldoDto(acumulados);
            var ret    = saldos.ToSql(SqlText.ParamMode.Substitute);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Query que devuelve todas las cuentas de detalle relacionadas con cierto conjunto de cuentas
        /// </summary>
        /// <returns></returns>
        static ISqlSelect <CuentasRaizDet> QueryCuentasDetalle(CuentasFiltro filtro)
        {
            var q = Sql.WithRecursive(
                Sql
                //Cuentas de las que nos interesa la relación analítica:
                .From(Sql.RawSubquery <CuentasRaizDet>(
                          @"
            SELECT
			    ""IdRegistro"" AS ""IdRaiz"",
			    null::uuid AS ""IdCuentaDet"",
			    ""IdRegistro"" AS ""IdCuentaAcum"",
			    ""Terminacion"",
			    ""Nombre"",
			    ""IdCuentaPadre"",
			    CASE WHEN ""IdCuentaPadre"" IS NULL THEN 0 ELSE 1 END AS ""Tipo""
            FROM ""CuentaAcumulativa""
                
            UNION ALL
                
            SELECT
			    ""IdRegistro"" AS ""IdRaiz"",
			    ""IdRegistro"" AS ""IdCuentaDet"",
			    null::uuid AS ""IdCuentaAcum"",
			    ""Terminacion"",
			    ""Nombre"",
			    ""IdCuentaPadre"", 
			    2 AS ""Tipo""
            FROM ""CuentaDetalle""
"
                          ))
                .Select(x => x)
                //Filtros por cuenta:
                .Where(x => filtro.IdCuenta == null || x.IdCuentaAcum == filtro.IdCuenta)
                ).UnionAll((w, cuentas) =>
                           //Obtener todas las subcuentas hijas de esas cuentas de interes, note que aquí estan revueltas las acumulativas como las de detalle
                           Sql.RawSubquery <CuentasRaizDet>(@"
            SELECT cuentas.""IdRaiz"", ac.""IdCuentaDet"", ac.""IdCuentaAcum"", ac.""Terminacion"", ac.""Nombre"", ac.""IdCuentaPadre"", ac.""Tipo"" 
            FROM
            (
		    SELECT 
			    null::uuid AS ""IdCuentaDet"",
			    ""IdRegistro"" AS ""IdCuentaAcum"", 
			    ""Terminacion"", 
			    ""Nombre"", 
			    ""IdCuentaPadre"", 
			    1 AS ""Tipo"" 
		    FROM ""CuentaAcumulativa""

		    UNION ALL
		    
		    SELECT 
			    ""IdRegistro"" AS ""IdCuentaDet"",
			    null::uuid AS ""IdCuentaAcum"", 
			    ""Terminacion"", 
			    ""Nombre"", 
			    ""IdCuentaPadre"", 
			    2 AS ""Tipo"" 
		    FROM ""CuentaDetalle""
            )  ac, cuentas 
            WHERE ac.""IdCuentaPadre"" = cuentas.""IdCuentaAcum""
"))
                    .Map((w, b) => b)
                    .Query(cuentas =>
                           Sql.From(cuentas)
                           .Select(x => x)
                           //Sólo nos interesan las de detalle:
                           .Where(x => x.Tipo == TipoCuenta.Detalle)
                           //El orden es sólo por conveniencia para depurar:
                           .OrderBy(x => x.Terminacion)
                           );

            return(q);
        }