Avatar billede visto Professor
20. maj 2020 - 15:38 Der er 44 kommentarer og
2 løsninger

Indtastning i kombinationsfelt skal automatisk tilføjes til tabel som er feltets rækkekilde

Jeg har en kombinationsboks i en formular. Listen der vises, når man klikker på pilen i feltet, hentes fra en tabel (rækkekilden), hvori der står en række navne.

Som det er nu, indtaster jeg nye navne i selve tabellen, når jeg ønsker de skal fremgå af nævnte liste.

Kan man lave det, så et i kombinationsfeltet nyindtastet navn automatisk tilføjes til tabellen, hvis navnet ikke findes i tabellen i forvejen?

Hvordan?
Avatar billede MSchlamovitz Mester
20. maj 2020 - 22:42 #1
Nedenfor er kombo-feltet: Kjole, som er et nummer på kjolen (IKKE UnikID)
Tabellen hedder tKjoler
UnikID er feltet KjoleID - som også er på formularen:

Private sub Kjole_NotInList (NewData As String, Response As Integer)

Dim DB As DAO.Database
Dim Rs As DAO.Recordset
Dim StrSQL As String
Dim NewID As Long

  Response = 0

  Me.Kjole.Undo
  If MsgBox("Kjole nr. " & NewData & " er ikke på listen. Skal det tilføjes?", vbYesNo + vbQuestion, "Skal " & NyData & " oprettes?") = vbNo Then
      Exit Sub
  End If
 
  Set DB = CurrentDb
  StrSQL = "SELECT Kjolenr, KjoleID FROM tKjoler"
  Set Rs = DB.OpenRecordset(StrSQL)
 
  Rs.AddNew
  Rs(0) = NyData
  NewID = Rs(1)
  Rs.Update
  Rs.Close
  DB.Close
 
  Me.KjoleID.Requery
  Me.KjoleID = NewID
Avatar billede visto Professor
20. maj 2020 - 23:05 #2
Tak for svar.

Hvor skal de koder, du angiver, skrives?
Jeg er kun bekendt med fremstilling og redigering af tabeller, forespørgsler og makroer via det interface for disse som Access stiller til rådighed (bruger Access 2013).
Avatar billede bsn Forsker
21. maj 2020 - 02:04 #3
VBA koderne placeres i kodevinduet for den formular, der indeholder kombinationsboksen ...
Avatar billede visto Professor
21. maj 2020 - 10:02 #4
Jeg går ud fra, at Kjolenr er navnet på feltet i tKjoler, der indeholder kjolenumrene.
 
Mit kombofelt og tabellen hedder begge Appellation. Tabellen har ikke noget UnikID.
Jeg ved derfor ikke, hvad jeg skal gøre med denne:
StrSQL = "SELECT Kjolenr, KjoleID FROM tKjoler"
Kan jeg gøre noget uden KjoleID? Eller skal jeg indsætte en autonummerering i tabellen?

Mht. hvor koden skal placeres: Jeg går ud fra, at jeg skal højreklikke i formularen i designvisning og derefter vælge Generer hændelsesprocedure > Kodegenerator.
Er det helt lige meget hvor i formularen jeg klikker, altså på formularbaggrunden eller i kombo-feltet?
Avatar billede MSchlamovitz Mester
21. maj 2020 - 10:24 #5
Hvis du ikke er bekendt med VBA programmering er der lang vej hjem
Men KjoleID skal være et autonummerfelt i databasen og skal være det felt, der anvendes i relationer til andre tabeller.
Koden placeres i kombofeltets  IkkePåListe event

Har du mulighed for at sende databasen til mig - så er det nemmere at rådgive ?
Avatar billede visto Professor
21. maj 2020 - 14:46 #6
Jeg vil i første omgang foretrække at afprøve, om vi kan komme igennem her. Hvis det viser sig at være helt håbløst, må jeg sende dig noget.
Så lad mig beskrive mere detaljeret det, som jeg regner med, du har brug for at vide:

Til grund for det hele ligger tabellen HOVEDTABEL, der har autonummererings-feltet Vin nummer, der er primærnøgle, og som er det, der bruges ved relationen til en anden tabel ÅRGANGSOPLYSNINGER (som er irrelevant her). HOVEDTABEL indeholder basisoplysninger om en masse vine, såsom appellation, producent og navn. Formularen START viser HOVEDTABELs data. I HOVEDTABEL befinder sig feltet Appellation, som er et kombo-felt. Oplysninger om de enkelte vines appellationer lagres i dette felt.

Tabellen Appellationer består kun af tekstfeltet Appellation. Her indtaster jeg løbende navne på nye appellationer, så jeg ved oprettelse af nye vine i START/HOVEDTABEL vil kunne vælge mellem alle i tabellen Appellationer registrerede appellations-navne, idet tabellen Appellationer er rækkekilde til START/HOVEDTABELs kombo-felt Appellationer - eller helt præcist: det er forespørgslen q-Appellationer, som er en alfabetisk sortering af tabellen Appellationer. Det er altså denne forespørgsel, der viser listen med valgbare appellationer i alfabetisk rækkefølge, når jeg i START-formularen klikker på pilen i kombofeltet Appellation, (eller som viser indtastningsforslag, når jeg begynder at indtaste i feltet).

Det er den "manuelle" indtastning af nye appellationer i tabellen Appellationer, jeg gerne vil "automatisere", sådan at når jeg i kombo-feltet indtaster et appellations-navn, der ikke befinder sig i tabellen Appellation, tilføjes det nye navn automatisk til denne tabel.

Jeg gætter på, at din "Koden placeres i kombofeltets  IkkePåListe event" betyder, at jeg skal gøre følgende:
1) I Egenskabsarket for START-formularens kombo-felt skal jeg under Hændelser > VedIkkePåListe klikke på de tre prikker ude til højre og derefter vælge Kodegenerator
2) Så kommer jeg ind til VBA, og mellem disse to linjer

Private Sub Appellation_NotInList(NewData As String, Response As Integer)

End Sub

skal jeg indkopiere din kode tilpasset min database.
Er det sådan?
Avatar billede terry Ekspert
21. maj 2020 - 16:22 #7
There is a NotInList event. You place code there

https://docs.microsoft.com/en-us/office/vba/api/access.combobox.notinlist
Avatar billede terry Ekspert
21. maj 2020 - 16:25 #8
Use the last example "The following example shows how to add an item to a bound combo box."
Avatar billede bsn Forsker
22. maj 2020 - 01:56 #9
Ja, den tilrettede kode til din database skal placeres her :

Private Sub Appellation_NotInList(NewData As String, Response As Integer)

End Sub
Avatar billede bsn Forsker
22. maj 2020 - 11:07 #10
En alternativ løsning :

Private Sub cboBygning_NotInList(NewData As String, Response As Integer)
Dim StrSQL As String
Dim NewID As Long
Dim Svar As String
Dim CNN As ADODB.Connection
Dim RS As ADODB.Recordset

Response = 0

NewData = Me.cboBygning.Text

Svar = MsgBox("Bygning nr. " & NewData & " er ikke på listen. Skal det tilføjes?", vbYesNo + vbQuestion)
If Svar = vbYes Then
    Set CNN = CurrentProject.Connection
    Set RS = New ADODB.Recordset
 
    StrSQL = "INSERT INTO tblBygning (BygningNavn) VALUES('" & NewData & "');"
    CNN.Execute StrSQL

    Me.cboBygning.Text = ""
    Me.cboBygning.Requery

    StrSQL = "SELECT MAX(BygningID) AS TEST FROM tblBygning"
    RS.Open StrSQL, CNN
    Me.cboBygning.Text = RS("TEST")
    RS.Close
    CNN.Close
Else
    Me.cboBygning.Text = ""
    Exit Sub
End If

End Sub
Avatar billede visto Professor
22. maj 2020 - 13:03 #11
Tak også for den alternative løsning.
Er der nogen forskel på funktionaliteten i de to løsninger (#1 og #10)? Eller er det bare to forskellige måder at skrive på?
Avatar billede bsn Forsker
22. maj 2020 - 13:10 #12
Det er så med ADO aktiveret i kodevinduet...
Ellers giver det samme resultat...
Avatar billede visto Professor
22. maj 2020 - 13:22 #13
Hvad betyder det med ADO aktiveret i kodevinduet? Den afdeling af Access er absolut ny for mig.
Avatar billede bsn Forsker
22. maj 2020 - 13:44 #14
I kodevinduet Tools_References
Markér
Microsoft ActiveX Data Objects 6.1 og
Microsoft ActiveX Data Objects Recordset 6
Avatar billede visto Professor
22. maj 2020 - 14:17 #15
Nu tager jeg lige én ting ad gangen. bsn, jeg har prøvet at erstatte dine bygningsting med mine vin-ting. Nogle ting tror jeg godt jeg ved, hvordan skal erstattes andre ikke.

Svar = MsgBox("Bygning nr. "
tror jeg hos mig skal være
Svar = MsgBox("Appellationen "
idet det ser ud til blot at være et spørgsmål, jeg præsenteres for, når jeg vil indsætte en ny appellation. Korrekt?

Din tblBygning er det den tabel, der i mit setup  (som fremgår af #6) svarer til HOVEDTABEL eller Appellationer?

Hvad svarer din cboBygning til i mit setup?

Hvad referer din (BygningNavn) til?
Avatar billede bsn Forsker
22. maj 2020 - 14:30 #16
Svar = MsgBox("Bygning nr. "
tror jeg hos mig skal være
Svar = MsgBox("Appellationen "
idet det ser ud til blot at være et spørgsmål, jeg præsenteres for, når jeg vil indsætte en ny appellation. Korrekt?
Ja

Din tblBygning er det den tabel, der i mit setup  (som fremgår af #6) svarer til HOVEDTABEL eller Appellationer?
Appellationer

Hvad svarer din cboBygning til i mit setup?
Appellationer

Hvad referer din (BygningNavn) til?
Der er to felter i min tblBygning - det ene er ID Autonummer,
og det andet et Tekstfelt(BygningNavn)...
Avatar billede visto Professor
22. maj 2020 - 15:21 #17
Jeg nu gjort følgende:
1) Jeg har indsat et autonummereringsfelt i tabellen Appellationer, idet din kode opererer med en sådan
2) I egenskabsarket for feltet Appellation ved VedIkkePåListe har jeg indsat nedenstående i kodevinduet mellem
Private Sub Appellation_NotInList(NewData As String, Response As Integer)
og
End Sub

Dim StrSQL As String
Dim NewID As Long
Dim Svar As String
Dim CNN As ADODB.Connection
Dim RS As ADODB.Recordset

Response = 0

NewData = Me.Appellation.Text

Svar = MsgBox("Appellationen " & NewData & " er ikke på listen. Skal den tilføjes?", vbYesNo + vbQuestion)
If Svar = vbYes Then
    Set CNN = CurrentProject.Connection
    Set RS = New ADODB.Recordset

    StrSQL = "INSERT INTO Appellationer (Appellation) VALUES('" & NewData & "');"
    CNN.Execute StrSQL

    Me.Appellation.Text = ""
    Me.Appellation.Requery

    StrSQL = "SELECT MAX(AppellationID) AS TEST FROM Appellationer"
    RS.Open StrSQL, CNN
    Me.Appellation.Text = RS("TEST")
    RS.Close
    CNN.Close
Else
    Me.Appellation.Text = ""
    Exit Sub
End If

3) I kodevinduet Tools > References har jeg tilvalgt
Microsoft ActiveX Data Objects 6.1 Library
Microsoft ActiveX Data Objects Recordset 6 Library

Men det virker ikke. Når jeg indtaster en ny appellation i feltet Appellation, stilles jeg ikke noget spørgsmål, og appellationen tilføjes heller ikke til tabellen Appellationer.

Mangler der noget? Eller har jeg gjort noget forkert?
Avatar billede bsn Forsker
22. maj 2020 - 15:31 #18
Mangler der noget? Eller har jeg gjort noget forkert?
Nej, det ser rigtigt ud...
Har du genstartet databasen efter tilføj af ADO...?
Avatar billede bsn Forsker
22. maj 2020 - 15:33 #19
Får du en fejlmeddelelse...?
Avatar billede visto Professor
22. maj 2020 - 15:41 #20
Nej. Alt er som før jeg indsatte koden.
Avatar billede terry Ekspert
22. maj 2020 - 16:18 #21
Have you looked at this link?

https://docs.microsoft.com/en-us/office/vba/api/access.combobox.notinlist

It cant get much easier than this. No need for ADO or DAO !!!
Avatar billede terry Ekspert
22. maj 2020 - 16:23 #22
Its also important that you set the Response parameter to either acDataErrContinue or acDataErrAdded, none of the examples here, do that.
Avatar billede bsn Forsker
22. maj 2020 - 16:55 #23
Du er velkommen til at prøve at sende database til mig...
Avatar billede visto Professor
22. maj 2020 - 17:37 #24
terry, if your solution is easier, I'll try that one first.
How does one set the Response parameter to either acDataErrContinue or acDataErrAdded?

bsn, tak for tilbuddet om at sende database. Vi må se om det bliver nødvendigt.
Avatar billede terry Ekspert
22. maj 2020 - 17:55 #25
I am assuming that the table is named tKjoler and it has only one field named Kjolenr
You need to create a NotInList event for the combo
Also, The LimitToList property must be set to Yes for the NotInList event to occur.

Then paste in this code.

On Error GoTo Error_Handler
    Dim intAnswer As Integer
    intAnswer = MsgBox("""" & NewData & """ not in the list. " & vbcrlf _
        & "Do you want to add it now?" _ vbYesNo + vbQuestion, "Invalid choice")

    Select Case intAnswer
        Case vbYes
            DoCmd.SetWarnings False
            DoCmd.RunSQL "INSERT INTO tKjoler (Kjolenr) "
                & _ "Select """ & NewData & """;"
            DoCmd.SetWarnings True
            Response = acDataErrAdded
        Case vbNo
            MsgBox "Please select an item from the list.", _
                vbExclamation + vbOKOnly, "Invalid Entry"
            Response = acDataErrContinue

    End Select

    Exit_Procedure:
        DoCmd.SetWarnings True
        Exit Sub

    Error_Handler:
        MsgBox Err.Number & ", " & Error Description
        Resume Exit_Procedure
        Resume
Avatar billede visto Professor
22. maj 2020 - 19:58 #26
Well, tKjoler is from the example from bsn. My database setup (names of tables and fields) is described in detail in #6. I'll try to convert from the database concerning kjoler to mine, which is about wine.
Avatar billede visto Professor
22. maj 2020 - 20:23 #27
I have set The LimitToList property to Yes for the NotInList.

I have inserted
On Error GoTo Error_Handler
    Dim intAnswer As Integer
    intAnswer = MsgBox("""" & NewData & """ not in the list. " & vbcrlf _
        & "Do you want to add it now?" _ vbYesNo + vbQuestion, "Invalid choice")

    Select Case intAnswer
        Case vbYes
            DoCmd.SetWarnings False
            DoCmd.RunSQL "INSERT INTO Appellationer (Appellation) "
                & _ "Select """ & NewData & """;"
            DoCmd.SetWarnings True
            Response = acDataErrAdded
        Case vbNo
            MsgBox "Please select an item from the list.", _
                vbExclamation + vbOKOnly, "Invalid Entry"
            Response = acDataErrContinue

    End Select

    Exit_Procedure:
        DoCmd.SetWarnings True
        Exit Sub

    Error_Handler:
        MsgBox Err.Number & ", " & Error Description
        Resume Exit_Procedure
        Resume

And now there is a reaction, when I write a new appellation and leave the field. Dialog box:
Compile error: Syntax error
In the codewindow the following is marked and is with red letters:
    intAnswer = MsgBox("""" & NewData & """ not in the list. " & vbcrlf _
        & "Do you want to add it now?" _ vbYesNo + vbQuestion, "Invalid choice")

The following is also with red letters which I presume can mark faults:
& _ "Select """ & NewData & """;"
MsgBox Err.Number & ", " & Error Description
Avatar billede bsn Forsker
22. maj 2020 - 23:20 #28
Har prøvet at lave terrys model ...
Prøv at tilrette den til din ...

On Error GoTo Error_Handler
   
    Dim intAnswer As Integer
   
    NewData = Me.cboBygning.Text
   
    intAnswer = MsgBox("""" & NewData & """ is not an approved category. " & vbCrLf & "Do you want to add it now?", vbYesNo + vbQuestion, "Invalid Category")

    Select Case intAnswer
        Case vbYes
            DoCmd.SetWarnings False
            DoCmd.RunSQL "INSERT INTO tblBygning(BygningNavn) Select """ & NewData & """;"
            DoCmd.SetWarnings True
            Response = acDataErrAdded
        Case vbNo
            MsgBox "Please select an item from the list.", vbExclamation + vbOKOnly, "Invalid Entry"
            Response = acDataErrContinue
    End Select

Exit_Procedure:
        DoCmd.SetWarnings True
        Exit Sub
       
Error_Handler:
        MsgBox Err.Number & ", " & Error.Description
        Resume Exit_Procedure
        Resume
Avatar billede visto Professor
23. maj 2020 - 13:37 #29
Så lykkedes det! Stor tak til jer begge!

terry (or bsn), what is the function of setting Yes to the LimitToList (begrænsTilListe) property for the NotInList (VedIkkePåListe)? (I like to know what I am doing.)

Min tilrettede kode fremgår nedenfor. Her er Appellationer tabellen, hvortil der skal tilføjes data, og Appellation er feltet, som nye appellationer skal tilføjes til.

On Error GoTo Error_Handler
 
    Dim intAnswer As Integer
 
    NewData = Me.Appellation.Text
 
    intAnswer = MsgBox("""" & NewData & """ findes ikke på listen. " & vbCrLf & "Vil du tilføje appellationen til listen?", vbYesNo + vbQuestion, "Tilføjes?")

    Select Case intAnswer
        Case vbYes
            DoCmd.SetWarnings False
            DoCmd.RunSQL "INSERT INTO Appellationer(Appellation) Select """ & NewData & """;"
            DoCmd.SetWarnings True
            Response = acDataErrAdded
        Case vbNo
            MsgBox "Vælg en appellation fra listen.", vbExclamation + vbOKOnly, "Vælg"
            Response = acDataErrContinue
    End Select

Exit_Procedure:
        DoCmd.SetWarnings True
        Exit Sub
     
Error_Handler:
        MsgBox Err.Number & ", " & Error.Description
        Resume Exit_Procedure
        Resume
Avatar billede terry Ekspert
23. maj 2020 - 13:48 #30
On Error GoTo Error_Handler
    Dim intAnswer As Integer
    intAnswer = MsgBox("""" & NewData & """ not in the list. " & vbCrLf & "Do you want to add it now?", vbYesNo + vbQuestion, "Invalid choice")
   

    Select Case intAnswer
        Case vbYes
            DoCmd.SetWarnings False
           
            DoCmd.RunSQL "INSERT INTO Appellationer (Appellation) " & "Select """ & NewData & """;"
           
            DoCmd.SetWarnings True
           
            Response = acDataErrAdded
        Case vbNo
           
            MsgBox "Please select an item from the list.", vbExclamation + vbOKOnly, "Invalid Entry"
           
            Response = acDataErrContinue

    End Select

Exit_Procedure:
        DoCmd.SetWarnings True
        Exit Function

Error_Handler:
        MsgBox Err.Number & ", " & Err.Description
        Resume Exit_Procedure
       
        Resume
Avatar billede terry Ekspert
23. maj 2020 - 13:50 #31
And I'm OK with understanding Danish, just too lazy to write... ;-)
Avatar billede terry Ekspert
23. maj 2020 - 13:59 #32
LimitToList needs to be set to Yes, otherwise the NotInList event is not triggered.
Avatar billede terry Ekspert
23. maj 2020 - 14:00 #33
Also, Response = acDataErrAdded requiries the combo after the new data is added.
Avatar billede visto Professor
23. maj 2020 - 14:20 #34
Tak for forklaringer.

terry, er din #30 en korrektion af min kode, eller havde du ikke set min kode, før du postede #30?
Jeg kan se, at der er småforskelle i kodningen.
Avatar billede visto Professor
23. maj 2020 - 16:04 #35
Jeg er i gang med at prøve at implementere samme løsning for andre felter, og det gik fint med det næste felt. Men nr. 3 felt driller. Her får jeg en Runtime error '424' - Object required.
Når jeg så går i debug, markeres med gult       
MsgBox Err.Number & ", " & Error.Description

Hvad kan det handle om?
Avatar billede terry Ekspert
23. maj 2020 - 16:43 #36
Error.Description = err.description
Avatar billede terry Ekspert
23. maj 2020 - 16:46 #37
I posted #30 before I noticed your code. They are very similar so if yours works then great.
Avatar billede visto Professor
23. maj 2020 - 17:05 #38
Så forsvandt Runtime error 424, men i stedet kommer nu denne:
3134 Der er syntaksfejl i INSERT INTO-sætningen.

Den ser sådan ud:
DoCmd.RunSQL "INSERT INTO Byer(By) Select """ & NewData & """;"

Syntaksen er jo magen til den fra appellationsfeltet, som virker:
DoCmd.RunSQL "INSERT INTO Appellationer(Appellation) Select """ & NewData & """;"
Avatar billede terry Ekspert
23. maj 2020 - 17:27 #39
Just a guess, "By" is maybe a reserved word, you may need to change it...
Avatar billede terry Ekspert
23. maj 2020 - 17:28 #40
or try
INSERT INTO Byer([By])

Square brackets areound By ;-)
Avatar billede visto Professor
23. maj 2020 - 17:55 #41
Det var det! Tak igen! (Jeg indsatte [ ] omkring By)
Avatar billede visto Professor
23. maj 2020 - 21:04 #42
Endnu et problem har vist sig.

Jeg vil gerne implementere samme funktion i en underformular til en underformular.

Jeg har indtil videre kun arbejdet i den overordnede formular. Den har en underformular, som igen har en underformular, som altså, hvad relationer angår, er 3. niveau.

Her i en formular på 3. relationsniveau er et kombofelt, der hedder Forhandler, hvor den tabel, som nye forhandlere skal tilføjes til, hedder Forhandlere, hvis eneste felt hedder Forhandler. (Altså samme princip som for de andre felter.)

Når jeg indtaster en forhandler, som ikke er i tabellen Forhandlere - og som jeg som vanligt ønsker tilføjet automatisk til tabellen - får jeg fejlmeddelelsen:
Compile error:
Method or data member not found

Den linje, som i kodevinduet genereres automatisk som indledning, bliver gulmarkeret:
Private Sub Købt_hos_NotInList(NewData As String, Response As Integer)

mens
.Forhandler
i kodelinjen
NewData = Me.Forhandler.Text
blåmarkeres.

Skyldes fejlen, at jeg ikke længere er på 1. niveau i relationshierakiet? Eller hvad?
Og hvad gør jeg?
Avatar billede visto Professor
24. maj 2020 - 08:39 #43
Hmm. Prøvede en gang mere, og nu fungerer det...
Avatar billede visto Professor
24. maj 2020 - 11:05 #44
Jeg sammenignede jeres kodeforslag, bsn og terry. Én forskel var, at bsn's linje
NewData = Me.cboBygning.Text
ikke var i terrys.
Jeg prøvede at fjerne den, for at se, om den gjorde nogen forskel (ud fra devisen: hvorfor have kode med, der ikke gør nogen forskel). Og det virkede uden denne linje, og i feltet på 3. relationsniveau gjorde det forskellen på om det virkede eller ikke.
Avatar billede terry Ekspert
24. maj 2020 - 12:01 #45
Looking at #29
NewData = Me.Appellation.Text

THis isnt necessary, because NewData is a parameter included in the NotInList event

Private Sub XXXXX_NotInList(NewData As String, Response As Integer)
The NewData is automatically given the value of what you entered into the combo, so it isnt necessary to do it again in the code.
Avatar billede visto Professor
24. maj 2020 - 12:22 #46
Tak for forklaring.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester