knop onzichtbaar maken

Status
Niet open voor verdere reacties.

arnoderuig

Gebruiker
Lid geworden
8 sep 2000
Berichten
577
Op een formulier heb ik een knop opgenomen. Wordt daarop geklikt dan wordt in een ander formulier de inhoud van een query zichtbaar gemaakt. Ik wil nu dat de knop onzichtbaar wordt op het formulier als blijkt dat de query geen records bevat. Hoe pak ik dat aan?
 
Arno,

plaats volgende code onder de gebeurtenisprocedure van het openen van het formulier waarop de knop staat.

Private Sub Form_Open(Cancel As Integer)
Dim aantal As Integer
Set dbs = CurrentDb

Set rst = dbs.OpenRecordset("qryNamen")
aantal = rst.RecordCount

If aantal > 0 Then
cmdOpenen.Visible = True
Else
cmdOpenen.Visible = False
End If
rst.Close
Set dbs = Nothing


End Sub



"qryNamen" moet vervangen worden door de naam van uw query

cmdOpenen moet vervangen worden door de naam van de knop waarmee uw formulier geopend wordt.

succes

Alverpos
 
foutmelding

Als ik de code opneem in het formulier en de teksten conform het gestelde heb aangepast verschijnt een foutmelding bij de regel:

set rst = dbs.OpenRecordset.....

De foutmelding is:

Fout 3061. Er zijn te weinig parameters. Het verwachte aantal is: 1

Mijn kennis van VBA is niet erg groot. Ik zou dus niet weten wat hier aan de hand is. Iemand een suggestie?

Groet,
Arno.
 
Op de plek van de parameter wordt een SQL statement verwacht.
In jouw geval verwacht access dus dat in plaats van de string qryNamen in het statement
Set rst = dbs.OpenRecordset("qryNamen")
een geldig SQL statement komt in de trend van:

"SELECT count(*) as Aantal FROM tblJouwTabel WHERE jouwveld = jouwwaarde"

Vervolgens is het goed voor de performance om ook nog het juiste type aan het statement toe te voegen
Set rst = dbs.OpenRecordset("jouwSQLStatement", dbOpenSnapShot)
 
nog steeds een foutmelding

Naar aanleiding van de reactie van Bartuls kreeg ik nog steeds foutmeldingen. Na wat omzwervingen op het internet heb ik uiteindelijk het volgende kunnen maken:

Private Sub Form_Open(Cancel As Integer)
Dim aantal As Integer
Set dbs = CurrentDb
Set rst = dbs.OpenRecordset("SELECT * FROM Facturen where [Facturen].[EmplidID] = [Forms]![DeelnemersReactie]![ID]")
aantal = rst.RecordCount
If aantal > 0 Then
KnopFacturen.Visible = True
Else
KnopFacturen.Visible = False
End If
rst.Close
Set dbs = Nothing
End Sub

Ik kan hier, mede door de vele voorbeelden op het internet, geen fouten meer in ontdekken. De foutmelding die ik nu krijg is (heel opvallend) dezelfde als in het begin. De variabale achter Forms is de variabele uit het formulier dat op dat moment wordt geopend. Zou daar een probleem kunnen zitten?

Arno.
 
Je moet niet de naam van het veld op je formulier meegeven in de SQL maar de inhoud van het veld op je formulier.
Ook moet je de recordset initialiseren (movefirst methode werkt daarvoor meestal wel).

Private Sub Form_Open(Cancel As Integer)
Dim aantal As Integer
Set dbs = CurrentDb
Set rst = dbs.OpenRecordset("SELECT * FROM Facturen where EmplidID = " & cstr([Forms]![DeelnemersReactie]![ID]))
rst.movefirst
aantal = rst.RecordCount
If aantal > 0 Then
KnopFacturen.Visible = True
Else
KnopFacturen.Visible = False
End If
rst.Close
Set dbs = Nothing
End Sub
 
set rst loopt niet

Er verschijnt een foutmelding 3464 bij de uitvoering van het set rst.

Fout 3464 Gegevenstypen komen niet overeen.

Dat kan kloppen omdat zowel ID als EmplidID tekstvelden zijn. Via het statementdeel Cstr wilde je van ID een string maken.

Ik heb het statement nu veranderd in:
Set rst = dbs.OpenRecordset("SELECT * FROM Facturen where EmplidID = " & ([Forms]![DeelnemersReactie]![ID]))

Maar dat helpt niet. In de Help zag ik een DLOOKUP voorbeeld waarbij de rechte haken er niet stonden. Ook gebprobeerd. Zelfde resultaat.

Kennelijk is mijn VBA-kennis te laag om dit probleempje op te lossen.

Hoe verder?
 
Kijk! Nu geef je weer wat ontbrekende informatie!

Dat kan kloppen omdat zowel ID als EmplidID tekstvelden zijn.

In 'normaal' automatiserings land is een ID altijd een betekenisloos nummer! Daarom gaan de meeste mensen ervan uit dat het dan een numeriek veld betreft.

Zo zie je maar weer, als je een probleem hebt geef dan zoveel mogelijk informatie, dan is de kans het grootst dat je een bruikbaar antwoord krijgt.....

Set rst = dbs.OpenRecordset("SELECT * FROM Facturen where EmplidID = '" & [Forms]![DeelnemersReactie]![ID] & "'")

zal het beter doen, de inhoud van tekstvelden moeten in dit soort expressies altijd tussen enkele quotes gezet worden.
 
valt niet mee

Bartuls,

Op zich heb je natuurlijk volkomen gelijk. De vraag blijft natuurlijk: welke informatie wel en welke niet. Ik had in dit voorbeeld ook kunnen vermelden welke velden allemaal bestaan, van welk soort ze zijn, hoeveel records er zijn, welke tabellen nog meer bestaan enz.

Dat heb ik ooit eerder gedaan en kreeg toen op me fl... omdat ik veel teveel informatie gaf die er niet toe deed. Tja, als ik wist wat het probleem was had ik het zelf wel opgelost. Kan ik het niet oplossen dan probeer ik te bedenken welke informatie zondermeer nodig zal zijn en welke er mogelijk niet toe doet. En helaas, dan blijkt natuurlijk altijd weer dat er een stukje ontbreekt. Overigens, als je het draadje nog een bekijkt, is langzamerhand een oplossing ontstaan over iets waarvan ik in het begin helemaal niet wist hoe het kon worden aangepakt. Ik kon op dat moment dus echt niet weten dat je moest weten dat het over niet-numerieke velden zou gaan.

Ik zal in het vervolg proberen een betere scheiding tussen nuttige en niet nuttige informatie te geven.

In ieder geval zeer bedankt. Ik het morgen uitproberen (en hoop natuurlijk dat niet blijkt dat ik nog wat vergeten was te vertellen).

Arno.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan