2011-01-05 13 views
0

Ich habe in meinem Büro eine MS Access-Datenbank geerbt, die von mehreren Personen über das Netzwerk genutzt wird. Dies verursacht viele Probleme mit Datenkollisionen und Sperren. Ich möchte die db teilen, so dass jeder Benutzer seine eigene Front-End-App hat und die Kerndaten auf dem Server verwaltet.Gibt es Probleme mit Tabellen, die eine automatische Nummer als Primärschlüssel in einer Back-End-MS Access-Datenbank verwenden?

Mehrere der Tabellen verwenden eine automatische Nummer: Reihenfolge: lang wie ihr Primärschlüssel - bei der Suche nach der Aufteilung Ich habe mehrere Einträge gefunden, die darauf hindeuten, dass Probleme bei der Verteilung einer Datenbank verursachen können in der Lage, etwas Festes zu finden. Das Problem scheint zu sein, dass ein Benutzer einen neuen Datensatz beginnen und die nächste Autonummer empfangen kann, aber ein zweiter Benutzer kann einen neuen Datensatz innerhalb eines kurzen Intervalls erstellen und dieselbe Autonummer erhalten, die zu einem Fehler führt?

Behandelt Jet dies richtig oder gibt es Auto-Nummer-Probleme mit einer FE/BE-Datenbank? Wenn es unwahrscheinlich ist, aber möglich ist, bin ich mir sicher, dass es immer noch viel besser ist als das, was meine Nutzer gerade erleben, aber ich würde gerne wissen, ob es Möglichkeiten gibt, solche Probleme zu minimieren.

Danke für Ihre Hilfe!

Antwort

2

Ich hatte das Pech, in meiner Jugend mit vielen Access-Datenbanken zu arbeiten. Obwohl es viele Probleme mit Access gibt, weiß ich nicht, ob es jemals ein Problem mit AutoNumber-Spalten in einer geteilten Datenbank, Multi-User-Umgebung, gegeben hat. Es sollte gut funktionieren. Dies ist ein so häufiges Setup, dass es überall im Internet Posts gibt, wenn es ein Problem gibt.

+0

Gute Punkte. Vielen Dank! – owlie

+0

Ich werde das zweite - es ist ein absolut bog-Standard-Ansatz, keine bekannten Probleme (mit dem ...). – RolandTumble

0

Solange Sie keine Datenreplikation durchführen (dh mehrere Abonnenten-Datenbanken, in denen Benutzer neue Datensätze in denselben Tabellen einfügen können, aber an verschiedenen Stellen), haben Sie keine Probleme mit Auto-Nummern als Primärschlüssel.

Wenn Sie der Meinung sind, dass Sie an einem bestimmten Tag eine Replikation durchführen müssen (verschiedene Standorte, eine zentrale Datenbank), zögern Sie nicht, zu eindeutigen Kennungen (Replikations-IDs) zu wechseln.

+0

Er, nein. Replikations-IDs funktionieren in Access nicht gut und führen zum Brechen des integrierten Konfliktlösers. Es gibt keine wirkliche Rechtfertigung dafür, sie hier überhaupt zu empfehlen. –

+0

Überraschung! Könnten Sie mir ein paar Referenzen dazu geben? –

0

Es scheint auf Ihrem Teil etwas Verwirrung über den Prozess des Splittings zu geben. Wenn Sie dies tun, haben Sie mehrere Frontends, aber das Back-End ist immer noch eine einzige Datei. Daher gibt es keinen Unterschied für die Datentabellen in Bezug auf Autonummern von dem, was Sie vor der Aufteilung der Anwendung hatten.

0

hatte ich das gleiche Problem, doch ich eine workarround habe die automatische Nummerierung der Arbeit von einem Onload() Ereignis

Was ich ist getan zu bekommen:

  1. ich ein Re-Cord erstellen basierend auf Your_Table jedes Mal muss der Benutzer ein Auto
  2. Öffnen Sie das Re-Cord (rst)
  3. suchen, wenn:
    -Your_Table leer ist, dann den Wert "1" zu Your_field
    -Ihr_Tabelle hat Daten ohne fehlende Zahlen, dann weist den Wert = "Anzahl der Zeilen + 1" Your_field (1,2, ...., n + 1)
    -Ihre_Tabelle hat fehlende Daten (1,3,4,5,7) [Hinweis "# 2 und # 7 fehlen]", dann verwendet eine Funktion, um in Your_Table die fehlenden Felder und zu suchen weisen Sie den ersten fehlenden Wert (# 2 in diesem Beispiel) Your_Field


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 


Hier ist die Funktion, die ich die fehlenden Werte auf einem bestimmten Tisch zu bekommen gefunden, Ich kann es nicht finden mehr, aber danke für den, der es geschafft hat.


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