none
Eliminar registro y al agregar ocupar espacios eliminados RRS feed

  • Pregunta

  • Hola, Soy un viejo programador de basic, cobol, C++ y ahora me estoy adentrando en la programación visual. Hay algunos conceptos que todavía me cuestan entender es por ello quiero preguntar aquí.

    Estoy armando un ABM de clientes, agrego registros y hasta ahi todo bien. supongamos que tengo almacenados 10 registros y elimino el registro Nº 3, al agregar el próximo registro no se como hacer para que ocupe la posición 3.

    Para la carga de registros utilizó una base de datos Access con consultas SQL 

        Private Sub BtCliente_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtCliente.Click
            If NombreCliTextBox.Text <> Nothing Then
                If DireccionCliTextBox.Text <> Nothing Then
                    If BarrioCliTextBox.Text <> Nothing Then
                        If LocalidadCliTextBox.Text <> Nothing Then
                            If TelefonoCliTextBox.Text <> "" Or CelularCliTextBox.Text <> Nothing Then
                                If Me.BtCliente.Text = "AGREGAR CLIENTE" Then
                                    Me.ClientesTableAdapter.AgregarCliente(IdCliTextBox.Text, NombreCliTextBox.Text, ApellidoCliTextBox.Text, FechaNacimientoCliDateTimePicker.Text, DNICliTextBox.Text, DireccionCliTextBox.Text, BarrioCliTextBox.Text, LocalidadCliTextBox.Text, TelefonoCliTextBox.Text, CelularCliTextBox.Text, FechaIngresoCliDateTimePicker.Text)
                                    Me.ClientesTableAdapter.Fill(Me.DATADataSet.Clientes)
                                Else
                                    If Me.BtCliente.Text = "MODIFICAR CLIENTE" Then
                                        Me.ClientesTableAdapter.ModificarCliente(IdCliTextBox.Text, NombreCliTextBox.Text, ApellidoCliTextBox.Text, FechaNacimientoCliDateTimePicker.Text, DNICliTextBox.Text, DireccionCliTextBox.Text, BarrioCliTextBox.Text, LocalidadCliTextBox.Text, TelefonoCliTextBox.Text, CelularCliTextBox.Text, FechaIngresoCliDateTimePicker.Text, IdCliTextBox.Text)
                                        Me.ClientesTableAdapter.Fill(Me.DATADataSet.Clientes)
                                    Else
                                        If Me.BtCliente.Text = "ELIMINAR CLIENTE" Then
                                            Me.ClientesTableAdapter.EliminarCliente(IdCliTextBox.Text)
                                            Me.ClientesTableAdapter.Fill(Me.DATADataSet.Clientes)
                                        End If
                                    End If
                                End If
                                LimpiarClientes()
                                Me.Hide()
                            Else
                                MsgBox("INGRESE AL MENOS UN TELEFONO DE CONTACTO DEL CLIENTE POR FAVOR")
                            End If
                        Else
                            MsgBox("INGRESE LA LOCALIDAD DEL CLIENTE POR FAVOR")
                        End If
                    Else
                        MsgBox("INGRESE EL BARRIO DEL CLIENTE POR FAVOR")
                    End If
                Else
                    MsgBox("INGRESE LA DIRECCION DEL CLIENTE POR FAVOR")
                End If
            Else
                MsgBox("INGRESE EL NOMBRE DEL CLIENTE POR FAVOR")
            End If
        End Sub

    Este es el codigo que utilizo. Desde ya muchas gracias.

    jueves, 13 de septiembre de 2018 22:27

Respuestas

  • Consejo, Es malo tener ifs, anidados, mejor usa una validación de banderas o usa el "return" 

    No te pasare un ejemplo, por que esa chamba es tuya.

    "Los verdaderos desarrolladores, busca y mas buscan "

    martes, 30 de octubre de 2018 15:46

Todas las respuestas

  • Tu problema está en que tienes un error de concepto en cuanto a cómo funcionan las bases de datos relacionales, aquí:

     no se como hacer para que ocupe la posición 3.


    En las bases de datos relacionales, no existe la "posición" de un registro. Los registros, conceptualmente, ocupan posiciones arbitrarias e indeterminadas y pueden ser devueltos por el servidor de base de datos en cualquier orden arbitrario en cualquier momento, dependiendo de cómo le venga bien en ese momento al motor de la base de datos.

    Si necesitas presentar los registros en un orden específico, es necesario incluir dentro del registro una columna que indique ese número de orden, y consultar los registros poniendo en la SELECT un ORDER BY y el nombre de esa columna.

    Una vez que tengas la tabla y las consultas de selección configuradas de esa manera, está claro cómo haces que un registro ocupe la posición 3: le insertas un 3 en esa columna de "número de orden".

    viernes, 14 de septiembre de 2018 6:07
  • Gracias por tu respuesta, quizas me exprese mal en la pregunta anterior. Supongamos tengo un listado con 1000 clientes y elimino el Cliente 33,67,89. Al agregar un cliente nuevo se agrega como 1001. Mi pregunta era como recuperar los Números de clientes eliminados para aprovecharlos. Mi unica solucion es crear una tabla con los códigos eliminados e ir tomandolos de a uno a la hora de crear un nuevo cliente hasta que se acaben y ahí seguir con la numeración normal.
    martes, 30 de octubre de 2018 14:20
  • Efectivamente, esa solucion de la tabla auxiliar es una forma eficiente de recuperar los numeros eliminados, si la estructura de tu aplicacion te permite hacerlo asi.

    Existen otros metodos alternativos para encontrar "huecos" en la tabla. Una tecnica consiste en hacer un JOIN de la tabla contra si misma sumando 1 en la columna en la que buscas huecos. Mas o menos algo asi:

    SELECT (ID+1) FROM laTable AS t1
    LEFT JOIN laTabla as t2
    ON t1.ID+1 = t2.ID
    WHERE t2.ID IS NULL

    Esto te permitira encontrar un hueco para reutilizarlo, y no devlovera nada si no hay huecos.

    Para una aplicacion real, lo mejor es no borrar nunca ningun cliente. Lo que se hace es poner en la tabla de clientes un campo booleano tal como "Baja" y se pone ese campo a 1 cuando se "borra" el cliente, y cuando se consulta la tabla de clientes se pone "where baja=0" para obtener solo los clientes "no borrados". La ventaja de esto es que se mantiene el historico, por ejemplo, si consultas una factura emitida y esta enlazada con la tabla de clientes, se sigue pudiendo ver a quien se emitio la factura, aunque en la actualidad ese cliente ya no sea cliente nuestro. Si reutilizasemos el codigo para otro cliente nuevo, se crearia una gran confusion porque la factura antigua aparentaria pertenecer al nuevo cliente en lugar del cliente al que realmente se le emitio la factura.

    martes, 30 de octubre de 2018 15:22
  • Consejo, Es malo tener ifs, anidados, mejor usa una validación de banderas o usa el "return" 

    No te pasare un ejemplo, por que esa chamba es tuya.

    "Los verdaderos desarrolladores, busca y mas buscan "

    martes, 30 de octubre de 2018 15:46
  • Si tenes razon con los ifs, vengo de la vieja escuela en otra pregunta me hicieron la corrección con Select.Case.
    Excelente consejo de no borrar el cliente y dejarlo como histórico. Me encanta la programación, si bien no es mi profesión es un hobby que amo. Estoy desarrollando una aplicacion para mi negocio, una Estética Canina, ya está casi lista solo me falta ajustar un par de detalles. Muchas gracias por tus consejos.
    martes, 30 de octubre de 2018 20:29