public List<CedForecastEntidades.Bejerman.Ventas> LeerNovedades(string Periodo)
 {
     DateTime fechaDsd = new DateTime(Convert.ToInt32(Periodo.Substring(0, 4)), Convert.ToInt32(Periodo.Substring(4, 2)), 1);
     DateTime fechaHst = fechaDsd.AddMonths(1).AddDays(-1);
     DataTable dt = new DataTable();
     System.Text.StringBuilder a = new StringBuilder();
     a.Append("SELECT ltrim(rtrim(SegDetV.sdvart_CodGen)) as sdvart_CodGen, ltrim(rtrim(CabVenta.cve_CodCli)) as cve_CodCli, sum(SegDetV.sdv_CantUM1) as sdv_CantUM1 ");
     a.Append("FROM CabVenta, SegCabV, SegDetV ");
     a.Append("WHERE CabVenta.cveemp_CodigoSCV=SegCabV.scvemp_Codigo ");
     a.Append("and CabVenta.cvesuc_CodSCV=SegCabV.scvsuc_Cod ");
     a.Append("and CabVenta.cvescv_ID=SegCabV.scv_ID ");
     a.Append("and SegCabV.scvemp_Codigo =SegDetV.sdvemp_Codigo ");
     a.Append("and SegCabV.scvsuc_Cod =SegDetV.sdvsuc_Cod ");
     a.Append("and SegCabV.scv_ID =SegDetV.sdvscv_id ");
     a.Append("and (CabVenta.cve_FEmision between '" + fechaDsd.ToString("yyyyMMdd") + "' and '" + fechaHst.ToString("yyyyMMdd") + "') ");
     a.Append("and SegDetV.sdvart_CodGen is not NULL ");
     a.Append("and sdvart_CodGen!='50000004' ");
     a.Append("group by sdvart_CodGen, cve_CodCli ");
     a.Append("having sum(SegDetV.sdv_CantUM1)<>0 ");
     a.Append("order by sdvart_CodGen, cve_CodCli ");
     dt = (DataTable)Ejecutar(a.ToString(), TipoRetorno.TB, Transaccion.NoAcepta, sesion.CnnStrAplicExterna);
     List<CedForecastEntidades.Bejerman.Ventas> lista = new List<CedForecastEntidades.Bejerman.Ventas>();
     if (dt.Rows.Count != 0)
     {
         for (int i = 0; i < dt.Rows.Count; i++)
         {
             CedForecastEntidades.Bejerman.Ventas elemento = new CedForecastEntidades.Bejerman.Ventas();
             Copiar(dt.Rows[i], elemento);
             lista.Add(elemento);
         }
     }
     return lista;
 }
Exemple #2
0
 public List<CedForecastEntidades.RFoPA> Lista(CedForecastEntidades.RFoPA Forecast, string TipoReporte, string ListaArticulos, string ListaClientes, string ListaVendedores)
 {
     cantidadFilas = 0;
     System.Text.StringBuilder a = new StringBuilder();
     a.Append("select Forecast.IdTipoPlanilla, Forecast.IdCuenta, Forecast.IdCliente, Forecast.IdPeriodo, Forecast.IdArticulo, Forecast.Cantidad, isnull(FamiliaArticulo.IdFamiliaArticulo, '') as IdFamiliaArticulo, isnull(FamiliaArticulo.DescrFamiliaArticulo, '') as DescrFamiliaArticulo ");
     //Articulo.DescrArticulo, Articulo.IdGrupoArticulo, GrupoArticulo.DescrGrupoArticulo, Division.IdDivision, Division.DescrDivision,
     a.Append("from Forecast left outer join FamiliaArticuloXArticulo on Forecast.IdArticulo = FamiliaArticuloXArticulo.IdArticulo ");
     a.Append("left outer join FamiliaArticulo on FamiliaArticuloXArticulo.IdFamiliaArticulo = FamiliaArticulo.IdFamiliaArticulo ");
     //, Articulo, GrupoArticulo, Division ");
     a.Append("where Forecast.IdTipoPlanilla='" + Forecast.IdTipoPlanilla + "' ");
     //Forecast.IdArticulo=Articulo.IdArticulo and Articulo.IdGrupoArticulo=GrupoArticulo.IdGrupoArticulo and GrupoArticulo.IdDivision=Division.IdDivision
     if (ListaArticulos != "")
     {
         a.Append("and Forecast.IdArticulo in (" + ListaArticulos + ") "); 
     }
     if (ListaClientes != "")
     {
         a.Append("and Forecast.IdCliente in (" + ListaClientes + ") ");
     }
     if (ListaVendedores != "")
     {
         a.Append("and Forecast.IdCuenta in (" + ListaVendedores + ") ");
     }
     if (Forecast.IdCliente != null && Forecast.IdCliente != "")
     {
         a.Append("and Forecast.IdCliente='" + Forecast.IdCliente + "' ");
     }
     string periodo = "";
     periodo = UltimoMesForecast(Forecast.IdPeriodo);
     if (Forecast.IdTipoPlanilla == "Proyectado" && Forecast.IdPeriodo.Substring(0, 4) == periodo.Substring(0, 4))
     {
         periodo = Forecast.IdPeriodo.Substring(0, 4) + "99";
     }
     a.Append("and IdPeriodo >= '" + Forecast.IdPeriodo + "' ");
     a.Append("and IdPeriodo <= '" + periodo + "' ");
     switch (TipoReporte)
     {
         case "FamArtCliVen":
         case "FamArtCli":
         case "FamArt":
             a.Append("order by IdArticulo asc, IdCliente asc, IdCuenta asc, IdPeriodo asc ");
             break;
         case "FamArtVen":
             a.Append("order by IdArticulo asc, IdCuenta asc, IdCliente asc, IdPeriodo asc ");
             break;
         case "Fam":
             a.Append("order by IdFamiliaArticulo asc, IdArticulo asc, IdCuenta asc, IdCliente asc, IdPeriodo asc ");
             break;
     }
     DataTable dt = new DataTable();  
     dt = (DataTable)Ejecutar(a.ToString(), TipoRetorno.TB, Transaccion.NoAcepta, sesion.CnnStr);
     List<CedForecastEntidades.RFoPA> lista = new List<CedForecastEntidades.RFoPA>();
     if (dt.Rows.Count != 0)
     {
         CedForecastEntidades.RFoPA forecast = new CedForecastEntidades.RFoPA();
         string idClave = "";
         idClave = ObtenerClaveXTipoReporte(dt.Rows[0], TipoReporte);
         CopiarCab(dt.Rows[0], forecast, Forecast.IdPeriodo);
         //Lista de ventas para Rolling Forecast
         List<CedForecastEntidades.Bejerman.Ventas> ventas = new List<CedForecastEntidades.Bejerman.Ventas>();
         List<CedForecastEntidades.RFoPA> totalProyectadoLista = new List<CedForecastEntidades.RFoPA>();
         if (Forecast.IdTipoPlanilla == "RollingForecast")
         {
             CedForecastDB.Bejerman.Ventas db = new CedForecastDB.Bejerman.Ventas(sesion);
             ventas = db.LeerParaRF(Forecast.IdPeriodo, TipoReporte);
             CedForecastEntidades.Bejerman.Ventas venta = new CedForecastEntidades.Bejerman.Ventas();
             switch (TipoReporte)
             {
                 case "FamArtCli":
                     venta = ventas.Find((delegate(CedForecastEntidades.Bejerman.Ventas e) { return e.Cve_CodCli == dt.Rows[0]["IdCliente"].ToString() && e.Sdvart_CodGen == dt.Rows[0]["IdArticulo"].ToString(); }));
                     break;
                 case "FamArt":
                     venta = ventas.Find((delegate(CedForecastEntidades.Bejerman.Ventas e) { return e.Sdvart_CodGen == dt.Rows[0]["IdArticulo"].ToString(); }));
                     break;
             }
             if (venta != null)
             {
                 forecast.Ventas = venta.Sdv_CantUM1;
             }
             //Lista de totales proyectados por articulo
             totalProyectadoLista = TotalProyectado(Forecast);
             ////Buscar total proyectado
             CedForecastEntidades.RFoPA totalProyectado = new CedForecastEntidades.RFoPA();
             totalProyectado = totalProyectadoLista.Find((delegate(CedForecastEntidades.RFoPA e) { return e.IdCliente == dt.Rows[0]["IdCliente"].ToString() && e.Articulo.Art_CodGen == dt.Rows[0]["IdArticulo"].ToString(); }));
             if (totalProyectado != null)
             {
                 forecast.Proyectado = totalProyectado.Proyectado;
             }
         }
         for (int i = 0; i < dt.Rows.Count; i++)
         {
             string periodoInicial = Forecast.IdPeriodo;
             //if (Forecast.IdTipoPlanilla == "Proyectado")
             //{
             //    periodoInicial = periodoInicial + "01";
             //}
             int mes = 0;
             if (Forecast.IdTipoPlanilla == "Proyectado" && (dt.Rows[i]["IdPeriodo"].ToString().Substring(4, 2) == "13" || dt.Rows[i]["IdPeriodo"].ToString().Substring(4, 2) == "14"))
             {
                 mes = Convert.ToInt32(dt.Rows[i]["IdPeriodo"].ToString().Substring(4, 2));
             }
             else
             {
                 mes = MesAProcesar(dt.Rows[i]["IdPeriodo"].ToString(), periodoInicial);
             }
             //Clave para armado de info según agrupamiento
             string claveAux = ObtenerClaveXTipoReporte(dt.Rows[i], TipoReporte);
             if (idClave != claveAux)
             {
                 idClave = claveAux;
                 lista.Add(forecast);
                 forecast = new CedForecastEntidades.RFoPA();
                 CopiarCab(dt.Rows[i], forecast, Forecast.IdPeriodo);
                 if (Forecast.IdTipoPlanilla == "RollingForecast")
                 {
                     //Buscar ventas reales
                     //CedForecastDB.Bejerman.Ventas db = new CedForecastDB.Bejerman.Ventas(sesion);
                     //ventas = db.LeerParaRF(Forecast.IdPeriodo, TipoReporte);
                     CedForecastEntidades.Bejerman.Ventas venta = new CedForecastEntidades.Bejerman.Ventas();
                     switch (TipoReporte)
                     {
                         case "FamArtCli":
                             venta = ventas.Find((delegate(CedForecastEntidades.Bejerman.Ventas e) { return e.Cve_CodCli == dt.Rows[i]["IdCliente"].ToString() && e.Sdvart_CodGen == dt.Rows[i]["IdArticulo"].ToString(); }));
                             break;
                         case "FamArt":
                             venta = ventas.Find((delegate(CedForecastEntidades.Bejerman.Ventas e) { return e.Sdvart_CodGen == dt.Rows[i]["IdArticulo"].ToString(); }));
                             break;
                     }
                     if (venta != null)
                     {
                         forecast.Ventas = venta.Sdv_CantUM1;
                     }
                     //Buscar total proyectado
                     CedForecastEntidades.RFoPA totalProyectado = new CedForecastEntidades.RFoPA();
                     totalProyectado = totalProyectadoLista.Find((delegate(CedForecastEntidades.RFoPA e) { return e.IdCliente == dt.Rows[i]["IdCliente"].ToString() && e.Articulo.Art_CodGen == dt.Rows[i]["IdArticulo"].ToString(); }));
                     if (totalProyectado != null)
                     {
                         forecast.Proyectado = totalProyectado.Proyectado;
                     }
                 }
             }
             CopiarDet(dt.Rows[i], forecast, mes);
          }
          lista.Add(forecast);
     }
     cantidadFilas = lista.Count;
     return lista;
 }
        public List<CedForecastEntidades.Bejerman.Ventas> LeerParaResumenArgentinaXZonas(string TipoReporte, string PeriodoDesde, string PeriodoHasta, string ListaArticulos, string ListaClientes, string ListaVendedores)
        {
            DateTime fechaDsd = new DateTime(Convert.ToInt32(PeriodoDesde.Substring(0, 4)), Convert.ToInt32(PeriodoDesde.Substring(4, 2)), 1);
            DateTime fechaHst = new DateTime(Convert.ToInt32(PeriodoHasta.Substring(0, 4)), Convert.ToInt32(PeriodoHasta.Substring(4, 2)), 1);
            fechaHst = fechaHst.AddMonths(1).AddDays(-1);  
            DataTable dt = new DataTable();
            System.Text.StringBuilder a = new StringBuilder();
            switch (TipoReporte)
            {
                case "Zona-Familia-Articulo":
                    a.Append("SELECT clizon_cod as Zona, cvemon_codigo, ltrim(rtrim(SegDetV.sdvart_CodGen)) as sdvart_CodGen, CabVenta.cve_FEmision, Convert(varchar(6), CabVenta.cve_FEmision, 112) as Periodo, sum(SegDetV.sdv_CantUM1) as sdv_CantUM1, Sum(SegDetV.sdv_ImpTot) as sdv_ImpTot ");
                    a.Append("FROM CabVenta, SegCabV, SegDetV, Clientes ");
                    a.Append("WHERE CabVenta.cveemp_CodigoSCV=SegCabV.scvemp_Codigo ");
                    a.Append("and CabVenta.cvesuc_CodSCV=SegCabV.scvsuc_Cod ");
                    a.Append("and CabVenta.cvescv_ID=SegCabV.scv_ID ");
                    a.Append("and SegCabV.scvemp_Codigo =SegDetV.sdvemp_Codigo ");
                    a.Append("and SegCabV.scvsuc_Cod =SegDetV.sdvsuc_Cod ");
                    a.Append("and SegCabV.scv_ID =SegDetV.sdvscv_id ");
                    a.Append("and CabVenta.cve_CodCli = Clientes.cli_Cod ");
                    a.Append("and (CabVenta.cve_FEmision between '" + fechaDsd.ToString("yyyyMMdd") + "' and '" + fechaHst.ToString("yyyyMMdd") + "') ");
                    a.Append("and (cve_NroCuota=1 or cve_NroCuota='') ");
                    a.Append("and SegDetV.sdvart_CodGen is not NULL ");
                    a.Append("and SegDetV.sdvart_CodGen!='50000004' ");
                    a.Append("and SegDetV.sdvart_CodGen in (" + ListaArticulos + ") and Clientes.cli_Cod in (" + ListaClientes + ") ");
                    a.Append("and CabVenta.cveven_Cod in (" + ListaVendedores + ") ");
                    a.Append("group by clizon_cod, sdvart_CodGen, cve_FEmision, cvemon_codigo ");
                    a.Append("having sum(SegDetV.sdv_CantUM1)<>0 ");
                    a.Append("order by clizon_cod, sdvart_CodGen, cve_FEmision, cvemon_Codigo ");
                    break;
                case "Vendedor-Familia-Articulo":
                    a.Append("SELECT cveven_Cod as Vendedor, cvemon_Codigo, ltrim(rtrim(SegDetV.sdvart_CodGen)) as sdvart_CodGen, CabVenta.cve_FEmision, Convert(varchar(6), CabVenta.cve_FEmision, 112) as Periodo, sum(SegDetV.sdv_CantUM1) as sdv_CantUM1, Sum(SegDetV.sdv_ImpTot) as sdv_ImpTot ");
                    a.Append("FROM CabVenta, SegCabV, SegDetV, Clientes ");
                    a.Append("WHERE CabVenta.cveemp_CodigoSCV=SegCabV.scvemp_Codigo ");
                    a.Append("and CabVenta.cvesuc_CodSCV=SegCabV.scvsuc_Cod ");
                    a.Append("and CabVenta.cvescv_ID=SegCabV.scv_ID ");
                    a.Append("and SegCabV.scvemp_Codigo =SegDetV.sdvemp_Codigo ");
                    a.Append("and SegCabV.scvsuc_Cod =SegDetV.sdvsuc_Cod ");
                    a.Append("and SegCabV.scv_ID =SegDetV.sdvscv_id ");
                    a.Append("and CabVenta.cve_CodCli = Clientes.cli_Cod ");
                    a.Append("and SegDetV.sdvart_CodGen in (" + ListaArticulos + ") and Clientes.cli_Cod in (" + ListaClientes + ") ");
                    a.Append("and CabVenta.cveven_Cod in (" + ListaVendedores + ") ");
                    a.Append("and (CabVenta.cve_FEmision between '" + fechaDsd.ToString("yyyyMMdd") + "' and '" + fechaHst.ToString("yyyyMMdd") + "') ");
                    a.Append("and (cve_NroCuota=1 or cve_NroCuota='') ");
                    a.Append("and SegDetV.sdvart_CodGen is not NULL ");
                    a.Append("and sdvart_CodGen!='50000004' ");
                    a.Append("group by cveven_Cod, sdvart_CodGen, cve_FEmision, cvemon_Codigo ");
                    a.Append("having sum(SegDetV.sdv_CantUM1)<>0 ");
                    a.Append("order by cveven_Cod, sdvart_CodGen, cve_FEmision, cvemon_Codigo ");
                    break;
            }
            dt = (DataTable)Ejecutar(a.ToString(), TipoRetorno.TB, Transaccion.NoAcepta, sesion.CnnStrAplicExterna);
            List<CedForecastEntidades.Bejerman.Ventas> lista = new List<CedForecastEntidades.Bejerman.Ventas>();
            if (dt.Rows.Count != 0)
            {
                List<CedForecastEntidades.Bejerman.Cotizacion> cotizaciones = new List<CedForecastEntidades.Bejerman.Cotizacion>();
                CedForecastDB.Bejerman.Cotizacion dbCotiz = new Cotizacion(sesion);
                cotizaciones = dbCotiz.LeerLista("DVT");

                CedForecastEntidades.Bejerman.Ventas elemento = new CedForecastEntidades.Bejerman.Ventas();
                string ClaveAnterior = "";
                switch (TipoReporte)
                {
                    case "Zona-Familia-Articulo":
                        ClaveAnterior = dt.Rows[0]["Zona"].ToString() + dt.Rows[0]["sdvart_CodGen"].ToString() + dt.Rows[0]["Periodo"].ToString(); 
                        break;
                    case "Vendedor-Familia-Articulo":
                        ClaveAnterior = dt.Rows[0]["Vendedor"].ToString() + dt.Rows[0]["sdvart_CodGen"].ToString() + dt.Rows[0]["Periodo"].ToString();
                        break;
                }
                string ClaveActual = "";
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    switch (TipoReporte)
                    {
                        case "Zona-Familia-Articulo":
                            ClaveActual = dt.Rows[i]["Zona"].ToString() + dt.Rows[i]["sdvart_CodGen"].ToString() + dt.Rows[i]["Periodo"].ToString(); 
                            break;
                        case "Vendedor-Familia-Articulo":
                            ClaveActual = dt.Rows[i]["Vendedor"].ToString() + dt.Rows[i]["sdvart_CodGen"].ToString() + dt.Rows[i]["Periodo"].ToString();
                            break;
                    }
                    if (ClaveAnterior != ClaveActual)
                    {
                        lista.Add(elemento);
                        elemento = new CedForecastEntidades.Bejerman.Ventas();
                        ClaveAnterior = ClaveActual;
                    }
                    CopiarResumenArgentinaXZonas(TipoReporte, cotizaciones, dt.Rows[i], elemento);
                }
                lista.Add(elemento);
            }
            return lista;
        }
Exemple #4
0
        public static DataTable ResumenArgentinaXZonas(string PeriodoDesde, string PeriodoHasta, string TipoReporte, string ListaArticulos, string ListaClientes, string ListaVendedores, bool Valorizado, CedEntidades.Sesion Sesion, out List<CedForecastEntidades.Advertencia> Advertencias)
        {
            Advertencias = new List<CedForecastEntidades.Advertencia>();
            //Validacion de parámetros
            if (ListaArticulos == String.Empty)
            {
                throw new Microsoft.ApplicationBlocks.ExceptionManagement.Validaciones.ValorNoInfo("Articulo(s)");
            }
            if (ListaClientes == String.Empty)
            {
                throw new Microsoft.ApplicationBlocks.ExceptionManagement.Validaciones.ValorNoInfo("Cliente(s)");
            }
            //Leer datos Forecast
            CedForecastDB.Forecast db = new CedForecastDB.Forecast(Sesion);
            DataSet ds = db.LeerDatosParaResumenArgentinaXZonas(PeriodoDesde, PeriodoHasta, TipoReporte, ListaArticulos, ListaClientes, ListaVendedores);
            DataTable dtZona;
            DataTable dtVendedor;
            switch (TipoReporte)
            {
                case "Zona-Familia-Articulo":
                    dtZona = ds.Tables[0];
                    break;
                case "Vendedor-Familia-Articulo":
                    dtVendedor = ds.Tables[0];
                    break;
            }
            DataTable dtFamilia = ds.Tables[1];
            DataTable dtArticulos = ds.Tables[2];
            DataTable dtDatos = ds.Tables[3];
            //Leer datos Bejerman
            List<CedForecastEntidades.Bejerman.Zona> zonas = new CedForecastDB.Bejerman.Zona(Sesion).LeerLista();
            List<CedForecastEntidades.Bejerman.Vendedor> vendedores = new CedForecastDB.Bejerman.Vendedor(Sesion).LeerLista();
            List<CedForecastEntidades.Bejerman.Articulos> articulos = new CedForecastDB.Bejerman.Articulos(Sesion).LeerListaConPrecios();
            List<CedForecastEntidades.ArticuloInfoAdicional> familiaXArticulos = new CedForecastDB.ArticuloInfoAdicional(Sesion).LeerLista();
            //Crear crosstab
            DataTable dt = new DataTable();
            dt.Columns.Add(ClonarColumna(dtDatos.Columns[0])); //Empresa
            dt.Columns.Add(ClonarColumna(dtDatos.Columns[1])); //Zona o Vendedor
            dt.Columns.Add(ClonarColumna(dtDatos.Columns["Familia"]));
            dt.Columns.Add(ClonarColumna(dtDatos.Columns["Articulo"]));
            string idPeriodo = "";
            DateTime periodoDesde = Convert.ToDateTime("01/" + PeriodoDesde.Substring(4, 2) + "/" + PeriodoDesde.Substring(0, 4));
            DateTime periodoHasta = Convert.ToDateTime("01/" + PeriodoHasta.Substring(4, 2) + "/" + PeriodoHasta.Substring(0, 4));
            int meses = periodoHasta.Month - periodoDesde.Month + 1;
            int años = periodoHasta.Year - periodoDesde.Year;
            meses += años * 12;
            idPeriodo = periodoDesde.ToString("yyyyMM");
            for (int i = 1; i <= meses; i++)
            {
                dt.Columns.Add(ClonarColumna(dtDatos.Columns["Cantidad"], "Plan-" + idPeriodo, "Plan-" + idPeriodo));
                dt.Columns.Add(ClonarColumna(dtDatos.Columns["Cantidad"], "Real-" + idPeriodo, "Real-" + idPeriodo));
                idPeriodo = periodoDesde.AddMonths(i).ToString("yyyyMM");
            }
            dt.Columns.Add(ClonarColumna(dtDatos.Columns["Cantidad"], "Total Plan", "Total Plan"));
            dt.Columns.Add(ClonarColumna(dtDatos.Columns["Cantidad"], "Total Real", "Total Real"));
            dt.Columns.Add(ClonarColumna(dtDatos.Columns["Cantidad"], "Desvio Plan", "Desvio Plan"));
            //Llenar crosstab
            string claveAnterior = String.Empty;
            //Buscar Ventas
            CedForecastDB.Bejerman.Ventas dbVentas = new CedForecastDB.Bejerman.Ventas(Sesion);
            List<CedForecastEntidades.Bejerman.Ventas> ventas = dbVentas.LeerParaResumenArgentinaXZonas(TipoReporte, PeriodoDesde, PeriodoHasta, ListaArticulos, ListaClientes, ListaVendedores);
            decimal precio = 0;
            for (int i = 0; i < ventas.Count; i++)
            {
                string familia = "";
                CedForecastEntidades.ArticuloInfoAdicional articuloInfoAdicional = familiaXArticulos.Find(delegate(CedForecastEntidades.ArticuloInfoAdicional c) { return c.IdArticulo == Convert.ToString(ventas[i].Sdvart_CodGen); });
                if (articuloInfoAdicional != null)
                {
                    familia = articuloInfoAdicional.IdFamiliaArticulo;
                }
                DataRow[] drv;
                switch (TipoReporte)
                {
                    case "Zona-Familia-Articulo":
                        drv = dtDatos.Select("Zona = '" + ventas[i].Zona + "' and Articulo = '" + ventas[i].Sdvart_CodGen + "' and Periodo = '" + ventas[i].Periodo + "'");
                        if (drv.Length == 0)
                        {

                            dtDatos.Rows.Add("Empresa", ventas[i].Zona, familia, ventas[i].Sdvart_CodGen, ventas[i].Sdvart_CodGen, ventas[i].Periodo, 0);
                        }
                        break;
                    case "Vendedor-Familia-Articulo":
                        drv = dtDatos.Select("Vendedor = '" + ventas[i].Vendedor + "' and Articulo = '" + ventas[i].Sdvart_CodGen + "' and Periodo = '" + ventas[i].Periodo + "'");
                        if (drv.Length == 0)
                        {
                            dtDatos.Rows.Add("Empresa", ventas[i].Vendedor, familia, ventas[i].Sdvart_CodGen, ventas[i].Sdvart_CodGen, ventas[i].Periodo, 0);
                        }
                        break;
                }
            }
            //Ordenar datos
            switch (TipoReporte)
            {
                case "Zona-Familia-Articulo":
                    dtDatos.DefaultView.Sort = "Zona ASC, Familia ASC, Articulo ASC";
                    break;
                case "Vendedor-Familia-Articulo":
                    dtDatos.DefaultView.Sort = "Vendedor ASC, Familia ASC, Articulo ASC";
                    break;
            }
            
            for (int i = 0; i < dtDatos.DefaultView.Count; i++)
            {
                string claveActual = Convert.ToString(dtDatos.DefaultView[i][1]) + Convert.ToString(dtDatos.DefaultView[i]["Familia"]) + Convert.ToString(dtDatos.DefaultView[i]["Articulo"]);
                if (claveAnterior != claveActual)
                {
                    DataRow dr = dt.NewRow();
                    dr["Empresa"] = "Empresa";
                    CedForecastEntidades.ArticuloInfoAdicional familiaXArticulo = familiaXArticulos.Find(delegate(CedForecastEntidades.ArticuloInfoAdicional c) { return c.IdArticulo == Convert.ToString(dtDatos.DefaultView[i]["Articulo"]); });
                    if (familiaXArticulo == null)
                    {
                        dr["Familia"] = "<<<Desconocida>>>";
                        Advertencias.Add(new CedForecastEntidades.Advertencia("CTabAC-01", "Artículo " + Convert.ToString(dtDatos.DefaultView[i]["Articulo"]) + " sin familia definida", CedForecastEntidades.Advertencia.TipoSeveridad.Advertencia));
                    }
                    else
                    {
                        dr["Familia"] = familiaXArticulo.DescrFamiliaArticulo;
                    }
                    CedForecastEntidades.Bejerman.Articulos articulo = articulos.Find(delegate(CedForecastEntidades.Bejerman.Articulos c) { return c.Art_CodGen == Convert.ToString(dtDatos.DefaultView[i]["Articulo"]); });
                    if (articulo == null)
                    {
                        dr["Articulo"] = Convert.ToString(dtDatos.DefaultView[i]["Articulo"]) + "-<<<Desconocido>>>";
                        Advertencias.Add(new CedForecastEntidades.Advertencia("CTabAC-02", "Descripción no encontrada para el artículo " + Convert.ToString(dtDatos.DefaultView[i]["Articulo"]), CedForecastEntidades.Advertencia.TipoSeveridad.Advertencia));
                        precio = 0;
                    }
                    else
                    {
                        dr["Articulo"] = Convert.ToString(dtDatos.DefaultView[i]["Articulo"]) + "-" + articulo.Art_DescGen;
                        precio = articulo.Lpr_Precio;
                    }
                    if (precio == 0)
                    {
                        Advertencias.Add(new CedForecastEntidades.Advertencia("CTabAC-03", "Precio no encontrado para el artículo " + Convert.ToString(dtDatos.DefaultView[i]["Articulo"]), CedForecastEntidades.Advertencia.TipoSeveridad.Error));
                    }
                    switch (TipoReporte)
                    {
                        case "Zona-Familia-Articulo":
                            CedForecastEntidades.Bejerman.Zona zona = zonas.Find(delegate(CedForecastEntidades.Bejerman.Zona c) { return c.Zon_Cod == Convert.ToString(dtDatos.DefaultView[i]["Zona"]); });
                            if (zona == null)
                            {
                                dr["Zona"] = Convert.ToString(dtDatos.DefaultView[i]["Zona"]) + "-<<<Desconocido>>>";
                                Advertencias.Add(new CedForecastEntidades.Advertencia("CTabAC-04", "Descripción no encontrada para la zona " + Convert.ToString(dtDatos.DefaultView[i]["Zona"]), CedForecastEntidades.Advertencia.TipoSeveridad.Advertencia));
                            }
                            else
                            {
                                dr["Zona"] = Convert.ToString(dtDatos.DefaultView[i]["Zona"]) + "-" + zona.Zon_Desc;
                            }
                            break;
                        case "Vendedor-Familia-Articulo":
                            CedForecastEntidades.Bejerman.Vendedor vendedor = vendedores.Find(delegate(CedForecastEntidades.Bejerman.Vendedor c) { return c.Ven_Cod == Convert.ToString(dtDatos.DefaultView[i]["Vendedor"]); });
                            if (vendedor == null)
                            {
                                dr["Vendedor"] = Convert.ToString(dtDatos.DefaultView[i]["Vendedor"]) + "-<<<Desconocido>>>";
                                Advertencias.Add(new CedForecastEntidades.Advertencia("CTabAC-04", "Descripción no encontrada para el vendedor " + Convert.ToString(dtDatos.DefaultView[i]["Vendedor"]), CedForecastEntidades.Advertencia.TipoSeveridad.Advertencia));
                            }
                            else
                            {
                                dr["Vendedor"] = Convert.ToString(dtDatos.DefaultView[i]["Vendedor"]) + "-" + vendedor.Ven_Desc;
                            }
                            break;
                    }

                    if (!Valorizado)
                    {
                        precio = 1;
                    }
                    else
                    {
                        if (articulo == null)
                        {
                            precio = 0;
                        }
                        else
                        {
                            precio = articulo.Lpr_Precio;
                        }
                    }
                    dr["Total Plan"] = 0;
                    dr["Total Real"] = 0;
                    dt.Rows.Add(dr);
                    claveAnterior = claveActual;
                }
                decimal valor = Convert.ToDecimal(dtDatos.DefaultView[i]["Cantidad"]) * precio;
                dt.Rows[dt.Rows.Count - 1]["Plan-" + dtDatos.DefaultView[i]["Periodo"].ToString()] = valor;
                //Completo ventas
                CedForecastEntidades.Bejerman.Ventas venta = new CedForecastEntidades.Bejerman.Ventas();
                switch (TipoReporte)
                {
                    case "Zona-Familia-Articulo":
                        venta = ventas.Find((delegate(CedForecastEntidades.Bejerman.Ventas e) { return e.Zona == dtDatos.DefaultView[i]["Zona"].ToString() && e.Sdvart_CodGen == dtDatos.DefaultView[i]["Articulo"].ToString() && e.Periodo == dtDatos.DefaultView[i]["Periodo"].ToString(); }));
                        break;
                    case "Vendedor-Familia-Articulo":
                        venta = ventas.Find((delegate(CedForecastEntidades.Bejerman.Ventas e) { return e.Vendedor == dtDatos.DefaultView[i]["Vendedor"].ToString() && e.Sdvart_CodGen == dtDatos.DefaultView[i]["Articulo"].ToString() && e.Periodo == dtDatos.DefaultView[i]["Periodo"].ToString(); }));
                        break;
                }
                
                decimal valorReal = 0;
                if (venta != null)
                {
                    if (Valorizado)
                    {
                        valorReal = venta.Sdv_ImpTot;
                    }
                    else
                    {
                        valorReal = venta.Sdv_CantUM1;
                    }
                    dt.Rows[dt.Rows.Count - 1]["Real-" + dtDatos.DefaultView[i]["Periodo"].ToString()] = valorReal;
                }
                //Sumar a Total
                dt.Rows[dt.Rows.Count - 1]["Total Plan"] = Convert.ToDecimal(dt.Rows[dt.Rows.Count - 1]["Total Plan"]) + valor;
                dt.Rows[dt.Rows.Count - 1]["Total Real"] = Convert.ToDecimal(dt.Rows[dt.Rows.Count - 1]["Total Real"]) + valorReal;
                dt.Rows[dt.Rows.Count - 1]["Desvio Plan"] = 0;
                if (Convert.ToDecimal(dt.Rows[dt.Rows.Count - 1]["Total Plan"]) > 0)
                {
                    dt.Rows[dt.Rows.Count - 1]["Desvio Plan"] = (Convert.ToDecimal(dt.Rows[dt.Rows.Count - 1]["Total Real"]) / Convert.ToDecimal(dt.Rows[dt.Rows.Count - 1]["Total Plan"]) - 1) * 100;
                }
                dt.AcceptChanges();
            }
            return dt;
        }