Access. TempVars

Status
Niet open voor verdere reacties.

KPTPTT

Gebruiker
Lid geworden
2 mrt 2018
Berichten
321
Hallo. Ik ben al uren aan het stoeien met TempVars. Ik heb deze gebruikt om een emailadres (sSender) van de ene subroutine van een eerste formulier naar de andere subroutine in een tweede formulier te transporteren. Het heeft goed gewerkt maar ineens niet meer. Op een gegeven moment merkte ik dat de variabele "geladen" bleef met een oude waarde en heb toen TempVars Remove gebruikt. Daarna is het niet meer goed gegaan, althans voor de email TempVars. De andere gebruikte TempVars Add en Remove voor een datum en een bestandsnaam in dezelfde subroutines werken goed. Ik heb de TempVars Remove buiten werking gesteld en toch blijft het probleem zich voordoen waarbij in de tweede routine de variabele sSender steeds "leeg" is. Een idee wat de oorzaak zou kunnen zijn?
Eerste formulier:
Code:
Private Sub Knop316_Click()                                   'Knop email Met bijlagen verzenden
Dim TempSender As TempVars

        'TempVars.Remove TempSender                                                   'Reset Emailadres
        sSender = DLookup("m_Email", "Monteurs", "[m_Monteur ID] =" & [sMonteur])   'Bepaal emailadres 
        MsgBox sSender                                                            'Resultaat emailadres
        TempVars.Add "TempSender", sSender 
End Sub                                                                            'Geef emailadres monteur door aan form sub Bijlagentoevoegen

Tweede formulier:
Code:
Private Sub Knop60_Click()                                       'Knop Verzenden, Wo + Bijlagen toevoegen
Dim TempSender As TempVars                                'Als test toegevoegd

        sSender = TempVars!TempSender                     'Haal emailadres op
        MsgBox sSender                                    'Resultaat "Leeg"

        Call Transmit_email(sSender)                      'Mail verzenden
        'TempVars.Remove TempSender                       'Reset Emailadres 
End Sub
 
Je gebruikt de TempVars wel héél erg onhandig. Om te beginnen: door TempSender als TempVar(s te definiëren maak je er een collectie van, geen variabele. En dat is toch wat je wilt. De declaratie moet dus zijn:
PHP:
Dim TempSender as TempVar
.
Dat is foutje 1. :). Alsof dat nog niet genoeg is, ga je daarna nóg een keer in de fout door op het tweede formulier de variabele nóg een keer te declareren. En het leuke (of vervelende) daarvan is: daarmee maak je de eerdere declaratie ongedaan. Dus als je de TempVar nog een keer declareert, is hij leeg. De opdracht Msgbox sSender levert dan uiteraard niks op.

TempVars zijn, mits correct gebruikt, heel krachtig. Maar dat goede gebruik, dat kan dus lastig zijn :). Wat is dan de juiste werkwijze?
1. Declareer de TempVars die je nodig hebt één keer. Zelf doe ik dat op het startformulier waarmee ik een db opstart. Kan ik ze ook niet vergeten.
2. Declareer ze dus nooit daarna nóg een keer, want dan heb je niks meer.
3. Gebruik, als je een TempVar declareert, de enkelvoudige variant. Het heeft doorgaans weinig zin om aparte collecties aan te maken.
4. Gooi TempVars niet weg.
5. TempVars houden hun waarde, totdat je er iets nieuws in zet, of ze leeg maakt.
6. Een TempVar kun je vullen door hem aan te maken, of door er een nieuwe waarde aan toe te kennen.
7. Als een TempVar al bestaat, kun je hem gewoon ‘opnieuw aanmaken’ als je een andere waarde wilt toewijzen. Je overschrijft dan de eerdere waarde.

Kortom: je doet een bietje te moeilijk :).

Overigens gebruik ik in dit soort situaties dus altijd de OpenArgs optie. Echt veel makkelijker. En het Access forum, want wat zou je die Excel gasten lastig vallen met zulke specifieke Access vragen? :D
 
Je valt mij er niet mee lastig @OctaFish.

Je bent hier volgens mij de enige met kennis van zaken.
Nette uitleg zoals deze waardeer ik in het bijzonder.
 
Keurige uitleg en volledig "to the point" :)
 
Geweldige hulp en Access is weer mijn "vriend". Met de declaratie van TempVar heb ik wel het eea. getest waarbij ik ook TempVar heb gebruikt. Ik heb je aanbevelingen strikt opgevolgd.
Ik gebruikte drie TempVars en één OpenArg waarvan nu twee TempVars nog goed werken. De variabele sSender heb ik nu als OpenArg getransporteerd echter ik had al een OpenArg met een Bijlagen_ID en dus moest ik deze twee variabelen (Bijlagen_ID en sSender) combineren in één OpenArg. In de andere ontvangende subroutine moest ik de twee variabelen weer uit de OpenArg destilleren door te splitsen. Dit heb ik gedaan bij Form Load van het tweede formulier echter toen kreeg ik de variabele sSender niet naar de feitenlijke subroutine in het andere formulier. Heb ik daarvoor maar weer TempVar sSender gebruikt en dat werkt nu wel. Voor het laatste zoek ik nog een oplossing, ik wil na 4 uur ploeteren en testen nog van die laatste TempVar af.
Twee variabelen Bijlagen_ID en sSender samengevoegd tbv de OpenArg functie:
Code:
        DoCmd.OpenForm "Bijlagentoevoegen", , , "Bijlagen_ID = " & Me.[o_Opdracht ID], , acDialog, OpenArgs:=Bijlagen_ID & "|" & sSender
Splising van de OpenArg variabele:
Code:
    If Len(Me.OpenArgs) > 0 Then
        intPos = InStr(Me.OpenArgs, "|")                    ' Positie van de pipe
        If intPos > 0 Then
            strControlName = Left$(Me.OpenArgs, intPos - 1) 'Bepaal de Control Name van het eerste deel vd string
            strValue = Mid$(Me.OpenArgs, intPos + 1)        'Bepaal het einde van de string
            Me(strControlName) = strValue                   'Beaal de waarde tot de Control
            Bijagen_ID = strControlName
            Bijlagen_ID = Me.Bijlagen_ID
        End If
    End If

        sSender = strValue
        TempVars.Add "sSenderx", sSender                    'Haal emailadres op ui From Load
Tweede subroutine, het feitelijke doel:
Code:
    sSender = TempVars![sSenderx]                           'Haal emailadres vanuit form load op
 
Ik snap niet helemaal dat twee TempVars wél werken, en één niet, want die ene die je hier laat zien, gebruik je verkeerd. En als je die andere op dezelfde manier gebruikt, dan zouden die dus óók niet kunnen werken. Het splitsen van een samengestelde OpenArgs kan m.i. slimmer, want je wilt ook wel eens meer dan twee variabelen meegeven, en dat wordt op jouw manier erg ingewikkeld. Ik gebruik daarom altijd Split. En wel in twee smaken :).

Variant 1:
Code:
Sub test()
Dim arr As Variant
    If Not Me.OpenArgs = "" Then
        arr = Split(Me.OpenArgs, "|")
        If Not LBound(arr) = UBound(arr) Then
            Me(strControlName) = arr(UBound(arr))        'Bepaal het einde van de string
            Bijlagen_ID = arr(LBound(arr))
        End If
    End If
    sSender = strValue
    TempVars.Add "sSenderx", sSender                    'Haal emailadres op ui From Load

End Sub

Variant 1:
Code:
Sub test()
Dim arr As Variant
    If Not Me.OpenArgs = "" Then
        If InStr(1, Me.OpenArgs, "|") > 0 Then
            Me(strControlName) = Split(Me.OpenArgs, "|")(LBound(Split(Me.OpenArgs, "|")))
            Bijlagen_ID = Split(Me.OpenArgs, "|")(LBound(Split(Me.OpenArgs, "|")))
        End If
    End If
    sSender = strValue.Value
    TempVars.Add "sSenderx", sSender                    'Haal emailadres op ui From Load

End Sub

En uitlezen van een TempVars doe je dus zo:
Code:
    sSender = TempVars![sSenderx][b].Value[/b]
 
Nog een Variant ?

PHP:
    sn = Split(Me.OpenArgs, "|")
    If UBound(sn) > 0 Then Me(strControlName) = sn(UBound(sn))
    If UBound(sn) > -1 Then Bijlagen_ID = sn(0)
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan