Campo autonumérico
En una tabla tengo un camo autonumérico que proporciona un consecutivo a mis datos, luego esos datos son anexados a otra tabla necesito que ese campo vuelva a empezar desde cero cuando pegue nuevamente más datos que hago
1 respuesta
Respuesta de asturcon3
1
1
asturcon3, Ingeniero en Informatica (5 años) Ingeniero Técnico en...
Sólo hay una forma de poner a cero un autonumérico, y es borrar todos los datos de la tabla que lo contiene y compactar la base de datos. Fin.
Ahora bien, posiblemente no lo necesitas. No me queda muy claro, pero si estás copiando datos con copiar/pegar datos anexados de una tabla a otra, lo que puedes hacer es ocultar la columna clave de ambas tablas antes de copiar/pegar, y así el access crea el autonumérico necesario en la tabla destino en lugar de tomarlo de la tabla origen.
(Para ocultar columna, click derecho sobre el encabezado)
Si en lugar de copiar/pegar utilizas una consulta de datos anexados, el principio es el mismo. No le pongas que se copie el campo clave, deja que access calcule el que necesita.
Bueno, si hay suertecilla habré acertado...
Chao
Ahora bien, posiblemente no lo necesitas. No me queda muy claro, pero si estás copiando datos con copiar/pegar datos anexados de una tabla a otra, lo que puedes hacer es ocultar la columna clave de ambas tablas antes de copiar/pegar, y así el access crea el autonumérico necesario en la tabla destino en lugar de tomarlo de la tabla origen.
(Para ocultar columna, click derecho sobre el encabezado)
Si en lugar de copiar/pegar utilizas una consulta de datos anexados, el principio es el mismo. No le pongas que se copie el campo clave, deja que access calcule el que necesita.
Bueno, si hay suertecilla habré acertado...
Chao
discilpa pero talvez no me hize enterder del todo, el campo autonumerico de la primera tabla me asigna un consecutivo por ejemplo de 1 a 60 que me es necesario para llevar mi control cuando pego estos datos en la tabla general este campo debe volver a empezar en cero para asignarme nuevamente un consecutivo desde 1, lo que he logrado hasta el momento es que despues de pegar los datos en la tabla principal, con una consulta de sql borro el campo autonumerico y nuevamente lo creo pero como oculto esta columna, ya que si dejo esta columna visible no puedo pegar los datos desde el archivo de excel. gracias
Lo que te decía entre paréntesis antes, cuando tienes la primera tabla abierta, haces click derecho sobre el encabezado de la primera columna y seleccionas 'ocultar'. Así, sigue existiendo pero no se ve.
De esa forma puedes pegar datos desde otro sitio (el excel, en tu caso) y access va asignando los autonuméricos. Después de pegar, puedes volver a ver esa columna desde el menú "formato/mostrar columnas"
De esa forma puedes pegar datos desde otro sitio (el excel, en tu caso) y access va asignando los autonuméricos. Después de pegar, puedes volver a ver esa columna desde el menú "formato/mostrar columnas"
Oye tu respuesta es muy buena pero sucede que necesitaría que después de crear la columna nuevamente se ejecutar una macro que sola hiciera ese procedimiento no puedo estar dando clic para ocultar, necesitaría hacer esto por el código para ejecujtarlo siempre
Me parece que tu y yo no nos entendemos...
Bueno, versión 3.0, vamos a ver si esto se puede automatizar un poco. Supongamos que tienes una tabla origen llamada A, tu tabla auxiliar llamada ATMP y el campo autonumérico es ID.
Supongamos también que te haces un nuevo formulario, le pones un botón, y en el evento 'al hacer click' le pones el siguiente código
DoCmd. Close acTable, "atmp"
CurrentDb. Execute "drop table atmp"
CurrentDb.Execute "select * into atmp from a where false"
DoCmd. OpenTable "atmp",, acEdit
DoCmd. SelectObject acTable, "atmp"
SendKeys "%FM {ENTER}"
SendKeys "%EA{ENTER}"
SendKeys "%FM {ENTER}"
La idea es:
- Se cierra la tabla, por si es que está abierta
- Se elimina la tabla temporal
- Se crea nueva a partir de la definitiva
- Se abre
- Se selecciona como objeto activo
- Se manda el comando de ocultar la primera columna
- Se ejecutar Editar/pegar datos
- Se vuelve a mostrar la columna.
Total, haces COPIAR en el Excel, te abres el formulario y le das al botón. Resultado: La tabla queda abierta mostrando el campo id.
No, si al final acertaré...
Bueno, versión 3.0, vamos a ver si esto se puede automatizar un poco. Supongamos que tienes una tabla origen llamada A, tu tabla auxiliar llamada ATMP y el campo autonumérico es ID.
Supongamos también que te haces un nuevo formulario, le pones un botón, y en el evento 'al hacer click' le pones el siguiente código
DoCmd. Close acTable, "atmp"
CurrentDb. Execute "drop table atmp"
CurrentDb.Execute "select * into atmp from a where false"
DoCmd. OpenTable "atmp",, acEdit
DoCmd. SelectObject acTable, "atmp"
SendKeys "%FM {ENTER}"
SendKeys "%EA{ENTER}"
SendKeys "%FM {ENTER}"
La idea es:
- Se cierra la tabla, por si es que está abierta
- Se elimina la tabla temporal
- Se crea nueva a partir de la definitiva
- Se abre
- Se selecciona como objeto activo
- Se manda el comando de ocultar la primera columna
- Se ejecutar Editar/pegar datos
- Se vuelve a mostrar la columna.
Total, haces COPIAR en el Excel, te abres el formulario y le das al botón. Resultado: La tabla queda abierta mostrando el campo id.
No, si al final acertaré...
Créate un nuevo módulo, comprueba que tienes activa en el menu ver/Referencias la de Microsoft DAO 3.6 Object Library (u otra versión) y pega en el módulo lo siguiente
Function nuevoCampo(tabla$, pos%, nombre$, tipo As Long, Optional tam As Long)
Dim db As Database, fld As Field, tdf As TableDef, i%
Set db = CurrentDb
Set tdf = db.TableDefs(tabla)
For i = 0 To tdf.Fields.Count - 1
If tdf.Fields(i).OrdinalPosition >= pos Then
tdf.Fields(i).OrdinalPosition = tdf.Fields(i).OrdinalPosition + 2
End If
Next
tdf.Fields.Append tdf.CreateField(nombre, tipo, tam)
tdf.Fields.Refresh
tdf.Fields(nombre).OrdinalPosition = pos
End Function
Esta función es para crear un nuevo campo en una posición cualquiera de una tabla que se le pase. Supongo que te resultará bastante obvia una vez que la tienes delante. Lo único es que tienes que saber los tipos de datos, están en una de las páginas de la ayuda (en la de createfield, saltando a tipo) pero sólo tienes la ayuda de vba si lo has especificado al instalar. Por ejemplo, para un entero hay que pasar dbInteger y el campo de tamaño es indiferente. Para un string, dbstring y el campo del tamaño da el número de caracteres.
Ah, y pues va desde 0 (el primero)
En cuanto a quitar un campo, es más fácil, lo puedes hacer con
CurrentDb. TableDefs(tabla). Fields.Delete nombre
indicando tabla y nombre de campo
Function nuevoCampo(tabla$, pos%, nombre$, tipo As Long, Optional tam As Long)
Dim db As Database, fld As Field, tdf As TableDef, i%
Set db = CurrentDb
Set tdf = db.TableDefs(tabla)
For i = 0 To tdf.Fields.Count - 1
If tdf.Fields(i).OrdinalPosition >= pos Then
tdf.Fields(i).OrdinalPosition = tdf.Fields(i).OrdinalPosition + 2
End If
Next
tdf.Fields.Append tdf.CreateField(nombre, tipo, tam)
tdf.Fields.Refresh
tdf.Fields(nombre).OrdinalPosition = pos
End Function
Esta función es para crear un nuevo campo en una posición cualquiera de una tabla que se le pase. Supongo que te resultará bastante obvia una vez que la tienes delante. Lo único es que tienes que saber los tipos de datos, están en una de las páginas de la ayuda (en la de createfield, saltando a tipo) pero sólo tienes la ayuda de vba si lo has especificado al instalar. Por ejemplo, para un entero hay que pasar dbInteger y el campo de tamaño es indiferente. Para un string, dbstring y el campo del tamaño da el número de caracteres.
Ah, y pues va desde 0 (el primero)
En cuanto a quitar un campo, es más fácil, lo puedes hacer con
CurrentDb. TableDefs(tabla). Fields.Delete nombre
indicando tabla y nombre de campo
No, pero parecido. Puedes utilizar %FM{DOWN 43} para simular que se ha pulsado la flecha abajo 43 veces, lo que te deja en la columna 44.
Ojito con el espacio en blanco a continuación, que simula la barra espaciadora y es el que marca o desmarca el campo.
Ojito con el espacio en blanco a continuación, que simula la barra espaciadora y es el que marca o desmarca el campo.
Oye era exactamente lo que necesitaba tiene grandes conocimientos perdona que te pregunte de nuevo pero quiero también a través del código eliminar solo la primera colmuna y después crear una columna nueva al principio de la tabla de un tipo determinadom de datos me puedes ayudar es lo ultimo gracia
Tus respuestas fueron de mevua ayuda se nota que tiene mucha experiencia gracias una ultima cosa tu me enviaste el comando %FM para ocultar la primera fila, sabes uno igual con el que pueda especificar el numero de la columna a ocultar
Vale, respuesta a la carta, pero francamente, si lo querías con este comando, el ejemplo lo tienes en la propia ayuda del access.
Y dice así:
Dim dbs As Object
Set dbs = CurrentDb
ShowColumn dbs.TableDefs!Productos.Fields!IdProducto, False
Sub ShowColumn(fldObject As Variant, entShow As Integer)
' Establecer la propiedad ColumnHidden.
SetFieldProperty fldObject, "ColumnHidden", dbLong, Not entShow
End Sub
Sub SetFieldProperty(fldField As Variant, cadPropertyName As String, _
entPropertyType As Integer, varPropertyValue As Variant)
' Establecer la propiedad del campo sin producir un error irrecuperable en tiempo de ejecución.
Const conErrPropertyNotFound = 3270
Dim prpProperty As Variant
On Error Resume Next Next ' No capturar errores.
fldField.Properties(cadPropertyName) = varPropertyValue
If Err <> 0 Then ' Error al establecer el valor.
If Err <> conErrPropertyNotFound Then
On Error GoTo 0
MsgBox " No se puede establecer la propiedad '" & cadPropertyName _
& "' en el campo '" & fldField.name & "'", 48, "SetFieldProperty"
Else
On Error GoTo 0
Set prpProperty = fldField.CreateProperty(cadPropertyName, _
entPropertyType, varPropertyValue)
fldField.Properties.Append prpProperty
End If
End If
End Sub
Colocas todo menos las tres primeras líneas en un módulo, esas tres lineas son las que tienes que ejecutar cuando quieras mostrar u ocultar una columna determinada.
Ah! Si lo anterior te ocultaba la primera columna debe ser porque tenías un espacio en blanco extra entre el %FM y el {DOWN. El espacio tiene que estar DETRÁS del {DOWN 43}
"%FM{DOWN 43} "
Y dice así:
Dim dbs As Object
Set dbs = CurrentDb
ShowColumn dbs.TableDefs!Productos.Fields!IdProducto, False
Sub ShowColumn(fldObject As Variant, entShow As Integer)
' Establecer la propiedad ColumnHidden.
SetFieldProperty fldObject, "ColumnHidden", dbLong, Not entShow
End Sub
Sub SetFieldProperty(fldField As Variant, cadPropertyName As String, _
entPropertyType As Integer, varPropertyValue As Variant)
' Establecer la propiedad del campo sin producir un error irrecuperable en tiempo de ejecución.
Const conErrPropertyNotFound = 3270
Dim prpProperty As Variant
On Error Resume Next Next ' No capturar errores.
fldField.Properties(cadPropertyName) = varPropertyValue
If Err <> 0 Then ' Error al establecer el valor.
If Err <> conErrPropertyNotFound Then
On Error GoTo 0
MsgBox " No se puede establecer la propiedad '" & cadPropertyName _
& "' en el campo '" & fldField.name & "'", 48, "SetFieldProperty"
Else
On Error GoTo 0
Set prpProperty = fldField.CreateProperty(cadPropertyName, _
entPropertyType, varPropertyValue)
fldField.Properties.Append prpProperty
End If
End If
End Sub
Colocas todo menos las tres primeras líneas en un módulo, esas tres lineas son las que tienes que ejecutar cuando quieras mostrar u ocultar una columna determinada.
Ah! Si lo anterior te ocultaba la primera columna debe ser porque tenías un espacio en blanco extra entre el %FM y el {DOWN. El espacio tiene que estar DETRÁS del {DOWN 43}
"%FM{DOWN 43} "
- Compartir respuesta
- Anónimo
ahora mismo