Avatar billede visto Professor
02. juni 2020 - 16:04 Der er 18 kommentarer og
4 løsninger

Ændring af VBA-kode

Som det er nu, sørger nedenstående kode for at spørge, om jeg vil tilføje en ny appellation, hvis den i feltet indtastede appellation ikke findes i den tabel (Appellationer), der er rækkekilde til komboksen, som jeg indtaster i. Hvis jeg vælger Ja, tilføjes den nye appellation til denne tabel, og jeg kan fortsætte med indtastninger i andre felter. Hvis jeg vælger Nej, bliver jeg bedt om at indtaste en appellation fra den udfoldede liste, som viser indholdet af nævnte tabel Appellationer.

Jeg ønsker imidlertid, at det der skal ske, hvis jeg vælger Nej, er at jeg blot kan fortsætte mine indtastninger i andre felter, uden at den nye appellation tilføjes til tabellen, og uden at jeg tvinges til at vælge en allerede eksisterende appellation fra listen/tabellen. M.a.o. hvis jeg vælger Nej, skal jeg bare kunne gå videre, og scriptet skal ikke gøre mere.

Hvordan skal koden ændres?

Nuværende kode:

Private Sub Appellation_NotInList(NewData As String, Response As Integer)
On Error GoTo Error_Handler
 
    Dim intAnswer As Integer
 
    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 & ", " & Err.Description
        Resume Exit_Procedure
        Resume
End Sub
Avatar billede terry Ekspert
02. juni 2020 - 19:51 #1
Case vbNo
            Response = acDataErrContinue
            Me.Appellation.Undo
Avatar billede visto Professor
02. juni 2020 - 20:10 #2
Yep. Det virker. Tak.
En lille skønhedsting: Når jeg svarer Nej, vises listen med appellationer fra tabellen, som jeg før skulle vælge noget fra. Kan jeg blive fri for at at denne liste slår ud/viser sig? Altså at svaret Nej bare udløser ingenting?
Avatar billede terry Ekspert
02. juni 2020 - 20:40 #3
Dont think its possible but if I find somethink I'll let you knoe ;-)
Avatar billede terry Ekspert
02. juni 2020 - 20:40 #4
know
Avatar billede visto Professor
02. juni 2020 - 20:48 #5
great, thanks
Avatar billede visto Professor
02. juni 2020 - 21:03 #6
Arhh, jeg har lige opdaget et problem mere. Når jeg indtaster en appellation, som ikke er i tabellen, og jeg svarer Nej til at den skal tilføjes tabellen, som er rækkekilde til kombobosen, så slettes min indtastning. M.a.o. kan jeg aktuelt ikke skrive en ny appellation i feltet uden at være tvunget til at tilføje den til tabellen. Så svarene Ja og Nej giver ingen mening. Jeg er tvunget til enten at tilføje en ny appellation til tabellen eller vælge en fra listen. Hvor jeg gerne bare vil kunne skrive hvad der passer mig, uden at noget (scriptet) skal blande sig i, om det skal i tabellen eller ej. Nej betyder for mig bare, at jeg ikke ønsker det tilføjet til tabellen, ikke at jeg bliver forhindret i at skrive i feltet.
Avatar billede terry Ekspert
02. juni 2020 - 21:31 #7
Not quite sure I understand.
If you answer yes you add the new appellation to the table. If you answer no then the data you entered is removed and you can TAB to the next field. You do not have to enter a new appellation or choose on efrom the list???
Avatar billede terry Ekspert
02. juni 2020 - 21:33 #8
"Hvor jeg gerne bare vil kunne skrive hvad der passer mig, uden at noget (scriptet) skal blande sig i, om det skal i tabellen eller ej."

Are you saying that you wnat Access to accept what you enter and NOT add it to the table?

Whats the point in having a combo then???
Avatar billede bvirk Guru
03. juni 2020 - 09:30 #9
En combo boks viser et element fra sin datakilde. Det lyder for mig som om der ønskes en combo boks skal kunne efterlades (= miste focus) visende en 'appelation' der ikke er en en post i dens datakilde.
Det er en combo boks som sådan ikke lavet - hensigtsmæssig understøttende  den  almindelige anvendelse at vise et felt i formularens aktuelle post - det gælder naturlig kun formularer som har en datakilde (formularens egen ikke combo boksens) hvortil combo boksen er bundet til et felt.
Som jeg ser det ville jeg droppe de msgbox's - evt. have en appelation navngivet '-' (et enkelt minu tegn) og lave det at tilføje nye appelationer en af følgende
1. unconfirmed - dvs. den bliver bare tilføjet.
2. som 1. men kortvrigt visualt tilkendegivet på button der ikke indår i focus kæden hvis ligeledes kortvarige aktiverbare click event sletter posten i comboboksens datakilde og vælger '-' posten
Avatar billede visto Professor
03. juni 2020 - 10:35 #10
bvirk, tak for dit svar.
Den kode, jeg skrev i mit indledende indlæg, har andre klaret for mig. Jeg behersker ikke selv VBA, så jeg kan ikke oversætte det du skriver til konkret kode.

Jeg var i gang med at skrive en længere forklaring på, hvad jeg gerne ville opnå, da beskeden om dit indlæg tikkede ind i min mailboks. Den var et svar på #7 og #8. Den copy/paster jeg nedenfor.
Hvis det, du skriver, gør det, som jeg ønsker, håber jeg du vil hjælpe med den konkrete kode.
- - -
Jeg kan godt forstå, det kan være svært at forstå. Så nu kommer den lange forklaring:

I formularen, som bl.a. indeholder komboboksen Appellation, er flere andre felter såsom Producent og Navn (det handler om vin). De data, som indtastes i formularen registreres i tabellen HOVEDTABEL, som indeholder de samme felter som formularen.
Når jeg opretter en ny vin, altså en ny post i formularen og dermed i HOVEDTABEL, skal jeg bl.a. indtaste vinens appellation. Hvis vinens appellation tidligere er indtastet for en anden vin, findes appellationen i komboboksens rækkekildetabel, som hedder Appellationer, og som kun har ét felt. Jeg vil derfor, mens jeg indtaster få forslag, eller jeg kan slå op på listen og vælge en appellation der.

Ved oprettelse af en ny vin og ved indtastning af en ny appellation vil funktionaliteten med at spørge "Vil du tilføje appellationen til listen?" og med de Ja- og Nej-hændelser, som de var før jeg oprettede dette spørgsmål, være fuldt tilstrækkelige. MEN i meget sjældne tilfælde støder jeg på en uregelmæssighed i forbindelse med en allerede oprettet vin. Den kan f.eks. være oprettet med appellationen Chianti Classico Riserva for 10 år siden. Men en ny årgang, som jeg nu skal registrere, har appellationen Chianti Classico Gran Selezione. Nye årgange af samme vin bruger samme post (med basisoplysninger) i forularen/HOVEDTABEL (specifikke data for årgangen, såsom årgangsnummer og specifik alkoholprocent for årgangen registreres i en underformular).
Det jeg så - og det er den sjældne undtagelse - i dette tilfælde ønsker at kunne er i appellationsfeltet at tilføje en bemærkning til den indtastede appellation, så det f.eks. kommer til at se sådan ud: Chianti Classico Riserva (efter 2017: Gran Selezione). Og så vil komboksen spørge: "Vil du tilføje appellationen til listen?" Og mit svar vil være Nej, for denne meget specifikke tekst for netop denne vin skal ikke være valgbar på appellationslisten efterfølgende og skal dermed ikke tilføjes komboboksens appellationstabel, men skal selvfølgelig registreres i HOVEDTABEL, hvilket ikke kan lade sig gøre med den nye løsning, jeg har afprøvet.

Jeg kan så godt se, at jeg formelt set, hvis jeg skal holde feltet Appellation "rent", så det kun indeholdende appellationer og ingen efterfølgende kommentarer som i eksemplet ovenfor, burde oprette endnu et felt, som kunne hedde Kommentar til appellation. Men det er lidt voldsomt for en hændelse, der bliver brug for ved måske 10 ud af 4000 vine. Jeg vil derfor foretrække den lidt mindre "korrekte" løsning - at kunne skrive en kommentar i appellationsfeltet. Og så får jeg brug for at kunne svare Nej til "Vil du tilføje appellationen til listen?" uden at være tvunget til at vælge fra den i forvejen eksisterende liste.
Avatar billede terry Ekspert
03. juni 2020 - 11:06 #11
Have had a very qucik read of you rlast comment and noticed this.

"korrekte" løsning - at kunne skrive en kommentar i appellationsfeltet.

Not sure I agree with that but heres a suggestion

If you cant use an existing Appellation and dont want to add the "new" Appellation to the tavle, then you could have pseudo Appellation  "See comment to Appellation" which refers to anothe field "Comment to Appellation " wher eyou can write whatever you want.
Avatar billede bvirk Guru
03. juni 2020 - 15:18 #12
En vin kategori (HOVEDTABEL) var af en bestemt appellation intil ny årgange krævede underindeling af appellation.

Appelation må så høre til årgangene (de relaterede poster i underformular) for en vin kategori i HOVEDTABEL kan ikke for nogle årgange (= relaterede poster) være af  én appelation og andre en anden.

Jeg tror jeg ville tilføje et felt 'appelation' til årgangs tabellen - et felt valgfrit felt som så vil indeholder ingenting for de fleste poster - betydende det som HOVEDTABEL angiver.

feltet 'appellation' i HOVEDTABEL er så at opfatte som default værdi - man kunne måske oven i købet lavet en etiktte over combo boksen  a la 'Mest anvendte for denne producent'.

Det kan konceptmæssigt ikke ske i combo boksen i HOVEDTABEL formularen.
Avatar billede visto Professor
03. juni 2020 - 20:41 #13
Tak for begge ideer. Jeg overvejer, hvad jeg vil gøre.

Med alt det man kan i dag, overrasker det mig, at man ikke kan lave en funktionalitet, hvor svaret Ja til spørgsmålet "Vil du tilføje appellationen til listen?" tilføjer den nye appellation til listen, mens svaret Nej gør, at den kodede funktion stopper sin aktivitet og holder op med at blande sig i, hvad jeg foretager mig i feltet.

I øvrigt (ang.#12 om "underinddeling af appellation"): Der er typisk tale om, at ny vinlovgivning udskifter én betegnelse med en anden, så vinen er sådan set den samme blot benævnt anderledes. I eksemplet med Riserva, der et år ændres til Gran Selezione, fandtes sidstnævnte ikke da den første vin blev registreret. Så hele miseren (og grunden til at jeg vil fortsætte med at registrere nye årgange under samme stamdata-post) skyldes, at vinene, hvor jeg ønsker at tilføje en kommentar til appellationen, er at betragte som identiske men med opdaterede oprindelsesbetegnelser.
Avatar billede terry Ekspert
04. juni 2020 - 10:44 #14
"Med alt det man kan i dag, overrasker det mig, at man ikke kan lave en funktionalitet, hvor svaret Ja til spørgsmålet "Vil du tilføje appellationen til listen?" tilføjer den nye appellation til listen, mens svaret Nej gør, at den kodede funktion stopper sin aktivitet og holder op med at blande sig i, hvad jeg foretager mig i feltet."

Its nothing to do with what we can or cant. Its basic database design.
If your database is designed correctly, when you choose an appellation from those that exist, it takes the primary key value of that appellation and puts it in your HOVEDTABEL. This will be a numeric value probably. So you now have a relationship from HOVEDTABEL to Appellationer table.
So whne you view the records the correct Appellationer is shown. Also if you made queries, you would be able to make relationships between the two tables.

If we now did what you want to, add any text you wish, where would you put that text? You dont want it to be an Appellation, and thats OK, but if you want to bve able to show this text, it has to be stored somewhere. And if its not in the Appellationer table, then it needs to be in either the HOVEDTABEL, or another related table for that use.
And that is why I suggested another field for texts which arent "real" Appellationer.
Avatar billede visto Professor
04. juni 2020 - 13:43 #15
Tak for din kommentar.
Der er INGEN relation mellem HOVEDTABEL og tabellen Appellationer. Sidstnævnte tabel består, som jeg har skrevet, af ét felt og ingen nummerering. Alle grundoplysninger, herunder hvilken appellation en given har, lagres i HOVEDTABEL og altså ikke i Appellationer. Hver vin er én post i HOVEDTABEL.

For at illustrere: Hvis jeg sletter tabellen Appellationer, sker der intet med mine data i HOVEDTABEL, fordi det er i sidstnævnte de lagres. Det eneste, der ville ske, hvis jeg slettede tabellen Appellationer, ville være at der ikke vil være nogen liste at slå op i i komboboksen i hovedformularens felt med oplysninger om vinens appellation. Denne liste fungerer udelukkende som "forslag" til, hvad jeg kan vælge mellem af appellationer, når jeg skal indtaste i hovedformularen (hvis data lagres i HOVEDTABEL. Så grundlæggende er min database bygget anderledes op end - som jeg læser det - du tror.

Det kan så være, at min database ikke er opbygget optimalt eller efter bogen. Jeg burde måske fra starten have lavet en relation mellem HOVEDTABEL og Appellationer, så HOVEDTABEL får sine data om appellation fra tabellen Appellationer i stedet for at oplysningerne blive registreret i HOVEDTABEL for hver post. Men det gjorde jeg ikke der tilbage i 1998, da jeg begyndte projektet...
Avatar billede visto Professor
04. juni 2020 - 14:25 #16
Uanset hvad, så har jeg nu under alle omstændigheder besluttet at holde appellationsfeltet "rent" og altså kun indeholdende appellationer og dermed ingen kommentarer, hvorved løsningen med automatisk indsættelse af nye appellationer i tabellen Appellationer kan bibeholdes.

Jeg vælger dog at tilføje løsningen fra #1, for jeg har ikke brug for den påmindelse om at vælge fra tabellen, hvis jeg svarer Nej. Den ville være aktuel, hvis andre skulle bruge databasen, men det er ikke tilfældet.

Kommentarer til ændring af en given vins appellation over årene, vil så fremgå af et seperat felt "Tidligere årgange", hvor det også vil være aktuelt at anføre andre ændring end appellations-navneskift. Der er også eksempler på, at producenter skifter navn, og andre oplysninger kan også være nyttige at anføre i dette felt.

Jeg takker endnu engang for alle inputs. Nyttigt og inspirerende.
Avatar billede terry Ekspert
04. juni 2020 - 15:01 #17
Happy that you have a solution thats acceptable ;-)

Just (hopefully) a short comment

in #6 you wrote "Hvor jeg gerne bare vil kunne skrive hvad der passer mig, "

Even if the combo is unbound (doesnt save data to main table) , the problem is still the same. Where do you expect to put "hvad der passer dig..." if it isnt in the main table or Appellationer table?
Avatar billede visto Professor
04. juni 2020 - 15:36 #18
ALT hvad jeg indtaster i hovedformularens Appellations-felt under en hvilken som helst omstændighed lagres i HOVEDTABELS felt "Appellation".
Avatar billede visto Professor
04. juni 2020 - 15:49 #19
Må jeg lige spørge (jeg kan godt lide at vide hvad der foregår):
Hvad gør den kode, du skrev i #1?

Case vbNo
            Response = acDataErrContinue
            Me.Appellation.Undo
Avatar billede terry Ekspert
04. juni 2020 - 16:09 #20
https://docs.microsoft.com/en-us/office/vba/api/access.combobox.notinlist

Response = acDataErrContinue Doesn't display the default message ...
Me.Appellation.Undo removes what you have entered into the field
Avatar billede visto Professor
04. juni 2020 - 16:50 #21
Tak for servicen :-)
Avatar billede terry Ekspert
04. juni 2020 - 17:26 #22
selv tak
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
Kategori
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

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