Visual Basic.NET - Comparar registros de una lista y establecer condiciones

 
Vista:
sin imagen de perfil

Comparar registros de una lista y establecer condiciones

Publicado por Jose (5 intervenciones) el 28/09/2023 05:03:47
Hola

estoy programando en vb y mysql

tengo una lista de 106 registros y quiero comparar cada registro de esa lista, para agregarlos
en una fila donde puedo registrar solo 4 y luego sigo para la siguiente fila, un par de esos 4 tiene que tener condiciones como por ejemplo que no sean de la misma ciudad o que ya hayan sido
parejas y no vuelvan a serlo, asi mismo con el siguiente par.

gracias por la ayuda de antemano
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Phil Rob
Val: 3.353
Oro
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Comparar registros de una lista y establecer condiciones

Publicado por Phil Rob (1554 intervenciones) el 28/09/2023 08:04:38
Hola,
No comprendo la pregunta.
Quieres extraer datos de la DB según condiciones o quieres seleccionar varios registros entre los ya presentes en un DataTable o DataGridView o ListView o ...
Cuando datos seleccionados, quieres los copiar en DataGridView o Listbox o ...
Quizá puedes dar ejemplo de los datos con resultados que vienen de la DB y resultados que quieres tener.
....
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Comparar registros de una lista y establecer condiciones

Publicado por Jose (5 intervenciones) el 28/09/2023 15:37:35
Hola me disculpo si no fui muy detallista en la explicación

tengo una tabla donde se encuentran esos 106 registros y se visualizan en una DGV
esos registrar ya fueron registrados previamente, necesito registrarlos en otra tabla donde permita solo 4
en una fila, es un emparejamiento que necesito hacer y para formar cada pareja deben haber ciertas condiciones
las cuales son, no deben ser de la misma ciudad, si fueron parejas alguna vez ya no lo pueden ser mas

es un sistema de juegos de domino y en una mesa hay 4 jugadores 2 parejas
por eso si jugador 1 ya fue pareja de jugador 2 no pueden serlo mas, pero si pueden jugar en contra en la
misma mesa, esos 106 registros representan 27 mesas es decir 27 filas en la tabla. y se juegan 12 rondas

en la tabla donde se encuentran los 106 registros hay datos como juegos jugados, juegos ganados, puntos a favor, juegos perdidos,
puntos en contra y average, luego de cada juego se anotan los datos respectivos, cuando todas las mesas han finalizado
se organizan de mayor a menor es decir de los mejores resultados a los peores. y luego se vuelve realizar el emparejamiento
aplicando las mismas condiciones antes mencionadas.

no se si me explique bien

gracias de antemano
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Phil Rob
Val: 3.353
Oro
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Comparar registros de una lista y establecer condiciones

Publicado por Phil Rob (1554 intervenciones) el 28/09/2023 19:34:47
Hola,

Pienso que, expliques bien pero conozco nada al juego de domino ...

Pero, con la informática, quizá podré te ayudar ...

Comprendo que tiene tabla en DB con 106 registros que están mostrados en DGV. Por lo tanto, supongo que existe un DataTable que es el DataSource del DGV : DGV.DataSource = ElNombreDeLaDataTable.
En este caso, debemos intentar de buscar los datos que quieres en el DataTable.
Si no existe el DataSource del DGV, debemos trabajar con los datos en el DGV.

En mas, comprendo que quieres extraer los registros por 4. Pienso que seria bien de crear un DataTable con estos registros y quizá los mostrar en un otro DGV, para verificación. Podrán ser grabar mas tarde en la DB, si necesario.

Para reflexionar mas sobre el problema, debería conocer las reglas para agrupar por 4. Seria bien que das un ejemplo con los nombres de los datos y los valores que indican si agrupamos o no.

Ahora, debo partir. Pero tendré un poco tiempo en varias horas (aquí es la 19h30') o mañana temprano.

...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Comparar registros de una lista y establecer condiciones

Publicado por Jose (5 intervenciones) el 01/10/2023 03:42:57
hola disculpa lo tarde en responder he pasado todo este tiempo tratando de construir el codigo pero no lo he logrado

le explico:

Public Sub cargarParticipantes1()
Try
Call Conexion.Conectar()
Dim datos As DataTable
Dim adaptador As MySqlDataAdapter
Dim consulta As String

consulta = ("select keycodigo,codtorneo,nombreapellido,codestado,estado,(juegos_ganados-juegos_perdidos) as juegos_jugados,juegos_ganados,juegos_perdidos,puntos_favor,puntos_contra,(puntos_favor-puntos_contra) as average,is_asignacion_mesa from participantes where codtorneo=1 and is_asignacion_mesa=0 order by codestado,nombreapellido asc")

adaptador = New MySqlDataAdapter(consulta, Conexion.Conexion)
datos = New DataTable
adaptador.Fill(datos)
DataGridView1.DataSource = datos

'PARA ORGANIZAR EL DGV DE ACUERDO AL TAMAÑO DE LOS DATOS
DataGridView1.Columns("keycodigo").Width = 50
DataGridView1.Columns("keycodigo").HeaderText = "Codigo"
DataGridView1.Columns("keycodigo").DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight

DataGridView1.Columns("codtorneo").Visible = False

DataGridView1.Columns("nombreapellido").Width = 200
DataGridView1.Columns("nombreapellido").HeaderText = "Nombre y Apellido"
DataGridView1.Columns("nombreapellido").DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft

DataGridView1.Columns("codestado").Visible = False

DataGridView1.Columns("estado").Width = 130
DataGridView1.Columns("estado").HeaderText = "Estado"
DataGridView1.Columns("estado").DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft

DataGridView1.Columns("juegos_jugados").Visible = False
DataGridView1.Columns("juegos_ganados").Visible = False
DataGridView1.Columns("puntos_favor").Visible = False
DataGridView1.Columns("juegos_perdidos").Visible = False
DataGridView1.Columns("puntos_contra").Visible = False
DataGridView1.Columns("average").Visible = False
DataGridView1.Columns("is_asignacion_mesa").Visible = False

GroupBox1.Text = "Participantes: " & DataGridView1.RowCount

With DataGridView1
'Para que el dgvfh sea solo lectura
.ReadOnly = True
'Para seleccionar todo, pero en este caso solo la fila a buscar
.SelectionMode = DataGridViewSelectionMode.FullRowSelect
'Evitamos que seleccionen varias filas al mismo tiempo
.MultiSelect = True
'Evitamos que se agregue la última fila(Fila vacía)
.AllowUserToAddRows = False
'Para que el datagridview cargue sin ninguna fila seleccionada
.SelectedRows(0).Cells(0).Value.ToString()
'Evitamos que se cambie el tamaño de las filas
.RowTemplate.Resizable = False
'Ocultamos el ancabezado de las filas
.RowHeadersVisible = False
End With
Catch ex As Exception
End Try
End Sub

en ese codigo lleno el DGV

Public Sub cargarMesasCreadas()
Try
Call Conexion.Conectar()
Dim datos As DataTable
Dim adaptador As MySqlDataAdapter
Dim consulta As String

consulta = ("select keycodigo,codtorneo,mesa,ronda,codestado_pa1,estado_pa1,codpa1,pa1,codestado_pa2,estado_pa2,codpa2,pa2,codestado_pb1,estado_pb1,codpb1,pb1,codestado_pb2,estado_pb2,codpb2,pb2,cod_combinacion_pareja_a1a2,cod_combinacion_pareja_a2a1,cod_combinacion_pareja_b1b2,cod_combinacion_pareja_b2b1,is_mesa_llena from juegos where codtorneo=1 order by mesa asc")

adaptador = New MySqlDataAdapter(consulta, Conexion.Conexion)
datos = New DataTable
adaptador.Fill(datos)
DataGridView3.DataSource = datos

'PARA ORGANIZAR EL DGV DE ACUERDO AL TAMAÑO DE LOS DATOS
DataGridView3.Columns("keycodigo").Visible = False
DataGridView3.Columns("codtorneo").Visible = False

DataGridView3.Columns("mesa").Width = 40
DataGridView3.Columns("mesa").HeaderText = "Mesa"
DataGridView3.Columns("mesa").DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight

DataGridView3.Columns("ronda").Visible = False

DataGridView3.Columns("codestado_pa1").Visible = False
DataGridView3.Columns("estado_pa1").Visible = False
DataGridView3.Columns("codpa1").Visible = False

DataGridView3.Columns("pa1").Width = 100
DataGridView3.Columns("pa1").HeaderText = "JA1"
DataGridView3.Columns("pa1").DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft

DataGridView3.Columns("codestado_pa2").Visible = False
DataGridView3.Columns("estado_pa2").Visible = False
DataGridView3.Columns("codpa2").Visible = False

DataGridView3.Columns("pa2").Width = 100
DataGridView3.Columns("pa2").HeaderText = "JA2"
DataGridView3.Columns("pa2").DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft

DataGridView3.Columns("codestado_pb1").Visible = False
DataGridView3.Columns("estado_pb1").Visible = False
DataGridView3.Columns("codpb1").Visible = False

DataGridView3.Columns("pb1").Width = 100
DataGridView3.Columns("pb1").HeaderText = "JB1"
DataGridView3.Columns("pb1").DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft

DataGridView3.Columns("codestado_pb2").Visible = False
DataGridView3.Columns("estado_pb2").Visible = False
DataGridView3.Columns("codpb2").Visible = False

DataGridView3.Columns("pb2").Width = 100
DataGridView3.Columns("pb2").HeaderText = "JB2"
DataGridView3.Columns("pb2").DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft


DataGridView3.Columns("cod_combinacion_pareja_a1a2").Visible = False
DataGridView3.Columns("cod_combinacion_pareja_a2a1").Visible = False
DataGridView3.Columns("cod_combinacion_pareja_b1b2").Visible = False
DataGridView3.Columns("cod_combinacion_pareja_b2b1").Visible = False
DataGridView3.Columns("is_mesa_llena").Visible = False


GroupBox2.Text = "Mesas: " & DataGridView3.RowCount

With DataGridView3
'Para que el dgvfh sea solo lectura
.ReadOnly = True
'Para seleccionar todo, pero en este caso solo la fila a buscar
.SelectionMode = DataGridViewSelectionMode.FullRowSelect
'Evitamos que seleccionen varias filas al mismo tiempo
.MultiSelect = True
'Evitamos que se agregue la última fila(Fila vacía)
.AllowUserToAddRows = False
'Para que el datagridview cargue sin ninguna fila seleccionada
.SelectedRows(0).Cells(0).Value.ToString()
'Evitamos que se cambie el tamaño de las filas
.RowTemplate.Resizable = False
'Ocultamos el ancabezado de las filas
.RowHeadersVisible = False
End With
Catch ex As Exception
End Try
End Sub

en este otro estan la 27 mesas creadas

explico porque son 27, una mesa de domino se compone por 4 jugadores, 2 parejas, pareja A y pareja B, son 106 jugadores serian 26,5 mesas es decir 26 mesas con 4 jugadores y 1 con 2 jugadores, no importa porque esa mesa donde estan solo 2 jugadores ya ganarian automaticamente

a cada mesa debo asignar 4 jugadores, con ciertas condiciones: un jugador de la pareja A no deben ser de la misma ciudad de los jugadores de la pareja B, no se si me explico bien, que rosa esta en la pareja A y maria este en la pareja B y sean de la misma ciudad y esten en la misma mesa

esa asignacion debe ocurrir 10 o 12 veces mas es decir por ronda, 10, 12 o N cantidad de rondas, luego de la primera aplica otra condicion, las parejas no pueden repetirse, es decir si maria y rosa jugaron de parejas en la misma ronda para las restantes no pueden ser nuevamente parejas pero si jugar en contra que maria sea de la pareja A y rosa de la pareja B

luego de la primera ronda se organiza la tabla de posiciones de mayor a menor, los que hayas ganados arriba y de ahi los que van perdiendo, partiendo de ese orden su organiza la siguiente ronda es decir lo que van ganando o mayor puntaje jugarian en las primeras mesas, de tener 3 o 4 o mas jugadores de la misma ciudad de primeros en la tabla de posiciones entonces se oganizarian en parejas en la mesa 1 y los demas para las demas mesas

en los bloques del codigo fuente estan los datos que extraigo para informacion, si necesita mas detalle con gusto se los dare.

muchas gracias por la ayuda
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Comparar registros de una lista y establecer condiciones

Publicado por Jose (5 intervenciones) el 01/10/2023 04:56:21
he intentado con ciclos for para comparar e insertar lo registros pero no he dado todavia con lo que necesito
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Phil Rob
Val: 3.353
Oro
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Comparar registros de una lista y establecer condiciones

Publicado por Phil Rob (1554 intervenciones) el 01/10/2023 16:35:12
Hola,

Comprendo las 27 mesas con los 106 jugadas.
Comprendo que con a1, a2 y b1, b2, no puede existir 2 veces mismas parejas a1, a2 ni b1,b2.
Sobre las Ciudades de los juegos, este parece me sin interés, quizá a ver mas tarde.

También comprendo que quieres elegir en la tabla participantes, una pajera de jugados que no ay existe en la tablas juegos. Supongo que las parejas que existen están escritas en los campos :
cod_combinacion_pareja_a1a2
cod_combinacion_pareja_a2a1
cod_combinacion_pareja_b1b2
cod_combinacion_pareja_b2b1

Para intentar un SELECT sobre participantes con estas condiciones, me gustaría de tener un ejemplo de valor des estos campos.

...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Phil Rob
Val: 3.353
Oro
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Comparar registros de una lista y establecer condiciones

Publicado por Phil Rob (1554 intervenciones) el 01/10/2023 19:27:51
Continuación ...


Esperando el ejemplo que te pego, he creado un ejemplo que parece.

Mi tabla TProductos seria tu tabla Participantes y mi tabla TParejas seria tu tabla Juegos.
En TProductos, tenemos los campos útiles para este ejemplo Id y Articulo que corresponden a los campos keycodigo y nombreapellido.
En TParejas, tenemos los campos útiles para este ejemplo A1y A2 que corresponden a las copiadas de los campos Id (de TProductos) de las parejas ya existiendo.

Por lo tanta, con una vista en paralelo de mi sistema y tuyo, debería escribir la consulta que da parejas no ya utiliza.
Jose

Este el código de la consulta :
1
2
3
FROM TProductos AS TP1, TProductos AS TP2
WHERE (TP1.Id <> TP2.Id) ANd Not EXISTS ( SELECT A1, A2  FROM TPajeras As TP3
               WHERE (TP1.Id & TP2.Id) = (TP3.A1 &  TP3.A2) OR (TP2.Id & TP1.Id) = (TP3.A1 &  TP3.A2));

Los contenidos de las tablas :

Jose2

Jose3


Jose4


Adjuntado mi DB de pruebas por ti la ejecutar si lo puede (ACCESS).


Espero que este te ayudara ...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Phil Rob
Val: 3.353
Oro
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Comparar registros de una lista y establecer condiciones

Publicado por Phil Rob (1554 intervenciones) el 02/10/2023 11:42:59
Hola,

Perdones me, veo que la consulta que te envió no es completamente escrita.

La escritura completa es :

1
2
3
4
SELECT DISTINCT TP1.Articulo, TP2.Articulo, TP1.Id, TP2.Id, TP3.A1, TP3.A2
FROM TProductos As TP1, TProductos As TP2, (SELECT A1, A2  FROM TPajeras As TP3)
WHERE (TP1.Id <> A1 AND TP1.Id <> A2 AND TP2.Id <> A1 AND TP2.Id <> A2 AND TP1.Id <> TP2.Id)
      AND Not EXISTS ( SELECT A1, A2  FROM TPajeras As TP3 WHERE (TP1.Id & TP2.Id) = (TP3.A1 &  TP3.A2))

Que tenga un buen día ...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Comparar registros de una lista y establecer condiciones

Publicado por Jose (5 intervenciones) el 08/10/2023 03:13:52
SELECT keycodigo,codtorneo,nombreapellido,codestado,estado,(juegos_ganados-juegos_perdidos) AS juegos_jugados,juegos_ganados,juegos_perdidos,puntos_favor,puntos_contra,(puntos_favor-puntos_contra) AS average,is_asignacion_mesa FROM participantes WHERE codtorneo=1 AND is_asignacion_mesa=0 ORDER BY codestado,nombreapellido ASC

ese es el select de la tabla participantes, aun no he podido como lograr la asignacion de lo jugadores a las mesas con las condiciones requeridas

select keycodigo,codtorneo,mesa,ronda,codestado_pa1,estado_pa1,codpa1,pa1,codestado_pa2,estado_pa2,codpa2,pa2,codestado_pb1,estado_pb1,codpb1,pb1,codestado_pb2,estado_pb2,codpb2,pb2,cod_combinacion_pareja_a1a2,cod_combinacion_pareja_a2a1,cod_combinacion_pareja_b1b2,cod_combinacion_pareja_b2b1,is_mesa_llena from juegos where codtorneo=1 order by mesa asc

ese select es las mesas creadas por cada ronda dependiendo de la cantidad de participantes

las columnas
cod_combinacion_pareja_a1a2
cod_combinacion_pareja_a2a1
cod_combinacion_pareja_b1b2
cod_combinacion_pareja_b2b1

las cree para que despues de la primera ronda tomar esos codigo y tratar de hacer una comparacion para que no se repitan las parejas es de decir si en la primera ronda rosa jugo con maria ya no pueden volver a jugar juntas
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Phil Rob
Val: 3.353
Oro
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Comparar registros de una lista y establecer condiciones

Publicado por Phil Rob (1554 intervenciones) el 08/10/2023 09:52:04
Hola,

Difícil ...

"Je les ai créés pour qu'après le premier tour, je prenne ces codes et j'essaie de faire une comparaison pour que les couples ne se répètent pas, cela signifie que si au premier tour Rosa a joué avec Maria, ils ne pourront plus jouer ensemble."

Por lo tanto, es bien este he comprendido. Quieres hacer nuevas mesas con parejas que no ya existe en la tabla de los juegos.

Tienes que buscar 2 "Particpantes" que no ya están emparejados en la tablas "Juegos" de los juegos.

Cuando has encontrado un o dos parejos que te gustan, debes actualizar la tabla "Juegos" con la nueva mesa. Solamente después, puedes buscar otro parejo para hacer otra mesa.

Sobre SQL, este es hacer la buscada de 1 par de "Particpantes" que NO EXISTS en la tabla "Juegos". Es la razon porque mi consulta SQL es :
SELECT DISTINCT TP1.Articulo, TP2.Articulo, TP1.Id, TP2.Id, TP3.A1, TP3.A2
FROM TProductos As TP1, TProductos As TP2, (SELECT A1, A2 FROM TPajeras As TP3)
WHERE (TP1.Id <> A1 AND TP1.Id <> A2 AND TP2.Id <> A1 AND TP2.Id <> A2 AND TP1.Id <> TP2.Id)
AND Not EXISTS (SELECT A1, A2 FROM TPajeras As TP3 WHERE (TP1.Id & TP2.Id) = (TP3.A1 & TP3.A2))

Si ajustas esta consulta para tus tablas, tendras el resultado.
Existe 2 puntos esenciales :
Utilizar NO EXISTS para encontrar un par de "Participantes" que no ya existe en "Juegos"
Actualizar "Juegos" inmediatamente para poder buscar otro par. (Este detalle te obliga de hacer un INSERT INTO Juegos a cada vez).

No encuentras soluciones sin NO EXISTS.

No puedo hacer mas porque no me envias ejemplos con los datos verdades (o simulados). Cuando los me envias, haré las tablas en ACCESS y ajustaré mi consulta a tus campos de datos. Quizá que seria mejor que me envias tu DB MySql. Si puedo el importar (no garantizado), entonces podré hacer la consulta en SQL que podrás pegar directamente en tu sistema.

Que tenga un buen domingo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar