Verwijzen naar globale variabele

Status
Niet open voor verdere reacties.

arnoderuig

Gebruiker
Lid geworden
8 sep 2000
Berichten
577
Ik ben even de weg kwijt; wie kan me er weer op helpen?

Ik heb een globale variabele als volgt in de module Recordwijzers gedeclareerd (heb ik dat zo goed gedaan):

Function Recordwijzer()
Global Notitiewijzer As Integer
End Function

De globale variabele Notitiewijzer verwijst naar een uniek ID uit de tabel tblNotities. Nu wil ik graag dat de notitie met het ID uit Notitiewijzer de focus krijgt. Hoe doe ik dat?
 
Je stelt een vraag die op het eerste gezicht niks met variabelen te maken heeft: de focus op een object zetten doe je op een formulier met Object.SetFocus. Je functie zie ik ook niet zo bar veel doen; het is alleen vastleggen van een variabele, die je net zo goed gelijk in het algemene blok van je module kunt declareren; daar hoef je geen functie voor te gebruiken. Dus leg eerst eens uit wat je eigenlijk wilt, en wat je bedoelt met Unieke ID in de tabel tblNotities.
 
Octafish,

Bedankt voor je reactie. Ik heb inmiddels over mijn probleem wat verder nagedacht en zal daarom onderstaand beschrijven wat mijn bedoeling is.

Er is een klantenformulier frmKlant (gekoppeld aan de tabel tblKlant) waarin een aantal tabbladen voorkomen. Onder andere een tabblad waarin notities kunnen worden bijgehouden. De notities krijgen een uniek ID (NotitieID) en zijn vastgelegd in de tabel tblNotitie. Notities kunnen een kenmerk meekrijgen dat ze zijn afgewikkeld. Notities zijn gekoppeld aan een medewerker. In de notitie staat ook een datum van gewenste afwikkeling vermeld.

Bij de start van het Access-programma verschijnen automatisch alle niet afgewikkelde notities behorend bij de medewerker die het programma heeft gestart voorzover deze notities de gewenste afwikkeltermijn naderen.

De klant werkt vanuit deze notities om contacten met klanten te leggen. Op het notitieformulier is daarom een knop opgenomen waarmee het formulier frmKlanten kan worden geopend. Daarin staan o.a. telefoonnummers, e-mailadressen en andere gegevens (uitgeleverde orders) die mijn klant nodig heeft. Via dat formulier kan ook de nu nog openstaande notitie als afgewikkeld worden aangegeven en eventueel een nieuwe notitie worden opgenomen. Ook andere klantgegevens kunnen eventueel worden gewijzigd (bijvoorbeeld contactpersonen). Nadat het formulier frmKlant wordt beeindigd wordt een requery op het notitiebestand uitgevoerd.

De klant wil nu dat op het 'nieuwe' notitieformulier direct wordt teruggekeerd naar de volgende nog niet afgewikkelde notitie in plaats van dat de focus komt te liggen (standaard) op de eerste openstaande notitie. Ik wilde daarom een oplossing creeeren waarmee het ID van de volgende openstaande notitie wordt opgeslagen (in de globale variabele) wanneer op de knop om naar de klantgegevens gaan wordt geklikt zodat na het openen van het notitieformulier naar die notitie wordt teruggekeerd.

Ik weet echter niet hoe ik dit goed kan regelen. Ik had inmiddels een globale variabele gecreerd (als ik dat goed heb gedaan) maar wist even niet hoe ik verder moet gaan.
 
Ik zie het verschil niet tussen een openstaande notitie, en een niet-afgewikkelde notitie. Voor zover ik je uitleg begrijp, geef je met een vinkje o.i.d. aan of een notitie is afgewikkeld of niet. Een nieuwe notitie lijkt mij de status niet-afgewikkeld te hebben. Dus als je een nieuwe notitie toevoegt op het klantenformulier, en het klantenformulier sluit en daarbij een requery op de notitietabel doet, dan zou je op je klantenoverzicht nog steeds alleen niet-afgewikkelde notities moeten zien.

Bovendien zie ik de procedure niet helemaal scherp: je begint met een klantenoverzicht met een tabblad met niet-afgewikkelde notities. Laten we zeggen: notities 12, 18, 23 en 44 zijn nog niet afgewikkeld, en die staan dus bij die klant in de lijst. Vervolgens open je het klantenformulier, waar dezelfde openstaande (niet-afgewikkelde?) notities op staan. Op dat formulier kun je ook notities afwikkelen. Zeg dat je notitie 18 afwikkelt. Ook maak je (je bent toch bezig) een nieuwe notitie aan: die krijgt nummer 52.
Die is op dat moment dus niet afgewikkeld; op je klantenformulier zie je dus een lijst met de notities 12, 23, 44 en 52. Nu sluit je het klantenformulier, en wordt de tabel Notities bijgewerkt (zou autmatisch moeten kunnen als het (sub)formulier is gebaseerd op de tabel, maar dat is een ander verhaal).
Je komt derhalve weer terug op het overzicht van de klant, met het tabblad openstaande (niet-afgewikkelde) notities. Volgens mijn logica zijn dat de nummers 12, 23, 44 en 52. En de eerstvolgende is dan afhankelijk van de sortering op je formulier, lijkt mij. Dus nummer 12.
Wat nu als je notitie 12 als opent, en niet 18? Dan heb je twee mogelijkheden: als je 12 afwikkelt, is 18 de eerstvolgende. Je zou dus 18 moeten opslaan in de variabele als je het klantenformulier opent. Maar als je dat formulier opent, en 12 niet afwikkelt en alleen een nieuwe notitie toevoegt? Dan is 12 de eerstvolgende, en niet 18. En die heb je dan wel in je variabele opgeslagen... Kortom: ik snap het nog steeds niet :)
 
Inderdaad is een niet-afgewikkelde notitie hetzelfde als een openstaande notitie. Verder wordt een nieuwe notitie inderdaad direct als openstaande notitie behandeld tenzij bij de invoer van een nieuwe notitie natuurlijk direct is afgevinkt dat de notitie is afgewikkeld (binnen het programma moet de notitie dan wel aan een aantal voorwaarden voldoen maar dat terzijde).

Het programma begint echter niet met de klantentabel maar met het notitieformulier gekoppeld aan de notitetabel. In het notitieformulier zijn dus alle openstaande notities te zien van de diverse klanten (o.a. wordt daarbij de klantnaam vermeld). Via het notitieformulier kan via een knop worden gegaan naar de klantentabel via het formulier Klant (alwaar nieuwe notities kunnen worden gemaakt, oude notities kunnen worden afgevinkt vanwege afgewikkeld en eventueel kan een notitie zelfs worden gewijzigd door deze aan een andere medewerker toe te wijzen).

De notitienummers die je bedoelt kunnen dus diverse klanten betreffen. Tussen haakjes vermeld ik een klantnaam. Stel dat de notities 12 (A), 23 (B), 44 (A) en 52 (C) worden weergegeven. Geklikt wordt op notitie 23. Via het klantformulier vinden hierop al of niet wijzigen plaats waarna het klantformulier wordt afgesloten. Een requery vind plaats en opnieuw worden alle op dat moment openstaande notities weergegeven. Nu moet notitie 44 (de notitie die na nummer 23 kwam) de focus krijgen.
 
Er is een klantenformulier frmKlant (gekoppeld aan de tabel tblKlant) waarin een aantal tabbladen voorkomen. Onder andere een tabblad waarin notities kunnen worden bijgehouden.
Ik begrijp hier dus uit dat je op je Klantenformulier een subformulier met notities hebt dat niet is gekoppeld aan de klant? Lijkt me een vreemde oplossing, maar dat weer terzijde...

Overigens kan de situatie die ik eerder schetste dus nog steeds voorkomen: als je van de notities 12 (A), 23 (B), 44 (A) en 52 (C) op 23 klikt en het bijbehorende klantenformulier klikt, en iets wijzigt maar de notitie niet afsluit, dan zit die dus nog steeds in de lijst. Waar wil je dan de focus op hebben? Gezien de volgorde neem ik aan dat je ze moet afhandelen in de juiste volgorde, en dat betekent dan toch nog steeds dat eerst 23 moet worden afgewikkeld. En niet 44.
 
Het wordt wat ingewikkeld, vrees ik. Toch nog even verder.

Uiteraard zijn notities gekoppeld aan de klant. Hoe zou ik anders vanuit het notitieformulier bij de klant terecht kunnen komen?

Belangrijk is de wijze van verwerking. Het programma start met een formulier waarin (onder bepaalde condities) een overzicht wordt gegeven van alle gemaakte notities die nog openstaan (een soort lijst dus). Hierin staan dus notities die op het hele klantenbestand betrekking hebben (een notitie is altijd gekoppeld aan één klant; bij één klant kunnen meerdere notities staan). Het is aan de gebruiker om zelf te bepalen met welke notities hij iets wil doen. Meestal werkt hij ze af in volgorde maar dat hoeft dus niet! De notities zijn gesorteerd op de gewenste afwikkeldatum. De oudste dus vooraan; de jongste (vaak een datum in de toekomst) dus onderaan. Het wil ook niet zeggen dat een in behandeling zijnde notitie (waarvoor op dat moment dus een klantenformulier kan zijn geopend) daarna ook zal zijn afgewikkeld.

De praktijk leert dat als ik niets regel en via het klantenformulier (geopend via de koppeling in het notitieformulier) een nieuwe notitie maak en daarna het klantenformulier afsluit en terugkeer naar het notitieformulier de nieuwe notitie daarin niet voorkomt! Vandaar dat ik heb geregeld dat na afsluiten van het klantenformulier altijd een requery op het notitieformulier laat uitvoeren. Dat heeft tot gevolg dat de eerste openstaande notitie weer de focus krijgt. Dat is dus niet de bedoeling. De gebruiker wil graag dat hij de eerstvolgende notitie in zijn scherm de focus krijgt.
 
Het wordt wat duidelijker; je start niet op met het klantenformulier, maar vanuit een overzicht van openstaande notities. Vervolgens (dubbel)klik je op een notitie, en verschijnt het klantenformulier met de betreffende notitiepagina. De medewerker doet e.e.a. en sluit het klantenformulier af. Als de notitie is afgehandeld, moet de lijst met openstaande notities worden bijgewerkt. Als dat niet gebeurt, dan heb je de Requery van dat notitieformulier niet goed staan. Dit formulier wordt als eerste geopend, en de records die op dat moment getoond worden, zijn dan actueel. Als je daarna via een ander formulier een record bewerkt dat van invloed is op je startformulier, dan moet dat formulier worden ververst. Dat doe je dus met Requery en Refresh. Die acties moeten worden uitgevoerd nadat het klantenformulier is gesloten, of in ieder geval nadat het klantenformulier is bijgewerkt en opgeslagen.

Als een medewerker zelf bepaalt in welke volgorde hij/zij notities afhandelt, zou ik mij niet eens druk maken om het al dan niet selecteren van een volgende notitie; het is dan namelijk aan de medewerker om zelf een record te kiezen. Ik zou het persoonlijk irritant vinden als er voor mij een keuze wordt gemaakt; dat wil ik toch echt zelf doen! Bovendien moet je toch een handeling uitvoeren om de notitie te openen; ik zou de selectie dus daaraan koppelen. Zoals gezegd: ik zou dat met een klik of een dubbelklik op de gewenste notitieregel doen. En dan heeft een voorselectie zoals je voor ogen hebt geen enkele zin.
 
Laatst bewerkt:
Uit de eerste alinea blijkt dat je nu precies hebt begrepen hoe één en ander in elkaar zit.

Met betrekking tot het tweede gedeelte blijkt dat mijn opdrachtgever in de allermeeste gevallen de notities op volgorde afhandelt en DUS graag wil terugkeren naar het volgende notitierecord. En zo kom ik dus bij mijn oorspronkelijke vraag (later iets gewijzigd); hoe regel ik dat.
 
Leg eerst eens uit waarom de Requery niet werkt, want dat is volgens mij één van je problemen.... Volgende vraag: wordt de lijst met notities gemaakt met een keuzelijst, of met een subformulier?
 
Alvast een voorzetje: je moet dus, ongeacht wat je doet op je klantenformulier, het volgende notitienummer ophalen uit je tabel. Dat is niet het current record, dus je zult daar een truc voor moeten gebruiken. Ik heb een testje gemaakt met een doorlopend formulier met projecten en een keuzelijst, die werkt. De code kun je denk ik wel aanpassen naar eigen gebruik:

Code:
Private Sub cboProject_AfterUpdate()
Dim rs As Object
Dim varBookmark As Variant
Dim Project As Variant

    Set rs = Me.Recordset.Clone
    With rs
        .FindFirst "[Projectnummer] = " & Str(Nz(Me.cboProject, 0))
        If Not rs.EOF Then Me.Bookmark = rs.Bookmark
        .Move 1
        varBookmark = .Bookmark
        Project = !Projectnummer
    End With
    MsgBox Project
End Sub
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan