Ik heb een probleempje met een key in een collection (VB6).
Ik heb een usertool. In deze tool is het o.a. mogelijk een Excel bestand te importeren in een tabel in SQL Server.
Hiervoor wordt eerst een tijdelijke tabel aangemaakt in de DB waarin de Excel file wordt geimporteerd. Daarna maak ik een collectie aan en loopen we door de records heen en plaatsen deze in de uiteindelijke tabel.
Een collectie heeft een zgn. key. Deze key in mijn geval is een klantnummer. Dit klantnummer zet ik in de code om in een string. Bij het vullen van de tabel kan er maar 1 instantie zijn van een key, anders levert dat een fout op ("This key is already associated with an element of this collection").
Een standaard klant nummer bestaat uit 5 cijfers (bijv. 12345 of 98765), echter sommige klantnummers uit 2 letters en daarna 5 cijfers (bijv. EU12345 of EU98765).
Nu krijg ik bij het vullen van de tabel de fout dat er een key al bestaat. Er zitten geen dubbele keys in Excel echter. Wat blijkt!: de import blijft hangen op die keys die beginnen met 2 letters. De fout treed exact 53 maal op. Er zijn ook juist 54 nummers die beginnen met EU.
Stukje code
In principe zou dit toch moeten kunnen? Waarom "parsed" de collectie niet goed de key? De key mag toch alfanumeriek zijn?
Ik heb een usertool. In deze tool is het o.a. mogelijk een Excel bestand te importeren in een tabel in SQL Server.
Hiervoor wordt eerst een tijdelijke tabel aangemaakt in de DB waarin de Excel file wordt geimporteerd. Daarna maak ik een collectie aan en loopen we door de records heen en plaatsen deze in de uiteindelijke tabel.
Een collectie heeft een zgn. key. Deze key in mijn geval is een klantnummer. Dit klantnummer zet ik in de code om in een string. Bij het vullen van de tabel kan er maar 1 instantie zijn van een key, anders levert dat een fout op ("This key is already associated with an element of this collection").
Een standaard klant nummer bestaat uit 5 cijfers (bijv. 12345 of 98765), echter sommige klantnummers uit 2 letters en daarna 5 cijfers (bijv. EU12345 of EU98765).
Nu krijg ik bij het vullen van de tabel de fout dat er een key al bestaat. Er zitten geen dubbele keys in Excel echter. Wat blijkt!: de import blijft hangen op die keys die beginnen met 2 letters. De fout treed exact 53 maal op. Er zijn ook juist 54 nummers die beginnen met EU.
Stukje code
Visual Basic .NET:
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
| ' We lopen langs alle records in de excel recordset. While Not rsnewContracts.EOF ' If intCounter >= 562 Then MsgBox "wait" ' Haal data uit de bronrecordset en zet deze in variabelen. strCustomerName = ConvertToString(rsnewContracts.Fields("CustomerName").Value) strContractNumber = ConvertToString(rsnewContracts.Fields("ContractNumber").Value) strCustomerNumber = ConvertToString(rsnewContracts.Fields("CustomerNumber").Value) lngPoints = NullsToZero(rsnewContracts.Fields("Points").Value) strLevel = ConvertToString(rsnewContracts.Fields("Level").Value) strProgram = ConvertToString(rsnewContracts.Fields("Program").Value) strCountry = ConvertToString(rsnewContracts.Fields("Country").Value) strRegion = ConvertToString(rsnewContracts.Fields("Region").Value) ' We gaan eerst controleren of het contractnummer al niet voorkomt ' voordat we het importeren. Als dit het geval is loggen we een melding ' hiervan. ' Hij bestond al, we geven een melding en voegen hem niet toe. If dicContractNumbers.Exists(strCustomerNumber) Then Call Log("WARNING CustomerNumber already imported: " & strCustomerNumber, False) intNumWarnings = intNumWarnings + 1 ' Hij bestond nog niet. we voegen hem toe. Else ' Voeg hem aan de controle collection toe. Call dicContractNumbers.Add(strCustomerNumber, strContractNumber) ' Controleer of het geen leeg record is. If Not _ (strCustomerName = "" And _ strContractNumber = "" And _ strCustomerNumber = "" And _ lngPoints = 0 And _ strLevel = "" And _ strProgram = "" And _ strCountry = "" And _ strRegion = "") Then Call Log("Importing " & strCustomerNumber, False) ' Maak een nieuw record aan. Call rsContracts.AddNew ' Kopieer de data vanuit de variabelen naar het nieuwe record. With rsContracts .Fields("CustomerName") = strCustomerName .Fields("ContractNumber") = strContractNumber .Fields("CustomerNumber") = strCustomerNumber .Fields("Points") = lngPoints .Fields("Level") = strLevel .Fields("Program") = strProgram .Fields("Country") = strCountry .Fields("Region") = strRegion ' Bijwerken van het record. .Update End With End If |
In principe zou dit toch moeten kunnen? Waarom "parsed" de collectie niet goed de key? De key mag toch alfanumeriek zijn?