Detailformulier instellen

Status
Niet open voor verdere reacties.

HJD1986

Gebruiker
Lid geworden
28 mrt 2017
Berichten
61
Beste forumleden,

Ik heb een formulier met offertes en in dit formulier een subformulier met offerte-inhoud. Dit subformulier wordt getoond als gegevensweergave. Nu heb ik in dit subformulier een veld genaamd artikel tekst.
Als ik op dit veld klik wil ik dat er een formulier opent waarin ik veld kan invullen (puur vanwege weergave technische redenen).

Ik heb een formulier artikeltekst gecreëerd en dit wordt middels een macro geopend als ik op het veld artikeltekst in het subformulier klik. Echter als ik het veld vul en sluit krijg ik de volgende opmerking: u kunt geen record toevoegen of wijzigen omdat voor de tabel offerte een gerelateerde record vereist is.

Wat doe ik fout?
 
Geen idee; je hebt vast code staan in dat formulier en die zal wel het e.e.a. willen doen. Dus zonder voorbeeldje, wordt het érg lastig. Ik gebruik dit soort constructies zelf ook (zelfs met één 'zoomformulier' dat op meerdere velden te gebruiken is) en nooit een probleem van dit soort gehad.
 
Begrijpelijk.
Onderstaande vond ik in de online help van access. Deze code heb ik gebruikt in mijn macro en de betreffende velden gewijzigd.
Zie ook https://support.office.com/nl-nl/article/Formulieren-koppelen-4d5e8143-1859-4521-bbba-215f5ec8bb39


<?xml version="1.0" encoding="UTF-16" standalone="no"?> <UserInterfaceMacros xmlns="http://schemas.microsoft.com/office/accessservices/2009/11/application"> <UserInterfaceMacro For="ID" Event="OnClick"><Statements><Action Name="OnError"><Argument Name="Goto">Macro Name</Argument><Argument Name="MacroName">ErrorHandler</Argument></Action> <ConditionalBlock><If><Condition>[Form].[Dirty]</Condition><Statements><Action Name="SaveRecord"/></Statements></If></ConditionalBlock> <ConditionalBlock><If><Condition>IsNull([ID])</Condition><Statements><Comment>Open the form to a new record if the current ID is Null</Comment><Action Name="OpenForm"><Argument Name="FormName">frmContactDetails</Argument><Argument Name="DataMode">Add</Argument><Argument Name="WindowMode">Dialog</Argument></Action><Action Name="Requery"/></Statements></If><Else><Statements><Comment>Use a TempVar to pass a filter to the OpenForm action</Comment><Action Name="SetTempVar"><Argument Name="Name">Contact_ID</Argument><Argument Name="Expression">[ID]</Argument></Action><Action Name="OpenForm"><Argument Name="FormName">frmContactDetails</Argument><Argument Name="WhereCondition">[ID]=[TempVars]![Contact_ID]</Argument><Argument Name="DataMode">Edit</Argument><Argument Name="WindowMode">Dialog</Argument></Action><Action Name="RemoveTempVar"><Argument Name="Name">Contact_ID</Argument></Action><Action Name="RefreshRecord"/></Statements></Else></ConditionalBlock> </Statements></UserInterfaceMacro></UserInterfaceMacros>

Maar Ik weet niet precies of deze code zou moeten doen waarnaar ik op zoek ben.
 
Jouw code opent een formulier op basis van het sleutelveld van het hoofdformulier, niet de inhoud van het tekstveld. daarvoor heb je toch een niet-afhankelijk formulier nodig. Met macro's kan ik het sowieso niet, dus daarvoor moet je niet bij mij zijn. Maar met VBA kan ik het gelukkig wel, en is het vrij simpel.
Om te beginnen: maak een formulier met één (groot) tekstveld, en een knop om te sluiten. Dat formulier (ik noem 'm "fNotitie", maar elke naam is natuurlijk goed) wordt geopend met een klikactie op het gewenste tekstveld. De inhoud van dat tekstveld wordt dan in het zoomformulier in het tekstveld gezet waar het bewerkt kan worden. Door het formulier te sluiten, zet je de bewerkte tekst weer terug in het oorspronkelijke tekstveld.

De resp. stappen zien er dan zo uit:
Stap 1: het tekstveld (voorbeeld: Leefomstandigheden) krijgt de actie <Bij klikken>: =NotitieBewerken([Leefomstandigheden])

Stap 2: de functie NotitieBewerken wordt gestart. Deze ziet er zo uit:
Code:
Function NotitieBewerken(ctl As Control)
Dim bC As Integer
    On Error GoTo Hell
    Application.TempVars.Remove "varNotitie"
    If ctl.Text & "" = vbNullString Then
        bC = MsgBox("Wil je nieuwe tekst invoegen?", vbYesNo, "Nieuwe notitie")
        If bC = vbYes Then
            Application.TempVars.Add "varNotitie", ""
            DoCmd.OpenForm "fNotitie", WindowMode:=acDialog, OpenArgs:=TempVars("varNotitie")
        Else
            Exit Function
        End If
    Else
        Application.TempVars.Add "varNotitie", ctl.Value
        DoCmd.OpenForm "fNotitie", WindowMode:=acDialog
    End If
    ctl.Value = TempVars("varNotitie") & ""

Hell:
End Function
Deze functie maakt een TempVar "varNotitie" aan en opent het formulier "fNotitie" in de Dialog modus. Hierdoor stopt de code tot het formulier weer wordt afgesloten. Daarna wordt de inhoud van de TempVar in het object teruggezet.

Stap 3: Het formulier fNotitie wordt geopend en de inhoud van de TempVar "varNotitie" wordt in het tekstveld [Notitie] gezet voor bewerking.
Code:
Private Sub Form_Load()
    If Len(TempVars("varNotitie")) > 2000 Then
        Me.notitie.ScrollBars = 2
        Me.Repaint
    Else
        Me.notitie.ScrollBars = 0
    End If
    If Len(TempVars("varNotitie")) > 0 Then
        With Me.notitie
            .SetFocus
            .Value = TempVars("varNotitie")
            If Len(TempVars("varNotitie")) > 2000 Then
                .SelStart = Len(.Text)
            Else
                .SelStart = 0
            End If
        End With
    End If
End Sub

De Sluitcode ziet er dan zo uit:
Code:
Private Sub cmdSluiten_Click()
    TempVars("varNotitie").Value = Me.notitie.Value
    DoCmd.Close acForm, Me.Form.Name
End Sub

En daarmee kom je weer terug in stap 2, waar de variabele terug wordt gezet in het juiste tekstveld.

Het mooie van dit principe is, dat je het op elk willekeurig tekstveld kunt gebruiken; maakt niet uit of dat een memo veld is, of een tekstveld.
 
Hallo Octafish,

Ben ik even blij dat jij thuis bent in VBA. Het maakt voor mij niet uit, als het maar werkt.
Ik ga gelijk aan de slag!

Erg leuk om te ontdekken dat er zoveel mogelijkheden zijn in access! Super leerzaam en leuk om te doen.

Bedankt!
 
Kom je er niet uit: post een voorbeeldje, dan zet ik mijn formulier (en code) er wel in.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan