07. april 2008 - 10:13Der er
22 kommentarer og 1 løsning
Opdaterbar forespørgsel
Hej
Får fejlmeddelelsen "Forespørgslen skal være en opdaterbar forespørgsel".
Jeg har en database med diverse tabeller. Den ene indeholder en masse registeringer. Det er IND/UD scanning af noget emballage. Vil godt lave en forespørgsel der sætter denne emballage til at være skrottet hvis status er IND og seneste registrering er ældre end 45 dage. Jeg har lavet en "Opdateringsforespørgsel" men får ovenstående fejl. Hvad går galt? Det er en tjekboks i en tabel der skal sættes til sand i stedet for falsk.
Der er tale om en større database og jeg har ikke ordentligt styr på relationer. Jeg er derfor bange for at komme til at blokere for et eller andet ved at ændre i relationerne. De relationer du mener er selve relationerne imellem tabellerne ikke? Integritet, osv. Findes der ikke nogle generelle guidelines på dette område? Synes hjælp-funktionen er meget overfladisk. Den skriver bare at forespørgslen skal være opdaterbar, hvilket ikke løser det store.
Jo. Den er jeg med på. Jeg er bare bange for at ændre i noget jeg efterfølgende ikke har overblik over konsekvenserne af. Det kan se rigtigt ud, men når først databasen er sat tilbage i drift, kan der være ting, jeg ikke har opdaget. Jeg har kort skimmet dine links igennem. Kan fornemme at du mener, at det har noget med normalisering at gøre. Det er muligt, at det er her problemet ligger. Som jeg skrev, er det en større database, som vi har haft en IT-virksomhed til at udvikle. Jeg tvivler defor på, at det er relationerne den er gal med. Selvfølgelig findes der også dårlige IT-konsulenter. Da jeg oprettede spørgsmålet havde jeg en idé om, at det måske kunne være fordi, at der indgik en beregning i forespørgslen, at den ikke virkede. Havde håbet det var noget, der var et hurtigt svar til. Tror jeg vil lade vores IT-konsulenter komme med deres besyv.
Prøv at åbne forespørgslen og se, om der ligger en opsummering af nogle poster. Hvis der gør, er opsummeringen jo en samling af poster der betyder, at Access ikke "ved" hvilken post du vil ændre, og derfor kan forespørgslen ikke ændre poster.
Der indgår 2 tabeller og 1 forespørgsel i opdateringsforespørgslen.
Registreringstabellens poster er bl.a. emballagenr., tidspunkt for registrering, IND/UD, ordrenr. Emballagetabellen indeholder bl.a. emballagenr. (nøgle), type, aktiv/ikke aktiv. Forespørgslen indholder emballagenr. samt maks tidspunkt for registrering på emballagenr. Dvs. at forespørgslen finder den sidste nye registrering på det specifikke emballagenr.
Opdateringsforespørgslen er herefter bygget op således. Forespørgslen udvælger seneste registrering på emballagen. Aktiv/ikke aktiv sættes til falsk. Dvs. at kun aktive emballager medtages. IND/UD sættes til "IND". Jeg ønsker at finde de emballager, der pt. har status IND. Maks tidspunkt sættes til < date() - 45. Den post der ud fra ovenstående kriterier skal opdateres er aktiv/ikke aktiv. Den skal sætte de fundne poster til ikke aktiv = en tjekboks der sættes til sand. Giver det mening eller er jeg helt i hegnet?
Ud fra det du skriver, er der ikke noget der tyder på nogle beregninger, så det må være relationerne. Men det er sværst at give et bud på, hvad der kan være galt. Du kan evt, tage en kopi af objekterne og lege med dem eller en kopi af hele db.
Du skriver, at db er stor. Prøv evt. i funktioner i databasefunktioner > Reparer og komprimer. Derefter checker du størrelsen igen.
Den blev 4-5 mb mindre. Nu er den på 14 mb. Fejlen er dog stadig den samme. Du skriver at jeg kan lege lidt med objekterne. Min viden er simpelthen for ringe til bare lige at gøre dette. Jeg vil ikke vide hvilke parametre jeg kan lege med. Nålen og høstakken du ved.
Har en idé. Hvis jeg i forespørgslen kan udvælge maks registreringstidspunkt under hensyntagen til at dette er en IND registrering kan jeg slippe for at medtage registreringstabellen i opdateringsforespørgslen. Har en idé om at det er her det går galt nemlig. Hvis jeg sætter kriteriet i forespørgslen til at IND/UD skal være IND finder den jo bare maks tidspunkt for seneste IND. Det jeg vil finde er maks tidspunkt HVIS det er IND. Kan det forstås?
Du kan åbne db i databasevinduet og vælge fanen Forespørgsler. Marker den forespørgsel du vil "lege" med og kopier den. DErefter kan du gøre med den som du vil og slertte den bagefter.
Har fundet ud af at så snart jeg blander forespørgslen med MaksOfSidsteRegistrering ind i billedet, så kan jeg ikke ændre i posterne. Jeg har afprøvet relationen imellem tabellen med emballagen og forespørgsel med alle 3 muligheder, men intet hjælper.
MaksOfSidsteRegistrering er en beregning der ligger i menuen Vis > Totaler. Så kommer der en linie mere i forespørgslen hvor du kan vælge Maks.
En sådan forespørgsel kan IKKE redigeres, som jeg tidliogere har omtalt. Det kan simpelthen ikke lade sig gøre. Du må finde en anden måde at foretage opdateringen på.
Ok. Forstod bare på dig, at der ikke var beregninger, der gav problemer. Hvad er der af andre muligheder for at vælge den linie ud for hvert emballagenr. hvor registreringen er nyest?
Beregninger behøver ikke at give problemer. Denne beregning f.eks.:
Udtryk1:[felt1]+[felt2]
betyder ikke, at forespørgslen ikke kan opdateres. Men når du bruger Vis > Totaler betyder det, at de viste poster er en samling af flere poster, og så kan du ikke redigere i posterne, for Access ved ikke hvilken post du vil opdatere.
Du kan lave en ny opdateringsdforespørgsel med kriterier:
Status skal have kriteriet Ind Registreringen skal være < Date() - 45
Nu skal du ikke sætte din have over styr pga. den slags småproblemer her :-) Jeg kan godt lave opd.forespørgslen, som du beskriver. Problemet er så bare, at der på næsten alle emballagenr. er en IND registrering. Tabellen er bygget op således at ALLE registreringer gemmes. Dvs. at for hver registrering er der en linie i tabellen. Dvs. at næsten alle emballagenumre er medtaget på trods af afgrænsningerne under kriterier. Jeg skal have lavet et kriterie hvor der kun sammenlignes med den nyeste registreringsdato. Kan man skrive sig ud af dette?
Har lige været optaget af andre opgaver, men er nu klar ved tasterne igen. Hvor skal jeg indsætte VBA-koden. Jeg er totalt nybegynder når det gælder VBA...
Åbn din formular i designvisning. Tag en kommandoknap fra værktøjslinien og sæt den i formularen. Højreklik på den > Egenskaber > Fanen hændelser > Sæt markøren på linien VedKlik og tryk på de 3 små ... i højre side. Du kommer nu ind i VBA-editoren og du indsætter koden hvor markøren blinker.
Hvis du lægger din e-mail, kan jeg sende et eksempel.
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.