tekst toevoegen aan keuzelijst

Status
Niet open voor verdere reacties.

raymin

Gebruiker
Lid geworden
24 aug 2010
Berichten
127
kwestie; ik heb een tabel aangemaakt voor "werkomschrijving" deze komt terug in de query, zodat ik nu een keuzelijst krijg. Ik zou echter graag willen dat ik in dit veld ook een nieuwe omschrijving op willen nemen die dan vervolgens in de tabel werkomschrijving komt te staan. (en dus in de keuzelijst voorkomt in het volgende record)

Is dit mogelijk?
 
Op een formulier heb je de gebeurtenis <Bij niet in lijst> die je hiervoor kunt gebruiken. Met deze gebeurtenis kun je een niet-bestaand item toevoegen aan de tabel, waarna de nieuwe waarde beschikbaar is in de keuzelijst. Een keuzelijst in een tabel kan niet op deze manier worden bijgewerkt, dat moet via een formulier.
Overigens zou ik in tabellen (en dus ook queries) nooit keuzelijsten gebruiken, maar de standaardvelden laten zien. Op die manier weet je altijd wat er daadwerkelijk is opgeslagen in de tabel. Keuzelijsten maak je op formulieren, waarbij je dus ook aanvullende acties kunt laten uitvoeren. De gebruiker hoeft in beginsel nooit in de tabel te kijken, dus daar hoef je het ook niet voor te doen...
 
Hoi ik zie de gebeurtenis <Bij niet in lijst> dit keuzemenu heb ik idd in een formulier. en de dat wordt uit een tabel gehaald, in deze tabel laat ik idd de standaard velden zien.

(begin een beetje te begrijpen hoe de boel in elkaar zit, als ik naar de tabel gaat met de "werkomschrijving" velden, kan ik weer terug zien in welke record ik de omschrijving heb gebruikt)

nu de main question natuurlijk, wat zet ik in de gebeurtenis?
 
Een voorbeeldje:
Code:
Private Sub cboCategorie_NotInList(NewData As String, Response As Integer)
Dim strSQL As String
Dim i As Integer
Dim Msg As String
'Stoppen als de keuzelijst leeg is.
If NewData = "" Then Exit Sub
Msg = "'" & NewData & "' staat niet in de lijst." & vbCrLf & vbCrLf
Msg = Msg & "Zal ik hem toevoegen?"
On Error Resume Next
i = MsgBox(Msg, vbQuestion + vbYesNo, "Onbekende categorie...")
    If i = vbYes Then
      strSQL = "INSERT INTO tCategorie ([Categorie]) VALUES ('" & NewData & "')"
            CurrentDb.Execute strSQL, dbFailOnError
            Response = acDataErrAdded
        Else
            Response = acDataErrContinue
    End If
End Sub
Hoe werkt het? Je typt iets in de keuzelijst, wat er niet in staat. Dat triggert de procedure NotInList. Deze geeft eerst een Msgbox met de vraag of je de waarde wilt toevoegen. Je zal maar een typfout hebben gemaakt... Als je op Ja klikt, wordt de Tekst uit de keuzelijst toegevoegd aan de tabel, en wordt de keuzelijst bijgewerkt.

Je hoeft uit deze code dus alleen maar de namen van tabel en veld te vervangen, om hem te kunnen gebruiken. (Uiteraard ook de naam van de keuzelijst, als je de hele code kopieert.)
In dit voorbeeldje wordt er wel van uitgegaan dat het Sleutelveld in de tabel tCategorie van het type Autonummering is. Je voegt namelijk geen nieuw sleutelveld toe. Ook kun je een probleem krijgen als je in die tabel meerdere verplichte velden hebt. Daarvoor heb je namelijk geen gegevens die je meestuurt met de INSERT opdracht. Kan overigens wel worden geregeld, mocht dat nodig zijn... Probeer 'm eens uit!
 
Ik heb de code in de sub Not in List gezet.

Welk stukje code is nu het veld?

De tabel die ik gebruik heeft twee kolommen, ID en werkomschrijving. ID is autonummering en er zijn verder geen verplichte velden.

Ik doe iets verkeerd, ik krijg namelijk de melding alsof de code er niet is.
 
Je krijgt dan:
strSQL = "INSERT INTO [JouwTabel] ([werkomschrijving]) VALUES ('" & NewData & "')"
Het kan zijn dat de query niet werkt; dat komt dan meestal doordat er een spatie in ofwel tabelnaam, ofwel veldnaam zit. Om dat te omzeilen moet je rechte haken ( [] ) om tabelnaam en veldnaam zetten. Om problemen te voorkomen, doe ik dat meestal automatisch. Kijk eens of het daar aan ligt.
 
ik heb geen spaties in de tabel en veldnaam, ik krijg toch een foutmelding, ik zal wel iets heel simpel iets fout doen, ben er alleen nog niet achter wat.

Ik krijg een foutmelding dat de er een fout is opgetreden tussen MS Access en het OLE-bronprogramma of het ActiveX-besturingselement.

De tabel heet Werkomschrijvingen en het veld heet Werkomschrijving (beetje ongelukkige keuze, maar het gaat even om de test)

Code:
Private Sub Werkomschrijving_NotInList(NewData As String, Response As Integer)
Dim strSQL As String
Dim i As Integer
Dim Msg As String
'Stoppen als de keuzelijst leeg is.
If NewData = "" Then Exit Sub
Msg = "'" & NewData & "' staat niet in de lijst." & vbCrLf & vbCrLf
Msg = Msg & "Zal ik hem toevoegen?"
On Error Resume Next
i = MsgBox(Msg, vbQuestion + vbYesNo, "Onbekende categorie...")
    If i = vbYes Then
      strSQL = "INSERT INTO [Werkomschrijvingen] ([Werkomschrijving]) VALUES ('" & NewData & "')"
            CurrentDb.Execute strSQL, dbFailOnError
            Response = acDataErrAdded
        Else
            Response = acDataErrContinue
    End If
End Sub
 
Het kan te maken hebben met de Bibliotheken die je standaard hebt geladen. En dat is weer een beetje afhankelijk van de Office versie. In grote lijnen moet je het volgende doen:
Druk op <Alt>+<F11> ; je komt nu in de VBA omgeving terecht
Ga in het VBA scherm naar <Extra>, <Verwijzingen>. Je ziet een aantal bibliotheken vermeld staan.
Controleer of je in ieder geval de bibliotheken hebt die in het plaatje staan, en in die volgorde. Zo niet, dan kun je ze opzoeken in de keuzelijst, en met de pijltjesknoppen omhoog en omlaag verplaatsen.
Als dat niet helpt, zoeken we verder!
 
Ben ik weer, het werkte niet, dus ik heb even een lege db aangemaakt met deze code en dat werkte wel ;-( grrr..

Ergens heb ik dus zitten kl...en, in ieder geval ik heb het gevonden en het werkt nu!

En bedankt natuurlijk . (er komen nog wel een bergje vragen tzt :) )
 
Om te kunnen controleren of er iets verkeerd zit in de db, kun je nog in het VBA scherm de optie <Foutopsporing>, <db compileren> draaien. Daarmee kun je alle fouten opsporen, en eventueel repareren. Vaak wordt een foutmelidng veroorzaakt door een fout ergens in een VBA module, die niks met de melding te maken heeft. Maar een nieuwe db maken, en alles importeren werkt vaak het beste...
En je mag de vraag ook nog op Opgelost zetten :)
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan