¿Hay problemas con tablas utilizando un autonumber como clave principal en un acceso db ms de back-end?

StackOverflow https://stackoverflow.com/questions/4600658

  •  25-09-2019
  •  | 
  •  

Pregunta

he heredado una base de datos de MS Access en mi oficina que está muy usado por varias personas en la red. Esto causa muchos problemas con las colisiones y las cerraduras de datos. Quiero dividir el PP para que cada usuario tiene emabrgo aplicación front-end propia y mantener los datos básicos sobre el servidor.

Varias de las tablas utilizan un autonumber: secuencia: siempre que rinda clave principal - en la investigación de cómo llevar a cabo la escisión que he encontrado varios mensajes que hacen alusión esto puede causar problemas al distribuir una base de datos pero no han sido capaces encontrar algo sólido. El problema parece ser que un usuario puede iniciar un nuevo registro y recibir la siguiente autonumber pero un segundo usuario puede crear un nuevo registro en un intervalo corto y recibir la misma autonumber lo que resulta en un error?

¿El Jet manejar esto correctamente o hay problemas Autonuméricos con una base de datos / SER FE? Si es un poco probable, pero possile-ocurrencia Estoy seguro de que todavía será mucho mejor que lo que mis usuarios están experimentando actualmente, pero me gustaría saber si hay alguna manera puedo minimizar dichos problemas.

Gracias por su ayuda!

¿Fue útil?

Solución

he tenido la mala suerte de trabajar con muchas bases de datos de acceso en mi juventud. Si bien hay muchos problemas con el acceso, no sé si alguna vez me he encontrado un problema con columnas Autonumérico en un entorno multi-usuario de base de datos dividida. Que debería funcionar bien. Esta es una configuración tan común que no habría todos los mensajes a través de Internet al respecto si fuera un problema.

Otros consejos

Mientras no se va para la replicación de datos (es decir, múltiples bases de datos de abonados, donde los usuarios pueden insertar nuevos registros en las tablas mismas, pero en diferentes lugares), que no tendrá problemas con AutoNumbers como claves primarias.

Si cree que uno de estos días puede que tenga que ir para la replicación (diferentes ubicaciones, una base de datos central), no dude en cambiar a los identificadores únicos (ID de replicación).

Parece que hay cierta confusión de su parte sobre el proceso de división. Al hacerlo, usted termina con múltiples interfaces, pero la administración sigue un único archivo. Por lo tanto, no hay ninguna diferencia en absoluto para las tablas de datos en términos de AutoNumbers de lo que tenía antes de dividir la aplicación.

Yo tenía el mismo problema, sin embargo, hice un workarround para hacer el trabajo de numeración automática de un OnLoad () Evento

Lo que hice es:

  1. I crear un conjunto de registros basado en cada Your_Table el usuario necesita un autonumber
  2. Abrir el conjunto de registros (RST)
  3. Buscar si:
    -Your_Table está vacío, después asigna el valor "1" a Your_field
    -Your_Table es tiene datos sin números que faltan, entonces asigna el valor = "Count de líneas + 1" a Your_field (1,2, ...., n + 1)
    -Your_Table tiene datos faltantes (1,3,4,5,7) [Nota "# 2 y # 7 están desaparecidos]", después utiliza una función para buscar en Your_Table los campos que faltan y asignar a Your_Field el primer valor que falta (# 2 en este ejemplo)


Private Sub Autonumbering(Your_Table As String)
Dim rst As DAO.Recordset
Dim db As Database

On Error GoTo ErrorHandler

Application.Echo False

Set db = CurrentDb
Set rst = db.OpenRecordset(Your_Table, dbOpenDynaset)

                    With rst
                        .AddNew
                            'Your_Table is Empty, **then** assigns the value "1" to Your_field
                            If DMin("[Your_Field]", Your_Table) = 1 Then
                                'Your_Table is has data without missing numbers,**then** assigns the value = "Count of lines + 1" to Your_field (1,2,....,n+1)
                                If DMax("[Your_Field]", Your_Table) = .RecordCount Then
                                    'Assings n+1 value to [Your_Field] records
                                    Value = .RecordCount + 1
                                        ![Your_Field] = Valor
                                Else
                                    'Your_Table has missing data (1,3,4,5,7) [Note "#2 and #7 are missing]", **then** uses a function to search in Your_Table & _
                     the missing fields and assign to Your_Field the first missing value (#2 in this example)
                                    Value = MyFunction$(Your_Table, "Your_Field")
                                        ![Your_Field] = Value
                                End If
                            Else
                            'Agrega el número 1
                            Value = 1
                            ![Your_Field] = Value
                            End If
                        .Update
                        .Bookmark = .LastModified
                        Me.Requery
                        DoCmd.GoToRecord acDataForm, Me.Name, acGoTo, Value
                        .Move 0, .LastModified
                    End With
ErrorCorregido:
Application.Echo True
Exit Sub

ErrorHandler:
MsgBox "An error ocurred, please verify numbering", vbCritical + vbOKOnly
Resume ErrorCorregido

End Sub


Esta es la función que he encontrado para obtener los valores que faltan en una tabla específica, no puedo encontrar más, pero gracias por la persona que lo hizo.


Function MyFunction$(cstrTable As String, cstrField As String)

' Read table/query sequentially to record all missing IDs.
' Fill a ListBox to display to found IDs.
' A reference to Microsoft DAO must be present.

  Dim dbs     As DAO.Database
  Dim rst     As DAO.Recordset
  Dim lst     As ListBox
  Dim Col     As Collection

  Dim strSQL  As String
  Dim strList As String
  Dim lngLast As Long
  Dim lngNext As Long
  Dim lngMiss As Long

  ' Build SQL string which sorts the ID field.
  strSQL = "Select " & cstrField & "" _
   & " From " & cstrTable & " Order By 1;"

  Set Col = Nothing
  ' Control to fill with missing numbers.
  'Set lst = Me!lstMissing

  ' Collection to hold the missing IDs.
  Set Col = New Collection

  '// Vacía la colección
  'Erase Col
    ' Read the table.
  Set dbs = CurrentDb
  Set rst = dbs.OpenRecordset(strSQL)

  If rst.RecordCount = 0 Then
    ' The recordset is empty.
    ' Nothing to do.
  Else
    ' Read and save the ID of the first record.
    lngLast = rst(cstrField).value
    rst.MoveNext
    ' Loop from the second record through the recordset
    ' while reading each ID.
    While rst.EOF = False
      lngNext = rst(cstrField).value
      ' For each ID, fill the collection with the
      ' missing IDs between the last ID and this ID.
      For lngMiss = lngLast + 1 To lngNext - 1
        Col.Add (lngMiss)
      Next
      ' Save the last read ID and move on.
      lngLast = lngNext
      rst.MoveNext
    Wend
    ' Finally, add the next possible ID to use.
    Col.Add (lngLast + 1)
  End If
  rst.Close

  For lngMiss = 1 To Col.Count
    ' Build the value list for the ListBox.
    If Len(strList) > 0 Then
      ' Append separator.
      strList = strList & ";"
    End If
    ' Append next item from the collection.
    strList = strList & Col(lngMiss)
    ' For debugging only. May be removed.
    Debug.Print Col(lngMiss)
  Next
  ' Pass the value list to the ListBox.
  ' Doing so will requery it too.
  ' lst.RowSource = strList
  ' For debugging only. May be removed.
  ' Debug.Print strList
  MyFunction$ = Col(1)
  ' Clean up.
  Set rst = Nothing
  Set dbs = Nothing
  Set Col = Nothing
  Set lst = Nothing

End Function
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top