Rellenar nuevo campo de tabla automáticamente
Soy nuevo y he creado una base de datos en la cual la tabla con los campos ID;PK;SOLDADURA (autonumerico;numero;numero).
EL problema es el siguiente, según se van introduciendo datos en el registro, la ID, va incrementando el numero y genera un orden lógico.
Pero el orden de agrupamiento lo genera el campo PORQUE y el campo SOLDADURA
. Me gustaría crear un campo nuevo (ORD) que se autorrellenara con el numero de la posición que generan el orden de los campos PK;SOLDADURA.
EL problema es el siguiente, según se van introduciendo datos en el registro, la ID, va incrementando el numero y genera un orden lógico.
Pero el orden de agrupamiento lo genera el campo PORQUE y el campo SOLDADURA
. Me gustaría crear un campo nuevo (ORD) que se autorrellenara con el numero de la posición que generan el orden de los campos PK;SOLDADURA.
1 respuesta
Respuesta de Neckkito Nck
1
1
Un par de consultas:
1. ¿Podrías poner un ejemplo de cómo quedaría un registro entero una vez rellenados los campos que comentas (incluyendo ORD)?
2. ¿Trabajas directamente sobre la tabla o a través de un formulario?
Espero que me digas cosas, a ver si podemos encontrar alguna solución.
1. ¿Podrías poner un ejemplo de cómo quedaría un registro entero una vez rellenados los campos que comentas (incluyendo ORD)?
2. ¿Trabajas directamente sobre la tabla o a través de un formulario?
Espero que me digas cosas, a ver si podemos encontrar alguna solución.
Gracias por el interés .
Las respuestas serian:
1º El ejemplo seria la introducción de datos de entradas de soldaduras con su correspondiente situación métrica, es decir nos vendría un informe dándonos una información de las unidades soldadas con sus correspondientes datos .
ID seria el autonumérico correspondiente con el orden de entrada de los registros
PORQUE seria el punto kilométrico que sitúa a la soldadura
SOLDADURA seria el orden de la soldadura dentro de ese PORQUE
Id porque soldadura
1 2 L45
2 2 L44
3 2 L46
4 3 L02
5 3 L01
Después de introducir los datos, quisiera que un campo ORD se iría autorrellenando y que fuese colocando sus registros en orden dependiendo de los campos PORQUE y SOLDADURA
Id porque soldadura ord
2 2 L44 1
1 2 L45 2
3 2 L46 3
5 3 L01 4
4 3 L02 5
Si colocase un nuevo registro y los campos PORQUE y Soldadura se ordenaran, el campo ORD se volviera a recalcular
nuevo registro ID 6 PORQUE 2 SOLDADURA 47
Id porque soldadura ord
2 2 L44 1
1 2 L45 2
3 2 L46 3
6 2 L47 4
5 3 L01 5
4 3 L02 6
2ªEsta tabla la trabajo desde un formulario y el interés de tener este campo ORD es para ver en el formulario el campo anterior(relacionado con el orden se PORQUE y SOLDADURA y no con el orden de introducción de los registros).
Espero que te sirva las explicaciones. Y gracias
Las respuestas serian:
1º El ejemplo seria la introducción de datos de entradas de soldaduras con su correspondiente situación métrica, es decir nos vendría un informe dándonos una información de las unidades soldadas con sus correspondientes datos .
ID seria el autonumérico correspondiente con el orden de entrada de los registros
PORQUE seria el punto kilométrico que sitúa a la soldadura
SOLDADURA seria el orden de la soldadura dentro de ese PORQUE
Id porque soldadura
1 2 L45
2 2 L44
3 2 L46
4 3 L02
5 3 L01
Después de introducir los datos, quisiera que un campo ORD se iría autorrellenando y que fuese colocando sus registros en orden dependiendo de los campos PORQUE y SOLDADURA
Id porque soldadura ord
2 2 L44 1
1 2 L45 2
3 2 L46 3
5 3 L01 4
4 3 L02 5
Si colocase un nuevo registro y los campos PORQUE y Soldadura se ordenaran, el campo ORD se volviera a recalcular
nuevo registro ID 6 PORQUE 2 SOLDADURA 47
Id porque soldadura ord
2 2 L44 1
1 2 L45 2
3 2 L46 3
6 2 L47 4
5 3 L01 5
4 3 L02 6
2ªEsta tabla la trabajo desde un formulario y el interés de tener este campo ORD es para ver en el formulario el campo anterior(relacionado con el orden se PORQUE y SOLDADURA y no con el orden de introducción de los registros).
Espero que te sirva las explicaciones. Y gracias
Te explico los pasos que debes seguir para conseguir lo que quieres (si te he entendido bien). Te pido disculpas si te explico alguna cosa que ya conoces, pero no tengo manera de saber si lo sabes o no. También te recomiendo que hagas pruebas en una copia de tu BD por si ya tienes datos introducidos, para evitar que haya algún problema (sólo por precaución), a ver si el resultado es lo que pedías.
Allá vamos:
1. He dado por supuesto que en el formulario de trabajo tienes varios campos. Lo importante es que los campos PORQUE, SOLDADURA y ORD tengan un índice de tabulación correlativo. Eso significa que el comportamiento del teclado debería ser: estamos en PORQUE -> Enter -> pasamos a SOLDADURA -> Enter -> Pasamos a ORD
También te indico que para realizar el proceso es necesario guardar el registro. Eso significa que no podrás utilizar la opción deshacer una vez hayas introducido un valor en SOLDADURA). Por ello te recomiendo que pongas esos campos en último lugar. (Ejemplo: Campo1 -> Campo2 -> Campo n->PORQUE->Soldadura->ORD->Y aquí ya agregarías un nuevo registro). Esto que te comento es simplemente por precaución.
2. Sacas las propiedades del campo SOLDADURA y te vas a la pestaña EVENTOS. En el evento "Después de actualizar" haces click en el espacio en blanco que hay a su derecha, y después click en el botoncillo de puntos suspensivos que te aparece. En la ventana que sale le dices que quieres generar código.
3. Escribes el siguiente código:
---
Private Sub SOLDADURA_AfterUpdate()
'Guardamos el registro
DoCmd. RunCommand acCmdSaveRecord
'Creamos el contador y lo inicializamos
Dim i As Integer
i = 1
'Creamos el recordset y la consulta
Dim dbs As DAO.Database
Dim miRst As DAO.Recordset
Dim miSql As String
miSql = "SELECT Tabla1.PK, Tabla1.SOLDADURA, Tabla1.ORD"
miSql = miSql & " FROM Tabla1"
miSql = miSql & " ORDER BY Tabla1.PK, Tabla1.SOLDADURA"
Set dbs = CurrentDb
Set miRst = dbs.OpenRecordset(miSql, dbOpenDynaset)
'Comenzamos la secuencia de actualización
miRst.MoveFirst
Do Until miRst.EOF
miRst.Edit
miRst.Fields("ORD").Value = i
miRst.Update
i = i + 1
miRst.MoveNext
Loop
'Cerramos y liberamos memoria
miRst.Close
dbs.Close
Set miRst = Nothing
Set dbs = Nothing
End Sub
---
4.- En el código anterior tienes que sustituir la palabra "Tabla1" por el nombre de la tabla que tú utilices en tu BD. Entiendo que PORQUE, SOLDADURA y ORD son los nombres que usas. Si no fueran esos tendrías también que cambiarlos por los tuyos.
Espero que esto fuera lo que pedías. Ya me dirás cosas.
Allá vamos:
1. He dado por supuesto que en el formulario de trabajo tienes varios campos. Lo importante es que los campos PORQUE, SOLDADURA y ORD tengan un índice de tabulación correlativo. Eso significa que el comportamiento del teclado debería ser: estamos en PORQUE -> Enter -> pasamos a SOLDADURA -> Enter -> Pasamos a ORD
También te indico que para realizar el proceso es necesario guardar el registro. Eso significa que no podrás utilizar la opción deshacer una vez hayas introducido un valor en SOLDADURA). Por ello te recomiendo que pongas esos campos en último lugar. (Ejemplo: Campo1 -> Campo2 -> Campo n->PORQUE->Soldadura->ORD->Y aquí ya agregarías un nuevo registro). Esto que te comento es simplemente por precaución.
2. Sacas las propiedades del campo SOLDADURA y te vas a la pestaña EVENTOS. En el evento "Después de actualizar" haces click en el espacio en blanco que hay a su derecha, y después click en el botoncillo de puntos suspensivos que te aparece. En la ventana que sale le dices que quieres generar código.
3. Escribes el siguiente código:
---
Private Sub SOLDADURA_AfterUpdate()
'Guardamos el registro
DoCmd. RunCommand acCmdSaveRecord
'Creamos el contador y lo inicializamos
Dim i As Integer
i = 1
'Creamos el recordset y la consulta
Dim dbs As DAO.Database
Dim miRst As DAO.Recordset
Dim miSql As String
miSql = "SELECT Tabla1.PK, Tabla1.SOLDADURA, Tabla1.ORD"
miSql = miSql & " FROM Tabla1"
miSql = miSql & " ORDER BY Tabla1.PK, Tabla1.SOLDADURA"
Set dbs = CurrentDb
Set miRst = dbs.OpenRecordset(miSql, dbOpenDynaset)
'Comenzamos la secuencia de actualización
miRst.MoveFirst
Do Until miRst.EOF
miRst.Edit
miRst.Fields("ORD").Value = i
miRst.Update
i = i + 1
miRst.MoveNext
Loop
'Cerramos y liberamos memoria
miRst.Close
dbs.Close
Set miRst = Nothing
Set dbs = Nothing
End Sub
---
4.- En el código anterior tienes que sustituir la palabra "Tabla1" por el nombre de la tabla que tú utilices en tu BD. Entiendo que PORQUE, SOLDADURA y ORD son los nombres que usas. Si no fueran esos tendrías también que cambiarlos por los tuyos.
Espero que esto fuera lo que pedías. Ya me dirás cosas.
Hola.
He probado tu código y me da un error.
3075 en tiempo de ejecución. Error de sintexis, falta operador en la expresión consulta LIBRO de TUBOS. PORQUE (LIBRO de TUBOS, es la tabla1).
También se coloca en amarillo
Set miRst = dbs.OpenRecordset(miSql, dbOpenDynaset).
Decirte que el error aparece nada más colocar el dato en el campo soldadura.
Muchas gracias
He probado tu código y me da un error.
3075 en tiempo de ejecución. Error de sintexis, falta operador en la expresión consulta LIBRO de TUBOS. PORQUE (LIBRO de TUBOS, es la tabla1).
También se coloca en amarillo
Set miRst = dbs.OpenRecordset(miSql, dbOpenDynaset).
Decirte que el error aparece nada más colocar el dato en el campo soldadura.
Muchas gracias
Esto es lo que coloque en el código.
SOLDADURA=nºsoldadura
PK=PK
ORD=ORD
Tabla1=LIBRO de SOLDADURA
Private Sub SOLDADURA_AfterUpdate()
'Guardamos el registro
DoCmd.RunCommand acCmdSaveRecord
'Creamos el contador y lo inicializamos
Dim i As Integer
i = 1
'Creamos el recordset y la consulta
Dim dbs As DAO.Database
Dim miRst As DAO.Recordset
Dim miSql As String
miSql = "SELECT LIBRO de TUBOS.PK, LIBRO de TUBOS.nºsoldadura, LIBRO de TUBOS.ORD"
miSql = miSql & " FROM LIBRO de TUBOS"
miSql = miSql & " ORDER BY LIBRO de TUBOS.PK, LIBRO de TUBOS.nºsoldadura"
Set dbs = CurrentDb
Set miRst = dbs.OpenRecordset(miSql, dbOpenDynaset)
'Comenzamos la secuencia de actualización
miRst.MoveFirst
Do Until miRst.EOF
miRst.Edit
miRst.Fields("ORD").Value = i
miRst.Update
i = i + 1
miRst.MoveNext
Loop
'Cerramos y liberamos memoria
miRst.Close
dbs.Close
Set miRst = Nothing
Set dbs = Nothing
End Sub
SOLDADURA=nºsoldadura
PK=PK
ORD=ORD
Tabla1=LIBRO de SOLDADURA
Private Sub SOLDADURA_AfterUpdate()
'Guardamos el registro
DoCmd.RunCommand acCmdSaveRecord
'Creamos el contador y lo inicializamos
Dim i As Integer
i = 1
'Creamos el recordset y la consulta
Dim dbs As DAO.Database
Dim miRst As DAO.Recordset
Dim miSql As String
miSql = "SELECT LIBRO de TUBOS.PK, LIBRO de TUBOS.nºsoldadura, LIBRO de TUBOS.ORD"
miSql = miSql & " FROM LIBRO de TUBOS"
miSql = miSql & " ORDER BY LIBRO de TUBOS.PK, LIBRO de TUBOS.nºsoldadura"
Set dbs = CurrentDb
Set miRst = dbs.OpenRecordset(miSql, dbOpenDynaset)
'Comenzamos la secuencia de actualización
miRst.MoveFirst
Do Until miRst.EOF
miRst.Edit
miRst.Fields("ORD").Value = i
miRst.Update
i = i + 1
miRst.MoveNext
Loop
'Cerramos y liberamos memoria
miRst.Close
dbs.Close
Set miRst = Nothing
Set dbs = Nothing
End Sub
Te explico por qué te da error: nuestro amigo Access se hace "la pincha un lío" (con perdón de la expresión) con los nombres que no están escritos todo junto. Es decir, si el nombre de la tabla fuera "LibroDeTubos" no te hubiera dado ningún error (en teoría), pero como es "LIBRO-espacio-de-espacio-TUBOS" se vuelve un poco "ein?" ;)
Hablando del nombre de la tabla, al principio me pones que el nombre de la tabla es "LIBRO de SOLDADURA", pero después, en miSql, has escrito "LIBRO de TUBOS". He supuesto que el nombre correcto era este último.
Para evitar lo que te comentaba antes basta con poner corchetes al nombre de la tabla. Yo me he creado una BD con una tabla llamada "LIBRO de TUBOS" y con los nombres de campo que tú me indicabas y he testeado el código, y no me ha dado ningún error. Confío en que a ti también te funcione.
Te paso de nuevo el código modificado:
---
Private Sub SOLDADURA_AfterUpdate()
'Guardamos el registro
DoCmd. RunCommand acCmdSaveRecord
'Creamos el contador y lo inicializamos
Dim i As Integer
i = 1
'Creamos el recordset y la consulta
Dim dbs As DAO.Database
Dim miRst As DAO.Recordset
Dim miSql As String
miSql = "SELECT [LIBRO de TUBOS].PK, [LIBRO de TUBOS].nºsoldadura, [LIBRO de TUBOS].ORD"
miSql = miSql & " FROM [LIBRO de TUBOS]"
miSql = miSql & " ORDER BY [LIBRO de TUBOS].PK, [LIBRO de TUBOS].nºsoldadura"
Set dbs = CurrentDb
Set miRst = dbs.OpenRecordset(miSql, dbOpenDynaset)
'Comenzamos la secuencia de actualización
miRst.MoveFirst
Do Until miRst.EOF
miRst.Edit
miRst.Fields("ORD").Value = i
miRst.Update
i = i + 1
miRst.MoveNext
Loop
'Cerramos y liberamos memoria
miRst.Close
dbs.Close
Set miRst = Nothing
Set dbs = Nothing
End Sub
---
De verdad espero que ahora te funcione, y que los resultados sean los que tú esperabas. Ya me dirás cosas.
Hablando del nombre de la tabla, al principio me pones que el nombre de la tabla es "LIBRO de SOLDADURA", pero después, en miSql, has escrito "LIBRO de TUBOS". He supuesto que el nombre correcto era este último.
Para evitar lo que te comentaba antes basta con poner corchetes al nombre de la tabla. Yo me he creado una BD con una tabla llamada "LIBRO de TUBOS" y con los nombres de campo que tú me indicabas y he testeado el código, y no me ha dado ningún error. Confío en que a ti también te funcione.
Te paso de nuevo el código modificado:
---
Private Sub SOLDADURA_AfterUpdate()
'Guardamos el registro
DoCmd. RunCommand acCmdSaveRecord
'Creamos el contador y lo inicializamos
Dim i As Integer
i = 1
'Creamos el recordset y la consulta
Dim dbs As DAO.Database
Dim miRst As DAO.Recordset
Dim miSql As String
miSql = "SELECT [LIBRO de TUBOS].PK, [LIBRO de TUBOS].nºsoldadura, [LIBRO de TUBOS].ORD"
miSql = miSql & " FROM [LIBRO de TUBOS]"
miSql = miSql & " ORDER BY [LIBRO de TUBOS].PK, [LIBRO de TUBOS].nºsoldadura"
Set dbs = CurrentDb
Set miRst = dbs.OpenRecordset(miSql, dbOpenDynaset)
'Comenzamos la secuencia de actualización
miRst.MoveFirst
Do Until miRst.EOF
miRst.Edit
miRst.Fields("ORD").Value = i
miRst.Update
i = i + 1
miRst.MoveNext
Loop
'Cerramos y liberamos memoria
miRst.Close
dbs.Close
Set miRst = Nothing
Set dbs = Nothing
End Sub
---
De verdad espero que ahora te funcione, y que los resultados sean los que tú esperabas. Ya me dirás cosas.
- Compartir respuesta
- Anónimo
ahora mismo