14. september 2000 - 20:06Der 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 ???
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.
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\")
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).
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
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.
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\"
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å.
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
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.