none
Recorrer datagrid RRS feed

  • Pregunta

  • Buenos días 

    He decidido abrir otro post a ver si me puede ayudar

    Estoy intentado recorrer una consulta y rellenar un datatable

    A ver si me explico bien;  empiezo comentado que significa palabra semana.  es una variable que cree, que va almacenando la semana es decir : Semana1    semana2,     Semana3 según va haciendo el foreach

    bien 

    este es mi Datatable

       private DataTable GetDataTable()
            {
    
                DataTable dt = new DataTable();
    
                dt.Columns.Add("codigo");
                dt.Columns.Add("name");
                dt.Columns.Add("Marca");
                dt.Columns.Add("Familia");
                dt.Columns.Add("SubFamilia");
                dt.Columns.Add("stock", typeof(Int32));
                dt.Columns.Add("uds_paq", typeof(Int32));
                dt.Columns.Add("uds_bultos", typeof(Int32));
                dt.Columns.Add("uds_vendidasFecha1", typeof(Int32));
                dt.Columns.Add("uds_vendidasFecha2", typeof(Int32));
                dt.Columns.Add("porcentajeaumento", typeof(decimal));  
    return dt;
            }

    Empiezo recorriendo la consulta para rellenar el datatable

    y obtengo lo primero este resultado

    Como pueden ver ahi creo la columna de la semana 26

    asi lo relleno

    Uan ves que se rellena toda la semana 26   creo la semana 27

    hasta ahi bien pero ahora no se me rellena esa columna 

    Por que puede ser?

    saludos amigos


    ruben

    lunes, 2 de julio de 2018 13:29

Todas las respuestas

  • hola

    algo que no veo es donde haces dt.NewRow() ?

    algo que veo incorrecto es que creas las columnas dinamicas al mismo tiempo que asignas los datos

    porque no solo realizas el foreach creando las columnas y despues el foreach asignando los datos ?

    var lstSemanas = Enumerable.Range(....
    
    foreach(var nSemana in lstSemanas){
    
      dt.Columns.Add(...);
    
    }


    y luego iteras para asignar los datos

    var newRow = dt.NewRow(); for(int i=0; ...){ foreach(var nSemana in lstSemanas){

    newRow["xx"] = ...;

    } }



    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina


    lunes, 2 de julio de 2018 14:14
  • Hola Leandro

    la forma que me has dicho no me funciona o algo estoy haciendo mal

    mira este es el resultado

    Asi no me carga ni la columna 26 

    este es mi codigo

                DateTime inicio = new DateTime(2018, 6, 27);
                DateTime fin = new DateTime(2018, 12, 31);
    
                List<int> lstSemanas = Enumerable.Range(inicio.GetWeekNumber(), (fin.GetWeekNumber() - inicio.GetWeekNumber())).ToList();
    
                foreach (var nSemana in lstSemanas)
                {
    
                    dt.Columns.Add($"Semana{nSemana}");
    
                }
    
    
                foreach (var nSemana in Enumerable.Range(inicio.GetWeekNumber(), (fin.GetWeekNumber() - inicio.GetWeekNumber())))
                {
                    var newRow2 = dt.NewRow();
                   for (int i = 0, k = 0; i < dt1.Rows.Count; i++)
                    {
                        #region Declaramos las variables
                        int uds_paq = 0;
                        int uds_bultos = 0;
                        int uds_vendidas = 0;
       string strCodigo = referencia;
                        int nValorCelda = -1;
                        //Busca una row que coincida el codigo, y despues obtiene el valor se la celda que se llame "Semana"+nSemana, intentamos convertir ese valor en int, y si se convierte es que hay un valor valido
    
                        int.TryParse(dt3.Rows.Cast<DataRow>().Where(x => x[0].ToString() == referencia).FirstOrDefault()?[palabrasemana].ToString(), out cantidadañopasado);
    
    
                        // Calculo consumo = la cantidad consumida el año pasado +  el porcentaje de aumento - stock
                        calculoconsumo = stock - ((cantidadañopasado * porcentajeaumento / 100) + cantidadañopasado);
                      
    
                     
    
    
                     //   newRow[palabrasemana] = calculoconsumo;
                        newRow2[palabrasemana] = calculoconsumo;
    
                        #endregion
    
    
                        dt.Rows.Add(newRow);
                    }
                }


    ruben

    lunes, 2 de julio de 2018 16:53
  • Leandro como dices que no ves el dt newrow te mando el código enterito

     #region Recorremos y rellenamos
    
                DateTime inicio = new DateTime(2018, 6, 27);
                DateTime fin = new DateTime(2018, 12, 31);
    
                List<int> lstSemanas = Enumerable.Range(inicio.GetWeekNumber(), (fin.GetWeekNumber() - inicio.GetWeekNumber())).ToList();
    
                foreach (var nSemana in lstSemanas)
                {
    
                    dt.Columns.Add($"Semana{nSemana}");
    
                }
    
    
                foreach (var nSemana in Enumerable.Range(inicio.GetWeekNumber(), (fin.GetWeekNumber() - inicio.GetWeekNumber())))
                {
                   
                    //   dt.Columns.Add($"Semana{nSemana}");
    
    
                    for (int i = 0, k = 0; i < dt1.Rows.Count; i++)
                    {
                        #region Declaramos las variables
                        int uds_paq = 0;
                        int uds_bultos = 0;
                        int uds_vendidas = 0;
                        int paq_vendidos = 0;
                        int paq_div_bultos = 0;
    
                        int unidadtotalfecha2 = 0;
    
                        int unidadesvendidasfecha1 = 0;
                        int unidadesvendidasfecha2 = 0;
                        int DiasFecha1 = 0;
                        int DiasFecha2 = 0;
                        decimal totalfecha1 = 0;
                        decimal totalfecha2 = 0;
                        decimal division = 0;
                        decimal porcentajeaumento = 0;
    
                        #endregion
    
                        DataRow dr = dt1.Rows[i];
                        DataRow newRow = dt.NewRow();
                        #region Rellenamos los valores
                       
    
                        newRow["codigo"] = dr["Referencia"];
                        string referencia = Convert.ToString(dr["Referencia"]);
                        newRow["name"] = dr["descripcion"];
                        newRow["Marca"] = dr["marca"];
                        newRow["Familia"] = dr["familia"];
                        newRow["SubFamilia"] = dr["subfamilia"];
                        newRow["stock"] = dr["stock"];
                        newRow["uds_paq"] = Convert.ToInt32(dr["uds_paq"]);
                        newRow["uds_bultos"] = Convert.ToInt32(dr["uds_bultos"]);
                        uds_paq = Convert.ToInt32(dr["uds_paq"]);
                        uds_bultos = Convert.ToInt32(dr["uds_bultos"]);
    
                        newRow["uds_vendidasFecha1"] = Convert.ToInt32(dr["unidadtotal"]);
                        unidadesvendidasfecha1 = Convert.ToInt32(dr["unidadtotal"]);
                        uds_vendidas = Convert.ToInt32(dr["unidadtotal"]);
                        #endregion
    
                        #region Comprobamos si tiene numero de paq
                        if (uds_paq != 0)
                        {
                            if (uds_bultos != 0)
                            {
                                paq_vendidos = Convert.ToInt32(dr["unidadtotal"]) / Convert.ToInt32(dr["uds_paq"]);
                            }
                        }
                        else
                        {
                            paq_vendidos = 0;
                        }
                        #endregion
    
    
                        DataRow dr3 = dt2.Rows[k];
    
                        #region Recorre el Datatable 2 y extrae la unidad total
                        foreach (DataRow row in dt2.Rows)
                        {
                            if (Convert.ToString(row.ItemArray[0]) == referencia)
                            {
    
    
                                unidadtotalfecha2 = Convert.ToInt32(row["unidadtotal"]);
    
                                break;
    
                            }
    
                        }
                        #endregion
    
                        newRow["uds_vendidasFecha2"] = unidadtotalfecha2;
                        unidadesvendidasfecha2 = unidadtotalfecha2;
    
                        #region Calculamos las Fechas para el porcentaje de aumento
    
                        if (unidadesvendidasfecha1 != 0)
                        {
                            totalfecha1 = unidadesvendidasfecha1 / diferenciadiasfecha1;
                        }
                        else
                        {
                            totalfecha1 = 0;
                        }
    
    
                        if (unidadesvendidasfecha2 != 0)
                        {
                            totalfecha2 = unidadesvendidasfecha2 / diferenciadiasfecha2;
                        }
                        else
                        {
                            totalfecha2 = 0;
                        }
    
    
                        if (totalfecha1 != 0)
                        {
                            if (totalfecha2 != 0)
                            {
                                division = (totalfecha2 / totalfecha1) - 1;
                                porcentajeaumento = division * 100;
                            }
                            else
                            {
                                porcentajeaumento = 0;
                            }
                        }
                        else
                        {
                            porcentajeaumento = 0;
                        }
                        #endregion
    
    
    
    
    
                        newRow["porcentajeaumento"] = porcentajeaumento;
                        #region Rellenamos los valores de las columnas que aparecen
    
                        if (rbcatalogotodo.Checked) //Comprobamos si esta elegido el todo de catalogo
                        {
                            int si = 0;
                            string palabrasi = "";
    
                            si = Convert.ToInt32(dr["nocatalogo"]);
                            if (si == 0)
                            {
                                palabrasi = "NO";
                            }
                            else
                            {
                                palabrasi = "SI";
                            }
    
                            newRow["catalogo"] = palabrasi;
                        }
    
                        if (rbbloqueadotodo.Checked)
                        {
                            int si = 0;
                            string palabrasi = "";
    
                            si = Convert.ToInt32(dr["bloqueocompra"]);
                            if (si == 0)
                            {
                                palabrasi = "NO BLOQUEADO";
                            }
                            else
                            {
                                palabrasi = "SI BLOQUEADO";
                            }
    
                            newRow["bloqueocompra"] = palabrasi;
                        }
                        #endregion
    
                        // Creamos las columas Necesarias a partir de la semana en que nos encontramos
    
                        #region Recorre el Datatable 3 y la semna
                        
    
                        int stock = Convert.ToInt32(dr["stock"]);
                        int cantidadañopasado = 0;
                        decimal calculoconsumo = 0;
    
                        string palabrasemana = "Semana" + nSemana;// NumeroSemana;
    
    
    
                        string strCodigo = referencia;
                        int nValorCelda = -1;
                        //Busca una row que coincida el codigo, y despues obtiene el valor se la celda que se llame "Semana"+nSemana, intentamos convertir ese valor en int, y si se convierte es que hay un valor valido
    
                        int.TryParse(dt3.Rows.Cast<DataRow>().Where(x => x[0].ToString() == referencia).FirstOrDefault()?[palabrasemana].ToString(), out cantidadañopasado);
    
    
                        // Calculo consumo = la cantidad consumida el año pasado +  el porcentaje de aumento - stock
                        calculoconsumo = stock - ((cantidadañopasado * porcentajeaumento / 100) + cantidadañopasado);
                      
    
                     
    
    
                        newRow[palabrasemana] = calculoconsumo;
                       // newRow2[palabrasemana] = calculoconsumo;
    
                        #endregion
    
                        dt.Rows.Add(newRow);
                    }
                }

    saludos


    ruben

    lunes, 2 de julio de 2018 16:56
  • Esta es la unica parte que no funciona

                        newRow[palabrasemana] = calculoconsumo;
                       // newRow2[palabrasemana] = calculoconsumo;
    
                        #endregion
    
                        dt.Rows.Add(newRow);

    la primera ves si funciona perfecto pero la segunda ves ya no carga el valor aunque calculo consumo si tiene  valor


    ruben

    lunes, 2 de julio de 2018 17:04
  • Amigoooossssss

    Ya me he dado cuenta si escribió

    pero abajo creo mas registros no lo va creando uno a lado de otro

    eso por que puede ser

    saludos


    ruben

    lunes, 2 de julio de 2018 17:15
  • hola

    porque usas esto

    foreach (var nSemana in Enumerable.Range(inicio.GetWeekNumber(), (fin.GetWeekNumber() - inicio.GetWeekNumber())))
    {

    en lugar de usar lstSemana, si ya tienes la lista en una variable itera por esta

    >>la primera ves si funciona perfecto pero la segunda ves ya no carga el valor aunque calculo consumo si tiene  valor

    para iterar el dt1 usa

     foreach (var rowDt1 in dt1.Rows)

    aunque veo mucho codigo, ademas iteras un dt2, no puedes sacar esa funcionalidad en funciones? para hacer mas entendible

    >>pero abajo creo mas registros no lo va creando uno a lado de otro

    pero para eso debes ir agregando los valores a la misma newRow, si agregas una columna he iteras creando una row nueva no usara la misma

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    lunes, 2 de julio de 2018 20:21
  • y como agrego los valores a la misma row

    saludos


    ruben

    martes, 3 de julio de 2018 7:56
  • Creo que aqui simplifico la pregunta Leandro

    //Este Calculo de Fecha es para prueba
    DateTime inicio = new DateTime(2018, 6, 27);
    DateTime fin = new DateTime(2018, 12, 31);
    
                List<int> lstSemanas = Enumerable.Range(inicio.GetWeekNumber(), (fin.GetWeekNumber() - inicio.GetWeekNumber())).ToList();
    
    //Aquí lo que hago es crear todas las columnas de las semanas en mi datatable
                foreach (var nSemana in lstSemanas)
                {
    
                    dt.Columns.Add($"Semana{nSemana}");
    
                }
    //Voy recorriendo nSemana por que lo que voy a hacer es escribir en cada semana un valor
    foreach (var nSemana in Enumerable.Range(inicio.GetWeekNumber(), (fin.GetWeekNumber() - inicio.GetWeekNumber())))
                {
          
    //un for para rellenar mi datatable
      for (int i = 0, k = 0; i < dt1.Rows.Count; i++)
                    {
                        #region Declaramos las variables
                        int uds_paq = 0;
                        int uds_bultos = 0;
                        int uds_vendidas = 0;
                        int paq_vendidos = 0;
                        int paq_div_bultos = 0; 
    newRow["codigo"] = dr["Referencia"];
                        string referencia = Convert.ToString(dr["Referencia"]);
                        newRow["name"] = dr["descripcion"];
                        newRow["Marca"] = dr["marca"];
                        newRow["Familia"] = dr["familia"];
                        newRow["SubFamilia"] = dr["subfamilia"];
    int stock = Convert.ToInt32(dr["stock"]);
    int cantidadañopasado = 0;
    decimal calculoconsumo = 0;
    string palabrasemana = "Semana" + nSemana;// NumeroSemana; Semana26
    string strCodigo = referencia;
    //Calculo el consumo 
    calculoconsumo = stock - ((cantidadañopasado * porcentajeaumento / 100) + cantidadañopasado);
    //Relleno la Fila de la semana que corresponda y que sea igual a la referencia
    dt3.Rows.Cast<DataRow>().Where(x => x[0].ToString() == referencia).FirstOrDefault()?[palabrasemana] = calculoconsumo;
           dt.Rows.Add(newRow);
    }
    } 
    
    Saludos


    ruben

    martes, 3 de julio de 2018 8:03