Counter op formload blijft steeds resetten

Status
Niet open voor verdere reacties.

jantrance

Gebruiker
Lid geworden
27 mei 2013
Berichten
6
Ik loop nu tegen een probleemje aan in mijn code.
Ik wil een globale variable "counter" aanmaken en tijdens de login form_load() wil ik testen of de counter kleiner of gelijk is aan 0.
Als dit waar is dan wil ik dat mijn subroutines 'DeleteTable' en 'CreateTable' worden uitgevoerd. Als counter hoger is dan 0 moet de code niks doen.

Bovenin de code heb ik de variable gedefinieerd:
Public counter as Integer

En bij de form load heb ik dit:
Code:
Public Sub Form_Load()
    If counter <= 0 Then
         DeleteTable
         CreateTable
         counter = counter + 1
    End If
End Sub
Nou is het probleem dat die counter wel lijkt te resetten want iedere keer als het form opstart dan is de counter 0 en onthoud hij dus NIET dat hij counter + 1 heeft gedaan en dus 1 zou moeten zijn en de code dus NIET zou moeten uitvoeren.


Met vriendelijke groet,

Jan ten Hove
 
Laatst bewerkt:
Bij mij doet-ie het anders prima. Al heb ik de vergelijking natuurlijk veranderd in If counter = 0 Then, want Counter kan nooit lager worden dan 0.
 
Probleem is waarschijnlijk dat je de variabele Counter in het formulier declareert. Hierdoor wordt deze steeds opnieuw geïnitialiseerd. Als je 'm bijvoorbeeld in 'n module zet, zal de code wel werken. En inderdaad wat Michel zegt: je kunt controleren op = 0 (of <>0) omdat de waarde nooit lager zal worden.
 
Klopt wat Rene zegt; ik had de variabele uiteraard niet op het formulier gedeclareerd maar op een module; de scope moet gelden binnen de gehele database, en niet alleen bij het formulier. Zet je hem namelijk op het formulier, wat ik dus ook vermoed dat je gedaan hebt, dan krijgt hij steeds de waarde 0 als je het formulier opent. Ik had het er met opzet niet bijgezet, om te kijken of TS wakker genoeg was om zelf het verschil te vinden ;)
 
Ok dank voor uw reactie maar ik krijg het nog steeds niet opgelost.

Ik sluit het form ook af, misschien ligt het daaraan??? Ik ben vrij nieuw met VBA wat bedoel je met een module graag een voorbeeld van code hoe je dit zou oplossen dank u wel
Code die ik nu heb:
Code:
Public counter As Integer
Public Sub counterset()
    counter = 0
End Sub

Public Sub Form_Load()
    If counter = 0 Then
        MsgBox ("counter = " & counter)
        counter = counter + 1
        MsgBox (counter)
        DeleteTable
        CreateTable
    Else
        MsgBox ("counter = hoger dan 0")
    End If
    
End Sub

Private Sub KnopOK_Click()
If Wachtwoord = Users.Column(1) Then
    RegUser Users.value
    Login
Else
    incorrect.Visible = True
    Wachtwoord = Null
    Wachtwoord.SetFocus
    Exit Sub
End If
End Sub

Private Sub Login()

    Select Case GetUser(UsGroup)
    Case 1, 2, 3
        setParam "accesslevel", GetUser(UsGroup)
        DoCmd.Close acForm, Me.Name
        DoCmd.OpenForm "hoofdscherm"
    Case 4
        DoCmd.Close acForm, Me.Name
        If getParam("accesslevel") < 4 Then
            setParam "accesslevel", 4
            If MsgBox("Welkom " & GetUser(UsName) & ". U kunt de Database volledig beheren zodra u deze opnieuw opstart." & _
            vbNewLine & vbNewLine & "Nu opnieuw opstarten?", vbInformation + vbYesNo, "Beheerder ingelogd") = vbYes Then
                DoCmd.Quit 'Kill de applicatie; beheerder moet opnieuw inloggen om de machtigingen aan te vragen (HOE Microsoft ;)...)
            End If
        End If
    Case Else 'Kill de applicatie
        DoCmd.Quit
    End Select
    
End Sub
 
Als je code kan kloppen, dan kun je ook een module invoegen. Formulieren en rapporten hebben hun eigen klassemodules. Code die daar staat werkt alleen zolang het formulier of rapport is geopend. Sluit je het formulier, dan wordt de waarde van je counter dus verwijderd. Je procedure Counterset moet dus zowiezo weg, want zelfs al zou je de counter nu in een algemene module zetten (<Invoegen>, <Module>) dan wordt hij bij het starten van het formulier weer op 0 gezet als je hem aanroept. En dus de beginnen met declaratie te verplaatsen naar de nieuwe module.
 
Ok dat met die globale counter werkt dus niet want jij zegt zodra het form gesloten wordt zijn de variablen ook weer op 0 dus daar heb ik niks aan.
Ik wou gewoon een globale counter hebben die per keer dat ik het form load dat die counter wordt opgehoogt met 1 als het 0 is voer dan die code uit als het hoger dan 0 is voer het dan niet uit.
Dus de counter zou uiteindelijk ook bijvoorbeeld 5 kunnen halen omdat erin het programma is ingebouwd dat als iemand op een plek komt waar hij niet mag komen dat hij dan weer terug gaat naar het loginscherm.

Heb het nu gewoon zo gefixt:
Het form is niet meer visable na een goede inlog dus hij is niet gesloten, dus zal ook niet meer een form load doen dus wordt de code alsnog maar 1 keer uitgevoerd.
Code:
Private Sub KnopOK_Click()
If Wachtwoord = Users.Column(1) Then
    RegUser Users.value
    Login
    me.visable = False
Else
    incorrect.Visible = True
    Wachtwoord = Null
    Wachtwoord.SetFocus
    Exit Sub
End If
End Sub

Ik heb het programma in access van een vorige collega gekregen en ben helemaal niet bekend in VBA dus vandaar dat ik graag een voorbeeld zou willen zien van een goede globale counter. Als uitdaging voor iemand:
on formload in een txt veld het getal van de counter laten zien het form afsluiten en in een ander form terug kunnen gaan naar het eerste form en waar dan het nummer tijdens de form load wordt opgehoogd met 1 en dat ook zichtbaar is in het textveld. Dus de eerste keer staat daar een 0 en de tweede keer staat daar een 1 etc...

Zou iemand die code kunnen schrijven alvast hartelijk dank.
 
Ok dat met die globale counter werkt dus niet want jij zegt zodra het form gesloten wordt zijn de variablen ook weer op 0 dus daar heb ik niks aan.
Zoals ik (en Rene) al gezegd hebben: het werkt prima als je de Public variabele in een aparte module zet (of, als je al modules hebt gemaakt, in één van de bestaande). Kortom: lees hierboven nog even na hoe je een nieuwe module aanmaakt....
 
Nou, meer stap-voor-stap kan ik het niet maken:
- open je database
- ga naar de broncode van je form (of druk op alt-F11)
- rechtsklikken ergens in de Project TreeView explorer,
- kies 'Insert Module (zal wel 'invoegen module' heten in de Nederlandse versie
- standaard heet de module Module1. Ik zou 'm in jouw geval bijvoorbeeld modGlobals noemen
- Declareer je publieke variabele
- Verwijder de declaratie van de counter van het formulier, alsmede code die 'm op '0' zet.
 
Ik heb het op deze manier opgelost,
Hartelijk dank voor jullie reactie.
@admin: Vraag mag gesloten worden.

Code:
[B]Module Startup[/B]Option Compare Database
Option Explicit
Public counter As Integer
Public Sub DeleteTable()
    CurrentDb().Execute "DROP TABLE prelijst"
End Sub
Public Sub CreateTable()
    CurrentDb().Execute "CREATE TABLE prelijst(LijstID AUTOINCREMENT, PersID Number, OrgID Number, Organisatie Text, Achternaam Text, Voorletters Text, Tussenvoegsel Text, Aanhef Text, Titel Text, Telefoon Text, Postadres Text, Postcode Text, Plaats Text, Email Text, [Functie Algemeen] Text, [Functie Operationeel] Text)"
End Sub

[B]Op het Form_Login[/B]Public Sub Form_Load()
    If counter = 0 Then
        DeleteTable
        CreateTable
        counter = counter + 1
    Else
        Exit Sub
    End If
End Sub
 
Het zal aan mij liggen, maar waarom niet gewoon een 'DELETE FROM prelijst" uitvoeren als Counter op 0 staat?
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan