Nieuwe gegevens automatisch laten opslaan in je keuzelijst met meedere kolommen

Status
Niet open voor verdere reacties.

kuyt1

Gebruiker
Lid geworden
8 mrt 2012
Berichten
24
Hallo allemaal,

Ik heb een database waarin het onderhoud wordt bijgehouden. Hiervoor is er een aparte tabel gemaakt met daarin alle onderdelen met hun partnummer die binnen de shop liggen.
Het onderhoud wordt bijgehouden door het invullen van een formulier. In het formulier is er van het tekstvak van onderdelen een combobox van gemaakt en gelinkt aan alle onderdelen binnen de shop. Daarnaast is er ook een koppeling met het partnummer, want indien een onderdeel wordt aangeklikt wordt automatisch het bijbehorende partnummer in het partnummer tekstvak ingevoerd. Hier wordt gebruik gemaakt van de expresse: =[cboOnderdeel].[Column](1)

Echter het probleem is wanneer er nieuwe onderdelen binnen komen die nog niet geregistreerd zijn niet in deze lijst staan dus.
Nu wil ik wanneer er een nieuw onderdeel met het bijbehorende partnummer binnen komt en wordt ingevoerd in het formulier handmatig, dat hij deze dus beide automatisch opslaat in de keuzelijst, zodat bij de volgende keer het onderdeel gewoon uit de keuzelijst kan worden aangevinkt.
Door de expressie in het tekstvak partnummer kan hier niks meer handmatig worden ingevuld.

Wat ik al te horen heb gekregen is dat ik dit via de gebeurtenis: <Bij niet in lijst> kan laten doen. Mijn vraag is dan ook hoe? (macro? vba? welke code?)
Heb er een aantal geprobeerd via opdracht uitvoeren met macro maar toen gebeurde er niks.
En nog belangrijker is hoe ik ook de partnummer erbij krijg opgeslagen in de 2e kolom van de keuzelijst..
 
Via de gebeurtenis <Bij niet in lijst> kun je een actie laten uitvoeren op het moment dat je in die keuzelijst iets hebt getypt dat nog niet bestaat in de onderliggende tabel. Daarbij worden doorgaans twee opties gebruikt:
1. Voeg de nieuwe waarde via een Toevoegquery toe aan de onderliggende tabel
2. Open een formulier waarin je de nieuwe gegevens van het item kunt invoeren
Optie 1 is prima te gebruiken als je een opzoeklijst tabel hebt gemaakt, waarbij je dus maar één of twee velden hebt. In de twee-velden variant gebruik je dan een Autoveld nummer als sleutelveld bijvoorbeeld. De tabel heeft verder dus maar één veld waarin je de gegevens opslaat. Die nieuwe waarde haal je uiteraard uit de keuzelijst, want daar heb je hem net getypt.
De tweede optie biedt wat meer mogelijkheden. Stel dat je een keuzelijst met invoervak hebt gemaakt voor de Contactpersonen van je klanten. Die contactpersonen heb je opgeslagen in een tabel tContactPersonen, waarin je naast de naam ook het BedrijfID wilt opslaan, en misschien wel een email adres, en een telefoonnummer. Kortom: je hebt allerlei gegevens van die persoon die je wilt invullen. Via een Toevoegquery zal dat nu niet gaan, want je hebt maar één persoonsgegeven: de naam uit de keuzelijst. In dat geval is het slimmer om een formulier te openen, waarin je dan gelijk alle gegevens kunt invullen en opslaan.
Ik gebruik dus meestal de tweede optie, want de eerste vind ik een beetje te beperkt. Een voorbeeldcode ziet er dan zo uit:
Code:
Private Sub cboContactPersoon_NotInList(NewData As String, Response As Integer)
Dim Result
Dim Msg As String, CR As String
    CR = Chr$(13)
    If NewData = "" Then Exit Sub
    Msg = "'" & NewData & "' staat niet in de lijst." & CR & CR
    Msg = Msg & "Wil je " & NewData & " toevoegen?"
    If MsgBox(Msg, vbQuestion + vbYesNo) = vbYes Then
De gebeurtenis <NotInList> maakt zelf al een aantal Parameters aan. NewData is een variabele die de tekst bevat die in de keuzelijst is ingevoerd. In mijn voorbeeld is dat de naam van de contactpersoon. Response wordt later gebruikt bij de verwerking van de aangepaste keuzelijst.
Vervolgens wordt er een Msgbox gemaakt, die laat zien wat er is ingetypt, en of dat moet worden toegevoegd. We gaan er vanuit dat je dan op Ja klikt, en dan gebeurt het volgende:
Code:
        iBedrijf = Me.Parent.cboBedrijf.Column(0)
        DoCmd.OpenForm "fContactPersonen", , , , acAdd, acDialog,  NewData & "|" & iBedrijf
    End If
    Me.cboContactPersoon.Requery
In mijn voorbeeldje heb ik de contactpersonen op een subformulier staan. Op het hoofdformulier staan de bedrijfsgegevens van de cp. Omdat ik bij het toevoegen van een nieuwe cp ook een BedrijfsID nodig heb om de cp te kunnen koppelen aan het bedrijf, moet ik dat BedrijfID dus van het hoofdformulier halen. Dat wordt vervolgens in de variabele iBedrijf gezet.
Vervolgens wordt het formulier <fContactPersonen> geopend in Dialog modus met acDialog. Dat zorgt ervoor dat de code hier stopt, en je eerst verder moet met het invoeren van de nieuwe CP op het formulier.
De gegevens die moeten worden ingevoerd voor de CP geef ik mee in het OpenArgs parameter van het formulier. Omdat OpenArgs maar één variabele waarde kent, moet ik, als ik meerdere waarden mee wil nemen, die scheiden met een scheidingsteken. In het voorbeeld is dat een |
Nu gaat de procedure verder op het formulier fContactpersonen. Dit word geopend, en nu moet als eerste de OpenArgs variabele gesplitst worden. Dat gaat als volgt:
Code:
Private Sub Form_Open(Cancel As Integer)
    If Not IsNull(Me.OpenArgs) Then
        Dim sArgs As Variant
        sArgs = Split(Me.OpenArgs, "|")
        Me.txtContactPersoon.SetFocus
        Me.txtContactPersoon.Value = sArgs(0)
        Me.cboBedrijfID.SetFocus
        Me.cboBedrijfID.Value = sArgs(1)
    End If
    Me.cboArtikel = ""
    Me.cboArtikelID = ""
End Sub
Een formulier heeft niet altijd een OpenArgs variabele als je hem opent, dus je begint met een check op die variabele. Daarna wordt een Array variabele gedeclareerd die met de opdracht SPLIT wordt gevuld. Je ziet dat hier het scheidingsteken | weer terugkomt. Elke waarde staat nu op een eigen regel in de Array, en die waarden kun je nu in je formulier zetten.
Omdat het formulier in Dialoogmodus is geopend, kun je op je gemakje alle gegevens invullen die je in wilt/moet vullen. Bij het sluiten van het formulier wordt het nieuwe record bewaard, en kun je verder met de oorspronkelijke procedure
Code:
    ' Zoek het nieuwe artikelID op in de tabel Artikelen.
    Result = DLookup("[ContactPersoonID]", "tContactPersonen", "[ContactPersoon]='" & NewData & "'")
    If IsNull(Result) Then
        ' Als het artikel niet is gemaakt, Response argument op Error message zetten en herstellen.
        Response = acDataErrContinue
        MsgBox "Nog een keer proberen...", vbOKOnly
    Else
        ' Als het artikel is gemaakt, het Response argument Added zetten.
        Response = acDataErrAdded
        Me.cboContactPersoon.SetFocus
        Me.cboContactPersoon = Result
    End If
End Sub
In het laatste deel van de procedure wordt met DLOOKUP de nieuwe ContactPersoonID opgezocht. In dit voorbeeld is dat veld de Afhankelijke kolom van de keuzelijst. Je ziet hem dus niet, maar je gebruikt hem wel in je tabellen. De Response parameter bepaalt vervolgens of het toevoegen is gelukt of niet. In het laatste geval zit er nog een foutje ergens, vermoedelijk in je formulier, of in het opzoeken van de nieuwe waarde.
En dat is eigenlijk de hele procedure :)
 
Bedankt voor je hulp. Echter snap ik er niet zo veel van met mijn gebrekkige access kennis hahaha.

Heb het maar anders opgelost en makkelijk voor mezelf gehouden. Gewoon een query gemaakt op de onderdelen-partnummer tabel, daaruit een formulier waarin ze nieuwe onderdelen kunnen invoeren en dan in de query criteria " " zodat al het overige niet zichtbaar is.

Toch bedankt.
 
Het onderwerp komt binnenkort in de cursus ook nog aan bod. Dus een mooi leermomentje :D
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan