none
Buscar registros faltantes RRS feed

  • Pregunta

  • Hola como va ?. Recibo un excel exportado de un bd, primeros lo cargo en un dgv1, luego hago el el primer filtro

    DataTable dataTableEmba = dataGridView1.DataSource as DataTable;
                dataGridView2.DataSource = dataTableEmba.AsEnumerable()
                    .Select(x => new { Embalador = x.Field<double>(3).ToString() }).Distinct().ToList();


    Aqui agrupo por el el campo "LEGEMBA" que es el legajo del embalador para mostrar en un segundo dgv2 solo una fila de cada embalador existente. Luego

    DataTable dataTableEmba = dataGridView1.DataSource as DataTable;
                string embal = Convert.ToString(dataGridView2.Rows[dataGridView2.CurrentRow.Index].Cells[0].Value);
    
    dataGridView3.DataSource = dataTableEmba.AsEnumerable().Where(x => x.Field<double>(3).ToString() == embal)
                    .Select(x => new { NUMEMBA = x.Field<double>(4).ToString() }).ToList();
    
                var query = dataTableEmba.AsEnumerable().Where(x => x.Field<double>(3).ToString() == embal).GroupBy(r => r.Field<double>(3))
                           .Select(grp => new
                           {
                               ID = grp.Key,
                               Min = grp.Min(t => t.Field<double>(4)),
                               Max = grp.Max(t => t.Field<double>(4))
                           });
    
                int maximo = Convert.ToInt32(query.Max(r => r.Max));
                int minimo = Convert.ToInt32(query.Min(r => r.Min));

    A medida que se selecciona en el dgv2 el emabalador, en el dgv3 muestro el campo "NUMEMBA" que es como una etiqueta consecutiva que tiene cada embalador por cada caja. y aparte cargo 2 variables "maximo" y "minimo" cual es primer numero de esas etiquetas y cual es el ultimo.

    La pregunta es de acuerdo a ese minimo y maximo como obtener en otro dgv el/los numeros faltantes desde ese minimo y el maximo ejempo . minimo =1200 maximo=1300 y en los registros faltan 1212,1243,1257,1288.

    Desde ya gracias.

    sábado, 4 de mayo de 2019 19:57

Respuestas

  • Bueno probando y probando logre hacer lo siguiente.

    Luego de obtener el mínimo y máximo hago esto

    dataGridView4.Rows.Clear();
                int[] secuencia = new int[maximo - minimo + 1];
                for (int i = minimo; i <= maximo; i++)
                {
                    secuencia[i - minimo] = i;
                    dataGridView4.Rows.Add(i.ToString());
                }

    Aqui en el dgv4 completo la lista de faltantes y ya tengo el dgv3 con lo que arroja la consulta y en el dgv4 la lista completa que existe entre minimo y maximo.

    Luego creo dos datatables y los lleno con los valores del dgv3 y el dgv4 asi

    DataTable dt3 = new DataTable();
                dt3.Columns.Add("val", typeof(System.Int32));
                DataTable dt4 = new DataTable();
                dt4.Columns.Add("val", typeof(System.Int32));
    
                foreach (DataGridViewRow rowGrid3 in dataGridView3.Rows)
                {
                    DataRow row = dt3.NewRow();
                    row["val"] = Convert.ToInt32(rowGrid3.Cells[0].Value);
                    dt3.Rows.Add(row);
                }
                foreach (DataGridViewRow rowGrid4 in dataGridView4.Rows)
                {
                    DataRow row = dt4.NewRow();
                    row["val"] = Convert.ToInt32(rowGrid4.Cells[0].Value);
                    dt4.Rows.Add(row);
                }

    y por ultimo creo el ultimo datatable

    DataTable dtRes = new DataTable();
    
                dtRes = dt4.AsEnumerable()
    
                    .Where(r =>
    
                        !dt3.AsEnumerable().Any(w =>
    
                            w.Field<int>("val") == r.Field<int>("val")))
    
                        .CopyToDataTable<DataRow>();
    
                dataGridView5.DataSource = dtRes;

    y por fin en el dgv5 me aparecen todos los numeros faltantes.

    PD: aunque es funcional y no se demora, seguro que hay alguna forma de optimizar el codigo, asi que si alguien quiere aportar bienvenido sea.

    • Marcado como respuesta EnzoTuc40 sábado, 4 de mayo de 2019 23:25
    sábado, 4 de mayo de 2019 23:25