Ayuda con autogenarar código en visual basic 2008

Buenas experto la idea es autogenerar un código (100220110001) que es la fecha 10022011 más un correlativo de 4 dígitos (0001)
Por ejemplo
fecha 10/02/2011
Registro 1 (100220110001)
Registro 2 (100220110002)
...
fecha 11/02/2011
Registro 1 (110220110001)
Registro 2 (110220110002)
haci quiero el formato del código pero hasta aquí llegue por favor ayudame
el problema esta con el primer registro del día ya que cuando hago la consulta no encuentra ningún registro y me sale error y no se como depurarlo
mando el código en vb 2008 con access 2007 gracias
Dim rs As ADODB.Recordset
        Dim maxcodigo As String
        Dim y, mm, m, d As String
        Dim cadena, aumenta As String
        d = dtp1.Value.Date.ToString("dd")
        mm = dtp1.Value.Date.Month.ToString
        If Len(mm) = 1 Then
            m = 0 & dtp1.Value.Date.Month.ToString
        Else
            m = dtp1.Value.Date.Month.ToString
        End If
        y = dtp1.Value.Date.ToString("yyyy")
        cadena = d & m & y
        sql = "SELECT MAX(idpedido)FROM pedidos where idpedido like '%" & cadena & "%'"
        rs = conexion.Execute(sql)
'aqui me manda error cuando no encuentra ningun registro
        maxcodigo = rs.Fields(0).Value
'aqui aumento
        aumenta = Mid(maxcodigo, 9) + 1
'aqui supuestamente es cuando no encuentra registro aumenta en uno
        'txtnumcuota.Text = cadena & "0001"
'aqui encuentra registro y lo suma 1
        txtnumcuota.Text = cadena & "000" & aumenta

1 Respuesta

Respuesta
1
Te coloco el código que he probado y me funciona.
Adicionalmente te doy algunos consejos que te pueden ahorrar problemas futuros con algunas declaraciiones de variables.
En VBA la declaración seguida de comas como la has hecho, sólo declara el tipo a la variable final de la seguidilla, todas las anteriores siguen siendo del tipo Variant.
Para ello declara las variables separadas (individualmente) o puedes hacer con las comas, pero a cada una le tienes que definir el tipo. En el código que te copio lo tienes de las dos formas, esto es especialmente delicado cuando las variables son de fecha.
Dim rs As Recordset
Dim MIBASE As Database
Dim maxcodigo As String
Dim y As String, mm As String, d As String
Dim cadena As String, cadenaB As String
Dim aumenta As String
        d = Day(dtp1)
        If d < 10 Then d = "0" & d
        mm = Month(dtp1)
        If mm < 10 Then mm = "0" & mm
        y = Year(dtp1)
        cadena = d & mm & y
        cadenaB = cadena & "*"
        Set MIBASE = CurrentDb
        Set rs = MIBASE.OpenRecordset("SELECT MAX(IDPEDIDO) AS MAXIMO FROM pedidos where idpedido like '" & cadenaB & "'")
        aumenta = Mid(rs!MAXIMO, 9) + 1
        txtnumcuota = cadena & "000" & aumenta
La sentencia SQL si no la puedes escribir en una´sola línea recuerda colocarle el guión bajo al final de la primera donde la dividas dejando un espacio antes.
Con este código me salido como yo quería gracias a tu idea pero en la salida del resultado en t1 no me convence
Dim y, mm, m, d As String
        Dim cadena, aumenta As String
        d = dtp1.Value.Date.ToString("dd")
        mm = dtp1.Value.Date.Month.ToString
        If Len(mm) = 1 Then
            m = 0 & dtp1.Value.Date.Month.ToString
        Else
            m = dtp1.Value.Date.Month.ToString
        End If
        y = dtp1.Value.Date.ToString("yyyy")
        cadena = d & m & y
        Dim fila As Integer = 0
        Dim ds As New DataSet
        Dim cnn As New OleDb.OleDbConnection("provider = Microsoft.jet.oledb.4.0;Data source = C:\Users\marco\NARTURAL\connecion\bin\Debug\NATURAL.mdb;user id = admin;password =;")
        Dim consulta As New OleDb.OleDbDataAdapter("SELECT MAX(idpedido) as [max]  FROM pedidos where idpedido like '%" & cadena & "%'", cnn)
        Dim maxcodigo As New DataTable()
        consulta.Fill(maxcodigo)
        Dim valor As String
        valor = Convert.ToString(maxcodigo.Rows(0)("max"))
//// aqui en la salida del t1 cuando lo encuentra aumenta 1 perooooooooo
/////por ejemplo si esta el registro 110220110009 (12 caracteres) con este
//////procedimiento devolveria 1102201100010 (13 caracteres) y como tu sabes q esta //////es la llave primaria va a mandar error
////// ¿Existe alguna manera de corregirlo yo lo puedo hacer un if y a la fuerza arreglarlo como lo hice más arriba con el mes (me salia un dígito y yo quería que me muestre los los dígitos) esa es mi pregunta? (Bueno si la hay mi profesor lo hizo pero no me acuerdo ayudame por favor )
        If valor <> "" Then
            aumenta = Mid(valor, 9) + 1
            t1.Text = cadena & "000" & aumenta
        Else
            t1.Text = cadena & "0001"
        End If
        Me.DataGridView1.DataSource = maxcodigo
Se me ocurren muchas formas de hacerlo, pero te digo la que yo escogería:
T1=cadena & left("000", 4-len(aumenta)) & aumenta
con esto en la medida que la cantidad la cantidad de cifras del valor a incrementar va aumentando de igual manera va disminuyendo la cantidad de ceros a la izquierda.
Excelente respuesta
Por favor ayudame con un filtro entre rango de fechas e intentado con formato pero igual no me sale la consulta la hago bien el problema es que el mes se cambia con el día y no me sale el filtro existiendo registro por allí me dijeron que la haga con paremetros pero no se como incluirlo a mi consulta gracias
private sub btnfiltrar_click(byval sender as system.object, byval e as system.eventargs) handles btnfiltrar.click
dim conpedidos as new oledb.oledbdataadapter("select pedidos.fechapedido as [fecha pedido], pedidos.estado as [estado pedido], pedidos.idpedido as [numero pedido],pedidos.numficha as [numero ficha], clientes.idcliente as [codigo cliente], clientes.apecliente as [apellido cliente], clientes.nomcliente as [nombre cliente], clientes.dni as [dni], clientes.telfcasa as [telefono casa], clientes.teltrabajo as [telefono trabajo], clientes.celular as [celular], clientes.direccion as [direccion], distritos.nomdistrito as [distrito], empleados.idempleado as [codigo empleado], empleados.apeempleado as [apellido empleado], empleados.nomempleado as [nombre empleado],pedidos.totalinicial as [total inicial],pedidos.totalpendiente as [total pendiente],pedidos.totalcobrado as [total cobrado] from distritos, clientes, empleados, pedidos where clientes.idcliente=pedidos.idcliente and empleados.idempleado=pedidos.idempleado and distritos.iddistrito=clientes.iddistrito and distritos.iddistrito=empleados.iddistrito and pedidos.estado like '%" & cmbest.text & "%' and pedidos.idpedido like '%" & txtnumpedido.text & "%' and pedidos.numficha like '%" & txtnumficha.text & "%' and  clientes.apecliente like '%" & txtapecli.text & "%' and  clientes.nomcliente like '%" & txtnomcli.text & "%' and empleados.apeempleado like '%" & txtapevend.text & "%' and empleados.nomempleado like '%" & txtnomvend.text & "%'", cnn)
dim dsped as new dataset
conpedidos.fill(dsped)
dtvpedidos.datasource = dsped.tables(0)
end sub
No veo donde haces la consulta por rango de fechas en la que me muestras.
En SQL al hacer la consulta hay que utilizar efectivamente el formato mm/dd/yyyy, para que lea correctamente las fechas de la consulta.
Para los campos de fecha se utiliza el marcador # de la misma forma que se utiliza la comilla simple para el texto.
Si no te sale con lo que te he dicho me dices cual es la consulta que quieres hacer.
Gracias por responder rapido solamente te mande la consulta para que veas como hacia la consulta el filtro de rango le quite
Un favor en esa consulta podrías hacerlo como me lo indicas por favor como t digo lo hice de varias maneras con formato y todo pero no me filtra o tal vez el formato que utilizo no lo lee por favor
Gracias
Te transcribo como ejemplo la parte de la sentencia SQL de una consulta que le rerspondí a otro usuario con la misma duda. La consulta es más sencialla que la tuya, pero la esencia es la misma.
("SELECT * FROM Entradas WHERE Entradas.Fecha BETWEEN #" & Format(Fecha1,"mm/dd/yy")  & "# AND #" & Format(Fecha2,"mm/dd/yy") & "#")

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas