Toon posts:

[VB6] Key probleem in Collection

Pagina: 1
Acties:

Verwijderd

Topicstarter
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
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?

  • Crazy D
  • Registratie: Augustus 2000
  • Laatst online: 14-08 12:38

Crazy D

I think we should take a look.

1e gedachte: zet bij het toevoegen in de collectie een cstr() om de key heen. Ik heb nog weleens rare dingen gehad met numerieke keys. Misschien snapt Excel t niet meer omdat je begint met numerieke keys, en later alfanum keys toevoegt.
Hopelijk is dit onzin mjah met Excel weet je het nooit, ik ben wel gekkere (en inconsequentere) zaken tegengekomen tijdens hobbyen met Excel.

Exact expert nodig?


Verwijderd

Topicstarter
Crazy D schreef op 28 April 2003 @ 13:09:
1e gedachte: zet bij het toevoegen in de collectie een cstr() om de key heen. Ik heb nog weleens rare dingen gehad met numerieke keys. Misschien snapt Excel t niet meer omdat je begint met numerieke keys, en later alfanum keys toevoegt.
Hopelijk is dit onzin mjah met Excel weet je het nooit, ik ben wel gekkere (en inconsequentere) zaken tegengekomen tijdens hobbyen met Excel.
Gekkigheid is het zeker! Het volgende ben ik namelijk te weten gekomen:

De driver om Excel aan te spreken en in een recordset te plempen bepaald namelijk zelf welk type een kolom heeft. Helaas helaas kan je dit type niet meer in VB veranderen omdat het object dan al inmiddels is geopend. Dus Cstr() haalt niets meer uit in je code. Zodra je data niet meer overeenkomt met het vastgestelde type geeft ie keurig ( :( :( ) een Null waarde terug.

Zie ook MSDN: http://support.microsoft....aspx?scid=kb;EN-US;194124

Echter de oplossingen die hierin stonden hebben vooralsnog niet geholpen. Misschien e.o.a. caching probleem. Anyway morgen weer een dag!