Niet eerst alle records inlezen voordat er wat getoond wordt

Status
Niet open voor verdere reacties.

bikerron

Gebruiker
Lid geworden
9 mei 2009
Berichten
229
Hoi,
Het zal wel een makkie zijn maar ik loop in cirkels te draaien.
De uitdaging:
Ik open, vanuit een startformulier een onderhoudsformulier.
Het onderhoudsformulier wordt geopend met een gekoppelde "onderhouds query" (relaties met 3 tabellen)
Alle noodzakelijke velden van de tabel, met de gerelateerde gegevens worden ingelezen.

Op het formulier bevindt zich een Niet afhankelijk "drop-down" menu.
Het selecteren vanuit het drop-down menu loopt lekker maar ik wil eigenlijk pas records in mijn formulier zien
als ik iets gekozen heb vanuit de drop-down.

Op dit moment worden er eerst > 34.000 records opgehaald en wordt daarna het eerste record ingevuld in het formulier.
Dit is natuurlijk van de zotte, vooral als je maar een aantal records zou willen bewerken.
Dit is een "dure" operatie, het openen van het formulier duurt nogal lang.

Wat kan ik doen om het aangenamer te maken?

Ron
 
Dus je wilt middels de keuzelijst eerst één record selecteren? Dan moet je het formulier niet-afhankelijk maken, en de Recordset baseren op de gefilterde query uit de keuzelijst.
 
Michel,
Inderdaad, afh van selectie pas dan de records uit de verzameling halen.
Ik ben al aan het stoeien geweest maar krijg bij een selectie toch nog alle records óf, na aanpassingen, wel een keuze maar die werkt dan weer niet op de te tonen records.

Is er niet iets dat kan zeggen:
Lees bij openen van formulier maar nn records en in de Query die op de drop-down werkt de distinct rijen van de te kiezen records.
Bij een gemaakte keuze wordt er weer verder in de verzameling gekeken

Ron
 
Je kunt de basisquery van het rapport natuurlijk i.p.v. alle records met TOP ### een in te stellen aantal records laten zien. Die selectie zou dan enige logica moeten hebben, zoals de TOP 1000 op basis van de laatste datum o.i.d., of de TOP 3 records per klant. Al dan niet op datum.
 
Michel,
Bedankt voor je suggesties. Ik merk dus dat als ik met TOP werk dat dan weer het "Niet afhankelijk" veld neit meer werkt NA de ingelzen TOP nnn records.

Ben jij misschien in het bezit van een voorbeeld uit je verzameling voorbeelden?

Ron
 
Ik vermoed dat je het formulier gebaseerd hebt op de query. Dat zou ik niet doen; ik zou het formulier niet-afhankelijk maken en de TOP query bij laden (of Aanwijzen) pas toekennen aan het formulier. Op die manier blijft je keuzelijst ook werken, want die maakt als het goed is ook een recordset voor het formulier.
 
Michel,
Ga toch weer de mist in.
Wat heb ik uitgespookt:
Formulier:
Recordbron: Niet ingevuld
Gebeurtenis bij laden:
Code:
Private Sub Form_Load()
DoCmd.OpenQuery ("QryOnderhFotos")
End Sub
De Query bevat SELECT TOP 20

(Wat me opviel is dat dit toch vrij lang duurt, ik had een sortering op 1 kolom gezet en ik denk dus dat de hele tabel eerst gesorteerd wordt en dan pas de TOP 20 wordt getoond)
Resultaat:
Formulierveld: (niet afhankelijk) SelectieerRegisternummer
Gebaseerd op: Select Distinct......

In formulier keurig de Distinct kandidaten

Overige velden:
Geen velden gevuld in formulier
Het resultaat wordt in weergavescherm van query getoond, mis ik een instelling?
(of moet ik de query niet als Docmd aanbieden maar een string vullen?

Bij de opties Docmd.OpenQuery zie ik niet een "viewForm" optie

Bij het selecteren uit de Picklist melding:
Fout 91, Objectvariabele of blokvariabele With is niet ingesteld.
Code:
Private Sub SelectieRegisternummer_AfterUpdate()
 Dim rs As Object

    Set rs = Me.Recordset.Clone
 rs.FindFirst "[Registernummer] = '" & Me![SelectieRegisternummer] & "'"
 If Not rs.EOF Then Me.Bookmark = rs.Bookmark
 Me.SelectieRegisternummer.Requery
 ' Expose the new list of contacts
 Me.SelectieRegisternummer.Dropdown
End Sub

Deze melding kreeg ik eerder niet.

Ron
 
Openquery is niet meer dan het openen van een query. Da's niet hetzelfde als een Recordbron aan een formulier toekennen. Dus een overbodige actie.
 
Michel,
Ik kom er zo toch echt niet uit. Ik snap je "hint" over de DoCmd.OpenQuery. Nogal logisch.
Dit aangepast in het opbouwen van een SQL string maar dat werkte ook niet, er komen berichten dat de database niet gevonden kan worden.

Wellicht zit ik dus weer op een dwaalspoor. Heb jij toch niet nog wat wegwijzers?

Ron
 
Michel,
Ik heb nog e.e.a gepruts maar krijg toch foutmelding:
Fout 3065.... Kan geen Selectie Query uitvoeren
.
De Query wordt wel goed opgebouwd, ik heb wat controles via
Code:
tmp = InputBox("", "", strSQL)
Hieronder de door mij gebruikte VB-code.
Gebeurtenis bij Laden van Formulier en Recordbron is NIET ingevuld
Code:
Private Sub Form_Load()
Dim strSQL As String
Dim db As DAO.Database
Dim qd As DAO.QueryDef

strSQL = "SELECT TOP 20 fotos.*, " _
& " schepen.Naam, " _
& " schepen.Lang, " _
& " schepen.Breed, " _
& " schepen.Diep, " _
& " schepen.Ton, " _
& " schepen.Aantal_Teu, " _
& " schepen.Aantal_passagiers, " _
& " schepen.Vermogenachter, " _
& " schepen.Vermogenvoor, " _
& " schepen.Bouwjaar, " _
& " schepen.Registernummer AS s_Registernummer, " _
& " schepen.Volgnummer AS s_Volgnummer, " _
& " schepen.Bijzonderheden, " _
& " schepen.Mutator AS s_Mutator, " _
& " schepen.Mutatiedatum AS s_Mutatiedatum, " _
& " steden.Plaatsnaam, " _
& " landen.Land" _
& " FROM (landen RIGHT JOIN steden ON landen.LandenID = steden.LandenID)" _
& " RIGHT JOIN ((rederijen RIGHT JOIN (rederijplaatsen RIGHT JOIN schepen " _
& " ON rederijplaatsen.RederijPlaatsenID = schepen.RederijplaatsenId) " _
& " ON rederijen.RederijenId = rederijplaatsen.RederijenId) RIGHT JOIN fotos " _
& " ON schepen.SchepenId = fotos.SchepenID) ON steden.StedenID = rederijplaatsen.DomicilieID;" _
& vbCrLf

'Onderstaande regels eventueel voor debugging
MsgBox (strSQL)
Dim tmp
tmp = InputBox("", "", strSQL)

Set db = CurrentDb()
Set qd = db.CreateQueryDef("", strSQL)

qd.ReturnsRecords = False
'Zijn er fouten
qd.Execute dbFailOnError

db.Close

End Sub

qd.Execute dbFailOnError is dan geel gemarkeerd en geeft (fout 128).

Ron
 
En dat kan heel goed kloppen, die foutmelding. Execute kun je alleen uitvoeren op actiequeries. Overigens maak je dezelfde fout als op 10 maart: je probeert een query te openen. En dat moet je dus niet doen: de nieuwe query moet als basis voor je formulier dienen. Dus: om te beginnen moet de query een naam hebben (doe je nu ook niet) en ten tweede moet de query zijn gekoppeld aan het formulier. En als laatste: stop met het proberen om de query te openen :)
 
Laatst bewerkt:
Michel,
En dus ben ik je nu "kwijt".
Ik had een query gekoppeld als recordbron. Die is er nu af.

De bedoeling is dus nu dat ik deze query bij het laden van het formulier laat activeren zodat de velden van het formulier gevuld worden met het
resultaat van deze query, niet alle 32000 records maar minimaal 1.
Als dat geregeld is wil ik dus met behulp van een picklist naar een record kunnen springen die uit die 32000 de gewenste informatie in het formulier toont.

Kortom: Welke instructie(s) zorgen er dan voor dat dit gaat werken?

Ron
 
En die gedachtegang is ook prima. Alleen: jij probeert steeds om die query te openen. En dat is zinloos, en werkt bovendien niet. Je moet in je VBA code die je uitvoert bij het openen van het formulier aan dat formulier koppelen aan de query. Overigens doe ik het zelf op de (andere) manier die ik zelf aangaf: een variabele query gebruiken die je steeds aanpast. Je formulier zet je dan dus vast op die query.
 
Michel,
Het kwartjes is er nog steeds niet . Ik duik eens in je cursus hoofdstuk 8, ik denk dat daar een mogelijke oplossing wordt behandeld
Ron
 
Michel,
Na bestudering van je duidelijk hoofdstuk 8 ben ik wel een heel stuk verder gekomen.
Er is alleen een "klein" probleem: De gevonden kandidaten worden NIET in het formulier getoond.
Het geselecteerde registernummer, vanuit de dropdown, wordt goed doorgegeven om de records op te halen.

Ik mis dus in feite de koppeling van de geretourneerde velden met het formulier.
Alle velden hebben de waarde: #Naam? of ####
Voorheen kreeg ik die waarden als je, in dit geval, een query koppelde aan de recordbron van het formulier (tabblad Gegevens).
Ik gebruik onderstaande VBA-code

Code:
Private Sub SelectieRegisternummer_AfterUpdate()

 Me.Filter = "[Registernummer] = '" & Me![SelectieRegisternummer] & "'"
 Me.FilterOn = True
 
 strSQL = "Select * from QryOnderhFotos " _
  & "where (registernummer = '" & Me.SelectieRegisternummer & "')"
 
 Me.SelectieRegisternummer.RowSource = strSQL
 Me.SelectieRegisternummer.Requery
 
End Sub

Private Sub SelectieRegisternummer_Enter()
Me.SelectieRegisternummer = ""
End Sub

Heb je nog een tip voor me?

Ron
 
Zijn de velden misschien nog gekoppeld? Als het formulier eerst gekoppeld was aan een Recordbron, dan staan de besturingselementen van de velden misschien nog op het bijbehorende veld.
 
In het nieuwe Access hoofdstuk behandel ik een techniek die je misschien ook kunt gebruiken: een keuzelijst vullen i.p.v. een (sub)formulier. En bij doorklikken dan de gewenste selectie laten zien. Wellicht heb je daar wat aan.
 
Michel,
Zijn de velden misschien nog gekoppeld?
In het ontwerpvenster zijn keurig de velden nog te zien. Maar bij de "optie" Bestaande Velden Toevoegen is de lijst met velden leeg.

In het nieuwe Access hoofdstuk behandel ik een techniek.....
Is dat hoofdstuk al via de nieuwsbrief verzonden?


Ron
 
Nee, dat zit nog gedeeltelijk in de pen. Hopelijk krijg ik het op tijd af...
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan