keuzelijst

Status
Niet open voor verdere reacties.

bassie3

Gebruiker
Lid geworden
16 nov 2013
Berichten
49
goede dag,
ik probeer een keuzelijst te vullen door middel van rowsource.additem maar na een aantal records stopt ie met vullen.
Ik ben er al achter dat dit komt omdat ie maar een x hoeveelheid aan data kwijt kan.
is er een mogelijkheid dit probleem te voorkomen? en dan zonder consessies te doen aan mijn te gebruiken data( kolomen weglaten is dus geen optie)
bij voorbaat dank.
 
Waarom AddItem? Zo'n beetje de langzaamste manier lijkt mij om een keuzelijst te vullen... Maar afgezien daarvan: je geeft gelukkig zelf al aan waar het aan ligt. Ik heb dat zelf ook al wel eens gemerkt, dat je maar een 'beperkt' (wat heet beperkt, je praat toch nog wel over een paar duizend items) kwijt kunt in een keuzelijst (met invoervak). Daarbij vroeg ik mij gelijk af: is een keuzelijst met 30.000 items wel bruikbaar in de praktijk? Ik vond al gelijk van niet. Kolommen weglaten, zeker als je er meer als 5 hebt, zou zeker een overweging moeten zijn, want een keuzelijst moet wel handelbaar zijn, lijkt mij. En je hebt 'm omdat je snel iets wilt kunnen vinden in je tabel. Als je je dan helemaal suf moet scrollen en dan ook nog eens tientallen kolommen moet doorlezen, dan vraag ik me af of je het wel op de handigste manier doet. Al gebruik ik zelf tegenwoordig steeds vaker keuzelijsten als alternatief voor subformulieren, en dan kom je toch ook wel aan een stevig aantal kolommen. Maar in een keuzelijst met invoervak hou ik het aantal kolommen dus wél laag. Maar je hebt het in je vraag over een keuzelijst en niet over een keuzelijst met invoervak. :)

Dus laten we er even vanuit gaan dat je een normale keuzelijst hebt, met een stevig aantal kolommen. (Des te meer reden om niet met AddItem te werken volgens mij). En dat je teveel records hebt zodat je tegen de limiet van de keuzelijst aanloopt. Hoe kun je dan het aantal records verminderen? M.i. alleen door de bron van de keuzelijst te beperken. De keuzelijst zal nu een stevig aantal records bevatten, en die zijn nooit in één keer te overzien. Betekent dus dat de gebruiker toch door de lijst moet om het gewenste record te vinden. En dat geeft jou dan weer de gelegenheid om m.b.v. een extra tekstvak te filteren op één of meer velden in de keuzelijst.
Gaat heb bijvoorbeeld om een overzicht van personen, dan wil je vermoedelijk persoonsnamen zien die met een bepaalde letter beginnen, of bepaalde letters bevatten. Door de Recordsource te filteren vóórdat je hem op de keuzelijst zet (m.b.v. dat tekstvak) wordt het aantal records in de onderliggende query kleiner, en zal de recordbron uiteindelijk prima passen. Maar stop met AddItem :D.
 
ben het helemaal met je eens dat het niet de snelste manier is, maar ik doe dit zodat ik ook in me code een evaluatie kan doen om iets wel of niet weer geven...
ik zal dus moeten gaan filteren
we praten trouwens over "maar" 6 kolomen > ( id; code bestaande uit 17 karakters;omschrijving vrij kort karakter of 20; een 0 of niks; een 0 of niks ; een 0 of niks )
dit lijkt me toch niet al te overdreven...
we hebben het daarnaast over maar 1100 records . en dan nog krijg ik niet alles in beeld ☺
 
1100 records met dat aantal kolommen zou geen probleem mogen zijn; ik heb het eens uitgezocht en volgens mij lag de limiet ergens bij de 55.000 tekens. En dat ga je hier niet mee halen.
Ik raad je echter toch aan om van AddItem af te stappen, je gaat toch niet met de hand 1100 rijen controleren en goedkeuren? Of heb je daar iemand voor ingehuurd? Ik wil je code wel eens zien die je gebruikt. Of, nog beter, de db zelf.
 
hoi octa,
hierbij:
Code:
         Dim toe As String
         Dim aan As String
         Dim bes As String

Me.TxtLijstItems.RowSource = ""
Set db = CurrentDb
Set rs = db.OpenRecordset("Qmat", dbOpenDynaset, dbSeeChanges)
If rs.EOF Then
Exit Sub
End If
rs.MoveFirst
        Do Until rs.EOF
         If rs!toegekend = True Then
         toe = "o"
         ElseIf rs!toegekend = False Then
         toe = ""
         End If
         If rs!aantal > 0 Then
         aan = "o"
         ElseIf rs!aantal = 0 Then
         aan = ""
         End If
         If rs!inbestelling > 0 Then
         bes = "o"
         ElseIf rs!inbestelling = 0 Then
         bes = ""
         End If
         
         
        Me.TxtLijstItems.AddItem rs!Id & ";" & rs!matcode & ";" & rs!mat & ";" & aan & ";" & toe & ";" & bes
        rs.MoveNext
      
        
        Loop
 
Ik denk dat ik gelijk ga krijgen.... ik zou het althans zo doen
Code:
Dim strSQL As String
    strSQL = "SELECT Id, matcode, mat, IIf([toegekend]=True,""o"","""")As toe, IIf([inbestelling] > 0,""o"","""") As bes, IIf([aantal] > 0,""o"","""") As aan FROM Qmat"
    With Me.TxtLijstItems
        .RowSource = strSQL
        .RowSourceType = "Table/Query"
        .ColumnCount = 6
        .ColumnHeads = True
        .Requery
    End With
 
goede middag,
bedankt octa, zoals verwacht van je, werkt dit idd beter( en ook sneller)
ik ben wel benieuwd naar de theorie er achter,
ik snap de snelheid maar waarom geeft hij in mijn geval niet alles weer en bij jou versie wel?
weet jij daar het antwoord op?( vast wel ☺)
 
Dat het sneller werkt verbaast me niet; ik doe niet veel anders dan een Recordbron aan een keuzelijst hangen en jij vult de keuzelijst met een boel rijen. En dat kost nu eenmaal wat tijd. Bij mijn oplossing heb je dan een (theoretisch) tragere keuzelijst omdat de waarden van de keuzelijst er bij het zoeken nog niet gelijk in zitten; die worden door de query opgehaald en bij jou zitten ze er al in. Maar dat verschil is verwaarloosbaar.
Daarnaast heeft de keuzelijst een fysieke beperking als het gaat om het vullen met vaste waarden. Omdat mijn techniek de keuzelijst dus feitelijk niet vult, maar alleen maar koppelt aan een gegevensbron, vervalt de beperking van het aantal mogelijke karakters.

Volgens mij hoef jij niet meer overtuigd te worden :D.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan