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 los saldos de un conjunto de cuentas detalle /// </summary> /// <param name="detalle">Subquery que tiene un renglon por cada cuenta de detalle de interés</param> static ISqlSelect <CuentasRaizDetSaldo> QuerySaldosDetalle(ISqlSelect <CuentasRaizDet> detalle, SaldoFiltro filtro) { var q = Sql .From(detalle) .Left().Lateral(det => Sql.From(Sql.RawSubquery <Mov>(@" SELECT CASE mov.""TipoMovimiento"" WHEN 0 THEN mov.""Importe"" ELSE 0 END AS ""Cargo"", CASE mov.""TipoMovimiento"" WHEN 1 THEN mov.""Importe"" ELSE 0 END AS ""Abono"", pol.""Fecha"" FROM ""Movimiento"" mov JOIN ""Poliza"" pol ON pol.""IdRegistro"" = mov.""IdPoliza"" WHERE mov.""IdCuentaDetalle"" = ""det"".""IdCuentaDet"" AND pol.""Aplicada"" AND NOT pol.""Borrada"" ")) .Select(x => new MovCargoAbono { CargoPer = Sql.Coalesce(Sql.Filter(Sql.Sum(x.Cargo), Sql.Between(x.Fecha, filtro.FechaIni, filtro.FechaFin)), 0), AbonoPer = Sql.Coalesce(Sql.Filter(Sql.Sum(x.Abono), Sql.Between(x.Fecha, filtro.FechaIni, filtro.FechaFin)), 0), CargoAnt = Sql.Coalesce(Sql.Filter(Sql.Sum(x.Cargo), x.Fecha < filtro.FechaIni), 0), AbonoAnt = Sql.Coalesce(Sql.Filter(Sql.Sum(x.Abono), x.Fecha < filtro.FechaIni), 0), })) .On(x => true) .Alias(x => new { det = x.Item1, mov = x.Item2 }) .Select(x => new CuentasRaizDetSaldo { IdRaiz = x.det.IdRaiz, IdCuentaDet = x.det.IdCuentaDet, IdCuentaAcum = x.det.IdCuentaAcum, IdCuentaPadre = x.det.IdCuentaPadre, Terminacion = x.det.Terminacion, Nombre = x.det.Nombre, CargoAnt = x.mov.CargoAnt, AbonoAnt = x.mov.AbonoAnt, CargoPer = x.mov.CargoPer, AbonoPer = x.mov.AbonoPer }); return(q); }