Id autonumérico

Hola como estas una vez más molestándote durante el día
jo jo jo, bien mira tengo este código se supone que hace id autoalfanumerico
pero bien antes jalaba ahora ya no, porque cada vez que entra resulta sale el FICOSA0001 y pues no, porque ese ya esta ocupado, como que se necesita entrar y que entre en el FICOSa0010 que se supone es el que sigue
Dim nRegistros As Integer
DoCmd.GoToRecord , , acNewRec
nRegistros = Dcount("[id]", "proyectos", "[id]<>''")
Me.id = "FICOSA" & Format(nRegistros + 1, "0000")
Exit Sub
Dim nRegistros As IntegerDoCmd.GoToRecord , , acNewRecnRegistros = Dcount("[id]", "proyectos", "[id]<>''")Me.id = "FICOSA" & Format(nRegistros + 1, "0000")Exit Sub

2 Respuestas

Respuesta
1
Por si las moscas, quítale el tercer argumento al DCount: se supone que todo registro de la tabla tendrá su ID correspondiente. Aprovecha para manejar el (im)probable nulo, utiliza el DefaulrValue (por si te arrepientes a media inserción) y hazlo en sola dos líneas:
DoCmd. GoToRecord,, acNewRec
Me!id.DefaultValue = Chr(34) & "FICOSA" & Format(Nz(DCount("*", "proyectos"), 0) + 1, "0000") & Chr(34)
Prueba y cuentas.
Xavi
¿Hola cómo estas?
Pues bien te envío los resultados pues, en si, no jalo...
Pero me pasaron este código
Private Sub Form_Load()
Dim nRegistros As Integer
DoCmd.GoToRecord , , acNewRec
nRegistros = DCount("[id]", "proyectos")
Me.id = "FICOSA" & Left("0000", 4 - Len(nRegistros)) & nRegistros
Exit Sub
End Sub
Y si lo hace pero, a de cuenta que si yo tenia el FICOSA0004 ya con datos
este me lo vuelve a poner como disponible para que cargue pero le pongo los datos
y no los guarda, no habrá alguna forma de decirle que no esta disponible (que ya tiene datos)
Pues mi código (a primera vista) debería funcionar...
Hola, muchas gracias eres genial
En esto jo jo jo, si tu código estaba bien
Solo que yo no lo copie bien y por eso no funcionaba.
Pero ya quedo
Muchos besos
Y gracias gracias
Respuesta
1
Antes que nada en la línea del Dcount le puedes quitar la última condición, ya que ese campo nunca estará vacío, y sin esa condición te contará todos los registros.
Puede quedar
nregistros=Dcount("[id]","proyectos")
Por otra parte, aunque no lo he probado, creo que lo que está pasando es que el format no es la mejor opción para cadenas de este tipo.
Si necesitas que siempre la cantidad de dígitos sean 4 completando con ceros a la izquierda, puede hacer una concatenación más o menos así.
Dim nRegistros As Integer
DoCmd.GoToRecord , , acNewRec
nRegistros = Dcount("[id]", "proyectos")
Me.id = "FICOSA" & left("0000", 4-len(nRegistros)) & nRegistros
Exit Sub
Efectivamente cada que carga es uno nuevo lo hace muy bien
pero creea valores repetidos
Private Sub Form_Load()
Dim nRegistros As Integer
DoCmd.GoToRecord , , acNewRec
nRegistros = DCount("[id]", "proyectos")
Me.id = "FICOSA" & Left("0000", 4 - Len(nRegistros)) & nRegistros
Exit Sub
End Sub
Porque ya tenia uno FICOSA0034 y cuando llegue a ese numero me permitió ponerlo :s
pero no guado los cambios
Huuuuyyyyy!
Disculpa, faltón pequeñíiiiisimo detalle... el incremento
Sólo cambia esta línea
Me.id = "FICOSA" & Left("0000", 4 - Len(nRegistros)) & nRegistros +1
¿Hola, cómo estas?, tarde pero bien segura, es que he tenido mucho trabajo últimamente, muchas gracias por tu respuesta oportuna, pero he de decirte que seguimos igual, si lo incrementa, solo que por ejemplo yo ya tenia unos dados de alta y como que por ejemplo va.. 10, 11, 12,13,14... bla bla bla (tengo uno ya llenado es el 34)... al decir 34, entonces entra como si fuera uno nuevo, en lugar de traerme los datos que ya están previamente cargados
pienso como que debería haber un ciclo donde viniera if código esta cargado entonces no hacernuevo y traer los datos algo así bien loco, ¿pero bien si no se puede
lo más factible es borrar todos los registros y generar todos nuevos
verdad?
Gracias
Ady.
Es que esto que me comentas ahora es otra cosa adicional que antes no me habías comentado. Vas por dosis.
No entiendo que quieres decir con "al decir 34". Lo primero es que el campo del contador no debe admitir duplicados (esto lo restringes desde la tabla). Lo segundo es que el control del formulario que lleva este contador, preferiblemente debe estar invisible y si no es posible, debe estar bloqueado. No se debe poder escribir, para evitar modificaciones involuntarias.
Si quieres llamar a un registro ya dado de alta, lo mejor es que tengas un control aparte con un botón "IR A..." (No existe ninguno predeterminado, hay que hacerlo) o un código con un InputBox que te pregunte por el dato cuando quieras ir a un registro.
Yo te escribí aquí el código que me pediste en tu primera pregunta. Aquí te he cambiado el GoToRecord después de crear el código para que lo asigne al control Id del formulario antes de grabarlo (estaba al revés).
Dim nRegistros As Integer
nRegistros = DCount("[id]", "proyectos")
Me.id = "FICOSA" & Left("0000", 4 - Len(nRegistros)) & nRegistros +1
DoCmd.GoToRecord , , acNewRec
Exit Sub
End Sub
Si quieres poner el botón para ir a un registro ya dado de alta el código sería algo así. Supondré algunos nombres:
La tabla y el formulario supondré que se llama PROYECTOS, con un campo Id y un campo REGIS (que es donde está el contador autonumérico). Supondré que en el formulario los nombres de los controles son los mismos que en la tabla. En el ejemplo que te pongo, estoy suponiendo también que quieres buscar un registro por su Id, no por su número de registro.
Dim BBDD As DataBase
Dim TPROYECTOS As RecordSet
Dim VREGISTRO As Integer
Dim VId
Vid=InputBox ("Indique el Id que desea buscar","escriba un número")
If INumeric(Vid) Then
     Vid="FICOSA" & Left("0000",4-Len(VId)) & VId
Else
     MsgBox "El valor introducido no es un número",,"Dato NO VÁLIDO")
    Exit Sub
End If
Set BBDD=CurrentDb
Set TPROYECTOS=BBDD.OpenRecordset("SELECT * FROM PROYECTOS WHERE Id= '" & VId & "'")
If Not TPROYECTOS.EOF Then
     VREGISTRO=TPROYECTOS!REGIS
     Me.Undo
     DoCmd.GoToRecord acDataForm, "PROYECTOS", acGoTo, VREGISTRO
Else
    MsgBox "El código buscado no existe o no está dado de alta",,"Dato inválido"
    Exit Sub
End If
Suerte y saludos.
Si te es posible y necesitas hacer una nueva pregunta, por favor evalúame esta y abre otra, que el puntaje también va por el tiempo para responder, contando desde la primera vez que preguntas hasta que se cierra el tema.
oohh lo siento pero es que no sabia eso de los
tiempos de las preguntas pensé que aquí todo lo que quiera jajaja
bueno esta bien, muy bien
lo que quería de que creara registros ya lo hace
y en cuando a los que ya tengo dados de alta
mejor decidí hacer una consulta y de esa forma abrilos
gracias te agradezco mucho tu tiempo y dedicación
muy buenas respuestas

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas