Hallo

Welkom, Gast. Alsjeblieft inloggen of registreren.

Recent

247 gasten, 0 leden

Welkom, Gast. Alsjeblieft inloggen of registreren.

19 april 2024, 18:46:28

Login met gebruikersnaam, wachtwoord en sessielengte

Nieuws

Welkom op het vernieuwde NL Computer Forum!

Auteur Topic: A97: sluit bij lege lyst  (gelezen 12435 keer)

0 leden en 1 gast bekijken dit topic.

Offline NLCOMP

  • Forumheld
  • *****
  • Berichten: 14.666
    • NL Computer Forum
A97: sluit bij lege lyst
« Gepost op: 9 november 2009, 19:03:12 »
Bericht 1 van 5

NL Computer Forum ~ SQL & Programmeren
 Van:Hugo KornelisDatum:04-10-2004
 Aan:AllenMsgID:1460.1
 Onderwerp:A97: sluit bij lege lystForum:ws-nlcomputer
Hoi allemaal,

In een Access 97 applicatie (als front-end voor een SQL Server database) heb ik een enkelvoudig formulier gemaakt met n van de gekoppelde tabllen als record-bron. Dit formulier wordt vanuit andere formulieren geopend worden; dit kan op twee manieren:


* Als invoerformulier (optie acFormAdd). In dat geval zijn bestaande records niet te bekijken; wel kunnen nieuwe records worden toegevoegd. Zolang het formulier open blijft kunnen de toegevoegde records ook nog bekeken en evtl. gewijzigd worden.


* Als bewerkformulier; in dit geval is de optie Toevoegingen toestaan op "Nee" ingesteld en wordt een where-conditie gebruikt in de OpenForm opdracht zodat alleen relevante records getoond worden. De gebruiker kan deze records wijzigen of verwijderen, of doorklikken naar nog weer andere gerelateerde schermen. Records die buiten de opgegeven selectie vallen kunnen niet bekeken worden; records toevoegen kan ook niet.


Als ik dit scherm open en alle records die in de selectie voorkomen verwijder, dan blijft het scherm leeg achter. Er komt geen blanco record (uiteraard, want toevoegen is niet toegestaan) en er wordt geen bestaand record getoond (want elk bestaand record valt buiten de selectie). Het enige dat ik kan doen is het scherm sluiten via het kruisje rechtsboven.


Wat ik veel liever wil, is het scherm automatisch sluiten zodra het laatste record uit de selectie verdwenen is, zodat de gebruiker nooit tegen een "leeg" scherm hoeft aan te kijken. Ik heb al gekeken of ik een gebeurtenis kon vinden die geschikt is om hierop te testen, maar op dit moment kom ik er niet uit. Is dit berhaupt mogelijk? Zo ja, aan welke gebeurtenis moet ik dan een procedure koppelen en hoe kan ik testen op een lege recordbron?

Groetjes, Hugo


Bericht 2 van 5

NL Computer Forum ~ SQL & Programmeren
 Van:John Kopmels (Sysop)Datum:04-10-2004
 Aan:Hugo KornelisMsgID:1460.2
 Onderwerp:A97: sluit bij lege lystForum:ws-nlcomputer
>> Wat ik veel liever wil, is het scherm automatisch sluiten zodra het laatste
record uit de selectie verdwenen is, zodat de gebruiker nooit tegen een "leeg"
scherm hoeft aan te kijken. Ik heb al gekeken of ik een gebeurtenis kon vinden
die geschikt is om hierop te testen, maar op dit moment kom ik er niet uit.
Is dit berhaupt mogelijk? Zo ja, aan welke gebeurtenis moet ik dan een
procedure koppelen en hoe kan ik testen op een lege recordbron?

Hoi Hugo,

Probeer het volgende eens

Private Sub Form_Delete(Cancel As Integer)
  '
  With Me.RecordsetClone
    If .RecordCount = 1 Then
      DoCmd.Close acForm, Me.Name
    End If
  End With
  '
End Sub

Groetjes -- john



Bericht 3 van 5

