gericht opzoeken in Acces database mbv variabelen?

Status
Niet open voor verdere reacties.

ernstcramer

Gebruiker
Lid geworden
14 dec 2015
Berichten
66
Ik wil graag zaken kunnen terugvinden in mijn treintjesdatabase; maar ik denk dat dit wel voor iedere DB geldt. Ik ken daar twee truuckjes voor.

De eerste is de wizard gebruiken die Access aanbiedt voor het maken van een functieknop. Die geeft:

Code:
Private Sub zoek_Click()
On Error GoTo Err_zoek_Click

    Screen.PreviousControl.SetFocus
    DoCmd.DoMenuItem acFormBar, acEditMenu, 10, , acMenuVer70

Exit_zoek_Click:
    Exit Sub

Err_zoek_Click:
    MsgBox Err.Description
    Resume Exit_zoek_Click
    
End Sub

Werkt op zich goed, behalve in een subformulier :shocked:
Daar vindt ie alleen de gegevens "binnen" de selectie in dat subformulier. Maar dus niet in de hele DB...

Ik zou graag de code Screen.PreviousControl.SetFocus variabel willen maken; of gericht van te voren invullen. In mijn geval bijvoorbeeld focus op [Id_data] (recordnummer van betreffend treintje) of focus op [Art] (het artikelnummer).
De tweede regel is zo'n regel die de wizard geeft maar waar Octafish bij beantwoording in een vorige vraag aangaf dat hij geen flauw idee had wat dit commando doet.

Tweede methode: voorheen (in oudere databases) gebruikte ik volgende code:

Code:
Private Sub doosnummer_Click()
    
    stDocName = "F_zoek_doosnummer"
    DoCmd.OpenForm stDocName, acFormDS

End Sub

Deze opende een hulpformulier met daaronder een query, waarin ik in het veld [doosnummer] de voorwaarde heb opgenomen:

Code:
Like [geef typenummer op de doos] & "*"

Het leuke van deze oplossing is dat je dan een lijst krijgt met alle dezelfde doosnummers, en dus kan kiezen. Maar met het aanklikken van je keuze wordt het al reeds geopende formulier, van waaruit de keuze is gemaakt, opnieuw geopend. Je draait dus in een kringetje, met ook nog een als nadeel dat je DB dan gefilterd is: het formulier wordt exclusief geopend met dat record.

Ik heb dit Forum al afgegraasd naar intelligente oplossingen voor zoeken, en internet, maar krijg eigenlijk weinig oplossingen aangeboden.
Kortom: is er een elegante van zoeken op basis van op te geven variabelen of vooraf ingesteld waarden?
 
Daar vindt ie alleen de gegevens "binnen" de selectie in dat subformulier. Maar dus niet in de hele DB...

En dat gaat je ook met geen enkele knop of opdracht lukken. Zoeken (wat iets anders is als filteren, wat je met je formulier doet) gebeurt altijd binnen een dynaset. Dat is dus ofwel een tabel, ofwel een query. Maar nooit de hele database. Tenzij je een query maakt die alle tabellen aan elkaar knoopt en ook alle mogelijke records laat zien. Of zo'n query nog begaanbaar is, vraag ik me dan wel af want volgens mij zit je dan zo aan het maximale aantal velden...
Vergeet dus het zoeken binnen je complete database. Ik vraag me ook af of dat überhaupt wel zinvol is. Het zal in ieder geval rete traag zijn.
Overigens kan het wel, met een functie. Die moet dan alles met een recordset openen en doorzoeken. Wordt dus echt wel traag...

Ik zou graag de code Screen.PreviousControl.SetFocus variabel willen maken; of gericht van te voren invullen. In mijn geval bijvoorbeeld focus op [Id_data] (recordnummer van betreffend treintje) of focus op [Art] (het artikelnummer).
Het mooie van Screen.PreviousControl is nu juist dát je vanuit elk willekeurig veld kan zoeken. Wat heeft het voor zin om eerst in een veld te gaan staan, dan de zoekfunctie te starten en vervolgens weer aan te moeten geven op welk veld je wilt zoeken? In 90% van de gevallen zal dat toch het actieve veld zijn. En anders is het een kwestie van instructie aan de gebruikers.

Screen.PreviousControl.SetFocus
Code:
    DoCmd.DoMenuItem acFormBar, acEditMenu, 10, , acMenuVer70
De tweede regel is zo'n regel die de wizard geeft maar waar Octafish bij beantwoording in een vorige vraag aangaf dat hij geen flauw idee had wat dit commando doet.
Heb je al iemand gesproken die het je wél zo uit het hoofd kan zeggen? :). Er zijn veel betere commando's beschikbaar, die wél duidelijk maken wat ze doen. En die precies hetzelfde doen. En die gebruik ik dus wél.

Het leuke van deze oplossing is dat je dan een lijst krijgt met alle dezelfde doosnummers, en dus kan kiezen. Maar met het aanklikken van je keuze wordt het al reeds geopende formulier, van waaruit de keuze is gemaakt, opnieuw geopend. Je draait dus in een kringetje, met ook nog een als nadeel dat je DB dan gefilterd is: het formulier wordt exclusief geopend met dat record.

Een eenmaal geopend formulier wordt nooit een tweede keer geopend. Je heropent dus het oorspronkelijke formulier, maar nu met de gekozen filtering. En zoals ik al zei, dat is iets anders als een zoekactie. Zoeken doe je gewoon binnen hetzelfde formulier, en wat mij betreft: filteren ook. Dan wordt het allemaal veel makkelijker.

Ik heb dit Forum al afgegraasd naar intelligente oplossingen voor zoeken, en internet, maar krijg eigenlijk weinig oplossingen aangeboden.
Kortom: is er een elegante van zoeken op basis van op te geven variabelen of vooraf ingesteld waarden?

Vragen over zoeken en filteren komen regelmatig voorbij op het forum, en ik geef daar dus doorgaans altijd dezelfde oplossingen voor die wat mij betreft prima werken. Maar die vind je dus niet intelligent en elegant genoeg? Dan vraag ik me af of ik je wel kan helpen :).
 
Dank voor je heldere en uitgebreide beantwoording.

Om in te gaan op je laatste paragraaf: ik heb gezocht op "zoeken", "search" en "filter". En vond daar oplossingen voor in mijn ogen hele specifieke vragen. Ik zag daarin niet de oplossing voor mijn vraag. Maar mogelijk zoek ik niet goed...:rolleyes:

Op basis van jouw eerdere oplossing Dlookup heb ik geprobeerd in een variabele het id [id_data] af te vangen die BV hoort bij een artikelnummer, of een materieeltype. Dat is me nog niet gelukt...
Dus als je een alternatief hebt voor de zoekfunctie zoals de wizard die nu geeft: ik houd mij aanbevolen!
Net zoals de mogelijkheid om direct naar een recordnummer te springen.
Ik hoor het graag.
 
Een ideetje: je kunt een list maken op je formulier met als bron een query waarin je de velden van die tabel(len) stopt waar je wilt op zoeken en dan zet je daarboven een tekstvak waar je je zoekterm kan intikken; je laat dan met een on_change event de list box filteren en verversen telkens je een karakter in je zoekveld intikt. Je kan dan via een on_click event op je gevonden item in je list box een apart, ander pop-up formuliertje laten openen.
In mijn 1° voorbeeldje kan je dus in het tekstvakje een (deel) van een bewonersnaam (of de partnernaam), bewonersnummer, afdeling, verdieping, kamernummer, zorgcode en bed intikken. En in het 2° voorbeeldje van onze leveranciersdatabase is die functie iets uitgebreider en kan je die kolommen in de list box nog elke afzonderlijk oplopend of aflopend sorteren door op de kolomkop te klikken. Gehied dat ze dus onze bewoners of artikels wel vinden ;)
 

Bijlagen

  • Knipsel8.JPG
    Knipsel8.JPG
    14,1 KB · Weergaven: 64
  • Knipsel9.jpg
    Knipsel9.jpg
    100,7 KB · Weergaven: 66
Laatst bewerkt:
Overigens snap ik dan nog steeds niet hoe je nu eigenlijk die functie voor ogen had. Misschien kun je dat nog even toelichten.
 
Dank JohanRVT voor je bericht; ik ga daar eens mee experimenteren.

@OktaFish: ik zal een poging doen.

Knipsel-1.jpg

Ik weet bijvoorbeeld welk id ik moet hebben (ik heb een printje en wil de gegevens van het model wijzigen) en wil dan direct naar id#95. Zie blauwe pijl.

Het vierkant-rode gemarkeerde veld is een veld in het formulier waarbij ik, als daarin gezocht wordt, de hele DB bekijkt. De ruit-rood gemarkeerde velden zitten in een subformulier (het hele gebied in het zwart gemarkeerde gebied). En daardoor heeft zoeken in die velden geen zin: die zijn gekoppeld aan het id#. Er kan dus via de standaard zoekfunctie niet in de hele DB gezocht worden.

Dan een plaatje van het standaard zoekveld:

Knipsel-2.JPG

Ik hoef helemaal geen "vervangfunctie", maar dat is niet het belangrijkste.
Ik moet telkens opnieuw instellen dat er niet in het "hele veld" gezocht wordt maar in een gedeelte.
Het is gewoon makkelijk als je dat vast kan inbakken bij het aanroepen van de functie.

Tot slot:
sommige tabbladen kennen opfris handelingen, nadat er een wijziging heeft plaatsgevonden. Die handeling kan ik vooralsnog niet gelijk in VBA code achter de zoekfunctie zetten; om duistere reden wordt dat gewoon niet uitgevoerd. Terwijl als ik het met de hand doe: dus opzoeken dan het tabblad verversen, kan ik de handelingen wel achter elkaar uitvoeren.

Ik hoop dat het zo wat duidelijker is.
 
De ruit-rood gemarkeerde velden zitten in een subformulier (het hele gebied in het zwart gemarkeerde gebied). En daardoor heeft zoeken in die velden geen zin: die zijn gekoppeld aan het id#./QUOTE]
Alles wat in het zwarte kader staat, lijkt mij onderdeel van het hoofdrecord, en zou dus op het hoofdformulier moeten staan. Lijkt mij handiger. Al ben je niet de eerste die een hoofdformulier maakt met niks, en dan de eigenlijke tabel gelijk in een subformulier mietert. Ik kan zo niet zien of dat nu ook het geval is, maar dat is de eerste indruk :).

Ik hoef helemaal geen "vervangfunctie", maar dat is niet het belangrijkste. Ik moet telkens opnieuw instellen dat er niet in het "hele veld" gezocht wordt maar in een gedeelte.
De functie heet niet voor niets <Zoeken en vervangen> :). Logisch dat je dan beide opties in een dialoogvenster ziet. Overigens kun je met een code (achter een knop) nog wel alleen het Zoeken venster laten zien, dat heb ik wel eens uitgezocht. Moet ergens op het forum staan, want voor mezelf zou ik dat nooit doen want ik zoek zeer zelden op die manier. Wat je tweede opmerking betreft: standaard staat de zoekfunctie ingesteld op <Snel zoeken>, en dat houdt in: Huidige veld en hele waarde. Zet je de optie op <Algemeen zoeken>, dan krijg je volgens mij wat jij wilt: Alle velden en gedeelte van veld. Dan heb je ook nog de optie <Begin van veld> en die zoekt in het huidige veld, vanaf het begin van het veld. Dus met <Algemeen zoeken> ben je volgens mij klaar, en hoef je verder niks te programmeren.

Overigens gebruik ik voor zoekacties dus altijd losse zelfgemaakte objecten zoals keuzelijsten en tekstvakken. Een keuzelijst is handig als je vanaf het begin van een zoekstring wilt zoeken, een tekstvak als je losse tekst binnen een veld wilt zoeken.

om duistere reden wordt dat gewoon niet uitgevoerd.
Als je met de hand ververst (<F9>) gaat dat altijd wel goed, Access doet alle benodigde handelingen voor je. In VBA moet je specificeren wat en hoe er moet worden ververst. Wellicht zit daar het probleem. Je hebt bijvoorbeeld een Requery nodig als een record verandert, en een Repaint om de veranderde informatie dan weer te laten zien.
 
De reden dat het in en subformulier staat is dat ik tabbladen heb gemaakt die ik in een keer zichtbaar/onzichtbaar kan maken afhankelijk van de keuze. En ik heb tabbladen zelf gemaakt omdat ik er graag een kleur aan wilde geven; iets dat niet kan bij de standaard tabbladen functie.
De bovenste velden staan dus wel direct op het hoofdformulier (zoals id en treintypen).

Je laatste opmerking snap ik niet helemaal goed:

Ik heb twee velden [land] en [periode]. IN periode staan de "spoortijdperken" vermeldt. Om te voorkomen dat ik een hele lijst door moet scrollen is dit veld afhankelijk van de waarde die in [land] staat. Als ik dus [land] heb ingevuld of aangepast, doe ik een requery op [periode] zodat ik daar alleen de tijdperken van dat land zie. Kan ik dat dan beter anders doen?
 
Ik vul een tweede keuzelijst pas nadat er in de eerste keuzelijst een keuze is gemaakt. Dan is er geen requery nodig.
 
Vanuit de eerste keuzelijst wordt de query van de tweede gemaakt met een filter op basis van de eerste keuzelijst. vervolgens wordt de query toegewezen aan de tweede keuzelijst. Heb je nog een derde, dan herhaal je dat proces.
 
Ik snap wel wat je zegt, maar heb geen idee hoe dat dan uitgevoerd moet worden.

Ik voeg een (uitgeklede) DB bij. Ik heb daarin twee zoekvelden aangebracht die een selectie maken op basis van een query. Van daaruit wil ik dan het record openen in het formulier.

Het ene veld zit in het hoofdformulier, het andere zit in Tabblad 1 - een subformulier.

Verder is in deze "beperkte" versie ook de velden [land] en [periode] aanwezig waar ook in dit draadje aan gerefereerd wordt.

Ik hoop dat je hier mee uit de voeten kan; ik heb ook alle verwijzingen naar afbeeldingen zoveel mogelijk eruit gehaald. Hoop dat de DB dan in één keer geopend kan worden.

https://www.dropbox.com/s/1n55ex2s00gvezn/MBC_test.mdb?dl=0
 
Ga ik zo naar kijken!
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan