Welkom op het forum van startpagina!

Dit forum staat op alleen-lezen. Je kan hier informatie zoeken en oude berichten terugvinden, maar geen nieuwe berichten plaatsen.

Naar overzicht van alle forums

subformulieren aanpassen

  • Sabrina

    Hoofdformulier = FrmNewTP

    Op hoofdformulier staat er een tabcontrol tabTP.

    Deze tabcontrol bestaat uit 9 pages.

    Op iedere page (behalve de 1e) staat een subformulier.

    subformulier op 2e page = subFrmRequest

    subformulier op 5e page = subFrmDescription

    subformulier op 6e page = subFrmCustomer

    Het subformulier op de 2e page bevat enkel checkboxen.

    Hier moet je 1 keuze maken.

    Afhankelijk van de keuze wil ik het volgende bereiken:

    - De velden van subformulier op 5e page en

    - De velden van subformulier op 6e page

    wil ik - enabled = true of false

    - backcolor instellen

    - standaardwaarde opgeven.

    Dus telkens wanneer een andere keuze gemaakt wordt op het subformulier van de 2e page, moet de subformulieren op de 5e en 6e page meewijzigen.

    Code die ik nu heb, maar niet werkt is de volgende:

    alles staat bij PAGE 2:

    Private Sub chkCStandard_Click()

    If not(chkCStandard.value = 0) then

    Call AanpassenOms (5e page aanpassen)

    Call AanpassenCus (6e page aanpassen)

    end if

    end sub

    Public Function AanpassenOms()

    Forms!FrmNewTP!subFrmDescription.Form!txtRequest.enabled = false

    Forms!FrmNewTP!subFrmDescription.Form!txtRequest.value = null

    enz… (alles instellen voor alle velden op subFrmDescription)

    End Function

    Public Function AanpassenCus()

    Forms!FrmNewTP!subFrmCustomer.Form!cmbCusRequester.enabled = false

    Forms!FrmNewTP!subFrmCustomer.Form!cmbCusRequester.value = null

    enz… (alles instellen voor alle velden op subFrmCustomer)

    End Function

    Voor het moment wordt er niets aangepast op die 2 andere subformulieren. Ik zie direct waaraan het kan liggen.

  • Eric

    Even wat zaken op een rij :

    Subformulieren welke een onderdeel vormen van een formulier worden door Access behandeld als een onderdeel van het formulier. Dus niet als een apart formulier!!. Dit kan je controleren met de functie ISFORMLOADED. Als je deze code in een modulel zet, en roept hem vervolgens aan in het het hoofdformulier ,dan zal je zien dat de functie FALSE retourneert op het moment dat je vraagt of het subformulier is geladen.

    Function ISFORMLOADED(ByVal strFormuliernaam As String) As Boolean

    Const conObjectgesloten = 0

    Const conOntwerpweergave = 0

    If SysCmd(acSysCmdGetObjectState, acForm, strFormuliernaam) <> conObjectgesloten Then

    If Forms(strFormuliernaam).CurrentView <> conOntwerpweergave Then

    ISFORMLOADED = True

    End If

    End If

    End Function

    Met deze wetenschap kan je een tweetal zaken stellen. Op het moment dat je een waarde wilt vullen in een subformulier doe je dat als volgt

    Veld eigenshappen of inhouden aanpassen vanuit module :

    Forms!.subFrmDescription.Form.testje.enabled=true

    Forms!.subFrmDescription.Form.testje.backcolor=0

    Vullen vanuit je hoofdformulier :

    Me.subFrmDescription.Form.testje.enabled=true

    Me.subFrmDescription.Form.testje.backcolor=0

    Goed betreffende de aanroep, maak deze sub aan in je module :

    Sub AanpassenOms (byval pnt as integer)

    ' veldnaam is in mijn geval testje moet je zelf even aanpassen

    select case pnt

    'aanpassen sub form subFrmDescription

    case 5

    Forms!.subFrmDescription.Form.testje.enabled=true

    Forms!.subFrmDescription.Form.testje.backcolor=0

    'aanpassen subFrmCustomer

    case 6

    Forms!.subFrmCustomer.Form.testje.enabled=true

    Forms!.subFrmCustomer.Form.testje.backcolor=0

    end select

    end sub

    Je aanroep wordt

    Private Sub chkCStandard_Click()

    If not(chkCStandard.value = 0) then

    AanpassenOms 5

    AanpassenOms 6

    end if

    end sub

    LET OP !! er is een kleine valkuil waardoor zaken niet goed gaan werken. De naam van je subformulier kan afwijken van de oorspronkelijke naam zoals deze is gedefineerd in je hoofdformulier. Stel je maakt een los formulier boekingen…en hangt deze later in in een factuur formulier, en je noemt hem vervolgens boekingenregels, dan moet je in de aanroep niet de oorspronkelijke formulier naam gebruiken maar de naam van het element dus boekingregels.

  • Sabrina

    Bedankt voor uw uitleg. Ik ben al een hele stap vooruit.

    Ik kreeg inderdaad false bij de isformloaded. Ik wist dat niet.

    Ik heb mijn code verplaatst naar een module en aangepast naar uw syntax.

    De code voor subFrmCustomer werkt volledig.

    Maar ik heb problemen met mijn code bij subFrmDescription.

    Op dat formulier zijn er 198 items die moeten aangepast worden aan de keuze die gemaakt wordt.

    Kan het zijn dat het te veel code wordt voor die module?

    Ik heb al zitten opsplitsen in case 41 tem 412.

    Zou die getallen een probleem opleveren?

    Hoeveel cases mag je hebben in een select case?

    Sub Aanpassen (ByVal pnt as integer)

    Case 4 'standaard subFrmDescription

    Forms!.subFrmDescription.Form.txtOtherDescription.Value = Null

    Forms!.subFrmDescription.Form.txtOtherDescription.Enabled = False

    Forms!.subFrmDescription.Form.txtOtherDescription.BackStyle = 0

    Forms!.subFrmDescription.Form.lblOtherDescription.BackStyle = 0

    Case 412 'subFrmDescription - keuze other

    Forms!.subFrmDescription.Form.txtOtherDescription.Enabled = True

    Forms!.subFrmDescription.Form.txtOtherDescription.Value = Null

    Forms!.subFrmDescription.Form.txtOtherDescription.BackStyle = 1

    Forms!.subFrmDescription.Form.lblOtherDescription.BackStyle = 1

    End Select

    End Sub

    Ik roep standaard eerst case 4 op om de layout van subFrmDescription aan te passen.

    Bepaalde items worden slechts bij 1 keuze gebruikt. Ik roep dan afhankelijk van de keuze case 41 tem 412 op.

    Kan ik problemen hebben dat ik eerst in case 4 zeg zo en dan in case 412 iets anders zeg voor dezelfde keuze?

    Ik heb eigenlijk nog nooit met modules gewerkt. Ik ken zijn mogelijkheden en beperkingen niet.

  • Eric

    Nee voor de code is dit geen bezwaar. Alleen voor jezelf wordt het wat lastiger (betreffende het onderhoud….vergens spreken we elkaar gewoon aan met je.

    In Modules stoppen we stukken code welke we meerdere malen gebruiken (aanroepen vanuit formulieren). Voorbeeldje is de functie IsformLoaded. De kracht van het geheel is dat op het moment dat er een fout in de code zit, je deze alleen in de module hoeft aan te passen. Scheelt dus onderhoud en tijd. Verder Algemene routines bewaar je en kan je gebruiken in je volgende project. Zelf heb ik een standaard database gevuld met een module met routines en een aantal standaard formulieren.

    Betreffende aansturing in case zoek de overeenkomsten en verschillen dat zorgt voor een reductie in je code.

    Verder vraag ik me wel af 198 items aanpassen…ik vraag me wel af waarmee je bezig bent????

  • Sabrina

    Ik heb nog 1 probleem.

    Wanneer ik mijn keuze verander, dan worden de subformulieren subFrmCustomer en subFrmDescription aangepast tot waar je het laatst ingevuld hebt.

    Het veld waar je het laatst iets ingevuld hebt, blijft onveranderd en de velden die daarna komen ook.

    Hoe moet ik dit omzeilen?

    Ik heb geprobeerd met de focus in het eerste veld te zetten voor de subformulieren aangepast worden (ook in de module), maar dan werkt het niet meer.

  • Sabrina

    Probleem is al opgelost