none
Comparar varios DataTable con los mismos datos y agregar a un Datagridview la fila con el precio mayor en VB.NET RRS feed

  • Pregunta

  • Buenas, estoy trabajando actualmente en VB.NET y MYSQL

    Tengo 4 base de datos y cada una tiene la misma tabla (productos) con la misma cantidad de columnas donde una de ellas es el código de producto (codprod) que seria la clave primaria y la misma cantidad de datos (las 4 DB's tienen la misma cantidad de productos), pero la variación entre ellas es el stock, costo y precio en las distintas base de datos, quisiera comparar cada producto en esas tablas y llenar en un DGV el producto que tenga el mayor precio y mostrar a DB pertenece; cabe destacar que la comparación son de productos con stock mayor a cero, si en la DB1 hay 10 productos con stock, alguno de esos producto de la DB1 puede estar en stock cero en las demás DB's, en ese caso colocar ese producto en el DGV. Eso es con la finalidad de que ademas de mostrar el producto con el precio mayor, ese precio mayor sea actualizado en las demás DB's y unificar el precio en las 4 base de datos.

    La consulta a la tabla productos en las 4 base de datos es la siguiente:

    SELECT codprod,costo,precio FROM productos WHERE stock > 0

    gracias de antemano por la ayuda.

    lunes, 14 de diciembre de 2020 13:23

Todas las respuestas

  • Option Explicit On
    Option Strict On
    Imports MySql.Data.MySqlClient
    Public Class Form1
        Private mdtDataTableBDAH As New DataTable
        Private mdtDataTableBDAFADOS As New DataTable
        Private mdtDataTableBDAFA As New DataTable
        Private mdtDataTableAE As New DataTable
        Private mdtDataTableFinal As New DataTable
        '
        Private msCadenaMySqlBDAH As String = "Data source=20.0.1.1;userid=juan.salon;password=lagarto;database=hptal;charset=utf8;"
        Private msCadenaMySqlBDAFADOS As String = "Data source=20.0.3.1;userid=juan.salon;password=lagarto;database=ffados;charset=utf8;"
        Private msCadenaMySqlBDAFA As String = "Data source=20.0.2.1;userid=juan.salon;password=lagarto;database=ffap;charset=utf8;"
        Private msCadenaMySqlAE As String = "Data source=20.0.4.1;userid=juan.salon;password=lagarto;database=fexpres;charset=utf8;"
        Private Sub Form6_KeyDown(sender As Object, e As KeyEventArgs) Handles MyBase.KeyDown
            If e.KeyCode = Keys.Escape Then
                Close()
            End If
        End Sub
        Private Sub Form6_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    
        End Sub
        Private Sub btncargar_Click(sender As Object, e As EventArgs) Handles btncargar.Click
            'Añadimos las columnas al datatable final.
            mdtDataTableFinal.Columns.Add(New DataColumn("Tabla", Type.GetType("System.String")))
            mdtDataTableFinal.Columns.Add(New DataColumn("CodProd", Type.GetType("System.Int16")))
            mdtDataTableFinal.Columns.Add(New DataColumn("Nombre", Type.GetType("System.String")))
            mdtDataTableFinal.Columns.Add(New DataColumn("Precio", Type.GetType("System.Int32")))
            '
            Me.DataGridView1.AllowUserToAddRows = False
            Me.DataGridView1.DataSource = mdtDataTableBDAH
            Me.DataGridView2.AllowUserToAddRows = False
            Me.DataGridView2.DataSource = mdtDataTableBDAFADOS
            Me.DataGridView3.AllowUserToAddRows = False
            Me.DataGridView3.DataSource = mdtDataTableBDAFA
            Me.DataGridView4.AllowUserToAddRows = False
            Me.DataGridView4.DataSource = mdtDataTableAE
            Try
                Dim lsQuery As String = String.Empty
                Using lConexion As New MySqlConnection(msCadenaMySqlBDAH)
                    lsQuery = "SELECT codprod, nombre, costo, precio, stock FROM productos"
                    Using lDataAdapter = New MySqlDataAdapter(lsQuery, lConexion)
                        lDataAdapter.Fill(mdtDataTableBDAH)
                    End Using
                End Using
                '
                Using lConexion As New MySqlConnection(msCadenaMySqlBDAFADOS)
                    lsQuery = "SELECT codprod, nombre, costo, precio, stock FROM productos"
                    Using lDataAdapter = New MySqlDataAdapter(lsQuery, lConexion)
                        lDataAdapter.Fill(mdtDataTableBDAFADOS)
                    End Using
                End Using
                '
                Using lConexion As New MySqlConnection(msCadenaMySqlBDAFA)
                    lsQuery = "SELECT codprod, nombre, costo, precio, stock FROM productos"
                    Using lDataAdapter = New MySqlDataAdapter(lsQuery, lConexion)
                        lDataAdapter.Fill(mdtDataTableBDAFA)
                    End Using
                End Using
                '
                Using lConexion As New MySqlConnection(msCadenaMySqlAE)
                    lsQuery = "SELECT codprod, nombre, costo, precio, stock FROM productos"
                    Using lDataAdapter = New MySqlDataAdapter(lsQuery, lConexion)
                        lDataAdapter.Fill(mdtDataTableAE)
                    End Using
                End Using
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
            'Me.WindowState = FormWindowState.Maximized
            Label1.Text = CStr(DataGridView1.RowCount)
            Label2.Text = CStr(DataGridView2.RowCount)
            Label3.Text = CStr(DataGridView3.RowCount)
            Label4.Text = CStr(DataGridView4.RowCount)
        End Sub
    
        Private Sub btnLista_Click(sender As Object, e As EventArgs) Handles btnLista.Click
            'Hay que hace un ciclo recorriendo todas las filas 
            '(solo se hace 1 ciclo porque todas las tablas tienen el mismo numero de registros, 
            'en este ejemplo es 10) y la que tenga el precio mayor y que el stock NO sea cero se añade a el datatable final
            Dim PrecioMax As Integer = 0
            Dim Fila As DataRow
            Dim Lista As New List(Of Precio)
            Dim Unidad As Precio
            For liCiclo As Integer = 0 To mdtDataTableBDAH.Rows.Count - 1
                If Convert.ToInt32(mdtDataTableBDAH.Rows(liCiclo)("stock")) > 0 Then
                    Unidad = New Precio("Primera", Convert.ToInt32(mdtDataTableBDAH.Rows(liCiclo)("codprod")), Convert.ToString(mdtDataTableBDAH.Rows(liCiclo)("nombre")), Convert.ToInt32(mdtDataTableBDAH.Rows(liCiclo)("precio")))
                    Lista.Add(Unidad)
                End If
                If Convert.ToInt32(mdtDataTableBDAFADOS.Rows(liCiclo)("stock")) > 0 Then
                    Unidad = New Precio("Segunda", Convert.ToInt32(mdtDataTableBDAH.Rows(liCiclo)("codprod")), Convert.ToString(mdtDataTableBDAH.Rows(liCiclo)("nombre")), Convert.ToInt32(mdtDataTableBDAFADOS.Rows(liCiclo)("precio")))
                    Lista.Add(Unidad)
                End If
                If Convert.ToInt32(mdtDataTableBDAFA.Rows(liCiclo)("stock")) > 0 Then
                    Unidad = New Precio("Tercera", Convert.ToInt32(mdtDataTableBDAH.Rows(liCiclo)("codprod")), Convert.ToString(mdtDataTableBDAH.Rows(liCiclo)("nombre")), Convert.ToInt32(mdtDataTableBDAFA.Rows(liCiclo)("precio")))
                    Lista.Add(Unidad)
                End If
                If Convert.ToInt32(mdtDataTableAE.Rows(liCiclo)("stock")) > 0 Then
                    Unidad = New Precio("Cuarta", Convert.ToInt32(mdtDataTableBDAH.Rows(liCiclo)("codprod")), Convert.ToString(mdtDataTableBDAH.Rows(liCiclo)("nombre")), Convert.ToInt32(mdtDataTableAE.Rows(liCiclo)("precio")))
                    Lista.Add(Unidad)
                End If
                Fila = mdtDataTableFinal.NewRow
                'Se ordena ascendente la lista por precio y se selecciona la ultima posicion
                Lista = Lista.OrderBy(Function(x) x.precio).ToList()
                Fila.Item("Tabla") = Lista(Lista.Count - 1).Tabla
                Fila.Item("CodProd") = Lista(Lista.Count - 1).codprod
                Fila.Item("Nombre") = Lista(Lista.Count - 1).Nombre
                Fila.Item("Precio") = Lista(Lista.Count - 1).precio
                mdtDataTableFinal.Rows.Add(Fila)
                Lista.Clear()
            Next
            Using loForm As New Form7
                loForm.Tabla = mdtDataTableFinal
                loForm.ShowDialog()
            End Using
        End Sub
    
        Private Sub btnDatatable_Click(sender As Object, e As EventArgs) Handles btnDatatable.Click
            'Hay que hace un ciclo recorriendo todas las filas 
            '(solo se hace 1 ciclo porque todas las tablas tienen 
            'el mismo numero de registros, en este ejemplo es 10) y la 
            'que tenga el precio mayor y que el stock NO sea cero se añade a el datatable final
            Dim PrecioMax As Integer = 0
            Dim Fila As DataRow
            Dim Temporal As DataTable = mdtDataTableFinal.Clone
            For liCiclo As Integer = 0 To mdtDataTableBDAH.Rows.Count - 1
                If Convert.ToInt32(mdtDataTableBDAH.Rows(liCiclo)("stock")) > 0 Then
                    Fila = Temporal.NewRow
                    Fila.Item("Tabla") = "Primera"
                    Fila.Item("CodProd") = Convert.ToInt32(mdtDataTableBDAH.Rows(liCiclo)("codprod"))
                    Fila.Item("Nombre") = Convert.ToString(mdtDataTableBDAH.Rows(liCiclo)("nombre"))
                    Fila.Item("Precio") = Convert.ToInt32(mdtDataTableBDAH.Rows(liCiclo)("precio"))
                    Temporal.Rows.Add(Fila)
                End If
                If Convert.ToInt32(mdtDataTableBDAFADOS.Rows(liCiclo)("stock")) > 0 Then
                    Fila = Temporal.NewRow
                    Fila.Item("Tabla") = "Segunda"
                    Fila.Item("CodProd") = Convert.ToInt32(mdtDataTableBDAFADOS.Rows(liCiclo)("codprod"))
                    Fila.Item("Nombre") = Convert.ToString(mdtDataTableBDAFADOS.Rows(liCiclo)("nombre"))
                    Fila.Item("Precio") = Convert.ToInt32(mdtDataTableBDAFADOS.Rows(liCiclo)("precio"))
                    Temporal.Rows.Add(Fila)
                End If
                If Convert.ToInt32(mdtDataTableBDAFA.Rows(liCiclo)("stock")) > 0 Then
                    Fila = Temporal.NewRow
                    Fila.Item("Tabla") = "Tercera"
                    Fila.Item("CodProd") = Convert.ToInt32(mdtDataTableBDAFA.Rows(liCiclo)("codprod"))
                    Fila.Item("Nombre") = Convert.ToString(mdtDataTableBDAFA.Rows(liCiclo)("nombre"))
                    Fila.Item("Precio") = Convert.ToInt32(mdtDataTableBDAFA.Rows(liCiclo)("precio"))
                    Temporal.Rows.Add(Fila)
                End If
                If Convert.ToInt32(mdtDataTableAE.Rows(liCiclo)("stock")) > 0 Then
                    Fila = Temporal.NewRow
                    Fila.Item("Tabla") = "Cuarta"
                    Fila.Item("CodProd") = Convert.ToInt32(mdtDataTableAE.Rows(liCiclo)("codprod"))
                    Fila.Item("Nombre") = Convert.ToString(mdtDataTableAE.Rows(liCiclo)("nombre"))
                    Fila.Item("Precio") = Convert.ToInt32(mdtDataTableAE.Rows(liCiclo)("precio"))
                    Temporal.Rows.Add(Fila)
                End If
                'Se ordena la tabla por precio descendente
                Dim view As DataView = New DataView(Temporal)
                view.Sort = "Precio DESC"
                Fila = mdtDataTableFinal.NewRow
                'Se selecciona la primera fila de la tabla
                Fila.Item("Tabla") = Convert.ToString(view.Item(0)(0))
                Fila.Item("CodProd") = Convert.ToInt32(view.Item(0)(1))
                Fila.Item("Nombre") = Convert.ToString(view.Item(0)(2))
                Fila.Item("Precio") = Convert.ToInt32(view.Item(0)(3))
                mdtDataTableFinal.Rows.Add(Fila)
                Temporal.Clear()
            Next
            Using loForm As New Form7
                loForm.Tabla = mdtDataTableFinal
                loForm.ShowDialog()
            End Using
        End Sub
    End Class

    martes, 15 de diciembre de 2020 20:51