NL Computer Forum ~ SQL & Programmeren
 Van:Hugo KornelisDatum:06-10-2004
 Aan:John Kopmels (Sysop)MsgID:1460.3
 Onderwerp:A97: sluit bij lege lystForum:ws-nlcomputer
Hoi John,

> Probeer het volgende eens
> (...)

Bedankt!! Ik heb hem weliswaar niet exact zo overgenomen als in jouw suggestie, maar zonder jouw idee was ik er nooit opgekomen. De oplossing waar ik uiteindelijk voor gekozen heb (en die precies lijkt te doen wat ik wil) is de volgende:

Private Sub Verwijderen_Click()
  If MsgBox("Wilt u NaamType " & Me.NTnaam & " echt verwijderen?", _
    vbYesNo + vbDefaultButton2 + vbQuestion, _
"Bevestig verwijderen") = vbYes Then
      Me.AllowDeletions = True
      DoCmd.RunCommand acCmdDeleteRecord
      Me.AllowDeletions = False
      If Me.AllowAdditions = False And _
      Me.RecordsetClone.RecordCount = 0 Then
        DoCmd.Close
      End If
    End If
End Sub

Ik heb hier nog wel een vervolgvraagje over: kan dit nog grote gevolgen hebben voor de performance? In SQL Server queries is het standaard advies eigenlijk om IF NOT EXISTS(...) te gebruiken in plaats van IF COUNT(...) = 0 (en IF EXISTS(...) ipv IF COUNT(...) > 0). Dat is omdat bij de EXISTS de evaluatie van de query stopt zodra een rij gevonden in die voldoet; bij de COUNT worden ze eerst alle 3.154.896 geteld voordat de vergelijking met 0 wordt gemaakt. Geldt dit ook zo bij Access? Zo ja, is er dan een equivalent van EXISTS die ik in plaats van Me.RecordsetClone.RecordCount = 0 kan gebruiken?

Groetjes, Hugo


Bericht 4 van 5

NL Computer Forum ~ SQL & Programmeren
 Van:John Kopmels (Sysop)Datum:06-10-2004
 Aan:Hugo KornelisMsgID:1460.4
 Onderwerp:A97: sluit bij lege lystForum:ws-nlcomputer
Hoi Hugo,

> Ik heb hier nog wel een vervolgvraagje over
> kan dit nog gevolgen hebben voor de performance?

De RecordsetClone is veel sneller dan een nieuw rs openen, de
query wordt niet opnieuw uitgevoerd, het geeft alleen een kopie
(pointers) naar het huidige rs, je telt dus evt iets wat er al is

met If .RecordCount = 0 vraag je alleen of er nog rec's in het (gefilterde!)
form aanwezig zijn, als je ze al telt dan zeker niet op de server, dit geldt
allemaal onder JET, maar vrijwel zeker ook met sql server als backend

EOF of .NewRecord werkt niet goed in een gefilterd form dus vallen afeen booleaans slimmigheidje ? kan nog wel zijn te kijken of er
uberhaupt records zijn, waarbij het aantal niet interesseant is

Me.AllowDeletions = True
DoCmd.RunCommand acCmdDeleteRecord
Me.AllowDeletions = False
'
If Not Me.RecordsetClone.RecordCount > 0 Then DoCmd.Close


maar uit ervaring (maar dan vooral met JET) weet ik dat werken
met de RecordsetClone lightning fast is, ook met RecordCount...

zeker voor kleine recordsets denk ik dat het allemaal niet(s) uitmaakt

PS COUNT als sql aggregate function werkt natuurlijk wel anders

Groetjes --John



Bericht 5 van 5

NL Computer Forum ~ SQL & Programmeren
 Van:Hugo KornelisDatum:06-10-2004
 Aan:John Kopmels (Sysop)MsgID:1460.5
 Onderwerp:A97: sluit bij lege lystForum:ws-nlcomputer
Hoi John,

> De RecordsetClone is veel sneller dan een nieuw rs openen,

(...)

> maar uit ervaring (maar dan vooral met JET) weet ik dat werken
> met de RecordsetClone lightning fast is, ook met RecordCount...

Ok, ik ben helemaal gerust gesteld!

Bedankt.

Groetjes, Hugo