none
Numero Correlativo en textbox

    Pregunta

  • Estimados tengo una aplicacion conectada a Access 2010

    En el Formulario 1 tengo un datagriwview y los botones de agregar modificar eliminar y buscar.

    Cuando se le da click al boton agregar me manda al formulario 2 y hay esta mi problema.

    este es el formulario 2


    me han pedido que el textbox1 que es el de COD_TRAB salga en automatico.

    Es decir cuando le den click al botón agregar del formulario 1 se cargue el formulario 2 y aparezca en automático el código de trabajador(COD_TRAB)

    para esto las condiciones son que el COD_TRAB tenga el siguiente formato TR000001 para el primero y cuando deseen ingresar otro trabajador en automatico aparesca TR000002 y asi sucesivamente, y obviamente al darle el boton guardar este codigo se guarde en la base de datos empleados en el campo COD_TRAB de access.

    me he guiado de códigos en sql adaptándolos para access pero no me resulta nada, por favor si alguien tuviera la solución para esto.

    atte.

    jueves, 16 de marzo de 2017 21:57

Respuestas

  • Hola eloshmt,

    Lo recomendable sería almacenar un valor numérico (indetity) en la BD y al mostrarlo solo le aplicas el formato.

    Dim id As Integer = 3
    
    Dim codigo = String.Format("TR{0:000000}", id)
    'Resultado : TR000003

    ¿La pregunta es porque necesitas mostrar el código al usuario que ingresa?

    Lo malo de agregar un código correlativo en un formulario es que no siempre va a funcionar, ya que puedes tener a 2 usuarios que ingresen datos paralelamente y en ambos casos mostraría el  último (ID + 1) pero el primero que registra lo hace con ese código, el segundo presentará error de 'duplicate pk'. Aunque puedes validar que no se produzca un error el código mostrado no siempre sería el ingresado.

    En todo caso al terminas el registro podrías mostrar el código al usuario obteniendo el id.

    "insert into miTable (...) values (...), SELECT @@IDENTITY"

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    • Marcado como respuesta eloshmt viernes, 17 de marzo de 2017 22:41
    viernes, 17 de marzo de 2017 3:02
  • Estimado, gracias por tu ayuda, lo resolvi agregando una columna id autonumerica y luego la columna COD_TRAB y use una funcion que toma el numero mayor del campo ID le da el formato TR0000# y lo ingresa en el campo COD_TRAB.

    Using cnn As New OleDb.OleDbConnection("Provider=microsoft.ace.oledb.12.0;data Source=empresa.accdb")
                Try
                    Dim sql As String =
                       "SELECT MAX(id) FROM trabajadores"
                    Dim cmd As New OleDb.OleDbCommand(sql, cnn)
                    cnn.Open()
                    Dim value As Object = cmd.ExecuteScalar
                    Return CInt(value) + 1
                Catch ex As Exception
                    Throw
                End Try
            End Using
        End Function

    y luego llamo a la funcion en el form2_load

    Try
                Dim CodProveedor As Integer = GetNextAutoNumeric()
    
                Dim codigo = String.Format("TR{0:}", CodProveedor)
    
    
                TextBox1.Text = codigo
    
            Catch ex As Exception
                MessageBox.Show(ex.Message)
    
            End Try

    me resulto mejor de lo que esperaba, ojala no me de problemas. Igualmente si puedes mejorar mi codigo seria genial.

    Gracias

    viernes, 17 de marzo de 2017 22:40

Todas las respuestas

  • No vamos a hacer tu tarea, pero te puedo ayudar a razonar:

    al mostrar el formulario 2 primero ve a consultar tu ultimo numero de empleado y muestra ese numero +1.

    Para que el formato de COD_TRAB sea TR000001, TR000002, etc., entonces usa la cadena del numero de trabajador con el formato "00000#", ej:

    dim trab_a as integer

    trab_a = ultimoTRAB()   'ultimoTRAB es la función que te devuelve el numero del ultimo trabajador registrado

    trab_a = trab_a +1

    dim trab_s as string

    trab_s = "TR" + trab_a.ToString("00000#")

    y ahora si muestra en el formulario2 trab_s.

    Saludos

    Si te sirvió marcarla como respuesta

    viernes, 17 de marzo de 2017 0:47
  • Hola eloshmt,

    Lo recomendable sería almacenar un valor numérico (indetity) en la BD y al mostrarlo solo le aplicas el formato.

    Dim id As Integer = 3
    
    Dim codigo = String.Format("TR{0:000000}", id)
    'Resultado : TR000003

    ¿La pregunta es porque necesitas mostrar el código al usuario que ingresa?

    Lo malo de agregar un código correlativo en un formulario es que no siempre va a funcionar, ya que puedes tener a 2 usuarios que ingresen datos paralelamente y en ambos casos mostraría el  último (ID + 1) pero el primero que registra lo hace con ese código, el segundo presentará error de 'duplicate pk'. Aunque puedes validar que no se produzca un error el código mostrado no siempre sería el ingresado.

    En todo caso al terminas el registro podrías mostrar el código al usuario obteniendo el id.

    "insert into miTable (...) values (...), SELECT @@IDENTITY"

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    • Marcado como respuesta eloshmt viernes, 17 de marzo de 2017 22:41
    viernes, 17 de marzo de 2017 3:02
  • Estimado, intente con tu ayuda pero no me funciona, te comento no es una tarea, solo que desarrolle un programa en visual de curioso, el programa es util a mis compañeros de labor (a pesar de ser un programa que solo modifica datos en una BD Access)

    y lo del autonumerico es por darle una mejora y ampliar conocimiento.

    Razonando deduje q el ultimo numero seria el mayor, investigando encontre la funcion MAX que a tu ejemplo la aplico asi:

    Dim trab_a As Integer
                cnn.Open()
                trab_a = "SELECT MAX(COD_TRAB) FROM ordenes"
    
                trab_a = trab_a + 1
    
                Dim trab_s As String
    
                trab_s = "TR" + trab_a.ToString("00000#")
    
                TextBox1.Text = trab_s

    encontre en internet en internet que esta forma seria una salida pero no la solucion, igualmente la salida me vendria bien, si me pudieras indicar en que esta mal el codigo te lo agradeceria.

    atte.

    viernes, 17 de marzo de 2017 17:31
  • Hola Joel,

    te comento lo que pasa es que mis compañeros cuando ingresan un nuevo trabajador deben preguntarse entre ellos que numero de COD_TRAB han usado para no repetirlo, ejemplo somos 4 empleados los 4 estamos conectados al programa, si empleado A quiere ingresar un nuevo trabajador debe preguntarle a empleado B,C,D cual es el ultimo COD_TRAB que ellos usaron, para asi no repetir el COD_TRAB a la hora de ingresar al nuevo trabajador.

    como todo esto es muy tedioso me dieron la idea de que ese dato COD_TRAB salga en automatico apenas se desee ingresar a un nuevo trabajador.

    pero tienes razon de que pasaria si dos intentan ingresar a un trabajador al mismo tiempo. No pense que una aplicacion tan pequeña me diera ese problema. No soy Programador nisiquiera sabia programar el mes pasado.. no entiendo tu codigo no se en que parte del formulario lo deberia aplicar.

    si me pudieras pasar un ejemplo o algo donde investigar... Gracias.

    viernes, 17 de marzo de 2017 17:48
  • eloshmt,

    Lo que veo es que estás redundando en la definición del identificador del empleado, ¿qué contiene la columna [DNI]? púes el identificador único de una persona, además de ese identificador ¿deseas agregar otro identificador? ¿con qué objetivo? ¿el código TR001, TR0050 tiene un significado para el negocio?, ¿vas a pedir que cada empleado recuerde el número de código asignado?, ¿no crees que lo natural es que el empleado se identifique por su número de DNI?, mi sugerencia es que desistas del campo COD_TRAB, no le veo sentido.



    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    viernes, 17 de marzo de 2017 18:21
  • Williams, te explico un poco.

    el are que maneja mi equipo es de tecnicos en mantenimiento, cuando un tecnico va a la casa de un cliente a revisar sus instalaciones electricas se identifica con su fotocheck el cual indica su numero de Trabajador (COD_TRAB) con ese codigo el cliente puede poner una queja o un aobservacion al trabajador.

    Ahora si me preguntas por que la empresa lo maneja asi.... me imagino que debe ser confidencialidad de datos... digo me imagino por que no se me ocurre otra cosa ademas no creo que es bueno ir dando a todo mundo tu DNI.

    el COD_TRAB es con que se le identifica al trabajador dentro de la empresa. el area en la que estoy entre muchas funciones le asigna ese codigo a un nuevo trabajador, lo hacemos en un excel compartido y lo llevamos bien esmas en el excel no tenemos ningún problema, pero como toda persona busco aportar algo, y por eso me entere de VB y desarrolle la aplicación con la ayuda de este foro incluyendo la tuya.

    bueno ese el motivo del COD_TRAB. 

    viernes, 17 de marzo de 2017 18:40
  • Hola Joel,

    te comento lo que pasa es que mis compañeros cuando ingresan un nuevo trabajador deben preguntarse entre ellos que numero de COD_TRAB han usado para no repetirlo, ejemplo somos 4 empleados los 4 estamos conectados al programa, si empleado A quiere ingresar un nuevo trabajador debe preguntarle a empleado B,C,D cual es el ultimo COD_TRAB que ellos usaron, para asi no repetir el COD_TRAB a la hora de ingresar al nuevo trabajador.

    como todo esto es muy tedioso me dieron la idea de que ese dato COD_TRAB salga en automatico apenas se desee ingresar a un nuevo trabajador.

    pero tienes razon de que pasaria si dos intentan ingresar a un trabajador al mismo tiempo. No pense que una aplicacion tan pequeña me diera ese problema. No soy Programador nisiquiera sabia programar el mes pasado.. no entiendo tu codigo no se en que parte del formulario lo deberia aplicar.

    si me pudieras pasar un ejemplo o algo donde investigar... Gracias.

    Hola eloshmt,

    Según lo que mencionas, no es necesario mostrar el código que se va a registrar al usuario.

    Deberías dejar que la base de datos te autogenere el Id numérico (solo le asignarías un constraint IDENTITY), así no tendrías los problemas antes mencionados y este ya no sería asignado en la consulta 'INSERT INTO ..'.

    Además, el campo 'FechaIngreso' corresponde a la fecha en que se registra ? En caso sea correcto no necesitas un campo, solo lo obtienes usando el método Now() de la clase DateTime, pero si deseas que el usuario lo seleccione sería recomendable usar un DateTimePicker.

    Dim query = "insert into miTabla (dni, name, fecha) values (?,?,?)"
    
    Dim cmd As New OleDbCommand(query, con)
    cmd.Parameters.AddWithValue("@dni", txtDni.Text)
    cmd.Parameters.AddWithValue("@name", txtNombre.Text)
    cmd.Parameters.AddWithValue("@fecha", DateTime.Now)
    'Si es de un DateTimePicker
    'cmd.Parameters.AddWithValue("@fecha", DateTimePicker1.Value)

    Por lo que ya no sería necesario crear un control  TextBox para el ingreso de ID y la Fecha (Si la tomas del sistema).

    Y claro está, que si en algún momento (ya sea para reportes u otras cosas) necesitas mostrar el id con un formato en particular utilizarías el método String.Format(...).

    'Obtienes el id de un trabajador
    Dim id As Integer = 152
    
    Dim codigo = String.Format("TR{0:000000}", id)
    'Resultado : TR000152

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    viernes, 17 de marzo de 2017 19:13
  • Estimado, gracias por tu ayuda, lo resolvi agregando una columna id autonumerica y luego la columna COD_TRAB y use una funcion que toma el numero mayor del campo ID le da el formato TR0000# y lo ingresa en el campo COD_TRAB.

    Using cnn As New OleDb.OleDbConnection("Provider=microsoft.ace.oledb.12.0;data Source=empresa.accdb")
                Try
                    Dim sql As String =
                       "SELECT MAX(id) FROM trabajadores"
                    Dim cmd As New OleDb.OleDbCommand(sql, cnn)
                    cnn.Open()
                    Dim value As Object = cmd.ExecuteScalar
                    Return CInt(value) + 1
                Catch ex As Exception
                    Throw
                End Try
            End Using
        End Function

    y luego llamo a la funcion en el form2_load

    Try
                Dim CodProveedor As Integer = GetNextAutoNumeric()
    
                Dim codigo = String.Format("TR{0:}", CodProveedor)
    
    
                TextBox1.Text = codigo
    
            Catch ex As Exception
                MessageBox.Show(ex.Message)
    
            End Try

    me resulto mejor de lo que esperaba, ojala no me de problemas. Igualmente si puedes mejorar mi codigo seria genial.

    Gracias

    viernes, 17 de marzo de 2017 22:40
  • A primera vista lo que veo es que tu código no hace nada :-( , la lógica seria la que te pase anteriormente, pero la linea:

    trab_a = ultimoTRAB()

    llama a una función que se llama ultimoTRAB(), esta función hay que desarrollarla pues las lineas

     cnn.Open()
                trab_a = "SELECT MAX(COD_TRAB) FROM ordenes"

    no hacen nadaLa función mas o menos seria así:

               

        Public Function ultimoTRAB() As Int16
    Dim con As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Module1.archivo & _
    ";Persist Security Info=False")   'conecta con la base de datos
    Dim cmd As Data.OleDb.OleDbCommand
    Dim cmd As New OleDbCommand

            mySQL = "SELECT MAX(COD_TRAB) as uTrab FROM ordenes"

            con.Open()
            Try
                cmd = New OleDbCommand(mySQL, con)
                ultimoTRAB = cmd.ExecuteScalar
            Catch ex As Exception
                ultimoTRAB = 0
            End Try
            con.Close()

            If ultimoTRAB = Nothing Then cita_sigue = 0

        End Function

    y todavia, para que esta funcione requieres al inicio del modulo o la clase poner:

    Imports System.Data
    Imports System.Data.OleDb
    Imports System.Data.DataTable
    Imports System.Data.DataRow

    Espero te de luz y la motivación a seguir estudiando el tema.


    sábado, 18 de marzo de 2017 0:30
  • Williams, te explico un poco.

    el are que maneja mi equipo es de tecnicos en mantenimiento, cuando un tecnico va a la casa de un cliente a revisar sus instalaciones electricas se identifica con su fotocheck el cual indica su numero de Trabajador (COD_TRAB) con ese codigo el cliente puede poner una queja o un aobservacion al trabajador.

    Ahora si me preguntas por que la empresa lo maneja asi.... me imagino que debe ser confidencialidad de datos... digo me imagino por que no se me ocurre otra cosa ademas no creo que es bueno ir dando a todo mundo tu DNI.

    el COD_TRAB es con que se le identifica al trabajador dentro de la empresa. el area en la que estoy entre muchas funciones le asigna ese codigo a un nuevo trabajador, lo hacemos en un excel compartido y lo llevamos bien esmas en el excel no tenemos ningún problema, pero como toda persona busco aportar algo, y por eso me entere de VB y desarrolle la aplicación con la ayuda de este foro incluyendo la tuya.

    bueno ese el motivo del COD_TRAB. 

    Por la firma que escribes imagino perteneces al área de recursos humanos de tu empresa, ¿verdad?, en ese contexto, ¿crees adecuado codificar a un empleado con un número secuencial que no guarda en sí significado alguno?. El objetivo de la codificación es contener datos -a veces extensos- que tengan sentido de representatividad y asociación en pocos dígitos o caracteres (como el número de DNI, el número de una cuenta bancaria, etc.), el código TR0002 no tiene representatividad ni asociación, de hecho por eso me referí en mi aporte anterior como una codificación sin sentido.

    Te recomiendo tener una nomenclatura para codificar y que sea parte del manual de procedimientos del área para la captación del personal. Por ejemplo:

    Código: MOCE1004TC

    Se trata del señor Molina Cervantes asignado a la zona cuyo código postal es 1004 y que es especialista en el área de telefonía y cable, mayor sentido y representatividad, ¿verdad?


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    sábado, 18 de marzo de 2017 15:27
  • si claro, fue lo primero que intente cuando empece con esto del numero correlativo, pero me di cuenta que podía existir un sr. Montes Cervera que vive en la misma zona de CP y que también es especialista en TC. también pensé que tal vez la coincidencia no se de nunca.... pero si se da .....que se hace en ese momento.

    igualmente con todas las ideas que me han dado en este tema, tengo para estudiar varias opciones para proponerlas y que se puedan adaptar a la realidad de la empresa.

    Gracias por la ayuda, la tendre en cuenta y la evaluare para intentar aplicarla.

    atte.

    lunes, 20 de marzo de 2017 16:49
  • Gracias por el apoyo, el código ahora si me funciona, pero a mi criterio y ojo que no soy programador, me parece que hace lo mismo que el código de Joel, solo que un poco mas complicado para alguien que no sabe mucho del tema de programador.

    Igualmente estudiare el tema mas afondo para entender tu codificación.

    Gracias por tu ayuda.

    lunes, 20 de marzo de 2017 16:54
  • Muy buena opción... Gracias!!
    lunes, 20 de marzo de 2017 16:58
  • si claro, fue lo primero que intente cuando empece con esto del numero correlativo, pero me di cuenta que podía existir un sr. Montes Cervera que vive en la misma zona de CP y que también es especialista en TC. también pensé que tal vez la coincidencia no se de nunca.... pero si se da .....que se hace en ese momento.

    igualmente con todas las ideas que me han dado en este tema, tengo para estudiar varias opciones para proponerlas y que se puedan adaptar a la realidad de la empresa.

    Gracias por la ayuda, la tendre en cuenta y la evaluare para intentar aplicarla.

    atte.

    El código de empleado propuesto es sólo para entender la diferencia entre un valor mnemotécnico versus un número sin significado aparente, define una convención de código según el escenario de la empresa, por ejemplo, ¿conoces lo que representa cada dígito de un número de identificación DNI? quizá puede valerte como idea para definir tu propio código QUÉ SIGNIFICAN LOS NÚMEROS DEL DNI


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    lunes, 20 de marzo de 2017 18:44