2016-08-11 2 views
0

MS Access 2013Clearing Wörterbuch Von Ram

Mein Ziel ist es, eine Zebrastreifen-Tabelle zu erstellen, aber ich kann nicht auf einem Memo/Langtextfeld verbinden und mit einer Aktualisierungsabfrage mit einer where-Anweisung anstelle der Join ist ineffizient und hängt, also habe ich beschlossen, ein Wörterbuch zu bauen füllen sie, und füllen Sie die nächste Spalte durch Nachschlagen der ID, Problem ist ich in "Überlauf" Probleme laufen - meine Vermutung ist eine RAM-Begrenzung. Meine Arbeit bestand darin, so viel wie möglich in das Wörterbuch zu füllen, so viel wie möglich aus dieser Untermenge zu füllen, das Wörterbuch zu löschen und es erneut mit der nächsten Wiederholung zu füllen. Nachdem jedoch der erste Stapel ausgeführt und aus dem Wörterbuch gelöscht wurde, erhalte ich den Overflow-Fehler beim nächsten Schlüssel/Wert-Paar, das ich in das "leere" Wörterbuch einfügen möchte - und ich weiß nicht warum.

Ideale JOIN SQL-Anweisung (mit langen Text/Memo Ausgabe):

UPDATE [ID Crosswalk] INNER JOIN [1 Clean Reasons] ON [ID Crosswalk].Reason = [1 Clean Reasons].Reason SET [ID Crosswalk].CR_ID = [1 Clean Reasons].[Reason]; 

WHERE SQL-Anweisung (nicht funktionierenden/hängend):

UPDATE [ID Crosswalk], [1 Clean Reasons] SET [ID Crosswalk].CR_ID = [1 Clean Reasons].[Reason] 
WHERE ((([ID Crosswalk].Reason)=[1 Clean Reasons].[Reason])); 

VBA Wörterbuch Solution (Überlauffehler):

Dim CRtbl as DAO.Recordset 
Dim CRDictNT as Dictionary 
Set CRDictNT = New Dictionary 

'Fill CR Dict 
CRtbl.MoveFirst 
On Error GoTo PrintCR 
Do Until CRtbl.EOF 
    Do Until CRtbl.EOF 
     CRDictNT.Add CStr(CRtbl("Reason")), CInt(CRtbl("CR_ID")) 'CR_ID by Reason 
     CRtbl.MoveNext 
    Loop 
PrintCR: 
    CWIDtbl.MoveFirst 
    Do Until CWIDtbl.EOF 
     If Not IsEmpty(CRDictNT(CWIDtbl("Reason"))) Then 
      CWIDtbl("CR_ID") = CRDictNT(CWIDtbl("Reason")) 
     End If 
     CWIDtbl.MoveNext 
    Loop 
    CRDictNT.RemoveAll    'these three lines are 
    Set CRDictNT = Nothing   'my attempts at clearing 
    Set CRDictNT = New Dictionary 'the item from RAM. 
Loop 
CRtbl.Close 
+0

Warum benötigen Sie an erster Stelle ein Memo-/Langtextfeld? –

Antwort

2

Das Problem ist nicht Ihr Wörterbuch, es ist die Besetzung, die Sie tun. VBA Integer sind klein (vorzeichenbehaftet 16-Bit mit maximal 32.767). Wenn Sie also CInt(CRtbl("CR_ID")) mit einer ID aufrufen, die größer ist als das, wird die zurückgegebene Ganzzahl überlaufen. Verwenden Sie stattdessen CLng(), um zu einem Long (vorzeichenbehaftet 32-Bit mit maximalem Wert 2.147.483.647) zu konvertieren. Stellen Sie sicher, dass Sie auch den Rest Ihres Codes umstrukturieren, damit Sie einen Long erwarten können.

Ich habe gerade einen kleinen Test gemacht, ein Wörterbuch nur für eine Weile laufen lassen, Elemente hinzufügen (Schlüssel war eine kurze Zeichenfolge, Wert war ein inkrementieren Long, ähnlich wie Ihre Situation). Es lief bis zu 3 Millionen Einträge, bevor ich es abgeschnitten habe, und es hat sich nicht über irgendwelche Überläufe oder andere Fehler beschwert (und die gesamte Speicherauslastung des Host-Prozesses betrug nur ~ 0,5 GB). Sie sollten also wahrscheinlich in der Lage sein, Ihr Wörterbuch so groß wie Sie möchten zu füllen, ohne sich Gedanken um das Gedächtnis machen zu müssen.