[VB] Updaten van recordset duurt te lang...

Pagina: 1
Acties:

  • kaandorp
  • Registratie: November 1999
  • Laatst online: 03-09 22:36
Ik heb een form met een datagrid die via code aan een database hangt.
Via een tweede formulier voeg ik een record toe aan de database.
Op het moment dat de record is opgeslagen laat ik het tweede formulier sluiten en laat ik het eerste formulier weer aktief worden.
In de procedure form1_activate() staat een requery van de database en een refresh van het datagrid.

Het probleem is nu dat het ongeveer een seconde of twee duurt voordat de record in de database staat, of vrij komt of iets dergelijks.
Als dus form1_activate() gerunt wordt is de nieuwe record nog niet beschikbaar. Als ik echter het formulier opnieuw activeer na een seconde of twee dan staat ie er gewoon wel bij.
Hoe kan het dat het zo lang duurt voordat de record er in zit, en hoe kan ik voorkomen dat ik form1_activate() run voordat de update van de database voltooid is?

  • mulder
  • Registratie: Augustus 2001
  • Nu online

mulder

ik spuug op het trottoir

Weet niet hoe je je record opslaat doet maar kijk is in de help naar: dbUpdateRegular. Al doe je het op een andere manier, dit vertelt je wel iets over de mogelijkheden.

Zet die code van Form1 ook niet in je Form_Activate, maar doe het zo:
code:
1
2
3
4
Private Sub ShowSecondForm
  Form2.Show vbModal 
  Refresh je datagrid
End Sub

oogjes open, snaveltjes dicht


  • whoami
  • Registratie: December 2000
  • Laatst online: 06:24
Het is dus niet uw requery die lang duurt?

Zitten er veel indexen op die tabel misschien? Kun je eens de tabel lay-out posten?
En hoeveel records zitten er in die tabel?

https://fgheysels.github.io/


  • kaandorp
  • Registratie: November 1999
  • Laatst online: 03-09 22:36
Het is een Access database met twee records en 6 velden ;)
Maar al zouden er 30.000 records in zitten, dan nog moet er een mogelijkheid zijn om pas te refreshen als de databasebewerking voltooid is.

Ik doe dan:
code:
1
2
3
4
5
6
7
rs.AddNew
rs!field1 = txtText1.text
rs!field2 = txtText2.text
rs!field3 = txtText3.text
Etc...
rs.Update
UnLoad Me

En dan in het eerste form:
code:
1
2
3
4
Private Sub Form1_activate()
rs.requery
Datagrid.refresh
End Sub

En dat werkt wel, maar alleen als ik ongeveer een seconde wacht met het requery-en en refreshen.

  • sopsop
  • Registratie: Januari 2002
  • Laatst online: 11:22

sopsop

[v] [;,,;] [v]

ik heb een soortgelijk probleem.

Alleen ik heb het met een view van een table. Die opbouw duurt ook een aantal seconden.

Als ik de recordset zelf te pakken heb dan gebruik ik de resync methode (adcurrent) op het record dat gewijzigd is.
Requery duurt gewoon een tijd. Heb nog niets kunnen vinden wat dat versnelt.
De datagrid moet dan wel een rebind krijgen (i.p.v refresh).

Ben op zich ook wel benieuwd hoe dit sneller kan.

  • whoami
  • Registratie: December 2000
  • Laatst online: 06:24
Als je echt veel indexen liggen hebt op die tabel kan het inserten of updaten van records wel wat langer duren.

Ik gebruik in m'n app (is wel Delphi) geen refresh en requery en dergelijke stuff om m'n nieuwe record in m'n lijst te krijgen. Als ik een nieuw record toevoeg in de databank, dan ga ik gewoon een nieuw item maken m'n list ipv m'n query opnieuw uit te voeren.

https://fgheysels.github.io/


  • mulder
  • Registratie: Augustus 2001
  • Nu online

mulder

ik spuug op het trottoir

rs.AddNew
rs!field1 = txtText1.text
rs!field2 = txtText2.text
rs!field3 = txtText3.text
Etc...
rs.Update dbUpdateRegular
UnLoad Me
Maar doe je elke keer in je Activate een RefreshQuery? Lijkt me niet handig.

oogjes open, snaveltjes dicht


  • kaandorp
  • Registratie: November 1999
  • Laatst online: 03-09 22:36
Dat dbUpdateRegular is zeker DAO?

Ik gebruik ADO... Was ik vergeten erbij te vermelden.

  • mulder
  • Registratie: Augustus 2001
  • Nu online

mulder

ik spuug op het trottoir

Die zal vast iets soortgelijks hebben.

oogjes open, snaveltjes dicht


  • kaandorp
  • Registratie: November 1999
  • Laatst online: 03-09 22:36
Oke.. Laat ik het even op een rijtje zetten, want ik word er helemaal para van.

Ik heb twee formulieren die allebei een ADO connectie naar een (bijna lege) access database hebben. Als ik vanuit formulier 2 iets wijzig in de database wil ik dat dat in formulier 1 onmiddelijk zichtbaar is.

Dus:
- update database (vanuit form2)
- wacht tot update zeker weten klaar is. (<-- Vooral dit is belangrijk!!)
- refresh grid op form1
- unload form2

That's it. Klinkt toch niet zo moeilijk?

Er is toch wel een mogelijkheid om te checken of die update gelukt is? Of een event wat launched als de update (echt) klaar is?

:'( Ik wordt gek... Zoiets simpels, maar zo moeilijk... :'(

  • mulder
  • Registratie: Augustus 2001
  • Nu online

mulder

ik spuug op het trottoir

Ga naar VB. Zet de cursor op Update of Updatebatch. Druk op F1. Meer ga ik niet voorkauwen, heb je nu toch genoeg aanknopings punten gegeven.

oogjes open, snaveltjes dicht


  • kaandorp
  • Registratie: November 1999
  • Laatst online: 03-09 22:36
Meer ga ik niet voorkauwen, heb je nu toch genoeg aanknopings punten gegeven.
Met alle respect... Maar je hebt nog helemaal niks bruikbaars "voorgekauwd".

Natuurlijk heb ik de MSDN van voor naar achter doorgespit. En de ADO manual moest er ook aan geloven. Maar er staat simpelweg geen goede oplossing in. Hoewel ik denk dat een hoop mensen net zo werken als mij.

Er is gewoon niet zoiets als rs_AfterUpdate(SuccesFull as Boolean)
En dat vind ik vreemd.
Ik waardeer je hulp.

Ik zal straks even een complete source posten met db waarin je het probleem heel duidelijk kunt zien.

  • mulder
  • Registratie: Augustus 2001
  • Nu online

mulder

ik spuug op het trottoir

Ken verder ADO niet, maar dat moet niet uitmaken. In de help staat dat UpdateBatch alle pending updates worden naar disk (db) worden geschreven. Verder heb ik nog een Requery commando gezien.
Verder zorgt dit:
code:
1
2
3
4
Private Sub ShowSecondForm
  Form2.Show vbModal 
  Refresh je datagrid
End Sub

er voor dat de code 'Refresh je datagrid' pas wordt uitgevoerd als als Form2 is afgesloten.

oogjes open, snaveltjes dicht


  • kaandorp
  • Registratie: November 1999
  • Laatst online: 03-09 22:36
Met UpdateBatch kun je in 1 keer een aantal veranderingen aan de recordset doorvoeren. Dit heeft dus niks te maken met mijn probleem. Update werkt net zo goed. Ik hoef namelijk maar 1 verandering door te voeren.

En het gaat er niet om dat het grid gerefreshed wordt als het form gesloten wordt, maar dat het form gesloten wordt NADAT de database update voltooid is. EN NIET EERDER.

  • whoami
  • Registratie: December 2000
  • Laatst online: 06:24
Op donderdag 10 januari 2002 09:35 schreef kaandorp het volgende:
Met UpdateBatch kun je in 1 keer een aantal veranderingen aan de recordset doorvoeren. Dit heeft dus niks te maken met mijn probleem. Update werkt net zo goed. Ik hoef namelijk maar 1 verandering door te voeren.

En het gaat er niet om dat het grid gerefreshed wordt als het form gesloten wordt, maar dat het form gesloten wordt NADAT de database update voltooid is. EN NIET EERDER.
Ik heb geen ervaring in VB, maar in Delphi heb je alleszins een event AfterInsert enzo... heb je dat niet in VB?

Het is wel vreemd dat het een aantal seconden duurt eer uw record geinsert is.

https://fgheysels.github.io/


  • kaandorp
  • Registratie: November 1999
  • Laatst online: 03-09 22:36
Oke... Ik heb even een voorbeeldje in elkaar gezet.
Allereerst de sourcebestanden:
frmAddName.frm
frmTest.frm
test.mdb
testproject.vbp
testproject.vbw

Plaats al deze bestanden even in c:\test\

Dit is het voorbeeld:
Afbeeldingslocatie: http://www.ultramedia.nl/michael/vb/preview.gif

Als je op de knop: Add name drukt komt het tweede schermpje tevoorschijn. Je vult dan een naam in en klikt op Add entry.
De naam wordt dan toegevoegd aan de database. De datasource op het onderliggende formpje die het grid aanstuurt wordt gerefreshed.
PROBLEEM: De wijzigingen worden niet zichtbaar. Alleen na meerdere keren klikken op de refresh komt na een seconde of drie de record wel tevoorschijn.

Probeer het maar. Ik hoop echt dat er een oplossing komt. Want ik snap er echt helemaal niks meer van nu...

  • kaandorp
  • Registratie: November 1999
  • Laatst online: 03-09 22:36
^ Schop ^ Er is toch wel iemand die op deze manier een VB-appje gemaakt heeft?

  • mulder
  • Registratie: Augustus 2001
  • Nu online

mulder

ik spuug op het trottoir

Geef gewoon de waardes van frmAddName door aan het andere form, en laat dat form het record toevoegen/updaten...

oogjes open, snaveltjes dicht

Pagina: 1