Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[Access] listbox recordset verversen

Pagina: 1
Acties:

  • Stefke
  • Registratie: December 2000
  • Laatst online: 19:09
Ik laat in Access normaliter een listbox vullen met gegevens met een rowsource ("Select * from etcetc")

In dit geval echter zou ik graag een zoekfunctie willen maken die zoekt in de waarden die het resultaat zijn van de vorige zoekactie, m.a.w.:
Ik heb eerst 1000 records, een zoekactie levert er 50 op, nu wil ik dat de zoekfunctie zoekt in die 50 records, tweede zoekactie levert 10 van de 50 op etc etc

Ik dacht dat het wel handig zou zijn hiervoor gebruik te maken van de listbox.recordset. Ik kan dan namelijk de huidige recordset van de listbox toewijzen aan een nieuwe recordset, hierin filteren, de nieuwe recordset toewijzen aan de listbox, en zo weer opnieuw

Dit werkt ook, maar het probleem is dat ik de gegevens in de listbox niet meer ververst krijg. Volgens msndn zou je een recordset van een listbox moeten kunnen verversen met
code:
1
set me.lstObjects.recordset = me.lstObjects.recordset.openrecordset

Maar dit doet niks.

Op de een of andere manier raakt de recordset die gebaseerd is op de recordset van de listbox de verbinding kwijt...

Het grappige is, zelfs wanneer ik bij het openen van het scherm (listbox is dan nog gebaseerd op een SQL rowsource met alle resultaten) daarna meteen bovenstaande "refresh" toepas daarna direct al geen recordwijzigingen meer zichtbaar zijn in de listbox

edit: foute info gegeven: https://msdn.microsoft.co...rary/office/ff836245.aspx
Er wordt helemaal niet aangegeven hoe je een listbox.recordset kunt verversen, het gaat (bij de "note") ineens over een form met een recordset.

[ Voor 18% gewijzigd door Stefke op 04-04-2016 15:50 ]


  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

De meest gebruikte manier is om de rowsource opnieuw in te stellen. Onderstaand stukje code beperkt de lijst steeds tot de records met een hoger ID dan het gekozen item.
code:
1
kl.RowSource = "select * from bron where id>=" & Me.kl

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland


  • Stefke
  • Registratie: December 2000
  • Laatst online: 19:09
Lustucru schreef op maandag 04 april 2016 @ 19:19:
De meest gebruikte manier is om de rowsource opnieuw in te stellen. Onderstaand stukje code beperkt de lijst steeds tot de records met een hoger ID dan het gekozen item.
code:
1
kl.RowSource = "select * from bron where id>=" & Me.kl
Ja, dat doe ik normaal ook. Ik heb een generieke functie gemaakt die van een willekeurige listbox alle velden doorzoekt door op alle velden een filter te zetten en de rowsource in te stellen
In dit geval gaat het om zoeken in over het algemeen string-velden, dus dat truukje van hierboven is zo niet toe te passen.

Maar een zoekfunctie die zoekt in de zoekresultaten van de vorige zoekactie (enz.) is daar naar mijn idee wat lastig mee te maken. In SQL zou ik dan een query met een subquery met een subquery etc opbouwen maar dat is in dit geval direct zo langzaam dat het vervelend wordt (waarschijnlijk omdat in alle query's op alle velden een filter zit)
Met recordsets op recordsets is het gemakkelijk te doen, maar het lukt mij op geen enkele manier om de recordset van een listbox te refreshen, niet met DAO, niet met ADODB. Zodra ik een recordset toewijs aan listbox.recordset krijg ik deze niet meer ververst.

[ Voor 11% gewijzigd door Stefke op 05-04-2016 11:09 ]


  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

Ik snap nog niet waarom je geen geldige sql-string op zou kunnen bouwen? Of je nu filter op filter bouwt of een serie where condities combineert maakt imho niet zoveel uit?


Maw wat is het verschil tussen:
code:
1
2
3
4
5
6
7
8
9
set rs=currentdb.openrecordset(sqlstring)
rs.filter=filterstring
set rs2=rs.openrecordset
rs2.filter=filterstring2

'etc...
óf

set rs=currentdb.openrecordset(sqlstring where filterstring AND filterstring2)


Het werkt wel zonder problemen:
code:
1
2
3
Set rs = CurrentDb.OpenRecordset("select foor, bar from foobar ")
rs.Filter = "filterstring"
Set kl.Recordset = rs.OpenRecordset


Maar zoals MSDN ook aangeeft, meestal is het sneller om een nieuwe recordset aan te maken met een nieuwe sql-string.

[ Voor 63% gewijzigd door Lustucru op 05-04-2016 21:11 ]

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland


  • Stefke
  • Registratie: December 2000
  • Laatst online: 19:09
Ik wil filteren op "alle" velden van de listbox met één zoekveld, dus:
code:
1
1) Select * from tbl where [field1]="zoek1" or [field2]="zoek1" etc

Dit levert bepaalde records

Vervolgens wil ik op deze records
code:
1
2) select * from tbl where [field1]="zoek2" or [field2]="zoek2"
etc

Volgens mij levert dit niet dezelfde records als bijv.
code:
1
2
3
4
5
6
7
select * from tbl where ([field1] like "zoek2" or [field1] like "zoek1") or 
([field2] like "zoek2" or [field1] like "zoek1")

of 

select * from tbl where ([field1] like "zoek2" and [field1] like "zoek1") or 
([field2] like "zoek2" and [field1] like "zoek1")

Omdat in het eerste situatie bij SQL1 records uitgesloten worden die bij de SQL2 niet meer in beschouwing genomen worden?

Nu ben ik niet zo'n ster in het interpreteren van SQL wanneer het ingewikkelder wordt, ik moet altijd even de effecten uittesten, dus wellicht vergis is me.

Wanneer ik op maar één veld zou filteren snap ik dat wat jij beschrijft hetzelfde is, maar niet voor meerdere velden

[ Voor 7% gewijzigd door Stefke op 06-04-2016 10:18 ]


  • wwwFan
  • Registratie: Januari 2012
  • Laatst online: 21:58
stefijn schreef op woensdag 06 april 2016 @ 10:13:
Ik wil filteren op "alle" velden van de listbox met één zoekveld, dus:
code:
1
1) Select * from tbl where [field1]="zoek1" or [field2]="zoek1" etc

Dit levert bepaalde records

Vervolgens wil ik op deze records
code:
1
2) select * from tbl where [field1]="zoek2" or [field2]="zoek2"
etc
Deze twee kan je als volgt in een sql query combineren:
code:
1
2
 Select * from tbl 
where ( [field1]="zoek1" or [field2]="zoek1" ) and ([field1]="zoek2" or [field2]="zoek2"  )

  • Stefke
  • Registratie: December 2000
  • Laatst online: 19:09
hmmm...dat klinkt héél logisch, waarom kom ik daar niet op! :) Gaat ik even uitproberen

[ Voor 16% gewijzigd door Stefke op 07-04-2016 10:01 ]


  • Stefke
  • Registratie: December 2000
  • Laatst online: 19:09
Haha, wat een grap. Blijkt dat ik dit wél al wist, erger nog, ik had in de functie die ik al jaren geleden gemaakt heb om een zoek-SQL op te bouwen op basis van velden in bijv. een listbox of query al een (blijkbaar nooit gebruikte maar wel werkend) boolean had ingebouwd die exact dit doet... Ik hoef alleen één van de functieparameters true mee te geven :+

Kom ik net achter toen ik die functie wilde gaan verbouwen

8)7
Pagina: 1