zandloper om achtergrondverwerking te verduidelijken

Status
Niet open voor verdere reacties.

Flor75

Gebruiker
Lid geworden
10 okt 2016
Berichten
13
Beste, in mijn access is er een query dit omwille van de grootte van het bestand, toch wel een tijdje loopt. ik zou aan de gebruikers willen laten weten dat men even geduld moet hebben. vb een melding van 'EVEN GEDULD' of zo. Kan dit en hoe moet ik dit juist aanpakken ?
 
Je ziet onderin de statusbalk dat de query loopt, en Access geeft met een soort tijdbalkje het verloop wel enigszins aan. Is dat niet voldoende, dan kun je de query starten met een knop op een formulier waarmee je dan eerst een popup laat verschijnen met de tekst "Even wachten a.u.b..." die je dan uiteraard weer sluit als de query klaar is. Jammer genoeg is er geen reële manier om de looptijd van de query te voorspellen of te beïnvloeden, dus je weet nooit hoe lang de query loopt. Daar kun je alleen achter komen door iets uit het resultaat van die query te vergelijken met de beginsituatie. Stel dat je een selectie bijwerkt, en daarbij ook de mutatiedatum verandert. Dan weet je dus de begindatum/tijd, en als het laatste record klaar is, de datum/tijd van het laatste record. Door in een tijdlus de twee tijden met elkaar te vergelijken van het laatste bij te werken record (dat dus als laatste een nieuwe tijd krijgt) weet je wanneer de query klaar is, en wanneer het formulier weg kan.

Veel handiger, en beter beheersbaar, is om geen query te gebruiken, maar de query via een recordset uit te voeren met ADO of DAO. Dan heb je namelijk wél controle over de loop van de query, en kun je het infoscherm niet alleen nauwkeurig aan- en uitzetten, je kunt zelfs de voortgang op het formulier laten zien m.b.v. tekstvakken en/of een tijdbalk.
 
Octafish, het is een query in een hele opbouw van een formulier.
code :
Public Sub Retrieve_Tags(lot As String)
Dim db As Database
Dim qdf As QueryDef
Dim rs As Recordset, rsM As Recordset
Dim bTime As Date, eTime As Date

'uitvoeren query DCSDBA_Inventory
Set db = CurrentDb
Set qdf = db.QueryDefs("qryDCSDBA_Inventory_Initial")
qdf.Sql = "SELECT TAG_ID, BATCH_ID from Inventory where BATCH_ID = '" & lot & "' GROUP BY TAG_ID, BATCH_ID;"
qdf.Close

Set qdf = db.QueryDefs("qryDCSDBA_Inventory_Transaction")
qdf.Sql = "SELECT TAG_ID, BATCH_ID FROM Inventory_TRANSACTION WHERE BATCH_ID = '" & lot & "' AND NOT BATCH_ID IS NULL UNION SELECT TAG_ID, BATCH_ID FROM INVENTORY_TRANSACTION_ARCHIVE WHERE BATCH_ID = '" & lot & "' AND NOT BATCH_ID IS NULL GROUP BY TAG_ID, BATCH_ID;"
qdf.Close

Set qdf = db.QueryDefs("qryDCSDBA_Shipping_Manifest")
qdf.Sql = "SELECT TAG_ID, BATCH_ID from Shipping_Manifest where BATCH_ID = '" & lot & "' GROUP BY TAG_ID, BATCH_ID;"
qdf.Close

Set qdf = db.QueryDefs("qryDCSDBA_Inventory")
qdf.Sql = "SELECT * FROM qryDCSDBA_Inventory_Initial UNION SELECT * FROM qryDCSDBA_Shipping_Manifest UNION SELECT * FROM qryDCSDBA_Inventory_Transaction;"
qdf.Close

bTime = Now()

Set rs = qdf.OpenRecordset


de archive-file waarin wordt gelezen is enorm groot en alle opties om hier data in op te halen duren lang. Hier zullen we moeten mee leren leven.
ik vroeg me af of het tijdens de uitvoering van deze query mogelijk is om een tussenscherm te laten zien zodat de gebruiker weet dat de toepassing nog wel aktief is. Hoe lang het gaat duren is niet belangrijk.
Er staat inderdaad onderaan scherm wel een balk met qry verloop maar dat merkt een gebruiker niet vlug op en spijtig genoeg komt ook bovenaan scherm 'not responding'.
de gebruikers sluiten dan hun scherm af (via task manager) en zo creert men corrupte data.
 
Doe ons een lol, en maak de code op met de CODE knop, dan is hij gestructureerd en leesbaar.
 
Maar je zou dus aan het begin en eind van je codes een formulier kunnen gebruiken.
 
Maar waarom zoveel queries in de strijd gegooid?
Code:
    strSQL = "SELECT TAG_ID, BATCH_ID from Inventory where BATCH_ID = '" & lot & "' " _
        & "UNION SELECT TAG_ID, BATCH_ID FROM Inventory_TRANSACTION WHERE BATCH_ID = '" & lot & "' AND NOT BATCH_ID IS NULL " _
        & "UNION SELECT TAG_ID, BATCH_ID FROM INVENTORY_TRANSACTION_ARCHIVE WHERE BATCH_ID = '" & lot & "' AND NOT BATCH_ID IS NULL " _
        & "UNION SELECT TAG_ID, BATCH_ID from Shipping_Manifest where BATCH_ID = '" & lot & "' " _
        & "GROUP BY TAG_ID, BATCH_ID;"
    Set qdf = CurrentDb.QueryDefs("qryDCSDBA_Inventory")
    qdf.SQL = strSQL

Maar volgens mij heb je die hele rimram niet nodig:
Code:
    strSQL = "SELECT TAG_ID, BATCH_ID from Inventory where BATCH_ID = '" & lot & "' " _
        & "UNION SELECT TAG_ID, BATCH_ID FROM Inventory_TRANSACTION WHERE BATCH_ID = '" & lot & "' AND NOT BATCH_ID IS NULL " _
        & "UNION SELECT TAG_ID, BATCH_ID FROM INVENTORY_TRANSACTION_ARCHIVE WHERE BATCH_ID = '" & lot & "' AND NOT BATCH_ID IS NULL " _
        & "UNION SELECT TAG_ID, BATCH_ID from Shipping_Manifest where BATCH_ID = '" & lot & "' " _
        & "GROUP BY TAG_ID, BATCH_ID;"
    Set rs = CurrentDb.OpenRecordset(strSQL)
    With rs
        Do While Not .EOF
            ' Wat er ook moet gebeuren
            .MoveNext
        Loop
    End With
 
bedankt voor de tips. code komt uit een access-toepassing die al jaren oud is, auteur is al op pensioen. ik moet hier soms aanpassingen aan uitvoeren.
ik ga zeker die query eens proberen, misschien gaat dit al vlugger.
 
De Querydef zal qua snelheid niets uitmaken, want je doet niet veel meer dan een definitie maken, en dat is maar een stukkie tekst, niets meer. Het draaien van de query kost tijd. Maar het uitvoeren van de code middels een recordset zou wel sneller kunnen zijn. Maar ik weet verder niet wat je doet met die query; het is een Totalenquery dus heel veel zal dat niet zijn. En ik zie niet wat er verder gebeurt.
 
probleem is opgelost. de query laat inderdaad alleen maar zijn resultaat op scherm zien. ik heb een index op de files laten leggen op batch_id en gewerkt via een recordset en het is nu inderdaad véél sneller.
bedankt !
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan