Focus verspringt naar eerste veld subformulier

Status
Niet open voor verdere reacties.

WimenBeer

Verenigingslid
Lid geworden
12 sep 2008
Berichten
808
Beste forumleden,

Ik heb een hoofdformulier met daarop een rubriek waarin het totaal van rubrieken op een subformulier worden geteld.
Het subformulier heeft meerdere regels (gegevensbladweergave).
Als ik nu een veld wijzig in een nieuwe waarde dan wordt de rubriek op het hoofdformulier netjes geteld na de gebeurtenis [AfterUpdate].
Code:
Private Sub Veld_AfterUpdate()
Me.Recalc
End Sub
Echter na deze opdracht springt de focus naar het eerste de beste veld op het subformulier.

Dus als ik in regel 4 op het subformulier de waarde verander en naar de volgende regel ga dan wordt door de Recalc de focus weer op regel 1 gezet.

Weet iemand een oplossing om de focus op het subformulier te behouden op het veld voordat de Recalc wordt uitgevoerd.

Ik hoor graag
Wim
 
Ik kan het niet echt reproduceren; bij mij blijft de cursor in het bewerkte record staan. Heb je het verschijnsel bij meerdere formulieren?
 
Even een voorbeeldje

Michel,

Inderdaad is het moeilijk te reproduceren, maar zie mij bijlage.

Het lijkt erop dat dit probleem alleen ontstaat als er een koppeling is gemaakt tussen het hoofdformulier en subformulier.

Ik heb een klein voorbeeldje gemaakt waarbij het probleem zich wel voor doet.

Open het formulier [Hoofd] en druk op de knop.
In het daarna geopende formulier (plus subformulier) kan je de waarden in het veldje [Teller] aanpassen en de som wordt dan berekend in [Totaal] op het hoofdformulier.

Ik hoor
 

Bijlagen

Hoi Wim,

Tis inderdaad een geinig probleem! Ook als OpenArgs parameter krijg je het niet weg. Het wordt overigens niet veroorzaakt door de aansturing via het hoofdformulier. Je kunt het ook reproduceren op het formulier zelf, door een filter toe te voegen:

Code:
Private Sub Form_Load()
Dim iCheck As Integer, sFilter As String
If Not IsNull(Me.OpenArgs) Then
    Me.Filter = "ID = " & Me.OpenArgs
    Me.FilterOn = True
Else
    iCheck = MsgBox("filtertje toepassen?", vbYesNo, "Filter")
    If iCheck = vbYes Then
        sFilter = InputBox("Typ een getal", "Filter", 1)
        Me.Filter = "ID = " & sFilter
        Me.FilterOn = True
    End If
End If

End Sub
We zullen de oplossing dus moeten zoeken in een omzeiling van het filter. Ik vermoed dat de Recordpointer niet jofel meer werkt als er een filter actief is.
 
Michel,

Ik krijg het met de volgende code wel voorelkaar om in de juiste kolom te blijven.
Code:
Private Sub Veld_AfterUpdate()
    Dim ctlCurrentControl As Control
    Set ctlCurrentControl = Screen.ActiveControl
    Me.Recalc
    Me.Controls(ctlCurrentControl.Name).SetFocus
End Sub
Echter kom ik dan wel in de 1e regel terecht en niet op de rubriek waar ik naar toe ben gesprongen.
Is ook geen schattige oplossing en ik kom er ook niet verder mee.

Ga ook even zoeken naar het omzeilen van de Filter.

Ik hoor
 
Hoi Wim,

Misschien is dit een optie?

Code:
Private Sub Veld_AfterUpdate()

    Dim Id As Long
    Dim rst As Object
    
    Set rst = Me.Recordset.Clone
    Id = Me.Id
    
    Me.Recalc
    
    rst.FindFirst "[ID] = " & Id
    If Not rst.EOF Then Me.Bookmark = rst.Bookmark
    
    'ivm unieke Id zoeken, nu dus een setfocus
    Me.Veld.SetFocus

End Sub
 
Greenery80,

Je oplossing werkt wel maar is nog niet erg netjes.
Als ik een waarde in [Veld] heb gewijzigd dan zorgt deze code er voor dat dezelfde rubriek weer de focus krijgt.
Maar,....
Eigenlijk wil ik dat het veld waar ik naar toe ga (volgende regel, veld rechts) de focus krijgt.
Dus is er een afhankelijkheid van de toets die ik heb ingedrukt (Enter, Tab, pijlje(s)).

Maar buiten dit moet er toch een andere mogelijkheid zijn, zodanig dat Access doet wat hij moet doen (dus alsof er geen filter - zie Michels boodschap) wordt gebruikt.

Misschien weet iemand daar nog iets over te melden.

Ik hoor graag
 
Ik had ongeveer een vergelijkbare oplossing, maar wil zelf eigenlijk iets dat niet afhankelijk is van een veld in de tabel. Ik probeer dus via AbsolutePosition de recordrij te achterhalen, maar dat lukt ook nog niet helemaal. Het probleem(pje) van het volgende veld selecteren moet toch ook op te lossen zijn....
 
focus op

WimenBeer,

probeer onderstaande eens.



Private Sub Veld_AfterUpdate()
Dim x As Long
x = Me.Id
Me.Requery
Me.Id.SetFocus
DoCmd.FindRecord x, acEntire
Me.Hoofd.SetFocus
End Sub

Groet, COr
 
Laatst bewerkt:
Een andere workaround voor dit probleem is, om de voettekst van je subformulier een tekstveld op te nemen met bijvoorbeeld de naam subtotaal. In gegevensblad weergave wordt dit tekstveld niet weergegeven. In dit subtotaal neem je de formule op die nu in het veld totaal staat van je hoofdformulier, dus in jouw voorbeeld: DSum("Veld";"Tabel1"). Deze formule moet je dan in het hoofdformulier bij het veld totaal verwijderen. Vervolgens neem je bij het after-update event van veld de volgende code op:

Code:
Private Sub Veld_AfterUpdate()
    DoCmd.RunCommand acCmdSaveRecord
    Me.subtotaal.Requery
    Me.Parent.Totaal = Me.subtotaal
End Sub

Dit werkt volgens mij goed. Je moet alleen nog bij het openen van je hoofdformulier en bij het wisselen van record (current) voor zorgen dat de waarde van het tekstveld totaal juist wordt ingesteld met: Me.Totaal = DSum("Veld", "Tabel1")


Rebmog
 
Oplossing gevonden (lijkt er op)

Sorry voor het late antwoord, maar ik ben zelf ook nog opzoek geweest naar een oplossing.
In principe heb ik deze niet gevonden dus ben ik maar aan het programeren geslagen zodat e.e.a. aan mij behoefte voldoet.
Ik heb de oplossing van Greenery80 uitgebreid zodat het veld dat wordt gekozen nadat de waarde in [Veld] is gewijzgd (of niet) de focus krijgt.

In het kort reageer ik alleen op de gebeurtenis [GotFocus] om de juiste rubriek te krijgen.
Dit betekent wel dat ik iedere keer een Recalc uitvoer en niet alleen als de waarde in [Veld] wijzigd.
Het gaat in dit geval om weinig records dus is dat niet zo bezwaarlijk.
Omdat in de oplossing van Greenery80 wederom de focus wordt gezet op het geselecteerde veld moest ik ook de daardoor onstane loop doorbreken.

In de bijlage heb ik het voorbeeld neergezet.
Mochten jullie nog een andere oplossing hebben dan hoor ik dat wel.
Morgen zal ik deze post op opgelost zetten.

Dank voor alle hulp.
 

Bijlagen

Wim,

Jouw oplossing werkt goed (behalve bij de pijltjestoets naar links), maar ik denk dat de door mij voorgestelde suggestie met minder programmeerwerk tot hetzelfde resultaat leidt. Daarnaast is er het voordeel dat die code alleen maar wordt uitgevoerd als het veld is gewijzigd en dat die ook werkt bij de linker pijltjestoets.

Rebmog
 
Laatst bewerkt:
Redmog

Ik ga het morgen dan maar even proberen

Wim


Regmod,

Jouw oplossing ingevoegd en inderdaad dit werkt.
Alleen een kleine aanpassing gedaan zodat alleen de getoonde records worden geteld.
Code:
=DSum("Veld";"Tabel1"[COLOR="Red"];"Hoofd=" & [Hoofd][/COLOR])

Voor de oplossing bij het openen van het formulier de volgende code opgenomen op het formulier1.
Code:
Private Sub Form_Current()
    Me.Totaal = DSum("Veld", "Tabel1", "Hoofd=" & Id)
End Sub

Dus ik ga jouw oplossing gebruiken.

Dank hiervoor.

Wim
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan