[vb6 sp5] Snellere manier om dit voorelkaar te krijgen?

Pagina: 1
Acties:

  • DPLuS
  • Registratie: April 2000
  • Niet online
2 vraagjes:

1: Ik wil in een combobox nummers weergeven van 0 t/m 999.
Normaal zou je met een een "For i = 0 to 999" en een "combo.additem i" volstaan, maar de values moeten bestaan uit 3 karakters, en daar waar ze minder zijn moeten ze opgevuld worden met nullen, m.a.w.: 3 moet 003 worden, 50 moet 050 worden:

Visual Basic:
1
2
3
4
5
6
7
8
9
    For i = 0 To 999
        If Len(i) = 1 Then
            Combo1.AddItem "00" & i
        ElseIf Len(i) = 2 Then
            Combo1.AddItem "0" & i
        Else
            Combo1.AddItem i
        End If
    Next i


Ik vroeg me gewoon af of ik dit ook op een snellere manier voorelkaar kan krijgen?


2: De nummers in de combobox moeten nu ook vergeleken worden met bestaande values die in een database zitten.
Daar waar de nummers gelijk aan elkaar zijn, moeten gewist worden uit de combobox.
Ik heb de volgende code:

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
' compare rs and combobox values
strSQL2 = "SELECT Nummer FROM Lijst WHERE OwnerId = " & Loginscreen.Id
Set rs1 = db.OpenRecordset(strSQL2)

If rs1.BOF = False And rs1.EOF = False Then
    rs1.MoveFirst
    Do While Not rs1.EOF
        For intTemp = 0 To Combo1.ListCount - 1
            If Combo1.List(intTemp) = rs1!Nummer Then
                Combo1.RemoveItem (intTemp)
            End If
        Next intTemp
    rs1.MoveNext
    Loop
End If

Combo1.ListIndex = 0

End Sub


Nu heb ik bovenstaande code allemaal in het form_load event van een venster staan en duurt het bij mij redelijk lang voordat dit scherm opgebouwd is.
Bestaat er misschien een mogelijkheid wat efficiëntere code te implementeren?

Bvd

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 13:28

gorgi_19

Kruimeltjes zijn weer op :9

1.
Visual Basic .NET:
1
2
3
    For i = 0 To 999
        Combo1.AddItem(Right("00" & I,3))
    Next i


2. Wat gaat er traag? Ophalen van de waarden?Het doorlopen van de items? Zet eens een paar tellers neer. En wat is "lang"

Verder kan ik me best voorstellen dat het lang duurt...
10 items, zorgt er voor dat er 999 * 10 items doorlopen moeten worden.. :X
Zorg gewoon dat ze uberhaupt niet eens in de collection inkomen. VB6 kent vast wel iets als een array, zet daar de items in welke niet toegevoegd mogen worden.

[ Voor 117% gewijzigd door gorgi_19 op 02-01-2004 16:01 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • Maasluip
  • Registratie: April 2002
  • Laatst online: 08:44

Maasluip

Kabbelend watertje

Iets als
Visual Basic:
1
Combo1.AddItem Format$("000", i)
gebruiken?

Signatures zijn voor boomers.


  • RayNbow
  • Registratie: Maart 2003
  • Laatst online: 12:56

RayNbow

Kirika <3

Misschien moet je het zo aanpakken?
  • Sorteer de records uit de database
  • Loop door de getallen 0 t/m 999
  • Als het huidige getal kleiner is dan Nummer uit de database, voeg je hem toe en ga je naar het volgende getal
  • Als het huidige getal gelijk is aan Nummer, ga je naar het volgende getal
  • Als het huidige getal groter is dan Nummer, dan ga je naar het volgende record en vergelijk je het getal met Nummer opnieuw.
  • Indien er geen records meer zijn kan je het getal altijd toevoegen
De code (ik heb het alleen niet gecontroleerd op bugs):

Visual Basic 6:
1
2
3
4
5
6
7
8
9
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
' compare rs and combobox values
strSQL2 = "SELECT Nummer FROM Lijst WHERE OwnerId = " & Loginscreen.Id & " ORDER BY Nummer"
Set rs1 = db.OpenRecordset(strSQL2)

If rs1.BOF = False And rs1.EOF = False Then
    rs1.MoveFirst
End If

Dim I As Integer, Leeg As Boolean
I = 0

Leeg = rs1.BOF And rs1.EOF

If Leeg Then
    
    For I = 0 To 999
        Combo1.AddItem Format$("000", i)
    Next I

Else

    Do While I <= 999
        
        If I < rs1!Nummer Then
            Combo1.AddItem Format$("000", i)
            I = I + 1
            
        Else If I = rs1!Nummer Then
            I = I + 1
            
        Else 'If I > rs1!Nummer Then
            
            If Not rs1.EOF Then
                rs1.MoveNext
            Else
                Combo1.AddItem Format$("000", i)
                I = I + 1
            End If
        End If
    
    Loop

End If

Ipsa Scientia Potestas Est
NNID: ShinNoNoir


  • DPLuS
  • Registratie: April 2000
  • Niet online
Ik heb nu de volgende code en het gaat inderdaad al een stuk sneller.
Mocht iemand nog op- of aanmerkingen hebben hoor ik dat graag :)

Visual Basic 6:
1
2
3
4
5
6
7
8
9
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
    Dim db As Database
    Dim rs1 As Recordset
    Dim strSQL2 As String
    strSQL2 = "SELECT Nummer FROM Lijst WHERE OwnerId = " & Loginscreen.Id & " ORDER BY Nummer"
    
    Set db = OpenDatabase(App.Path & "\database.mdb")
    Set rs1 = db.OpenRecordset(strSQL2, dbOpenSnapshot) ' Recordset is bijv: "001", "003", "006", "102", "105" enz...
    
    Dim i As Integer
    i = 1
    
    If rs1.BOF = True And rs1.EOF = True Then
        Do While i <= 2200 ' 2200 is max. value
            Combo1.AddItem Format$(i, "000")
            i = i + 1
        Loop
    Else
        rs1.MoveFirst
        Do While i <= 2200
            If rs1.EOF = True Then
                Combo1.AddItem Format$(i, "000")
                i = i + 1
            ElseIf i < CInt(rs1.Fields("Nummer")) Then
                Combo1.AddItem Format$(i, "000")
                i = i + 1
            ElseIf i > CInt(rs1.Fields("Nummer")) Then
                Combo1.AddItem Format$(i, "000")
                i = i + 1
            Else 'If i = CInt(rs1.Fields("Nummer")) Then
                If Not rs1.EOF Then
                    rs1.MoveNext
                    i = i + 1
                End If
            End If
        Loop
    End If

  • jvdmeer
  • Registratie: April 2000
  • Laatst online: 13:02
Waarom zet je die 1000 getallen niet in de database? In een aparte tabel?

Dan kan je nummers die in de combobox moeten komen tenminste erin zetten middels:

SQL:
1
2
3
4
5
6
7
8
SELECT Nummer
  FROM NieuweTabel
  WHERE Nummer NOT IN 
    ( SELECT Nummer 
      FROM Lijst 
      WHERE OwnerId = 'Loginscreen.Id'
    )
  ORDER BY Nummer


Eventueel i.v.m. indexen 'NOT IN' vervangen door een variant met 'EXISTS'.
Pagina: 1