Auto numérico siempre desde 1 en tabla asociada

Tengo una base de Datos en Access compuesta por una tabla principal (CLIENTES) y una tabla asociada (DOCUMENTOS) . Es de 1 a varios. Necesito que cada vez que inicie un nuevo registro en tabla DOCUMENTOS este auto numérico comience desde siempre desde 1

2 respuestas

Respuesta
2

Alexis, la verdad, no entiendo la pregunta. Si la tabla Clientes con, por ejemplo, Idcliente(autonumérico o numérico) y clave, está relacionado con el IdCliente(numérico) de la tabla Documentos en una relación UNO a VARIOS(un cliente varios documentos)

1º ¿Cómo va a ser el IDcliente de documentos autonumérico?

2º ¿Cómo va a volver a poner 1?. El número que pondrá será el que le asigne la tabla Clientes.

Por otro lado, si te refieres a un campo IdDocumento en la tabla de ese nombre, yo te aconsejaría que no lo pusieras autonumérico( ya que pierdes el control sobre él), sino ponerlo numérico(y si quieres, como clave) y en las propiedades del formulario Documentos, en eventos-Al activar el registro poner simplemente

If me.newrecord then

idDocumento=nz(Dcount("*","documentos"))+1

end if

Es decir, cuando vas a escribir en el formulario, cuenta cuantos registros hay ya en la tabla. Si no hay ninguno, le asigna el 1. Te vas a otro registro y como en la tabla ya hay uno, le asigna el 2

Que borras la tabla, pues se repite el proceso.

Ya lo hice pero me dice que no encuentra el objeto If me. Discúlpame no domini este nivel de programación

Me pillas ocupadísimo. He ido de la sala a la cocina, y de la cocina al dormitorio, pero por más veces que las visito, siguen en el mismo estado que la visita anterior, y así llevo casi cuarenta días. Perdona que te pregunte esto, pero ¿lo has puesto bien?

En vista diseño del formulario verás que en su parte superior izquierda debe haber un cuadradito marcado de negro. Eso quiere decir que está seleccionado "todo" el formulario. En la barra de menus Pulsa Diseño-Hoja de propiedades y te aparecerá esto

Te vas a la solapa Eventos y verás que a la derecha de Al activar el registro hay un botón con tres puntos(...) Si lo pulsas se abrirá una ventana que te preguntara que quieres usar. Elige Generador de código y se abrirá la ventana del editor de VB con

Private Sub....

End Sub

Pues entre ambos sólo tienes que poner lo que te dije antes

De todas formas, como me parece que tienes mi correo, mándame un mensaje y te envío un ejemplo.

espera correo con BD adjunta

Por cierto, mi correo es [email protected]

Lo digo por si el que tuvieras era el antiguo

¡Gracias! he estado trabajando en esta semana en las soluciones que me enviaste y por fin lo he logrado. Gracias por todo y ya sabe A QUEDARSE EN CASA.

Respuesta
1

Hay varias formas, le explico 2:

1- Borrar todos los datos de la tabla DOCUMENOS y Compactar la base de datos

2- Sin necesidad de compactar mediante código VBA:

Copie el siguiente código en un módulo de VBA:

Public Function ReiniciarAutonumerico(strNombreTabla, strNombreCampo, ValorInicial)
' Funcion para reiniciar autonumeric
' Requiere referencia a Microsoft ActiveX Objects 2.5 Library (o superior)
On Error GoTo hay_error
Dim cat As Object
Dim t As Object
Dim col As Object
Dim P As Object
DoCmd.SetWarnings (False)
'Retiro los datos de la tabla
DoCmd.RunSQL "DELETE FROM " & strNombreTabla
Set cat = CreateObject("ADOX.Catalog")
Set cat.ActiveConnection = CurrentProject.Connection
Set t = cat.Tables(strNombreTabla)
Set col = t.Columns(strNombreCampo)
Set P = col.Properties("Seed")
If IsMissing(ValorInicial) Then
P.Value = Nz(DMax(strNombreCampo, strNombreTabla), 1)
Else
P.Value = ValorInicial
End If
Set P = Nothing
Set col = Nothing
Set t = Nothing
Set cat = Nothing
If Err.Number = 0 Then
MsgBox "Contador reniciado satisfactoriamente", vbInformation, "REINICIO CONTADOR"
End If
hay_error_exit:
Exit Function

hay_error:
MsgBox "Ocurrió el error: " & Err.Description, vbCritical, "Error...."
Resume hay_error_exit

End Function

Esta función requiere 3 parámetros:

- Tabla a reiniciar el campo

- Nombre del campo autonumérico

- Valor de inicio del campo (puede iniciar desde otro número no necesariamente 1) si se omite la función asigna 1 (uno)

Ejemplo de llamada:

ReiniciarAutonumerico("Documentos","id", 1)

En mi respuesta asumo que la tabla DOCUMENTOS tiene los siguientes campos:

id                ------>   Autonumérico

IdCliente ------> Entero Largo

Documento -----> Texto

En estas condiciones si vale tener un campo autonumérico y es buena costumbre cuando migre a un sistema más robusto como PostgreSQL será necesario.

Viéndolo desde otro punto de vista si quiere vaciar los registros de la tabla DOCUMENTOS sería conveniente pasar estos registros por ejemplo, a una tabla que lleve el histórico y después vaciar los registros de la tabla documentos. En este caso no hay necesidad de reiniciar el autonumericio ya que le sirve para determinar opcionalmente el número de documentos.

Acá le dejo otra función mucho más completa pero haciendo uso de SQL elaborada por Juan M Afán de Ribera, permite incrementar a partir de un valor y establecer los intervalos, además la tabla puede estar en otra base de datos.

' Código escrito originalmente por Juan M Afán de Ribera.
' Estás autorizado a utilizarlo dentro de una aplicación
' siempre que esta nota de autor permanezca inalterada.
' En el caso de querer publicarlo en una página Web,
' por favor, contactar con el autor en
'
'     [email protected]
'
' Este código se brinda por cortesía de
' Juan M. Afán de Ribera
'
Function ResetNumber( _
                     TableName As String, _
                     FieldName As String, _
                     Optional FirstNum As Long = 1, _
                     Optional Interval As Long = 1, _
                     Optional DBPath As String) As Long
Dim db As Object 'DAO.Database
Dim SQL As String

    SQL = "ALTER TABLE " & TableName _
    & " ALTER COLUMN " & FieldName _
    & " COUNTER(" & FirstNum & ", " & Interval & ")"
    On Error GoTo err_ResetNumber
    If DBPath = "" Then
        Set db = CurrentDb
    Else
        Set db = DBEngine.OpenDatabase(DBPath)
    End If
    db.Execute SQL
    ResetNumber = -1
exit_Function:

    If Not db Is Nothing Then db.Close
    Set db = Nothing
    Exit Function
err_ResetNumber:

    ResetNumber = Err.Number
    Resume exit_Function
End Function

Ejemplos de llamada;

ResetNumber("Documentos","id", 1,1) -------> Inicia a partir de 1 e incrementa de a 1

ResetNumber("Documentos","id", 1,10) -------> Inicia a partir de 1 e incrementa de a 10

ResetNumber("Documentos","id", 15,5) -------> Inicia a partir de 5 e incrementa de a 1

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas