Access VBA. Waardem variabelen tussen twee subroutines uitwisselen.

Status
Niet open voor verdere reacties.

KPTPTT

Gebruiker
Lid geworden
2 mrt 2018
Berichten
321
Ik heb de volgende vraag. Er is sprake van een formulier "Historie" waarbij een zoekveld beschikbaar is van waaruit een adres voor een reparatieopdracht kan worden geselecteerd. Hiervoor is VBA geschreven, via Eigenschappen en item "Na bijwerken". Dit werkt goed. Vervolgens wordt automatisch bij dit adres alle bijhorende (records) reparatie opdrachten uit de tabel c.q. Query gefilterd en in het formulier, in hiervoor beschikbare tekst velden, gepresenteerd. Ook deze VBA code is onderdeel van de Subroutine "Na bijwerken". De output van deze subroutine zou er voor ieder gefilterd record een overeenkomstig OpdrachtID nummer moeten zijn en is gevat in een variabele [sOPdracht1] genoemd. Hiermee wil ik dmv een knop "Werkorder", naast de tekst velden, het formulier "Werkorder" oproepen met alle verdere informatie van de opdracht. Hiervoor heb ik VBA code in een subroutine "Click" geschreven. Nu blijkt het OpdrachtID nummer van het Historie formulier niet wordt doorgegeven aan de subroutine "Click" (formulier Werkorder) en het formulier "leeg" wordt geopend (geen indexnummer beschikbaar). Ik heb het geprobeerd oa. met Call met het oproepen van de Subroutine maar het werkt niet. Er is in het formulier Historie sprake van 7 knoppen Werkorder waarbij 7 variabelen sOpdracht1 t/m sOpdracht7 beschikbaar zijn maar niet worden doorgegeven aan de formulieren werkorder. Hoe kan ik het realiseren.

Code:
Private Sub Knop44_Click()
Debug.Print sOpdracht1
DoCmd.OpenForm "Werkorder", WhereCondition:="[o_Opdracht ID] = " & Me.[sOpdracht1]     
End Sub
Ik heb ook andere code geprobeerd maar geen resultaat. Variabele "sOpdracht1" vanuit het Historie formulier c.q. subroutine wordt niet door getoonde routine ontvangen. sOpdracht1 bevat (zou moeten bevatten) de indexwaarde van [o_Opdracht ID]. Hoe kan ik de variabelen tussen de twee routine overdragen?Formulier Historie.png
 
Laatst bewerkt:
Ik zie wel een onlogische werkwijze.
De output van deze subroutine zou er voor ieder gefilterd record een overeenkomstig OpdrachtID nummer moeten zijn en is gevat in een variabele [sOPdracht1] genoemd. ... Nu blijkt het OpdrachtID nummer van het Historie formulier niet wordt doorgegeven

Je hebt dus het veld OpdrachtID op je formulier staan (ik ga er maar vanuit dat dat veld het label "Opdrachtnummer" heeft). Waarom gebruik je dat veld niet in je code? Waarom zit daar een variabele tussen?

Als we het nut van die variabele even buiten beschouwing laten, kun je een filter op twee manieren gebruiken: d.m.v. een veldverwijzing, of d.m.v. een variabele. Beide manieren hebben een eigen 'aanspreekwijze' die je a) niet moet verwarren en b) niet moet combineren. Jij doet, vrees ik, het laatste. Waarschijnlijk veroorzaakt door het eerste :D. Ik geef beide opties, waarvan je er uiteraard maar één moet gebruiken. Persoonlijk zou ik de variabele variant dus weggooien, tenzij je daar nog andere doelen mee voor ogen hebt.

Code:
Private Sub Knop44_Click()
     DoCmd.OpenForm "Werkorder", WhereCondition:="[o_Opdracht ID] = " & sOpdracht1
     DoCmd.OpenForm "Werkorder", WhereCondition:="[o_Opdracht ID] = " & Me.OpdrachtID
End Sub
 
Dank je wel OctaFish voor je altijd trouwe hulp, perfect! Je oplossingen zijn nog niet werkend. De reden voor het gebruik van de variabele dat ik tijdens het opzoeken van het adres in de Query het bij gevonden Opdracht ID index als output wel moest bewaren voor de sub knop 44 Click. Ik heb er zo zeven stuks met als basis [o_Opdracht ID]. De waarde van o_Opdracht ID kan immers zeven keer veranderen.
De tweede coderegel geeft de volgende foutmelding: Kan het veld |1 niet vinden waarnaar wordt verwezen in de expressie. Ik had deze code zelf ook al zonder succes getest.
De eerste coderegel geeft de foutmelding: Syntaxfout (operator ontbreekt) in query-expressie [o_Opdracht ID]=. Deze had ik ook al zonder succes getest.
Dit is een stukje van één van de zeven delen broncode in het Historieforumlier.
Code:
Do Until rsClone.EOF
    If (sAdres = rsClone![o_Adres]) And (sNum = rsClone![o_Huisnummer]) Then
        If Count = 0 Then
            sOpdracht1 = rsClone![o_Opdracht ID]
             etc.
        End If 
    rsClone.MoveNext
Hopelijk heb je nog een idee.
 
...dat ik tijdens het opzoeken van het adres in de Query het bij gevonden Opdracht ID index als output wel moest bewaren voor de sub knop 44 Click. Ik heb er zo zeven stuks met als basis [o_Opdracht ID]. De waarde van o_Opdracht ID kan immers zeven keer veranderen.
En hier snap ik dus weer niets van; het maakt niet uit hoeveel records er in je subformulier zitten; je kunt ze allemaal pakken met één knop. In het ontwerp van je subformulier heb je toch ook maar 1 veld voor [OpdrachtID] en 1 knop? Tenzij je, en daar begin ik een beetje bang voor te worden, geen doorlopend formulier gebruikt maar de hele mikmak 7 keer op een enkelvoudig formulier hebt gezet. Dan snap ik dat je nu problemen hebt.
En van je recordset snap ik dus ook niet veel. Ik zou zeggen: een voorbeeldje met dummydata (ze worden streng bij HelpMij zag ik) maakt het hoop ik wat duidelijker.
 
Hallo OctaFish. Ik heb inderdaad alle zeven op een formulier gezet. Ik heb een doorlopend formulier geprobeerd maar dat was om één of andere reden geen succes, teveel geprobeerd.
Ik wil nl. naast de weergave van iedere record twee knoppen Werkorder en verzamelstaat. Ook is het zeer gewenst dat ik deze twee formulieren gelijktijdig op het scherm kan tonen. De gebruikers zouden hier veel aan hebben. Ik vind het vreemd dat ik als ik ipv. sOpdracht1 de index waarde [o_Opdracht ID] overbreng, het formulier Werkorder met gegevens wordt getoond, weliswaar met niet de juiste ID. Vreemd dat ik de waarde sOpdracht1 niet kan overbrengen/uitwisselen. Als dat lukt, is alles opgelost want nu ben ik vastgelopen. Waarom zou het niet kunnen?
 
Zonder de db te zien? Geen idee. Maar dat je veel te ingewikkeld doet (en dan bedoel ik: vééééééél te ingewikkeld) moge duidelijk zijn. Waarom kies je niet voor de makkelijkste optie? En ook op een doorlopend formulier kun je twee knoppen maken voor twee aparte formulieren. Sterker nog: ik heb er wel eens 3 op gezet :).
 
Geregistreerd 2 maart 2018 Access VBA. Waardem variabelen tussen twee subroutines uit

Dank voor je hulp en je suggesties. Ik heb het opgelost en kan de variabele sOpdracht1 tm 7 tussen de subroutines uitwisselen. De variabele sOpdracht1 tm 7 heb ik niet in de sub gedeclareerd maar daarbuiten op module niveau. De code is uiteindelijk nmi. niet ingewikkeld. Alle records in de tabel vergelijken met het adres+huisnummer. Bij een match de indexwaarde van de record toewijzen aan de variabele sOpdracht1 tm 7. Variabele sOpdracht1 declareren in de module, dus boven de subroutines plaatsen. Vervolgens in de tweede tm de zevende sub van de formulierknop het formulier ahv de variabele sOpdracht 1 tm 7 opvragen. Werkt geheel naar wens. Dank
Code:
Private Sub Knop44_Click()
DoCmd.OpenForm "Werkorder", WhereCondition:="[o_Opdracht ID] = " & sOpdracht1
End Sub
 
De code is uiteindelijk nmi. niet ingewikkeld.
Voor de meelezers: deze oplossing is voor TS blijkbaar genoeg, maar gebruikt altijd doordlopende formulieren voor dit soort klusjes, dan bespaar je jezelf een hoop extra werk :). Een formulier hoort m.i. ook geen herhalende objecten te hebben op deze manier. Dat kun je echt veel makkelijker en simpeler oplossen dus. Denk alleen maar aan de hoeveelheid werk die je jezelf op de hals haalt als er meer dan 7 groepen op je formulier moeten.
Goed ontwerpen houdt in dat je van tevoren nadenkt over de complexiteit van de taken, en de simpelste en meest generieke oplossing bouwt, niet degene die je als eerste bedenkt :).
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan