none
unir parametros en un textbox

    Pregunta

  • Buenas dias, tengo una duda con respecto a crear un "código"(no me refiero a código de programación) que diferencie un proyecto de otro. Mi idea es tomar las primera 3 letras de un nombre (textbox), el año (datetimepicker) y un numero que vaya incrementando(1, 2, 3) cada ves que el nombre se repita.

    ejemplo

    marcelo 27/12/2016 =  mar201601

    Juan 28/12/2016 = jua201601

    marcelo 29/12/2016  = mar201602

    la verdad no tengo idea de como podria hacerlo una vez mas gracias por su paciencia.

    martes, 27 de diciembre de 2016 14:29

Respuestas

  • adriian.91,

    Puedes escribir una consulta de selección que retorne la secuencia siguiente respecto a un código cualquiera, la consulta buscará por los 7 primeros caracteres y retornará la secuencia siguiente o 1 en caso no exista una codificación igual, algo como:

    Dim Codigo As String = String.Concat(cbx_Cliente.Text.Substring(0, 3),
    		Dtp_FechaCotizacion.Value.Year)
    
    Try
    	Using cn As New SqlConnection("Cadena de conexión")
    		Dim ConsultaSQL As String = "SELECT ISNULL(MAX(CONVERT(int, RIGHT(Codigo, 2))), 0) + 1 
    			FROM NombreTabla WHERE SUBSTRING(Codigo, 1, 7) = @Codigo"
    		Dim cmd As New SqlCommand(ConsultaSQL, cn)
    
    		cmd.Parameters.AddWithValue("@Codigo", Codigo)
    
    		cn.Open()
    
    		Txt_Cotizacion.Text = String.Format("{0}{1:00}", Codigo, cmd.ExecuteScalar())
    	End Using
    Catch ex As Exception
    	MessageBox.Show(ex.Message)
    End Try


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta adriian.91 martes, 27 de diciembre de 2016 17:25
    martes, 27 de diciembre de 2016 16:27

Todas las respuestas

  • Hola adriian.91

    Podrías intentar con split sacar las tres primeras letras del textbox que contiene tu nombre, obtener sólo el año del datetimepicker es muy sencillo y el número de incremento igual, tendrías que tenerlo almacenado en algún lugar e ir incrementando de uno en uno:

    Dim nombre As String = TxtBoxNombre.Text
    Dim numero as Integer = 1 'Est número tendrás que almacenarlo en alguna parte  para irle sumando uno y crear el incremento deseado
    
    Dim anio as Integer = DatetimePicker1.Value.Year
    
    nombre = nombre.Split("")(2)
    numero += 1 'Incrementa de uno en uno
    Dim codigo As String = nombre & anio.ToString() & numero.toString()

    Y tendrías un código, espero hayas entendido la idea y que te sirva.

    saludos

     

    Javier

    martes, 27 de diciembre de 2016 15:00
  • Javier entiendo el codigo gracias por la ayuda, pero me aparce el siguiente error: 

    Índice fuera de los límites de la matriz.

    Disculpa pero el nombre lo saco de un combobox, no de un textbox puede ser eso? aqui te dejo el codigo y donde marca el error

    Dim nombre As String
    Dim nombre_corto As String
    Dim numero As Integer = 1
    Dim año As Integer
    Dim codigo As String
    
    
            nombre = cbx_Cliente.Text
            nombre_corto = nombre.Split(CChar(""))(2) '--> aqui me muestra el error
            año = Dtp_FechaCotizacion.Value.Year
            numero += 1 
            codigo = nombre_corto & año.ToString() & numero.ToString()
    
            Txt_Cotizacion.Text = codigo

    martes, 27 de diciembre de 2016 15:31
  • adriian.91,

    No deberías tener problemas en crear el código inicial, es concatenar valores revisando previamente la existencia del código, sin embargo no mencionas en que medio almacenas el código para obtener -en caso exista- la secuencia siguiente, a ver si nos das mayores detalles al respecto.

    Txt_Cotizacion.Text = String.Concat(cbx_Cliente.Text.Substring(0, 3),
                    Dtp_FechaCotizacion.Value.Year, "01")



    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    martes, 27 de diciembre de 2016 15:41
  • Hola Williams el codigo lo almacenare en sql server, el parametro nombre lo obtengo de sql server tambien atraves de un procedimiento almacenado.  Veras el nombre no se repite en la tabla puesto que son nombres de empresa. Por lo que el codigo es para tener un registro de trabajos que se le hacen a cada empresa por año. Entonces cada ves que se haga un nuevo trabajo a una empresa el codigo deberia ir cambiando dependiendo del numero de trabajo que se este ingresando. Espero haberme explicado.
    martes, 27 de diciembre de 2016 15:51
  • adriian.91,

    Puedes escribir una consulta de selección que retorne la secuencia siguiente respecto a un código cualquiera, la consulta buscará por los 7 primeros caracteres y retornará la secuencia siguiente o 1 en caso no exista una codificación igual, algo como:

    Dim Codigo As String = String.Concat(cbx_Cliente.Text.Substring(0, 3),
    		Dtp_FechaCotizacion.Value.Year)
    
    Try
    	Using cn As New SqlConnection("Cadena de conexión")
    		Dim ConsultaSQL As String = "SELECT ISNULL(MAX(CONVERT(int, RIGHT(Codigo, 2))), 0) + 1 
    			FROM NombreTabla WHERE SUBSTRING(Codigo, 1, 7) = @Codigo"
    		Dim cmd As New SqlCommand(ConsultaSQL, cn)
    
    		cmd.Parameters.AddWithValue("@Codigo", Codigo)
    
    		cn.Open()
    
    		Txt_Cotizacion.Text = String.Format("{0}{1:00}", Codigo, cmd.ExecuteScalar())
    	End Using
    Catch ex As Exception
    	MessageBox.Show(ex.Message)
    End Try


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta adriian.91 martes, 27 de diciembre de 2016 17:25
    martes, 27 de diciembre de 2016 16:27
  • Grasias Williams el codigo funciona perfectamente. 
    martes, 27 de diciembre de 2016 17:27