20. maj 2020 - 15:38Der 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?
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
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).
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?
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 ?
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?
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 = "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
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å?
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?
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)...
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 = "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?
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
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.
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
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
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
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
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
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
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?
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.
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.
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.