Keuzelijst waarde moet formulier verversen nadat nieuwe record is toegevoegd

Status
Niet open voor verdere reacties.

WiseGuy78

Gebruiker
Lid geworden
3 nov 2010
Berichten
50
Ik heb een keuzelijst van 7 kolommen waarin "balken" van een productielijn in staan. Middels het klikken op een record in deze keuzelijst worden de rest van de formuliervelden ververst. Op de volgende manier:

Private Sub Balk_AfterUpdate()
' De record zoeken die overeenkomt met het besturingselement
Dim rs As Object

Set rs = Me.Recordset.Clone
rs.FindFirst "[BalkID] = " & Me![Balk] & ""
If Not rs.EOF Then Me.Bookmark = rs.Bookmark
End Sub

Voor zover alles prima. Nu heb ik een formulier gemaakt waarop enkele gegevens van een nieuwe balk ingevuld dienen te worden. Als ik dit formulier sluit middels een OK knop dan roep ik een gebeurtenis op (onder "bij klikken") met de volgende VBA-code:

Private Sub OK_Click()

DoCmd.DoMenuItem acFormBar, acRecordsMenu, acSaveRecord, , acMenuVer70

Forms![Hoofdmenu].Requery
Forms![Hoofdmenu].Refresh

Forms![Hoofdmenu]![Balk] = Me![BalkID]
DoCmd.GoToRecord , , acLast

DoCmd.Close

Exit_OK_Click:
Exit Sub

Err_Ok_Click:
MsgBox Err.Description
Resume Exit_OK_Click

End Sub

Wat hier wel goed bij gaat, is dat de nieuwe balk in de keuzelijst komt te staan en dat deze ook geselecteerd is. Wat hij niet doet, is alle andere velden op het formulier versersen zodat deze de waarden van deze nieuwe balk hebben. Hij moet als het ware de eerste code (Private Sub Balk_AfterUpdate()) nogmaals uitvoeren.

Iemand een idee? Let wel mijn vba-programmeer skills zijn waardeloos...tis een kwestie van trial and error bij mij.
 
Nog afgezien van het feit dat je code inderdaad niet de best mogelijke is, snap ik niet wat je allemaal aan het doen bent; wat ik constateer in de OK knop is niet meer dan een hoop acties om een formulier te sluiten... Waarom je de keuzelijst wilt verversen is mij dus een raadsel, want de volgende stap die je doet is het sluiten van het formulier. Waarom wil je dan nog een keer die keuzelijst ververst hebben? Gebruiken doe je hem niet meer!

Code:
Private Sub OK_Click()
    On Error Goto Err_Ok_Click
    DoCmd.RunCommand acCmdSave
    DoCmd.Close acForm, Me.Form.Name
    Exit Sub

Err_Ok_Click:
MsgBox Err.Description
End Sub
Doet volgens mij exact hetzelfde.
 
Beste OctaFish,

Bedankt voor je reactie...ik heb even 2 afbeeldingen toegevoegd ter verduidelijking.

Hoofdmenu.jpg
Nieuwe balk.jpg

Ik wil dus dat formulier "nieuwe balk" zich sluit en de balk weergeven wordt in de keuzelijst op het hoofdmenu. Vervolgens dient de aangemaakte balk geselecteerd te zijn. Dit krijg ik met mijn geknutselde VBA-code nog voor elkaar. Met die van jou niet.

Wat ik niet voor elkaar krijg is dat de velden onder de keuzelijst ook de waarden weergeven van deze nieuwe balk.
 
OK, de situatie is dus dat je twee formulieren tegelijk open hebt, en dat je in het formulier <Nieuwe balk> een nieuw record toevoegt dat je dan in <Hoofdmenu> terug wilt zien... Dat is een iets andere situatie dan je in eerste instantie suggereerde.

Vraag is: hoe roep je het formulier <Nieuwe balk> aan vanuit het hoofdformulier?
Eventuele code graag opmaken met de CODE knop i.v.m. leesbaarheid ;)
 
Rechts op het scherm hoofdmenu staat een knop "Nieuw". Bij de gebeurtenis "Bij klikken" staat de volgende code:

Code:
Private Sub Nieuwe_balk_Click()
On Error GoTo Err_Nieuwe_order_Click

    Dim stDocName As String
    Dim stLinkCriteria As String

    stDocName = "Nieuwe_Balk"
    DoCmd.OpenForm stDocName, , , stLinkCriteria
    
Exit_Nieuwe_order_Click:
    Exit Sub

Err_Nieuwe_order_Click:
    MsgBox Err.Description
    Resume Exit_Nieuwe_order_Click
End Sub
 
Probeer 'm zo eens:

Code:
Private Sub Nieuwe_balk_Click()
On Error GoTo Err_Nieuwe_order_Click
Dim stDocName As String
Dim stLinkCriteria As String

    stDocName = "Nieuwe_Balk"
    Me.Form.Visible = False
    DoCmd.OpenForm stDocName, , , stLinkCriteria, , acDialog
    Me.Form.Visible = True
    Me.Requery
    Me.Balk.Requery
    Exit Sub

Err_Nieuwe_order_Click:
    MsgBox Err.Description
End Sub

Hiermee wordt het formulier <Nieuwe balk> modaal geopend. Je kunt nu alleen nog iets doen in dat nieuwe formulier; nadat het formulier is gesloten gaat de code verder met het vernieuwen van het hoofdformulier.
 
Ik snap je gedachte maar dit is niet de bedoeling. Ik wil dat het formulier "nieuwe balk" geopend blijft staan en dat het hoofdmenu op de achtergrond staat.
Het formulier wordt trouwens nu gesloten en weer geopend maar de waarden in alle overige velden is niet degene die in de keuzelijst actief staat.

Ik moet het toch zoeken in een code bij het sluiten van het formulier "nieuwe balk". Wat nu dus wel goed gaat, is dat de juiste record in de keuzelijst de focus krijgt. Alleen moet hij als het ware dan onderstaande code nog een keer uitvoeren (aangezien dat nu ook gaat als ik op dezelfde record in de keuzelijst klik):

Code:
Private Sub Balk_AfterUpdate()
' De record zoeken die overeenkomt met het besturingselement
Dim rs As Object

Set rs = Me.Recordset.Clone
rs.FindFirst "[BalkID] = " & Me![Balk] & ""
If Not rs.EOF Then Me.Bookmark = rs.Bookmark
End Sub

Misschien een idee hoe ik dit voor elkaar krijg?
 
Als je het formulier zichtbaar wil houden, gebruik je de regel Visible=False niet. Dan blijf je hem zien.
 
Octafish, dat snap ik...dat werkt dan ook. Maar jouw code (net als de mijne) 1 stap te weinig. Namelijk als het formulier gesloten wordt dan staat de record weliswaar tussen de keuzelijst maar alle overige velden op het hoofdmenu hebben nog de waarde van een ander record in de keuzelijst (namelijk de laatste record in de lijst: volgnr. 7 op 9-1-2012 [Adenco]).

Dus nog steeds de vraag: hoe krijg ik het voor elkaar dat de record die ik nieuw heb aangemaakt ook actief en weergegeven wordt?
 
Ik denk dat je met een Public variabele moet gaan werken, waarin je in het formulier <Nieuwe balk> het nummer zet bij sluiten van het formulier, en vervolgens op het Hoofdformulier de waarde opzoekt in de keuzelijst.
 
Dit heb ik al (nl. BalkID) en staat als niet zichtbaar ingesteld. Deze staat ook in de keuzelijst (met kolombreedte 0).

Ik weet niet hoe je de public code moet schrijven. Heb je een aanzet voor mij?

En is het echt niet mogelijk om bij het sluiten van formulier "nieuwe balk" de functie "Private Sub Balk_AfterUpdate()" van het hoofdmenu op te roepen ergens. Want dit werkt nu wel, maar alleen als ik op de record in de keuzelijst klik.
 
Een Public variabele kun je niet zichtbaar of onzichtbaar maken, en al helemaal niet in een keuzelijst zetten. Ik vermoed dus dat je niet weet wat een public variabele is...
In een (willekeurige) module zet je bovenaan:

Code:
Public iBalkNummer as Integer

En dat is je Public variabele. Bij het sluiten van het formulier Nieuwe Balk vul je de variabele met het nieuwe nummer dat je hebt gegenereerd, en op het hoofdformulier gebruik je de variabele om, nadat de keuzelijst is ververst, om het nummer te selecteren. Met de code die je al hebt.
 
OctaFish, helemaal gelijk...ik weet niet wat een Public variabele is...laat staan dat ik nu weet hoe te programmeren.
Ontzettend bedankt voor je hulp...dus zou je wellicht een voorzetje kunnen geven van een code? Wellicht mag ik je even mijn database sturen zodat je eens kunt kijken?
 
Als je dat wilt, mag je 'm wel mailen. Dan kijk ik er wel even naar.
 
Laatst bewerkt:
Met een Public variabele is het in beginsel op te lossen. In bijgaande db heb ik een paar aanpassingen gedaan; zo wordt er nu ook automatisch een nieuw volgnummer meegegeven aan het formulier.
 
Laatst bewerkt:
Octafish, bedankt voor je aanpassingen!
Alleen doet hij nog steeds niet wat ik eigenlijk wil. Ik weet niet of je bedoeld dat ik de public variabele nu zelf moet aanpassen, want ik zou niet weten hoe dit moet. Maar het volgende is nogmaals de bedoeling:

Nadat er een balk is aangemaakt moet a) het formulier "nieuwe balk" zich sluiten, b) in de keuzelijst de nieuwe balk zichtbaar zijn én c) moet de nieuwe balk actief staan zodat ik meteen alle andere velden kan invullen van deze nieuwe balk. Dit laatste punt doet hij nog steeds niet.

Kleine vraag nog: het volgnummer zou per dag gelden. Dus iedere dag begint het volgnummer weer op 1. Dit gebruik ik om het aantal balken per dag te tellen.
 
Volgens mij moet je de functie voor het volgnummer zelf kunnen aanpassen, gezien de omvang van je db :) De Public variabele doet niet meer dan 'zijn'... Dus daar hoef je weinig aan te doen, behalve hem een keer te definiëren. Daarna kun je hem gebruiken.
Je volgnummer is dus blijkbaar niet uniek, en kan dan ook niet gebruikt worden om de juiste record op te zoeken in het formulier; daarvoor moet je dan BalkID gebruiken. Bijgewerkte versie dus!
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan