[VBA] Access2k juiste formulier openen n.a.v. waarde in veld

Pagina: 1
Acties:

  • pea992
  • Registratie: November 2000
  • Laatst online: 02-02-2023
Hallo allemaal! Op het volgende loop ik vast:

Ik ben bezig met een database, waarin opdrachten kunnen worden aangemeld, waarin de aanmeld tabel uit 1 grote tabel bestaat. D.m.v. een keuzemenu voor het aanmelden, krijg je een "opdrachtspecifiek" formulier voor je neus, waaraan een autonr ID wordt gekoppeld (mede vandaar ook 1 tabel, en mede omdat er heel veel overlappende. Als degene die de opdracht heeft aangemeld nou achteraf de status wil bekijken, moet hij/zij via het ID nummer kunnen tracken wat de status is (een onderdeel van de database). De bedoeling is om dan de output weer in het juiste formulier te zien.

Nou is het met een simpele query makkelijk te maken om op ID te zoeken. Deze query werkt goed, maar vervolgens moet dus het juiste formulier geopend worden, en dit krijg ik niet voor mekaar.

Ik heb nu een knop "bekijk status" met daaraan een macro die "formulier openen" kiest. Als ik direct naar een van de 8 soorten formulieren verwijs, op basis van de query, dan krijg ik een perfecte output (alleen in 7/8 gevallen dus in een verkeerd formulier). Als ik een "tussen-/hulpformulier" maak dat geopend wordt, met in VBA iets in de trant van:
code:
1
2
3
Private Sub Form_Load()
IF [soort-opdracht] = "1" then docmd.openform "form1" _
ELSE [soort-opdracht] = "2" then docmd.openform "Form2" etc ... "Form8"

dan loopt-ie hopeloos in de knoop. Of hij geeft geen output meer van bestaande ID's of hij opent de hele tabel in een soort formulier (en dan blijven ze natuurlijk allemaal in hetzelfde formulier staan)...

Heeft er iemand een idee hoe ik dit probleem (anders) kan oplossen?

Alvast bedankt!

  • robjanssen
  • Registratie: September 2001
  • Laatst online: 02-08 16:10

robjanssen

Software Developer

Misschien een

code:
1
2
3
If [soort-opdracht] then [form1]
elseif [soort-opdracht] then [form2]
elseif [soort-opdracht] then [form3]


constructie gebruiken???

  • pea992
  • Registratie: November 2000
  • Laatst online: 02-02-2023
Hmmm... daar had ik ookal wat mee geprobeerd, maar ik krijg dan steeds een "else zonder if" compileerfout...? Enig idee wat ik hier over het hoofd zie?
[code]
IF [soort] = "offerte" Then DoCmd.OpenForm "offerte"
ElseIf [soort] = "overig" Then DoCmd.OpenForm "overig"
ElseIf [soort] = "rapport" Then DoCmd.OpenForm "rapport"
Else
MsgBox "Het referentienummer is niet gevonden." & Chr( _
13) & "Probeer het nogmaals", vbOKOnly, "Fout - Opdracht niet gevonden."
End If

  • Boss
  • Registratie: September 1999
  • Laatst online: 00:09

Boss

+1 Overgewaardeerd

Maak bij je opdrachten soorten een extra kolom aan in die tabel met daarin de naam van het te openen formulier. Dan kan je gewoon gebruiken
code:
1
docmd.openform [naam van die kolom]


Ik heb dat bij een paar databases gedaan en dat werkt prima.

The process of preparing programs for a digital computer is especially attractive, not only because it can be economically and scientifically rewarding, but also because it is an aesthetic experience much like composing poetry or music.


  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 26-06 10:37

OZ-Gump

terug van weggeweest

pea schreef op 06 July 2003 @ 14:08:
<...>
Enig idee wat ik hier over het hoofd zie?
code:
1
2
3
4
5
6
7
8
9
10
11
  IF [soort] = "offerte" Then
    DoCmd.OpenForm "offerte" 
  ElseIf [soort] = "overig" Then
    DoCmd.OpenForm "overig"
  ElseIf [soort] = "rapport"
    Then DoCmd.OpenForm "rapport"
  Else
    MsgBox "Het referentienummer is niet gevonden." & 
    Chr( 13) & "Probeer het nogmaals", vbOKOnly, 
    "Fout - Opdracht niet gevonden."
  End If
De fout die je hier maakt is dat na een ElseIf geen aparte else meer kan voorkomen in hetzelfde if-statement. Maak er dus of allemaal aparte if-statements van (ook allemaal met hun eigen End If dus!), of verzin een criterium welke je kunt gebruiken om van de losse else ook een ElseIf te maken.

Makkelijkste is natuurlijk een case in elkaar te draaien...!

[ Voor 43% gewijzigd door OZ-Gump op 06-07-2003 21:24 . Reden: verduidelijken ]

My personal website


  • pea992
  • Registratie: November 2000
  • Laatst online: 02-02-2023
ok, dat is inderdaad al een stap verder, bedankt!
Het enige is dat ik nu alle records krijg na de query, ipv het unieke met het id, allemaal geopend in het formulier dat bij de query output hoort.

Dus wat er moet gebeuren, is op een knop drukken -> query "welk ID status bekijken?" -> ID wordt gevonden en heeft ook een veld "soort" waarin 8 vaste mogelijkheden staan. Op basis van de waarde in het veld soort moet het bijhorende formulier worden geopend, met alleen dat ene unieke ID (tevens primaire sleutel).

Verwijderd

OZ-Gump schreef op 06 juli 2003 @ 21:21:
De fout die je hier maakt is dat na een ElseIf geen aparte else meer kan voorkomen in hetzelfde if-statement.
Weet je dat zeker?
Voor zover ik weet is het toch echt gewoon If.. Then.. ElseIf.. Else.. End If.
De fout die ik zie in de post van de TS en bij robjanssen, is dat de statements na de "Then" op dezelfde regel staan. Je hebt in VB 2 mogelijke constructies voor een If-statement, dat is ofwel alles op 1 regel, maar geen End If:
code:
1
If conditie Then statements [Else statements]

of:
code:
1
2
3
4
5
6
7
If conditie Then
  statements
[ElseIf conditie Then
  statements]
[Else 
  statements]
End If

  • ATS
  • Registratie: September 2001
  • Laatst online: 12-02 13:46

ATS

Met het DoCmd.OpenForm commando kan je meer argumenten meegeven dan alleen de formuliernaam. Kijk bijvoorbeeld eens naar het argument 'Filter'.

My opinions may have changed, but not the fact that I am right. -- Ashleigh Brilliant


  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 26-06 10:37

OZ-Gump

terug van weggeweest

Verwijderd schreef op 07 July 2003 @ 10:59:
[...]
Weet je dat zeker?
Voor zover ik weet is het toch echt gewoon If.. Then.. ElseIf.. Else.. End If.
De fout die ik zie in de post van de TS en bij robjanssen, is dat de statements na de "Then" op dezelfde regel staan.
You are so right... 8)7
In ieder geval heeft de TS volgens mij wel IETS aan mijn post gehad.

Verder is idd filter een goede parameter om naar te kijken als je maar een bepaald aantal records wil hebben.

[ Voor 23% gewijzigd door OZ-Gump op 07-07-2003 11:42 ]

My personal website


  • pea992
  • Registratie: November 2000
  • Laatst online: 02-02-2023
ATS - daar zat ik ook aan te denken, maar in docmd.openform moet ik EERST zeggen WELK formulier er geopend moet worden. Daar zit juist het hele probleem... In de tabel heb ik een autonummer ID, een hele lijst gegevens en een veld soort. Bij iedere "soort" aanmelding wordt een aangepast formulier geopend.

Bij het terugzoeken van de status moet dus bij het unieke ID (dat de gebruiker moet invoeren, maakt me niet veel uit hoe) het juiste formulier, dat aan het veld "soort" zit gekoppeld, worden geopend.

Het formulier dat hoort zit bij de waarde in veld "soort", mag dan dus ook maar 1 record bevatten, en niet door te bladeren zijn naar andere records... 't is wat ingewikkelder dan ik dacht volgens mij... :/

  • pea992
  • Registratie: November 2000
  • Laatst online: 02-02-2023
na nog heel wat gezoek en gepuzzel eindelijk een oplossing zoals ik 'm nodig heb (ook aan te passen voor dropdowns > afterupdate etc), bedankt voor het meedenken allemaal!
In dit geval verberg ik gewoon de tabbladen die ik niet nodig heb op het specifieke formulier als volgt:

code:
1
2
3
4
5
Private Sub Form_Current()
If [soort] = "PC" Then
 Me.TabbestEl0.Pages(1).Visible = False
 Else: Me.TabbestEl0.Pages(1).Visible = True
End If

waarbij: tabbestEl0 het tabblad besturingselement is; pages(#) de paginanummering aangeeft van de tabbladen (beginnend bij 0) en [soort] de kolomnaam is uit de tabel.

[ Voor 13% gewijzigd door pea992 op 09-07-2003 18:24 ]

Pagina: 1