Enkel eerste deel van code werkt

Status
Niet open voor verdere reacties.

Scallebe

Gebruiker
Lid geworden
29 okt 2014
Berichten
535
Goede avond ontwikkelaars,

Ik heb onderstaande code reeds gebruikt in een eerdere DB waar het perfect werkt.

Het dient om te vermijden dat de gebruiker vergeet een veld in te vullen of een item te selecteren uit de diverse DropDown-menu's.

Voor zover ik weet, na veelvuldig nazicht heb ik zeker de juiste benamingen in de verschillende onderdelen gebruikt.

Enkel het eerste stuk voor "BenamingID" reageert als er geen selectie is toegepast.

Code:
Private Sub btnBewaarNP_Click()

If IsNull(Me.BenamingID) Then
Beep
    MsgBox "Selecteer een Benaming aub...", vbOKOnly, "OPGELET!"
    Me.cboBenaming.SetFocus
    Me.cboBenaming.Dropdown
    Exit Sub
End If

If IsNull(Me.MateriaalID) Then
Beep
    MsgBox "Selecteer een Materiaal a.u.b.", vbOKOnly, "OPGELET!"
    Me.cboMateriaal.SetFocus
    Me.cboMateriaal.Dropdown
    Exit Sub
End If

If IsNull(Me.Disc_ModelID) Then
Beep
    MsgBox "Selecteer een Disc Model a.u.b.", vbOKOnly, "OPGELET!"
    Me.cboDiscModel.SetFocus
    Me.cboDiscModel.Dropdown
    Exit Sub
End If

If IsNull(Me.Vorm_PiercingID) Then
Beep
    MsgBox "Selecteer een Piercing Vorm a.u.b.", vbOKOnly, "OPGELET!"
    Me.cboVormPiercing.SetFocus
    Me.cboVormPiercing.Dropdown
    Exit Sub
End If

If IsNull(Me.PlaatsID) Then
Beep
    MsgBox "Selecteer een Plaats a.u.b.", vbOKOnly, "OPGELET!"
    Me.cboPlaats.SetFocus
    Me.cboPlaats.Dropdown
    Exit Sub
End If

If IsNull(Me.Diameter_StaafjeID) Then
Beep
    MsgBox "Selecteer een Diameter Staafje a.u.b.", vbOKOnly, "OPGELET!"
    Me.cboDiameterStaafje.SetFocus
    Me.cboDiameterStaafje.Dropdown
    Exit Sub
End If

If IsNull(Me.Lengte_StaafjeID) Then
Beep
    MsgBox "Selecteer een Lengte Staafje a.u.b.", vbOKOnly, "OPGELET!"
    Me.cboLengteStaafje.SetFocus
    Me.cboLengteStaafje.Dropdown
    Exit Sub
End If

If IsNull(Me.SchroefdraadID) Then
Beep
    MsgBox "Selecteer een Schroefdraad a.u.b.", vbOKOnly, "OPGELET!"
    Me.cboSchroefdraad.SetFocus
    Me.cboSchroefdraad.Dropdown
    Exit Sub
End If

If IsNull(Me.Kleur_BolletjeID) Then
Beep
    MsgBox "Selecteer een Kleur Bolletje a.u.b.", vbOKOnly, "OPGELET!"
    Me.cboKleurBolletje.SetFocus
    Me.cboKleurBolletje.Dropdown
    Exit Sub
End If

If IsNull(Me.Inkoopprijs) Then
Beep
    MsgBox "Geef een Inkoopprijs a.u.b.", vbOKOnly, "OPGELET!"
    Me.Inkoopprijs.SetFocus
    Exit Sub
End If

If IsNull(Me.Verkoopprijs) Then
Beep
    MsgBox "Geef een Verkoopprijs a.u.b.", vbOKOnly, "OPGELET!"
    Me.Verkoopprijs.SetFocus
    Exit Sub
End If

End Sub

Wat doe ik verkeerd of waarom gaat de code niet verder met de controle?

Bedankt

Groetjes

Pascal
 
Haal die Exit Sub regels er eens uit.
 
Weet je zeker dat je wilt stoppen met de procedure als één van de gevraagde waarden leeg is? Persoonlijk loop ik ze liever allemaal door, en zet alle ‘vergeten’ objecten in een string als melding op het eind.
En nog een trucje: maak de opslaan knop disabled totdat alle velden zijn ingevuld, ben je gelijk van de ellende af.
 
Ik heb jouw code getest in de db die ik heb (da's niet dezelfde, want er zitten minder velden in) maar daar kon ik de oorzaak wel achterhalen, want daar werkte jouw code ook niet. En die oorzaak is eigenlijk heel simpel: je test op een waarde die op dat moment niet in het veld zit. Dus worden de velden overgeslagen. De reden dat de velden niet leeg zijn ligt in de inrichting van de tabel. Je gebruikt numerieke velden in de tabel, en die hebben allemaal een Standaardwaarde. En die standaardwaarde is 0. En 0 is niet hetzelfde als Null. En dus wordt je code niet uitgevoerd. De meest simpele oplossing is natuurlijk om die standaardwaarde weg te halen bij de numerieke velden, want dan kun je deze code wél gebruiken.
Een andere optie is om de check aan te passen. Dan krijg je dus dit:
Code:
    If Me.cboDiameterStaafje = 0 Then
    Beep
        MsgBox "Selecteer een Diameter Staafje a.u.b.", vbOKOnly, "OPGELET!"
        Me.cboDiameterStaafje.SetFocus
        Me.cboDiameterStaafje.Dropdown
        Exit Sub
    End If

Zelf gebruik ik bij numerieke velden zelden een standaardwaarde, want dat is doorgaans onzinnig. En al helemaal niet het cijfer 0, want als het goed is gebruik je dat nergens voor. Als je een koppelveld hebt met een sleutelveld uit een andere tabel, dan begint dat veld sowieso met 1 en niet met 0. En daarnaast wil je meestal zelf kiezen. Ik gebruik een standaardwaarde hooguit bij velden waarin je een Aantal invult, bijvoorbeeld bij bestellingen. Dan is 0 uiteraard ook weer een hele onhandige waarde :).
Ik raad je dus aan om de standaardwaarden te verwijderen, en dan ben je klaar.
 
Goede morgen

Bedankt voor jullie reactie, :thumb:

#Edmoor,

Ik heb er de Exit Sub's uitgehaald en wanneer ik geen enkel veld invul (om te testen of access alle onderdelen zou afhandelen) krijg ik alle waarschuwingen dat de velden leeg zijn zonder naar het desbetreffende veld te gaan om iets te selecteren.

Wanneer ik in het eerste veld (Benaming) wel iets selecteer gaat Access de rest van de velden niet meer controleren.

De code heb ik van een eerder gemaakte DB waar ze perfect werkt. De Exit Sub zijn er wel en Access geeft enkel waarschuwingen bij de lege velden met de reactie om iets in te vullen.

Zie hier de originele code die ik dan aangepast heb voor de nieuwe DB. (Ik heb enkel het waarschuwingsgedeelte voor de lege velden gebruikt)

Waarschijnlijk zal ik wel een onderdeel van die code ook moeten plaatsen in de nieuwe... Maar ik ben niet ervaren genoeg om te herkennen of te weten welk gedeelte. Deze code is ook grotendeels opgebouwd met jullie hulp.

Code:
Private Sub cmdEmail_Click()
On Error GoTo cmdEmail_Click_Err
If IsNull(Me.Hoeveel) Then
Beep
    MsgBox "Vul een aantal in ..." & vbLf & vbLf & "Entrez un nombre ...", vbOKOnly, "OPGELET! - ATTENTION!"
    Me.Hoeveel.SetFocus
    Exit Sub
End If
If IsNull(Me.Wat) Then
Beep
    MsgBox "Wat vraag je?" & vbLf & vbLf & "Ce que vous demandez?", vbOKOnly, "OPGELET! - ATTENTION!"
    Me.Wat.SetFocus
    Me.Wat.Dropdown
    Exit Sub
End If
If IsNull(Me.Op_datum_van___à_la_date_du) Then
Beep
    MsgBox "Op datum van :" & vbLf & vbLf & "A la date du :", vbOKOnly, "OPGELET! - ATTENTION!"
    Me.Op_datum_van___à_la_date_du.SetFocus
    Exit Sub
End If
If IsNull(Me.Dagindeling) Then
Beep
    MsgBox "Kies een Dagindeling" & vbLf & vbLf & "Choisir une Horaire quotidien", vbOKOnly, "OPGELET! - ATTENTION!"
    Me.Dagindeling.SetFocus
    Me.Dagindeling.Dropdown
    Exit Sub
End If
If IsNull(Me.txtTot) Then
Beep
    MsgBox "Tot :" & vbLf & vbLf & "Jusqu'à :", vbOKOnly, "OPGELET! - ATTENTION!"
    Me.txtTot.SetFocus
    Exit Sub
End If
If IsNull(Me.Dagindeling2) Then
Beep
    MsgBox "Kies een Dagindeling" & vbLf & vbLf & "Choisir une Horaire quotidien", vbOKOnly, "OPGELET! - ATTENTION!"
    Me.Dagindeling2.SetFocus
    Me.Dagindeling2.Dropdown
    Exit Sub
End If
If IsNull(Me.Comment) Then
Beep
    MsgBox "Vul een Commentaar in a.u.b." & vbLf & vbLf & "Entrez un commentaire s.v.p.", vbOKOnly, "OPGELET! - ATTENTION!"
    Me.Comment.SetFocus
    Exit Sub
End If
If IsNull(Me.cbo1) Then
Beep
    MsgBox "Kies een Versturen naar - choisir une Envoyer à", vbOKOnly, "OPGELET! - ATTENTION!"
    Me.cbo1.SetFocus
    Me.cbo1.Dropdown
    Exit Sub
End If
    'If Me.Dirty Then Me.Dirty = False
    If Me.Dirty Then
        Dim strMsg As String
        Dim iResponse As Integer
        ' Specify the message to display.
        Beep
        strMsg = "Wil je deze aanvraag bewaren?" & vbLf & "Klik ''Yes'' om te bewaren of ''No'' om af te sluiten." & vbLf & vbLf
        strMsg = strMsg & "Voulez-vous enregistrer cette demande?" & vbLf & "Cliquez sur ''Yes'' pour enregistrer ou sur ''No'' pour fermer." ' Display the message box.
        iResponse = MsgBox(strMsg, vbQuestion + vbYesNo, "Save Record?")
                
        ' Check the user's response.
        If iResponse = vbNo Then
           ' Undo the change.
           Me.Undo
           Me.Hoeveel.SetFocus
           Exit Sub
           ' Cancel the update.
        Else
            On Error Resume Next
            bolErrorHandled = True
            DoCmd.RunCommand acCmdSaveRecord
            bolErrorHandled = False
            On Error GoTo 0
        End If
        Me.Hoeveel.SetFocus
    
    End If
    DoCmd.OpenForm "FormOpgelet", acNormal
cmdEmail_Click_Exit:
    Exit Sub
cmdEmail_Click_Err:
    MsgBox Error$
    Resume cmdEmail_Click_Exit
End Sub



#OctaFish,

Uiteraard wil ik niet stoppen met de procedure, alle velden moeten gecontroleerd worden.

Om de knop pas zichtbaar te maken nadat alle velden zijn ingevuld is zeker een optie maar als ik het kan doen door een waarschuwing te geven per veld, als de gebruiker bv 1 veld vergeet in te vullen, is het voor die gebruiker ook onmiddellijk duidelijk.

Ik heb wel al voorzien dat de knop enkel zichtbaar wordt als er op "Nieuw" wordt geklikt.

Code:
Private Sub Form_Load()
If Me.NewRecord Then
   Me.btnBewaarNP.Visible = True
   Else
   Me.btnBewaarNP.Visible = False
End If
End Sub


Aangezien ik ook in een leermodus zit zou ik wel willen weten hoe de code voor de zichtbaarheid, zoals jij voorstelt, er uit zou zien en waar ik ze moet plaatsen. :confused:

En hoe kan ik alle ‘vergeten’ objecten in een string plaatsen als melding op het eind? :confused:

Bedankt

Groetjes

Pascal
 
Laatst bewerkt:
Octafish,

Ik had jou reactie van deze morgen nog niet gezien... Ik ga dat nu doen... :)

Groetjes

Pascal
 
Je had jezelf een hoop typ-, knip- en plakwerk bespaard als je eerst mijn laatste berichtje had gelezen :).
 
En als je nog wat te lezen/experimenteren wit hebben, probeer dan dit eens uit:
Code:
Option Compare Database
Dim msg As String
Code:
Private Sub Form_Current()
    If Me.NewRecord Then
        Me.btnBewaarNP.Enabled = False
    Else
        CheckVelden
    End If
End Sub

Code:
Function CheckVelden()
Dim iCheck As Integer, i As Integer
    
    msg = "": iCheck = 0
    If IsNull(Me.Benaming.Value) Then
        i = i + 1
        If msg <> "" Then msg = msg & vbCrLf Else: msg = "Het volgende ontbreekt nog: " & vbLf & vbLf
        msg = msg & i & " - Je moet nog een Benaming invullen..."
    Else
        iCheck = iCheck + 1
    End If
    
    If IsNull(Me.cboDiameterStaafje) Then
        i = i + 1
        If msg <> "" Then msg = msg & vbCrLf Else: msg = "Het volgende ontbreekt nog: " & vbLf & vbLf
        msg = msg & i & " - Je moet nog een Diameter Staafje invullen..."
    Else
        iCheck = iCheck + 2
    End If
    
    If IsNull(Me.cboLengteStaafje) Then
        i = i + 1
        If msg <> "" Then msg = msg & vbCrLf Else: msg = "Het volgende ontbreekt nog: " & vbLf & vbLf
        msg = msg & i & " - Je moet nog een Lengte Staafje invullen..."
    Else
        iCheck = iCheck + 4
    End If
    
    If IsNull(Me.cboDiameterBolletje.Value) Then
        i = i + 1
        If msg <> "" Then msg = msg & vbCrLf Else: msg = "Het volgende ontbreekt nog: " & vbLf & vbLf
        msg = msg & i & " - Je moet nog een Diameterbol  invullen..."
    Else
        iCheck = iCheck + 8
    End If

    If iCheck = 15 Then
        Me.btnBewaarNP.Enabled = True
        Me.Partnummer = UCase(Left([cboBenaming].[Column](1), 3)) & Right("00" & [cboDiameterStaafje].[Column](1), 3) _
            & Right("00" & [cboLengteStaafje].[Column](1), 3) & Right("00" & [cboDiameterBolletje].[Column](2), 3)
    Else
        Me.Partnummer = "Partnummer nog niet volledig..."
        MsgBox msg, vbCritical
        Me.btnBewaarNP.Enabled = False
    End If

End Function

Code:
Private Sub cboBenaming_Click()
    CheckVelden
End Sub

Code:
Private Sub cboDiameterBolletje_Click()
    CheckVelden
End Sub

Code:
Private Sub cboDiameterStaafje_Click()
    CheckVelden
End Sub

Code:
Private Sub cboLengteStaafje_Click()
    CheckVelden
End Sub
 
Laatst bewerkt:
Je had jezelf een hoop typ-, knip- en plakwerk bespaard als je eerst mijn laatste berichtje had gelezen .
Ja das waar... :d


Ik zal er mij deze namiddag eens mee amuseren.

Ik heb ondertussen de twee andere mogelijkheden (Andere code of beginwaarde weglaten) al eens kunnen uittesten en, uiteraard, werkt prima. :thumb::thumb:


Ik hou je op de hoogte.


Thanks


Pascal
 
Je kan het systeem nog wat fraaier maken als je geen Msgbox gebruikt, maar een label op je formulier zet waarin je de tekst plant als nog niet alles is ingevuld. Dat ziet er qua code dan zo uit:
Code:
    If IsNull(Me.cboDiameterBolletje.Value) Then
        i = i + 1
        If msg <> "" Then msg = msg & vbCrLf Else: msg = "Het volgende ontbreekt nog: " & vbCrLf & vbCrLf
        msg = msg & i & " - Je moet nog een Diameterbol  invullen..."
    Else
        iCheck = iCheck + 8
    End If

    If iCheck = 15 Then
        Me.lblInfo.Visible = False
        Me.btnBewaarNP.Enabled = True
        Me.Partnummer = UCase(Left([cboBenaming].[Column](1), 3)) & Right("00" & [cboDiameterStaafje].[Column](1), 3) _
            & Right("00" & [cboLengteStaafje].[Column](1), 3) & Right("00" & [cboDiameterBolletje].[Column](2), 3)
    Else
        Me.Partnummer = "Partnummer nog niet volledig..."
        With Me.lblInfo
            .Caption = msg
            .Visible = True
        End With
        Me.btnBewaarNP.Enabled = False
    End If

Als je het label een opvallende kleur geeft (rode achtergrond, gele tekst bijvoorbeeld) dan zie je gelijk wat je nog moet doen zonder dat je steeds een Msgbox moet wegklikken, wat reuze irritant is :).

En nog een kleine aanvulling:

Code:
Private Sub cboBenaming_Enter()
    Drop_Down Me.cboBenaming
End Sub

Private Sub cboDiameterBolletje_Enter()
    Drop_Down Me.cboDiameterBolletje
End Sub

Private Sub cboDiameterStaafje_Enter()
    Drop_Down Me.cboDiameterStaafje
End Sub

Private Sub cboLengteStaafje_Enter()
    Drop_Down Me.cboLengteStaafje
End Sub

Code:
Function Drop_Down(obj As Object)
    With obj
        .SetFocus
        .Dropdown
    End With
End Function
 
OctaFish,

Ik vermoed dat ik uw "experimenten" moet uittesten op het door jou laatst meegestuurd voorbeeld? :confused:

Mijn huidige database is ondertussen al wat uitgebreider geworden... :)


Groetjes

Pascal
 
OctaFish,

In jouw laatste meegestuurde voorbeeld heb je de formulieren Opdrachten en Piercings.

Hoe kan ik vanuit Piercings, na het aanmaken van een nieuwe piercing via een knop naar het Formulier Opdrachten gaan en in het gedeelte opdrachtgegevens al de juiste, net aangemaakte, partnummer geselecteerd hebben?


Als je liever een nieuwe vraag hebt dan maak ik er wel een hoor. :confused:


Ik heb al wat rondgezocht en geprobeerd maar krijg het niet gevonden voor mijn DB.

De voorbeelden zijn te specifiek voor andere DB's


Groetjes

Pascal
 
Hoe kan ik vanuit Piercings, na het aanmaken van een nieuwe piercing via een knop naar het Formulier Opdrachten gaan en in het gedeelte opdrachtgegevens al de juiste, net aangemaakte, partnummer geselecteerd hebben?
Dat proces moet je precies omdraaien: ik zou vanuit het formulier Opdrachten de nieuwe piercing toevoegen. Dat werkt relatief simpel (de relativiteit is natuurlijk: als je het weet is het simpel, als je het niet weet zoek je je het schompes ;)).

Om te beginnen: de keuzelijst laat in jouw geval de complete Partnummerstring zien. Die string is opgebouwd uit de verschillende velden, zoals je weet. Je kunt dus alleen bestaande partnummers kiezen. Wat nu als je begint met typen (zodat de lijst korter wordt) en je typt een waarde die nog niet bestaat? Dat levert uiteraard een niet-bestaande connectie op met de Piercings tabel. En daar komt het leuke: Access heeft daar een speciale actie voor: <Bij niet in lijst>. En die actie wordt getriggerd op het moment dat je een niet-bestaande waarde typt. En daar kun je dus van alles aan hangen! Eigenlijk zijn er dan twee varianten mogelijk, afhankelijk van de brontabel. Bij een simpele tabel (één zoekwaarde, en één waarde in de tabel) volstaat het om die nieuwe waarde gelijk in de tabel te zetten. Gaat het om een tabel waarin je verschillende elementen moet invoeren, dan kun je beter een Formulier openen. In jouw geval: fPiercings.
Dan kun je op je gemakje de nieuwe piercing toevoegen, je sluit het formulier af en voilà, je nieuwe piercing staat in de lijst, en is gelijk gekozen.

Ik zou zeggen: makkelijker kan het niet worden :).
 
OctaFish,

Goede morgen,

Ik volg jouw jouw redenering en het lijkt ook wel de meest logische. :cool:

Ik denk even luid-op....

Om toch van de nieuwe piercing naar de opdracht te gaan...


Van zodra alle gegevens zijn ingevoerd bij een nieuwe piercing, klik ik op de knop "opslaan" en het nieuwe record wordt gecontroleerd en dan gesaved (met VBA) en als dan het formulier fOpdrachten zou openen
dan is het partnummer toch wel bekend en zou die toch in de cbo (partnummer v/d opdrachtgegevens) van het formulier moeten staan?

Kan dan het gecreëerde partnummer al niet ingevuld worden in de cbo en de bijkomende gegevens zichtbaar maken? :rolleyes:

Dan hoeft enkel nog een klant geselecteerd worden... :d

Groetjes

Pascal
 
Er is een zekere mate van volgordelijkheid in Access, en daar ben jij nu mee aan het worstelen, als ik het zo lees. Om te beginnen: formulieren zijn gebaseerd op tabellen (meestal dan, hoeft uiteraard niet) en bij het openen van zo'n formulier leest hij de actuele situatie in van dat formulier. Dat betekent: de stand van zaken zoals die op dat moment in de database vastligt. Als je nu een ánder formulier (op een andere tabel) bewerkt (records toevoegen, verwijderen, muteren) dan zie je die wijzigingen niet terug in je eerste formulier, want dat werkt alleen op zijn eigen records. Je ziet dus de toevoegingen vanuit andere tabellen inderdaad niet terug. De 'enige optie' is om het formulier te sluiten en opnieuw te openen. Andere optie is natuurlijk om de gegevensbron te verversen, maar dat moet je programmeren. Dus je vraag
dan is het partnummer toch wel bekend en zou die toch in de cbo (partnummer v/d opdrachtgegevens) van het formulier moeten staan?
moet ik met Nee beantwoorden.
Vandaar dat ik het vanuit het formulier fOpdrachten regel, want dan kun je het wél netjes regelen. Als ik tijd heb vandaag, zal ik e.e.a. met een voorbeeldje demonstreren.
 
OctaFish,

OK, zolang het formulier niet is gesloten zal zijn tabel ook niet aangepast zijn en zijn de gegevens in geen enkel ander formulier zichtbaar. Zover ben ik mee en begrijp ik ook wel de volgordelijkheid. Niet in de lijst? maak er dan een aan... is logisch :)

Dat het met een refresh code voor de gegevensbron kan opgelost worden dat is mss al 1 mogelijkheid. En daar zou ik dan beroep moeten doen op jouw kennis... :rolleyes:

Maar vanuit een reeds bestaand record is het wel mogelijk dan. Om van de piercings naar de opdrachten te gaan met de piercing reeds geselecteerd in de opdrachtgegevens...

Dan kan er gewerkt worden vanuit 2 richtingen. De stockgegevens worden ook bijgehouden en als de user controleert of er een stock is voor een bepaald item dan kan van daaruit de opdracht aangemaakt worden.


Groetjes

Pascal
 
Laatst bewerkt:
OctaFish,

Ik zal sowiezo uw voorbeeldje even afwachten.

Thanks

Pascal
 
Om van de piercings naar de opdrachten te gaan met de piercing reeds geselecteerd in de opdrachtgegevens...
Dat kan uiteraard. Je kunt een formulier openen met een parameter die een bepaalde waarde bevat en alvast invult in het geopende formulier. Zet ik er ook gelijk bij :).
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan