
Imports System.Data.OleDb

Public Class FTestDB

    Dim MiConexion As New OleDbConnection
    Dim MiDatos As New DataSet
    Dim NombreTablaEnDB As String

    Private Sub CargarLaTabla()


        ' Exit Sub  ' este Sub no necesario para el problema de Nivel y Status

        'Dim NombreDBCompleto As String = "D:\Tmp\TestAccesDBSimpleConMostrar\MonStock2003.mdb"   ' MiExistencia
        'MiConexion.ConnectionString = "Provider=Microsoft.JET.OLEDB.4.0;Data Source=" & NombreDBCompleto & ";"  ' Exécuter en x86

        Dim NombreDBCompleto As String = "D:\Tmp\TestAccesDBSimpleConMostrar\MonStock2013.accdb"   ' MiExistencia
        MiConexion.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & NombreDBCompleto & ";"  ' Ejecutar en x64


        Dim UnaTabla As New DataTable
        Dim Consulta As String
        NombreTablaEnDB = "TProduit"   ' este es LaTablaQueMeGusta

        Consulta = "SELECT * FROM " & NombreTablaEnDB

        Dim MiAdapter As New OleDbDataAdapter(Consulta, MiConexion)
        MiAdapter.Fill(UnaTabla)
        UnaTabla.TableName = NombreTablaEnDB
        MiDatos.Tables.Add(UnaTabla)
        DGVTest.DataSource = UnaTabla

        MiAdapter.Dispose()


        UnaTabla.TableName = NombreTablaEnDB
        MiDatos.Tables.Add(UnaTabla)

        'DGVTest es un DataGridView

        DGVTest.DataSource = UnaTabla  ' Para ejemplo, todos campos

        'CBTest es un ComboBox

        CBTest.DataSource = UnaTabla
        CBTest.DisplayMember = "Article" ' este es el NombredelCampoQueMeGustaAqui, articulo

        ' *** Para introducción automática

        ''CBTest.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.Suggest
        ''CBTest.AutoCompleteSource = AutoCompleteSource.CustomSource

        ''Dim DatosParaAutoCompleteSource As New AutoCompleteStringCollection()

        ''For I As Integer = 0 To UnaTabla.Rows.Count - 1
        ''    DatosParaAutoCompleteSource.Add(UnaTabla.Rows(I).Item("Article"))
        ''Next I

        ''CBTest.AutoCompleteCustomSource = DatosParaAutoCompleteSource

        ' *** 

        'LBTest es un ListBox

        LBTest.DataSource = UnaTabla
        LBTest.DisplayMember = "Article" ' este es ElNombredelCampoQueMeGustaAqui, articulo

        'TBTest es un TextBox

        TBTest.DataBindings.Add("Text", UnaTabla, "Stock") ' este es ElNombredelCampoQueMeGustaAqui, este es la cuantidad de articulos

        MiAdapter.Dispose()
        MiConexion.Close()
        MiConexion.Dispose()

    End Sub

    ' El bloque de gestión de lectura. Un solo procedimiente evento responde a 4 fuentes de Click : BPrimero, BAnterior, BSiguiente y BUltimo
    Private Sub LecturaCircular_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BUltimo.Click, BAnterior.Click, BSiguiente.Click, BPrimero.Click
        ' No es necesario intentar un movimiento si el DataSet no contiene ninguna tabla.
        If MiDatos.Tables.Count > 0 Then
            ' El BindingContext pertenece a un contenedor, el formulario en este caso.
            With Me.BindingContext(MiDatos.Tables(NombreTablaEnDB))
                ' Modificacion de la propiedad Position segun el boton seleccionado.
                Select Case sender.Name
                    Case "BPrimero"
                        .Position = 0
                    Case "BAnterior"
                        If .Position = 0 Then
                            .Position = .Count - 1              ' Lectura circular (como un reloj pero al revés)
                        Else
                            .Position -= 1
                        End If
                    Case "BSiguiente"
                        If .Position = .Count - 1 Then
                            .Position = 0                       ' Lectura circular (como un reloj)
                        Else
                            .Position += 1
                        End If
                    Case "BUltimo"
                        .Position = .Count - 1
                End Select
            End With
        End If
    End Sub

    'Private Sub CBTest_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles CBTest.KeyDown
    '    CBTest.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.Suggest
    'End Sub

    Private Sub BTestar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BTestar.Click

        '' Determinar los nivel y status
        Dim NombreDBCompleto As String = "D:\Tmp\TestAccesDBSimpleConMostrar\MonStock2013.accdb"   ' MiExistencia
        MiConexion.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & NombreDBCompleto & ";"  ' Exécuter en x64

        Dim CuantidadRegistroALeer As Integer = 5   ' Cuantidad de ultimos registros a leer en la tabla

        Dim MiComando As New OleDbCommand

        Dim UnaTabla As New DataTable
        Dim Consulta As String
        NombreTablaEnDB = "TLotesInspeccionados"   ' este es LaTablaQueMeGusta

        MiConexion.Open()
        MiComando = MiConexion.CreateCommand()
        MiComando.CommandType = CommandType.Text

        ' *** Si la tabla en la DB no tiene 5 registros, nada a hacer ***

        Consulta = "SELECT COUNT(ID) FROM " & NombreTablaEnDB
        MiComando.CommandText = Consulta

        If MiComando.ExecuteScalar() < CuantidadRegistroALeer Then   ' Nada a hacer si no bastante registros
            MiConexion.Close()
            MiConexion.Dispose()
            Exit Sub
        End If

        ' *** Leer los 5 ultimos registros y los poner en DataTable  ***

        ' Aqui, llenamos un DataTable con los ultimos registros de la tabla en la DB (y para testar, mostrar en DGV)
        Consulta = "SELECT TOP " & CuantidadRegistroALeer & " ID, * FROM " & NombreTablaEnDB & " ORDER BY ID DESC"
        Dim MiAdapter As New OleDbDataAdapter(Consulta, MiConexion)
        MiAdapter.Fill(UnaTabla)
        UnaTabla.TableName = "TUltimosRegistros"
        MiDatos.Tables.Add(UnaTabla)    ' Poner la tabla en un DataSet no es siempre necesario
        ' DGVTest.DataSource = UnaTabla   ' Mostrar en DGV

        MiAdapter.Dispose()

        ' *** Creo otra DataTable para contener los valores del nuevo registro ***

        ' Solamente para tener un esquema bien para registrar en la DB
        Dim NuevoRegistro As New DataTable
        NuevoRegistro = UnaTabla.Clone
        NuevoRegistro.TableName = "RegistroAPoner"
        MiDatos.Tables.Add(NuevoRegistro)

        ' Escribir los valores del nuevo registro  : escribido aqui para testar, de otra manera tienes que llenar con los valores de la pantalla
        MiDatos.Tables("RegistroAPoner").Rows.Add()
        MiDatos.Tables("RegistroAPoner").Rows(0).Item("ID") = 17
        MiDatos.Tables("RegistroAPoner").Rows(0).Item("numero_lot") = 117
        MiDatos.Tables("RegistroAPoner").Rows(0).Item("documentacion") = "Palabras"
        MiDatos.Tables("RegistroAPoner").Rows(0).Item("nivel") = ""
        MiDatos.Tables("RegistroAPoner").Rows(0).Item("status") = ""

        ' ********** Algoritma para decir el nivel de esto ultimo registro  *******************

        ' Contar los Status de los ultimos registros y memorizar los Nivel y Status del ultimo registro en la DB
        Dim StatusEnDB As String
        StatusEnDB = MiDatos.Tables("TUltimosRegistros").Rows(0).Item("status")
        Dim NivelEnDB As String
        NivelEnDB = MiDatos.Tables("TUltimosRegistros").Rows(0).Item("nivel")

        Dim CuentaDeMismoStatus As Integer = 1
        For L As Integer = 1 To CuantidadRegistroALeer - 1
            If MiDatos.Tables("TUltimosRegistros").Rows(L).Item("status") = StatusEnDB Then
                CuentaDeMismoStatus += 1
            End If
        Next

        ' Decir el valor para Nivel y la Valor para Status para el nuevo registro
        With MiDatos.Tables("RegistroAPoner").Rows(0)
            If CuentaDeMismoStatus < 5 Then   ' no encontrado 5 mismos status
                ' segun los valores del ultimo registro en la DVB
                Select Case StatusEnDB
                    Case "Aceptado"
                        .Item("nivel") = "escriba el valor que tu gusta par el nuevo registro"
                        .Item("status") = "escriba el valor que tu gusta par el nuevo registro"
                    Case "Rechazado"
                        .Item("nivel") = " ..."
                        .Item("status") = " ..."
                    Case " agregas aqui tan de Case con valores de Status que te gustan"
                        .Item("nivel") = "????"
                        .Item("status") = "????"
                End Select
            Else ' encontramos 5 mismos status
                Select Case StatusEnDB  ' este es el valor del ultimo Status en la DB
                    Case "Aceptado"
                        Select Case NivelEnDB   ' este es el valor del ultimo Nivel en la DB
                            Case "Normal"
                                .Item("nivel") = "escriba el valor que tu gusta par el nuevo registro"
                                .Item("status") = "escriba el valor que tu gusta par el nuevo registro"
                            Case "Ajustada"
                                .Item("nivel") = "escriba el valor que tu gusta par el nuevo registro"
                                .Item("status") = "escriba el valor que tu gusta par el nuevo registro"
                            Case " agregas aqui tan de Case con valores de Nivel que te gustan"
                                .Item("nivel") = "escriba el valor que tu gusta par el nuevo registro"
                                .Item("status") = "escriba el valor que tu gusta par el nuevo registro"
                        End Select
                    Case "Rechazado"
                        Select Case NivelEnDB   ' este es el valor del ultimo Nivel en la DB
                            Case "Normal"
                                .Item("nivel") = "escriba el valor que tu gusta par el nuevo registro"
                                .Item("status") = "escriba el valor que tu gusta par el nuevo registro"
                            Case "Ajustada"
                                .Item("nivel") = "escriba el valor que tu gusta par el nuevo registro"
                                .Item("status") = "escriba el valor que tu gusta par el nuevo registro"
                            Case " agredas aqui tan de Case con valores de Nivel que te gustan"
                                .Item("nivel") = "escriba el valor que tu gusta par el nuevo registro"
                                .Item("status") = "escriba el valor que tu gusta par el nuevo registro"
                        End Select
                    Case "Aceptado"
                        Select Case NivelEnDB   ' este es el valor del ultimo Nivel en la DB
                            Case "Normal"
                                .Item("nivel") = "escriba el valor que tu gusta par el nuevo registro"
                                .Item("status") = "escriba el valor que tu gusta par el nuevo registro"
                            Case "Ajustada"
                                .Item("nivel") = "escriba el valor que tu gusta par el nuevo registro"
                                .Item("status") = "escriba el valor que tu gusta par el nuevo registro"
                            Case " agredas aqui tan de Case con valores de Nivel que te gustan"
                                .Item("nivel") = "escriba el valor que tu gusta par el nuevo registro"
                                .Item("status") = "escriba el valor que tu gusta par el nuevo registro"
                        End Select
                    Case " agregas aqui tan de Case con valores de Status que te gustan"
                        Select Case NivelEnDB   ' este es el valor del ultimo Nivel en la DB
                            Case "Normal"
                                .Item("nivel") = "escriba el valor que tu gusta par el nuevo registro"
                                .Item("status") = "escriba el valor que tu gusta par el nuevo registro"
                            Case "Ajustada"
                                .Item("nivel") = "escriba el valor que tu gusta par el nuevo registro"
                                .Item("status") = "escriba el valor que tu gusta par el nuevo registro"
                            Case " agregas aqui tan de Case con valores de Nivel que te gustan"
                                .Item("nivel") = "escriba el valor que tu gusta par el nuevo registro"
                                .Item("status") = "escriba el valor que tu gusta par el nuevo registro"
                        End Select
                End Select
            End If
        End With

        ' ********** Algoritma terminado  *******************

        ' agregar el nuevo registro en la DB

        MiComando = MiConexion.CreateCommand()
        MiComando.CommandType = CommandType.Text
        With MiDatos.Tables("RegistroAPoner").Rows(0)
            MiComando.CommandText = "INSERT INTO " & NombreTablaEnDB & " (ID, numero_lot, documentacion, nivel, status) " &
            "VALUES (" & .Item("ID") & ", " & .Item("numero_lot") & ", '" & .Item("documentacion") & "', '" & .Item("nivel") & "', '" & .Item("status") & "')"
        End With
        MiComando.ExecuteNonQuery()

        MiConexion.Close()
        MiConexion.Dispose()

    End Sub

    Private Sub BCargar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BCargar.Click
        MiDatos.Reset()
        DGVTest.DataSource = Nothing
        CBTest.DataSource = Nothing
        LBTest.DataSource = Nothing
        TBTest.DataBindings.Clear()
        CargarLaTabla()
        ' EncodagePermis = True
    End Sub

    ''   Dim EncodagePermis As Boolean = False

    'Private Sub DGVTest_CellValueChanged(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DGVTest.CellValueChanged

    '    Dim MiAdapter As OleDbDataAdapter
    '    Dim UnaTabla As New DataTable
    '    Dim Consulta As String

    '    If e.ColumnIndex <> 0 Then Exit Sub ' 0 es el indicio de la columna del Id

    '    Dim NombreDBCompleto As String = "D:\Tmp\TestAccesDBSimpleConMostrar\MonStock2013.accdb"   ' MiExistencia
    '    MiConexion.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & NombreDBCompleto & ";"  ' Ejecutar en x64

    '    NombreTablaEnDB = "TProduit"   ' este es LaTablaQueMeGusta, = TProductos

    '    Try
    '        Consulta = "SELECT * FROM " & NombreTablaEnDB & " WHERE Id = " & DGVTest.Item(0, e.RowIndex).Value
    '        MiAdapter = New OleDbDataAdapter(Consulta, MiConexion)
    '        MiAdapter.Fill(UnaTabla)

    '        DGVTest.Item(1, e.RowIndex).Value = UnaTabla.Rows(0).Item(1)

    '    Catch
    '        MessageBox.Show("Codigo " & DGVTest.Item(0, e.RowIndex).Value.ToString & " no encontrado")  ' Si error con la DB o malo codigo
    '    End Try


    '    UnaTabla.Clear()
    '    UnaTabla.Dispose()
    '    MiAdapter.Dispose()

    'End Sub

End Class


'' Eliminar duplicatos con sum de las cuatidades
''      D:\Tmp\TestAccesDBSimpleConMostrar
'Dim NombreDBCompleto As String = "D:\Tmp\TestAccesDBSimpleConMostrar\MonStock2013.accdb"   ' MiExistencia
'MiConexion.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & NombreDBCompleto & ";"  ' Exécuter en x64

'Dim MiComando As New OleDbCommand

'Dim UnaTabla As New DataTable
'Dim Consulta As String
'NombreTablaEnDB = "TProduit"   ' este es LaTablaQueMeGusta, TProductos

'Consulta = "SELECT MIN(Id) AS IDMIN, Article, SUM(STOCK) AS TOTALSTOCK FROM " & NombreTablaEnDB & " GROUP BY Article"



'Dim MiAdapter As New OleDbDataAdapter(Consulta, MiConexion)
'MiAdapter.Fill(UnaTabla)
'UnaTabla.TableName = NombreTablaEnDB
'MiDatos.Tables.Add(UnaTabla)
'DGVTest.DataSource = UnaTabla

'MiAdapter.Dispose()

'MiConexion.Open()
'MiComando = MiConexion.CreateCommand()
'MiComando.CommandType = CommandType.Text
'For Each R As DataRow In MiDatos.Tables(NombreTablaEnDB).Rows
'    MiComando.CommandText = "UPDATE " & NombreTablaEnDB & " SET Stock = " & R.Item("TOTALSTOCK") & " WHERE Id = " & R.Item("IDMIN")
'    MiComando.ExecuteNonQuery()
'    MiComando.CommandText = "DELETE FROM " & NombreTablaEnDB & " WHERE Article = '" & R.Item("Article") & "' AND NOT (Id = " & R.Item("IDMIN") & ")"
'    MiComando.ExecuteNonQuery()
'Next

'MiConexion.Close()
'MiConexion.Dispose()
