form openen als correctie of als aanvulling

Status
Niet open voor verdere reacties.

JEPEDEWE

Terugkerende gebruiker
Lid geworden
14 jun 2006
Berichten
1.697
ik vraag me af wat de beste manier is om volgende situatie op te lossen

Ik heb een tabel met de gegevens van een leerling (ook zij ID)
en een tabel met diens stagegevens
op de fiche van de leerling staat een knop. Als je deze aanklikt zou eerst in "stage_gegevens" gekeken moeten worden of voor deze leerling stage-gegevens beschikbaar zijn
indien dit zo is dan zoue er zich een form moeten openen met de gegevens (die dan aangepast zouden kunnen worden)
zijn er geen gegevens beschikbaar dan zou er zich een form moeten openen waarin deze gegevens aangevuld kunnen worden
Ik vroeg me af wat de beste weg is om dit te bereiken

dit had ik al bin het laden van deze "gegevens-form":
([Forms]![leerlingen]![Identificatie] is een uniek nummer van een leerling)

Private Sub Form_Load()
Dim db As Database
Dim tb As Recordset
Set db = CurrentDb()
Dim sql As String
sql = "SELECT Stage_evaluatie.*, Stage_evaluatie.nr_lln FROM Stage_evaluatie WHERE Stage_evaluatie.nr_lln = " & [Forms]![leerlingen]![Identificatie] & ";"
Set tb = db.OpenRecordset(sql)
If tb.RecordCount <> 0 Then
' hier zou het moeten gebeuren
else
' of hier
End If
End Sub

met dank
JP
 
Je bent er al bijna; je zou de rest er zelf al wel bij hebben moeten kunnen bedenken ;)

Code:
    strSQL = "SELECT nr_lln FROM Stage_evaluatie WHERE nr_lln = " & Me.Identificatie
    With CurrentDb.OpenRecordset(strSQL)
        If .RecordCount <> 0 Then
            DoCmd.OpenForm "Formulier1"
        Else
            DoCmd.OpenForm "Formulier2"
        End If
        .Close
    End With

Ik heb de code wat simpeler gemaakt; ingewikkelder mag uiteraard wel, maar waarom zou je :)
 
Me.Identificatie zal niet werken want "identificatie" komt van een andere form die op dat moment nog open staat

If .RecordCount <> 0 Then
DoCmd.OpenForm "Formulier1"
Else
DoCmd.OpenForm "Formulier2"
End If
.Close

dat OpenForm gedoe wist ik inderdaad ook, maar met de rest worstel ik al een tijdje...

Moet ik voor mijn concrete situatie 2 afzonderlijke formulieren aanmaken
maak ik die met unbound velden
hoe verwijs ik dan best naar het record dat ik wil hebben... maw... als er een record is welke code schrijf ik best zodat de waarden in de velden komen op het nieuwe formulier??

enfin, de rest krijg ik wel geprogrammeerd, maar erg omslachtig, er moet een betere "nettere" manier zijn

Graag een handje

JP
 
Als je weinig informatie geeft, krijg je algemene oplossingen :)
Je had het over 'aanvullen van gegevens' maar vermoedelijk bedoel je dat je een nieuw record wilt aanmaken. Het was voor mij ook niet duidelijk dat je het identificatienummer uit een ander formulier haalt; die code moet je dan uiteraard niet aanpassen. Als je dus eigenlijk hetzelfde formulier opent, de ene keer om een record toe te voegen, en de andere keer om een record te bewerken, dan wordt het zoiets:

Code:
    strSQL = "SELECT nr_lln FROM Stage_evaluatie WHERE nr_lln = " & Forms]![leerlingen]![Identificatie]
    With CurrentDb.OpenRecordset(strSQL)
        If .RecordCount <> 0 Then
            DoCmd.OpenForm "Formulier1", , , "nr_lln = " & Forms]![leerlingen]![Identificatie]
        Else
            DoCmd.OpenForm "Formulier1", , , , acFormAdd
        End If
        .Close
    End With

Overigens ziet code er beter uit als je hem opmaakt met de Code knop (knop #).
 
Ik hing jouw (heel lichtjes aangepaste) code aan een kop op de fiche van een leerling:

Private Sub Stage_knop_Click()
Dim db As Database
Dim tb As Recordset
Set db = CurrentDb()
Dim sql As String
sql = "SELECT Stage_evaluatie.*, Stage_evaluatie.nr_lln FROM Stage_evaluatie WHERE Stage_evaluatie.nr_lln = " & [Forms]![leerlingen]![Identificatie] & ";"
Set tb = db.OpenRecordset(sql)
With CurrentDb.OpenRecordset(sql)
If .RecordCount <> 0 Then
DoCmd.OpenForm "Stage_gegevens", , , "Nummer_lln = " & [Forms]![leerlingen]![Identificatie], , acDialog
Else
DoCmd.OpenForm "Stage_gegevens", , , , acFormAdd, acDialog
End If
.Close
End With
End Sub

Ik heb 2 problemen:
als er een nieuwe form aangemaakt wordt wordt de nummer van de leerling niet meegenomen en ingevuld in de nieuwe form
als er al ee record is dan opent er zich een dialoog-form "Enter parameter value" Nummer_lln
"Nummer_lln" is de naam van het veld waar de nummer in moet komen

enig idee?

Mercikes

JP vanuit Belgie met BIJNA een nieuwe regering... en een premier die nauwelijks nederlands praat
 
Ik zie dat je het concept van de code knop nog niet helemaal doorhebt ;)
Je opent de formulieren zonder een parameter mee te geven. Daardoor kun je uiteraard ook niks op het formulier doen verder. Zelf geef ik de parameters altijd mee als OpenArgs variabele. Die lees je dan vervolgens uit bij het openen van het formulier. In het geval van een bestaand record heeft dat uiteraard geen zin, want je zoekt dan een bestaand record op. De OpenArgs hoef je dus alleen mee te geven bij een nieuw record. Zoals gezegd: bij het openen van het formulier controleer je of de OpenArgs leeg is of niet, en in het laatste geval vul je dan het overeenkomende veld met de waarde uit de OpenArgs variabele.
 
Waar kan ik hier iets meer over lezen want dit is een brug te ver voor muj vrees ik!
 
Een simpel voorbeeldje helpt misschien :)

Op een formulier met een keuzelijst om artikelen te kiezen heb ik de volgende knop staan:
Code:
Private Sub cmdArtikel_Click()
Dim stDocName As String
Dim stLinkCriteria As String

    stDocName = "fArtikelNr"
    If Me![cboArtikel] & "" <> "" Then stLinkCriteria = "[ArtikelNr]=" & Me![cboArtikel]
    DoCmd.OpenForm stDocName, , , , , , stLinkCriteria

End Sub
Deze code maakt een filter stLinkCriteria aan als er een artikel is gekozen; is er geen keus gemaakt, dan is het stLinkCriteria leeg.
Op het formulier dat wordt geopend, staat deze code:
Code:
Private Sub Form_Open(Cancel As Integer)
    If Not Nz(Me.OpenArgs, "") = "" Then
        Me.Filter = Me.OpenArgs
        Me.FilterOn = True
    Else
        Me.Filter = ""
        Me.FilterOn = False
    End If
End Sub
Deze routine kijkt bij het openen van het formulier of er een waarde is in de variabele OpenArgs. Zo ja, dan wordt het filter toegepast en zie je het gekozen artikel. Zo nee (OpenArgs is leeg) dan is er geen filter op het formulier, en zie je alle records.

Je kunt OpenArgs ook gebruiken om bij nieuwe records een aantal velden te vullen met velden uit het eerste formulier. Dan is de code uiteraard iets anders, omdat je maar één string kunt meegeven in OpenArgs. Wat ik dan doe, is alle velden 'verzamelen' in één string met een scheidingsteken. Op het tweede formulier wordt de string vervolgens in een array uit elkaar getrokken, en worden de individuele arraywaarden aan de bijbehorende velden gezet. Heb je daar een voorbeeldje van nodig, dan kan dat uiteraard ook...
 
Laatst bewerkt:
Sorry Michel, raak er echt niet uit

De code achter de knop "Stage" op de leerlingenfiche is de volgende

Private Sub Stage_knop_Click()
Dim db As Database
Dim tb As Recordset
Set db = CurrentDb()
Dim sql As String
sql = "SELECT Stage_evaluatie.*, Stage_evaluatie.nr_lln FROM Stage_evaluatie WHERE Stage_evaluatie.nr_lln = " & [Forms]![leerlingen]![Identificatie] & ";"
Set tb = db.OpenRecordset(sql)
With CurrentDb.OpenRecordset(sql)
If .RecordCount <> 0 Then
DoCmd.OpenForm "Stage_gegevens", , , "nr_lln = " & [Forms]![leerlingen]![Identificatie], , acDialog
Else
DoCmd.OpenForm "Stage_gegevens", , , , acFormAdd, acDialog
End If
.Close
End With
End Sub

als er een record bestaat in de table dan wordt deze netjes getoond
een nieuw record wordt ook aangemaakt maar er worden geen waarden meegegeven

Dat Openargs-gedoe begrijp ik totaal niet

moet ik Openargs eerst als een string definieren in form1 voor ik form2 (met de stagegegevens) open?
moet ik dan aan Openargs een waarde toekennen

wat schrijf ik dan in de OnOpen eigenschap van form2
iets van Me.nummer_lln=Openargs of zo iets

alle, kom er niet uit

zal weer te moeilijk zijn voor een leek als ik vrees ik...

JP
 
denk dat ik iets ontdekte:

Ik veranderde de code in form1 als volgt

With CurrentDb.OpenRecordset(sql)
If .RecordCount <> 0 Then
DoCmd.OpenForm "Stage_gegevens", , , "nr_lln = " & [Forms]![leerlingen]![Identificatie], , acDialog
Else
DoCmd.OpenForm "Stage_gegevens", , , , acFormAdd, acDialog, [Forms]![leerlingen]![Identificatie]
End If
.Close
End With

blijkbaar heb ik dan een waarde aan Openargs gegeven

raar, want blijkbaar is de ze waarde een string een geen cijfer...
ik krijg iets als "8"
(terwijl dit veld het ID van die leerling bevat, wat een cijfer is en geen string)

in de OnOpen prop van form2 had ik eerst:

Private Sub Form_Open(Cancel As Integer)
Me.Nummer_lln = OpenArgs
End Sub

als ik de waarde van OpenArgs controleerde had ik "8"

dus ik schreef
Private Sub Form_Open(Cancel As Integer)
Me.Nummer_lln = Int(OpenArgs)
End Sub

beide codea gavan als foutmelding:

You can't assign a value to this object
 
Je bent consequent, wat op zich een fraaie eigenschap is, maar zou je code toch eens met de Code knop willen opmaken?
OpenArgs is (vermoed ik, zeker weten doe ik het niet) van het type Variant. Maakt verder ook niet uit, want de waarden worden toch wel goed overgenomen. De gebeurtenis Open werkt inderdaad niet altijd; in dat geval kun je beter Form_Load() gebruiken.
 
Sorry hoor, maart ik snap eigenlijk niet goed wat je bedoelt met
"maar zou je code toch eens met de Code knop willen opmaken"
Graag maar....enfin, snap niet waar je naartoe wil, maar wil heel graag leren

wat de code betreft:
Ik schreef:

Private Sub Form_Load()
Me.Nummer_lln = Int(OpenArgs)
End Sub


wat blijkbaar werk, de waarde van ID wordt meegenomen

maar

Er is wat fout in de code als er een record is:

With CurrentDb.OpenRecordset(sql)
If .RecordCount <> 0 Then
DoCmd.OpenForm "Stage_gegevens", , , "nr_lln = " & [Forms]![leerlingen]![Identificatie], , acDialog
Else
DoCmd.OpenForm "Stage_gegevens", , , , acFormAdd, acDialog, [Forms]![leerlingen]![Identificatie]
End If
.Close
End With

recordcount waarde = 1
er IS een record in de table
maar ik krijg een lege form...
Wat moet ik aanpassen???

Bedankt
 
Als je een berichtje maakt, heb je opmaak knoppen. Eén daarvan is de knop Code. Die ziet er zo uit: [ # ]. En daarmee maak je code op.

Wat betreft je code: daar mankeert op zich niks aan, maar is niet helemaal compleet. Je hebt twee varianten: de eerste opent het formulier met een filter, en de tweede moet een waarde toekennen aan een veld. Dat betekent dat er twee verschillende statussen van het tweede formulier zijn, die verschillende acties moeten triggeren. De code zou er zo uit moeten zien:
Op het formulier Leerlingen krijg je dit bij de knop.

Code:
Dim SQL As String

    SQL = "SELECT nr_lln FROM Stage_evaluatie WHERE nr_lln = " & Me.Identificatie
    With CurrentDb.OpenRecordset(SQL)
        If .RecordCount = 0 Then
            DoCmd.OpenForm "Stage_gegevens", , , , acFormAdd, acDialog, Me.Identificatie
        Else
            DoCmd.OpenForm "Stage_gegevens", , , "nr_lln = " & Me.Identificatie, , acDialog
        End If
        .Close
    End With

En bij het openen van het formulier Stage_gegevens deze code.

Code:
Private Sub Form_Load()
    If Not Nz(Me.OpenArgs, "") = "" Then
        If Me.DataEntry = True Then
            Me.nr_lln = Me.OpenArgs
        Else
            Me.Filter = Me.OpenArgs
            Me.FilterOn = True
        End If
    End If
End Sub
Deze kijkt of het formulier is geopend in Toevoegmodus (met acFormAdd op het eerste formulier ingesteld) door te kijken naar de formulierstatus DataEntry. Als die status waar is, dan moet het veld worden gevuld, is het niet waar, dan het formulier filteren.
 
sorry Michel maar een bestaand record wordt nog steeds niet getoond

Het is er wel (staat in table) maar ik krijg een leeg formulier te zien

Raar
 
Ik heb er maar 'even' een voorbeeldje van gemaakt. De db is gebaseerd op een andere vraag, dus kijk niet naar de gegevens...
 

Bijlagen

bedankt voor je bestandje

echter..; ik vind de fout niet

Een nieuwe record aanvullen lukt perfet

een bestaande tonen niet

als ik een stop zet in de OnLoad-code dan merk ik dat

Private Sub Form_Load()

Me.OpenArgs Null is....

Misschien heeft het hier iets mee te maken?
 
Dan wordt het tijd om zelf een bestand te posten :)
 
heb vanalles uit het programma gegooid maar het blijft nog te groot: 1,5MB

is er een alternatief?

Mvg
JP
 
Je mag 'm (gezipt) wel mailen.
 
Laatst bewerkt:
Er zit iets niet helemaal jofel in je db; hij groeit nogal fors bij het openen, om te beginnen. Verder vermoed ik dat je Stageformulier corrupt is, want hij herkent de codeaanroepen niet die er in zitten, en dat is altijd een veeg teken aan de wand. Ik heb daarom om e.e.a. te testen maar even een nieuw formulier gemaakt op basis van de tabel Stage_evaluatie. En de Stageknop heeft dan deze code:

Code:
Private Sub Stage_knop_Click()
Dim SQL As String
 
    SQL = "SELECT * FROM Stage_evaluatie WHERE nr_lln = " & Me.Identificatie
    With CurrentDb.OpenRecordset(SQL)
        If .RecordCount <> 0 Then
            DoCmd.OpenForm "fStage_evaluatie", , , "nr_lln = " & Me.Identificatie, , acDialog
        Else
            DoCmd.OpenForm "fStage_evaluatie", , , , acFormAdd, acDialog, Me.Identificatie
        End If
        .Close
    End With
End Sub

Op het formulier [fStage_evaluatie] moet de OpenArgs weer worden uitgelezen, maar alleen als die is meegegeven. Die check ziet er zo uit:
Code:
Private Sub Form_Load()
    If Not Nz(Me.OpenArgs, "") = "" Then
        Me.nr_lln = Me.OpenArgs
    End If
End Sub

En dan werkt alles als een zonnetje: ofwel hij filtert het formulier fStage_Evaluatie op Identificatie, ofwel hij vult'm in bij een nieuw record.
Maar ik zou het Stageformulier dus weggooien en opnieuw maken...
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan