none
Realizar una asignación automática C# RRS feed

  • Pregunta

  • necesito realizar una asignacion automatica pero tengo  4 parametros 

    factura -->documentos -->productos

    total factura 2

    total documentos 4

    total productos 5

    total personas 2

    cada factura tiene cierta cantidad de documentos  y asu ves cada documento de esa factura tiene productos

    de acuerdo a la cantidad de productos es que se debe dividir los documentos,  pero como los documentos  no tienen la misma cantidad de productos  es como debemos dividir eso los documentos  espero darme a entender.

    tengo una lista con esos datos  que se llama

    List <facturas> fac= obtenerFac();

    fac contiene el numero de documentos por factura  y la cantidad de los productos

    como puedo realizarlo :/

    he probado pero no me sale espero me puedan ayudar

    tengo esto que estaba realizando

                int totalFac = 2; int totalDocumentos=4
                int totalProd = 5;
                int totalPersonal = 2;
                double TotalProductosAsignadosPorPersona = Math.Round((double)(totalProd / totalPersonal));
                double residuo = (totalProd % totalPersonal);

    una vez sabido que documentos le toca a cada personal es asignarlo a el 

    jueves, 19 de mayo de 2016 17:59

Todas las respuestas

  • Hola,

    La verdad no entendí bien lo que quieres hacer,

    ¿Tu problema es que si la división de productos entre personas no es exacta no sabes cómo asignar los productos sobrantes a las diferentes personas?.

    Si es esto, seria coger tu variable residuo que es el resto y con un for recorrer a las personas y ir asignándole un producto a cada una.

    Un saludo.


    Es de buena educación dar las gracias cuando te ayudan, si alguna respuesta te ha sido de utilidad agradécelo marcandola como útil.
    Blog

    viernes, 20 de mayo de 2016 10:05
  • tengo que repartir los documentos  pero cada documento tiene productos 

    los documentos los debo repartir pero en candidad de productos que tiene el documento y deben quedar equivalentes por ejemplo

    factura 1 tiene 1 documentos con 2 productos

    factura 2 tiene 2 documentos con 5 productos

    factura 3 tiene 3 documentos con 9 productos

    factura 4 tiene 4 documentos con 4 productos

    y tenemos 3 usuarios a los cuales se les van asignar.

    debo asignar  los documentos en un equivalente de acuerdo a los totales claro esta que algunos tendrán mas y unos menos pero deben ser lo mas equivalente que se pueda

    viernes, 20 de mayo de 2016 15:35
  • Hola,

    Creo que necesitaras tres bucles anidados, el primero itera sobre las facturas, el segundo sobre los documentos y el tercero sobre los productor, yo diría que los bucles serian foreach pero como no has puesto nada de código y no sabemos de donde salen los datos ni como los cargas, no sabría decirte cual seria mas interesante.

    La estructura del código seria algo así.

    Bucle (Itero sobre facturas)

    {

    Bucle2 (Itero sobre documentos)

    {

    Bucle3 (Itero sobre productos)

    {

    Asigno producto a persona

    Muevo índice persona si es mayor que personas existentes reseteo el índice a 1

    }

    }

    }


    Es de buena educación dar las gracias cuando te ayudan, si alguna respuesta te ha sido de utilidad agradécelo marcandola como útil.
    Blog

    viernes, 20 de mayo de 2016 17:51
  • tengo una lista de facturas que tiene la esta estructura 

    factura,documentosTotales,productosTotales

    y la de personas es otra lista 

    persona,codigo

    se deben asignar la cantidad de documentos de acuerdo a los productos para que sea lo mas justo posible

    veo interesante la de los bucles  tengo algo asi

    int totalRec = 156;
                int totalPersonal = 2;
                double TotalProductosAsignadosPorPersona = Math.Round(totalRec / (double)totalPersonal);
                double residuo = (totalRec % totalPersonal);
                List<facPersonal> listaAsignada = new List<facPersonal>();
                foreach (personal items in lispersonal)
                {
                    
                    foreach (ListViewItem item in lvFacNoAsignadas.Items)
                    {
    
                        double recetasFacLis = Convert.ToDouble(lvFacNoAsignadas.Items[item.Index].SubItems[1].Text);
                        if (recetasFacLis <= TotalProductosAsignadosPorPersona)
                        {
                            facPersonal f = new facPersonal();
                            f.IDFactura = lvFacNoAsignadas.Items[item.Index].SubItems[0].Text;
                            f.usuario = items.Usuario;
                            f.recetas = (int)recetasFacLis;
                            listaAsignada.Add(f);
                        }
    
                        else if (recetasFacLis > TotalProductosAsignadosPorPersona)
                        {
                            facPersonal f = new facPersonal();
                            f.IDFactura = lvFacNoAsignadas.Items[item.Index].SubItems[0].Text;
                            f.usuario = items.Usuario;
                            f.recetas = (int)recetasFacLis;
                            listaAsignada.Add(f);
                        }
                        lvFacNoAsignadas.Items.Remove(item);
                        lvFacAsignadas.Items.Add(item);
    
                        int totalreceperUser = 0;
                        foreach (facPersonal h in listaAsignada)
                        {
                            if (h.usuario == items.Usuario)
                            {
                                totalreceperUser += h.recetas;
                            }
                        }
                        if (totalreceperUser >= TotalProductosAsignadosPorPersona)
                        {
                            break;
                        }
    
                    }
                }

    tengo eso pero no creo que sea conveniente cabe destacar que documentos y productos solo son totales por factura

    viernes, 20 de mayo de 2016 18:00
  • Hola,

    La verdad no entiendo muy bien tu código, ni de donde salen facturas, documentos y productos ni como esta estructurada esta información, pero lo primero que me llama la atención es el siguiente bloque de código

     if (recetasFacLis <= TotalProductosAsignadosPorPersona)
                        {
                            facPersonal f = new facPersonal();
                            f.IDFactura = lvFacNoAsignadas.Items[item.Index].SubItems[0].Text;
                            f.usuario = items.Usuario;
                            f.recetas = (int)recetasFacLis;
                            listaAsignada.Add(f);
                        }
    
                        else if (recetasFacLis > TotalProductosAsignadosPorPersona)
                        {
                            facPersonal f = new facPersonal();
                            f.IDFactura = lvFacNoAsignadas.Items[item.Index].SubItems[0].Text;
                            f.usuario = items.Usuario;
                            f.recetas = (int)recetasFacLis;
                            listaAsignada.Add(f);
                        }

    Analizamos el primer if, si recetasFarLis es menor o igual a TotalProductos...... hace algo, bien, sino, si recetasFacLis es mayor a  TotalProductos...... hace lo mismo que lo anterior, por lo tanto si recetasFarLis es menor igual o mayor hace lo mismo, no lo entiendo lo puedes aclarar. Si no, te sobra el if el else if, o es que recetasFarLis en algún momento puede que no sea ni mayor ni menor ni igual a TotalProductos..... ¿?

    ¿este otro bloque que pretende hacer? lo puedes aclarar

     foreach (facPersonal h in listaAsignada)
                        {
                            if (h.usuario == items.Usuario)
                            {
                                totalreceperUser += h.recetas;
                            }
                        }
                        if (totalreceperUser >= TotalProductosAsignadosPorPersona)
                        {
                            break;
                        }

    Recorre una lista parece ser de personas, pero no hace gran cosa mas que sumar una especie de contador, que por cierto si esa lista contiene 2000 datos los recorres por completo para quizás sumar algo, yo creo que eso esta mal planteado, para luego si ese contador supera o igual algo, cortar el segundo foreach y por lo tanto deja de recorrer los item no asignaos. Creo que la lógica de tu código esta mal planteada. Creo que si lo planteas bien con escasas 10 lineas de código y creo que me paso te seria suficiente.

    Es mi opinión y no tiene por que ser correcta.

    Un saludo.


    Es de buena educación dar las gracias cuando te ayudan, si alguna respuesta te ha sido de utilidad agradécelo marcandola como útil.
    Blog

    sábado, 21 de mayo de 2016 11:18