Usuario
Realizar una asignación automática C#

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
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 -
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
-
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 -
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
-
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