Sorteren subformulier werkt niet

Status
Niet open voor verdere reacties.

Jintra

Gebruiker
Lid geworden
17 mrt 2016
Berichten
31
Goedenavond,

Ik zit met een probleem waar ik niet uit kom. Ik heb een formulier waar je informatie over personeel kan invoeren en zien zoals: Medewerker_ID, Voornaam, achternaam, adres enzovoorts.

Nu heb ik van de labels die ik zojuist heb genoemd knoppen gemaakt, zodat je hier op kan klikken om bijvoorbeeld te sorteren op Medewerker_ID (van a-z).

Hiervoor heb ik een functie gebruikt van octafish namelijk:
Code:
Function fSort (frmName As String, fldName As String)
Dim sTmp() As String, i As Integer, sSort As String
sSort = ""
If Forms(frmName).OrderBy = fldName Then
    Forms(frmName).OrderByOn = True
    If InStr(1, fldName, ",") > 0 Then
        sTmp = Split(fldName, ",")
        For i = 0 To UBound(sTmp)
            sTmp(i) = Trim(sTmp(i))
            If i = 0 Then
                sSort = sSort & sTmp(i) & " DESC"
            Else
                sSort = sSort & sTmp(i) & " ASC"
            End If
            If i < UBound(sTmp) Then sSort = sSort & ", "
        Next i
        Forms(frmName).OrderBy = sSort
    Else
        Forms(frmName).OrderBy = fldName & " DESC"
    End If
Else
    Forms(frmName).OrderByOn = True
    Forms(frmName).OrderBy = fldName
End If
End Function

En om deze functie aan te roepen in het formulier een clickevent (als voorbeeld Medewerker_ID):
Code:
Private Sub btnMedewerker_ID_Click()
fSort Me.Form.Name, "Medewerker_ID"
End Sub

Dit werkt allemaal prima als je het formulier zelfstandig opent, maar als ik het formulier open als subformulier in een ander formulier bijvoorbeeld in een navigatievenster, dan geeft hij de volgende melding: Microsoft Access kan het formulier Medewerkers invoer niet vinden waarnaar wordt verwezen.

Iemand enig idee hoe ik de functie correct kan aanroepen in het subformulier?

Alvast bedankt!
 
Laatst bewerkt:
Uit de help van microsoft

To refer to a control on a subform

Code:
Forms![main form name]![subform control name].Form![control name]
 
Dat had ik ook al gevonden alleen zelfs als ik het volgens die methode doe krijg ik een foutmelding.
Code:
Private Sub btnMedewerker_ID_Click()
    fSort Forms![F_Hoofdmenu]![F_Medewerker].Form![Medewerker_ID], "Medewerker_ID"
End Sub
Als ik dit invoer ziet hij het formulier F_Medewerker als een veld, dit blijkt uit de volgende foutmelding: Kan het veld F_Medewerker niet vinden waarnaar wordt verwezen in de expressie. Enig idee waardoor dat komt?

Uit de help van microsoft

To refer to a control on a subform

Code:
Forms![main form name]![subform control name].Form![control name]
 
Laatst bewerkt:
Ik gebruik altijd dit document om op te zoeken hoe ik moet verwijzen naar subformulieren etc.
 

Bijlagen

Bedankt voor het documentje! Ik ga er even naar kijken en dit komt sowieso altijd wel van pas
 
Ik heb aan de hand van het document geprobeerd het clickevent aan te passen, maar hij blijft het tweede formulier wat ik opgeef (subformulier) zien als een veld en niet als formulier. Hij geeft dus aan dat hij het veld niet kan vinden terwijl dat eigenlijk een formulier is. De fout ontstaat bij de volgende code:
Code:
fSort Forms![F_Hoofdmenu]![F_Medewerkers].Form![Medewerker_ID], "Medewerker_ID"

Nogmaals ziet hij F_Medewerkers als een veld..
Wat doe ik hier fout?
 
Ik heb de functie iets aangepast, en die ziet er nu zo uit:
Code:
Function fSort(frm As Form, fldName As String)
Dim sTmp() As String, i As Integer, sSort As String
    
    sSort = ""
    If frm.OrderBy = fldName Then
        frm.OrderByOn = True
        If InStr(1, fldName, ",") > 0 Then
            sTmp = Split(fldName, ",")
            For i = 0 To UBound(sTmp)
                sTmp(i) = Trim(sTmp(i))
                If i = 0 Then
                    sSort = sSort & sTmp(i) & " DESC"
                Else
                    sSort = sSort & sTmp(i) & " ASC"
                End If
                If i < UBound(sTmp) Then sSort = sSort & ", "
            Next i
            frm.OrderBy = sSort
        Else
            frm.OrderBy = fldName & " DESC"
        End If
    Else
        frm.OrderByOn = True
        frm.OrderBy = fldName
    End If
End Function
Dan moet de aanroep uiteraard ook anders, anders lukt het niet. Ik gebruik zelf tegenwoordig de eigenschap Tag (<Extra info> in Eigenschappen) om de sortering te starten; dan kun je de functieaanroep makkelijker kopiëren. Dus bij mij is het dan:
Code:
Private Sub start_datum_Bijschrift_Click()
Dim frm As Form
    Set frm = Forms!fStamkaart!fSub_Activiteiten.Form
    fSort frm, frm.start_datum_Bijschrift.Tag
End Sub

Code:
Private Sub eind_datum_Bijschrift_Click()
Dim frm As Form
    Set frm = Forms!fStamkaart!fSub_Activiteiten.Form
    fSort frm, frm.eind_datum_Bijschrift.Tag
End Sub
 
Heb je ook een voorbeeldje, dat ik kan zien hoe het is toegepast?
 
Dat wordt een beetje lastig, want die heb ik thuis staan. En de werkdb is uiteraard niet geschikt om publiek te gooien. Maar als je de functie zo overneemt, en een kleine aanpassing doet in je eigen db zou dit moeten werken:
Code:
Private Sub btnMedewerker_ID_Click()
Dim frm As Form
    Set frm = Forms!F_Hoofdmenu!F_Medewerkers.Form
    fSort frm, frm.btnMedewerker_ID.Tag
End Sub
In de eigenschap <Extra Info> van het label [btnMedewerker_ID] zet je dan: [Medewerker_ID]
 
Nee dat snap ik en maakt verder ook niet uit.

Ik heb het precies zo gedaan als jij zegt, maar alsnog zegt hij dat die het veld F_Medewerkers niet kan vinden en dat is logisch want dat veld bestaat ook niet.
Hij zou hem moeten zien als een (sub)formulier en ik snap maar niet hoe access bij mij aangeeft dat die het veld niet kan vinden.

Dit zou toch moeten werken als je een knop op een formulier hebt staan en dit formulier als subformulier hebt geladen op een hoofdformulier?
 
Hij zou hem moeten zien als een (sub)formulier en ik snap maar niet hoe access bij mij aangeeft dat die het veld niet kan vinden.
Hier maak je een kleine denkfout, vrees ik. Een verklaarbare, maar desalniettemin: een principefoutje. Je hebt een formulier, en dat is in Access begrippen een object. Op dat object kun je andere objecten zetten, zoals knoppen en tekstvakken. Eén van de beschikbare objecten is het object Subformulier. Logischerwijze zet je in dat object een formulier. Subformulieren als zodanig bestaan niet: een subformulier is hoe dan ook altijd een formulier. En daar zit de denkfout. Enige verschil: wat wij dus een 'subformulier' noemen, is niks anders als een 'formulier' dat in een subformulier object is geplaatst.

En nou komt het: alle objecten hebben een eigen naam. Dat moet wel, anders kan Access nooit naar een object verwijzen. Een formulier heeft dus een naam, en in jouw geval heb je dus 2 formulieren op dat formulier: [F_Hoofdmen] en [F_Medewerkers]. Maar het formulier [F_Medewerkers] staat dus in een subformulierobject, en dat heeft ook een naam! En als je verwijzingen maakt naar objecten op/in een ander object, dan moet je naar de juiste naam verwijzen. En ik vermoed dat het object subformulier een andere naam heeft dan [F_Medewerkers]. En daarom kan Access het niet vinden! Dus eigenlijk heel logisch.

Om even mijn eigen code erbij te halen: ik heb dus een formulier [fStamkaart], en een formulier [fActiviteiten]. Dat laatste staat op het eerste als subformulier. Deze code werkt echter niet:
Code:
    Set frm = Forms!fStamkaart!fActiviteiten.Form

Deze wel!
Code:
    Set frm = Forms!fStamkaart!fSub_Activiteiten.Form
Wat is het verschil? het subformulier object heet [fSub_Activiteiten]! Dat ik in het object een formulier zet dat [fActiviteiten] heet, is eigenlijk helemaal niet interessant. Ik kan daar probleemloos een ander formulier inzetten door de eigenschap <Bronobject> te veranderen. Dat verandert helemaal niks aan het object [Subformulier]. Om een lang verhaal kort te maken: selecteer dus het subformulier object, ga naar de Eigenschappen en controleer/verander daar de naam op het tabblad <Overige>. Ik zorg er dus altijd voor (zeker als ik het nodig heb in de code) dat de naam van het formulier anders is als de naam van het object subformulier. Op die manier krijg je nooit problemen met het aanroepen van controls etc van een object, omdat je met unieke namen werkt.
 
Ontzettend bedankt voor je uitgebreide uitleg octafish en natuurlijk zoals we van je gewend zijn, werkt het!

Ik verwees inderdaad telkens naar het formulier [F_Medewerkers] in plaats van naar het object subformulier, deze had de naam fSub_Medewerkers en toen ik dit wijzigde werkte het direct.

Weer wat geleerd, ik zet hem op opgelost!:thumb:
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan