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); }
/// <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); }