Avatar billede sorenmt Nybegynder
14. september 2000 - 20:06 Der er 14 kommentarer og
1 løsning

Opdater formular efter tilføjelse af ny post

Jeg her en database, som jeg bruger til noget videosystem. Der skal man bl.a. udfylde Genre mm. Men det hender, at jeg støder på en ny film, hvor genren ikke eksistere. Så har jeg lavet det sådan (med makro) at når man dobbelt klikker på feltet, åbner den tabellen, hvor alle genrene står i.
Så kan jeg tilføje en ny, men jeg kan først se den i den anden database, når jeg lukker den ned og åbner den igen. Hvordan kan jeg lave, så dan bliver opdateret f.eks. når den anden tabel lukkes ???
Avatar billede sorenmt Nybegynder
14. september 2000 - 20:07 #1
Jeg skal måske lige tilføje at, det felt hvor man vælger genre i, er i en kombinationsboks, som har sin egen tabel
Avatar billede hnteknik Novice
14. september 2000 - 20:35 #2
Jeg har skrevet om det før.

åben underformualarer som en dialog i.e.

docmd.form,\"\",.... , adialog eller sådan noget.

herved stopper exekveringen af koden i
comboboksens dbltklik sub - det er vigtig for ikke at næste linie udføres førend at du returnerer/lukker under formularen.

næste linie

me.comboboks.requery

og så er komboboksen opdateret.

Henrik.
Avatar billede sorenmt Nybegynder
14. september 2000 - 22:29 #3
Kan du lige forklarer det på dansk tak !!!!
Avatar billede hnteknik Novice
15. september 2000 - 22:14 #4
nej men på us VBA sprog

Private Sub Kombinationsboks0_DblClick(Cancel As Integer)
    DoCmd.OpenForm \"frm-omf-type\", , , , , acDialog
    Me.Kombinationsboks0.Requery
End Sub
Avatar billede lkp Nybegynder
19. september 2000 - 13:50 #5
Hej Sorenmt

Jeg går ud fra, at du kan bruge VBA.

Det du skal bruge, er comboboxens NotInList event. Denne event har to parametre nemlig NewData og Response.

NewData indeholder den streng brugeren har forsøgt at tilføje, og Response skal du sætte til f.eks. acDataErrAdded, der angiver, at du har tilføjet posten.

Nedenstående simple kode, antager at comboboxen hedder \"cmbValg\", at den tabel comboboxen trækker data fra hedder \"tblTest\", samt at det felt i tabellen der skal tilføjes nye data i hedder \"Tekst\".

Koden indsættes som sagt i comboboxens NotInList event. Dette gøres ved at vælge egenskaber for combboxens, og vælge code builder ud for NotInList.

Bemærk endvidere, at eksemplet anvender DAO, da du ikke angiver hvilken version af Access du bruger. Denne burde virke med både 2000 og 97. Såfremt du bruger 2000 er referencen til DAO dog ikke sat som standard. Dette gøres ved, fra VB editoren, at gå i Tools, References og sætte hak ud for Microsoft DAO 3.6 Object Library.

I Access 97 skal du ikke gøre noget.

--- Kode start ---

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

    Dim db As DAO.Database
    Dim rst As DAO.Recordset
   
    Set db = CurrentDb
    Set rst = db.OpenRecordset(\"tblTest\")
   
    Response = acDataErrAdded
   
    rst.AddNew
    rst.Fields(\"Tekst\").Value = NewData
    rst.Update
   

End Sub

--- Kode slut ---

Jeg håber at ovenstående er forståligt nok, ellers skriv igen.

Med venlig hilsen

LKP
Avatar billede hnteknik Novice
19. september 2000 - 21:49 #6
Det var fandme dag ikke det du spurgte om.
Svaret har jeg soerme givet dig.

Henrik
Avatar billede lkp Nybegynder
19. september 2000 - 22:20 #7
Hej HNTeknik

Voldsomt sprog du fører dig.

Ordet \"f.eks.\" i spørgsmålet, giver vel mulighed for, at løse problemet på en bedre måde end den forholdsvis omstændige måde du (ikke særlig godt) beskriver.

Nu er det ikke pga. pointene, at jeg besvarer spørgsmål, så hvis du virkelig føler dig snydt for de 60 point, kan jeg oprette et spørgsmål der lyder:

Hvordan åbner jeg en formular, og forhindrer anden kode i at blive eksekveret mens denne formular er åben (modal).

Og taksere det til 60 point...

Med venlig hilsen

LKP
Avatar billede sorenmt Nybegynder
20. september 2000 - 17:50 #8
Til hnteknik 

Jeg må give LKP ret i at den formulering ikke er serlig i møde kommende, derud over, kunne jeg ikke fatte en halv meter af din forklaring, hvor i mode at LKP\'s forklaring var lidt mere detaljeret
Avatar billede hnteknik Novice
20. september 2000 - 17:54 #9
Glem det.

Nu du tilsyneladende ikke ved så meget om VBA i access, har du så tænkt over, hvad du gør, når du kommer til at taste et forkert resultat ind ???

Hvad hvis en anden bruger dit program - ved han det så også ???

Kan du have en god dag Henrik
Avatar billede hnteknik Novice
20. september 2000 - 20:37 #10
Sorry - men når jeg stikker et tip midt i en stresset arbejdsuge på 60-70 timer og folk forventer det hele serveret på et sølvfad flipper jeg sgu ud.

Sagens kerne er, at du ikke skal bruge en makro til at fremkalde en form visning.

Ved at højreklikke på comboboksen kan du indsætte en subrutine for dobbeltklikfunktionen

i rutinen indsættes kaldet til formularen

DoCmd.OpenForm \"frm-omf-type\", , , , , acDialog
   
acdialog i.e. dialogformen sikrer, at koden stopper her indtil formen lukkes igen.

man kan nu i ro og mag opdatere sin tabel, der ligger til grund for comboboksen.

Ofte har man i sit opslag kun brug for at gemme et tal, der repræsenter et forhold

1 svarer til pornofilm
2 til skrækfilm etc.

ofte har man to eller flere kolonner i et opslag
1 til tallet (det skjuler man)
1 til teksten, man gerne vil se (pornofilm)
1 til et notat, der forklarer hvad pornofilm er.

Min måde er derfor den mest kontrollerede måde at opdatere på modsat den anden, der umiddelbart virker tiltalende men kan forårsage en masse garbage i opslagstabellerne.

når opslagformularen lukker gives kontrollen tibage til programmet, der udfører den næste og efterfølgende linier kode:

Me.Kombinationsboks0.Requery

der opdaterer dit rullegardin.
du kan nu finde den eller de nye opslag, du har tilført eller ikke finde dem, du har slettet.

to liner kode - sikker opdatering - no garbage

er der mere at forstå.
Henrik

Avatar billede lkp Nybegynder
20. september 2000 - 21:10 #11
Hej Henrik

Nu skal vi ikke koge ret meget mere suppe på det her...

Men...

Hvis du er så stresset, at du ikke kan give fyldige svar, samt svare i et fornuftigt sprog, burde du hellere lade være.

Mht til dit argument med, at man får en masse affald ved den metode jeg forklarer, kan jeg kun sige flg.:

Det er rigtigt, at der ikke er nogen form for check mht. om f.eks. kategorien eksisterer i forvejen. Af den årsag, kunne man forestille sig, at der kom gengangere af typen \"Skræk Film\", \"Skrak Film\" osv.

Den metode du nævner har dog heller ingen check for dette... Selvom du åbner en formular med hele den underliggende tabel, står der ikke andet i den, end der står i comboboxen - du viser jo netop den tabel der ligger til grund for comboboxen.

Jeg vil give dig ret i, at hvis programmet skal distribueres, skal der laves dobbeltcheck, eksempelvis med en msgbox.

Du er dog ikke den eneste i det her forum, der udvikler for andre, og mine erfaringer med at åbne en formular der giver brugeren direkte adgang til en underliggende tabel, der ovenikøbet bruges til at kategorisere andre poster, ikke er en god idé (En forfærdelig masse indskudte sætninger - undskyld).

Situationen hvor der er kommet \"garbage\" i opslagstabellen er - som du skriver - sandsynlig. Men der går først rigtig ged i den hvis man giver brugeren mulighed for, at fjerne kategorier uden at lave en grundig check på evt. efterladte poster.

Hele denne lange smøre bare for at fortælle, at der er fordele og ulemper ved begge metoder. Jeg vil give dig ret i, at hvis databasen skal distribueres, skal der mere check på tingene. Men det gælder for begge metoder.

Jeg synes at det mest intuitive for brugeren er, at såfremt der indtastes et element der ikke eksisterer i forvejen, spørger programmet om elementet skal tilføjes - eller bare gør det.

Måske synes Sorenmt også det, eller måske synes han bare at min forklaring var mere letlæselig, eller også var det af en 3. årsag, at han valgt mit forslag. Uanset hvad, så træk lige vejret en ekstra gang næste gang du er stresset og sætter dig til at besvare spørgsmål.

Hverken din eller min løsning kan: \"to liner kode - sikker opdatering - no garbage\", men man kan bruge begge metoder, sammen med lidt ekstra kode til at opnå det.

Håber at jeg i dette lange indlæg har gjort mig selv forståelig, og at du forstår at det ikke er for at træde dig over fødderne.

Med venlig hilsen

LKP

PS. Såfremt der skal knyttes en forklaring til en entry i opslagstabellen, skal man åbne en dialog box. Dette gør jeg ved at åbne en inputbox (standard eller designet) hvor jeg f.eks. skriver \"Skrækfilm er ikke en katogori i øjeblikket, Skriv en forklaring, og tryk OK for at tilføje, ellers tryk Anuller\"

Avatar billede hnteknik Novice
20. september 2000 - 22:17 #12
Ja du har også ret og så lige det sidste ord og så ikke mere i nat.

Jeg formoder, at du giver mig ret i, at din ellers udmærket metode ikke dur, hvis man f.eks. skal gemme et nyt index og helst vil se en smule tekst i rullegardinen, men det har du måske også en løsning på.

Henrik
Avatar billede lkp Nybegynder
20. september 2000 - 22:24 #13
Hej Henrik

Du har ret.

Selvom jeg måske kunne finde en løsning :-)

Tak for en (faktisk lærerig) diskussion, håber at vi stadig er på talefod.

Med venlig hilsen

LKP
Avatar billede hnteknik Novice
21. september 2000 - 13:43 #14
Jamen det er vi da og lad mig lige snørre sækken med denne her - Henrik
Jeg er normalt ikke så sur:

Private Sub cbvalg_NotInList(NyData As String, Response As Integer)
                    Dim db As Database, rs As Recordset
                        Dim strMsg As String
                        strMsg = \"\'\" & NyData & \"\' er ikke med på listen\"
                        strMsg = strMsg & \"@ønsker du at tilføje denne ?\"
                        strMsg = strMsg & \"@klik JA for at tilføje eller NEJ for at rette.\"
                        If MsgBox(strMsg, vbQuestion + vbYesNo, \"Tilføj \" & NyData & \" til listen?\") = vbNo Then
                            Response = acDataErrContinue
                        Else
                            Set db = CurrentDb
                            Set rs = db.OpenRecordset(\"tabelnavn\", dbOpenDynaset)
                            On Error Resume Next
                            rs.AddNew
                                rs!variabelnavn = NyData
                            rs.Update
                           
                            If Err Then
                                MsgBox \"Hovsa - prøv igen.\"
                                Response = acDataErrContinue
                            Else
                                Response = acDataErrAdded
                            End If
                        End If
                    End Sub
Avatar billede lkp Nybegynder
21. september 2000 - 13:56 #15
Hej Henrik

Smukt...

Vi tales ved.

Med venlig hilsen

LKP
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