Avatar billede puppetmaster Nybegynder
23. september 2005 - 14:08 Der er 12 kommentarer og
1 løsning

Problem med opdateringsforespørgsel (Aggregate)

Følgende opdateringsforespørgsel går i fejl:
"Du har forsøgt at køre en forespørgsel, der ikke medtager det angivne udtryk "Tot" som en del af en aggregatfunktion"

UPDATE tempLonpostTotal, Medarbejdere SET Medarbejdere.[Genn_snitløn-var] = tempLonpostTotal.Tot, Medarbejdere.Beregningsgrundlag = Last([tempLonpostTotal].[Dato]) & ", " & Last([tempLonpostTotal].[Dato])
WHERE (((Medarbejdere.Nummer)=[tempLonpostTotal].[Medarbejdernr_]));


Det kører fint nok når jeg kun forsøger at opdatere feltet Tot:
UPDATE tempLonpostTotal, Medarbejdere SET Medarbejdere.[Genn_snitløn-var] = tempLonpostTotal.Tot
WHERE (((Medarbejdere.Nummer)=[tempLonpostTotal].[Medarbejdernr_]));


Hvordan kommer jeg videre (skal gerne have opdateret begge felter...)
Avatar billede claesdamlund Nybegynder
23. september 2005 - 14:23 #1
Last er en aggregat funktion, som kræver en Group By for at virke. Du vil åbenbart have den seneste dato pr. et eller andet -  er dét pr medarbejdernummer?
Avatar billede puppetmaster Nybegynder
23. september 2005 - 14:26 #2
:)
Ja, det er det lige nøjagtigt.
Har dog ændret på den i mellemtiden, så den ser sådan her ud:

UPDATE tempLonpostTotal, Medarbejdere SET Medarbejdere.[Genn_snitløn-var] = tempLonpostTotal.Tot, Medarbejdere.Beregningsgrundlag = Last([tempLonpostTotal].[Dato])
WHERE (((Medarbejdere.Nummer)=[tempLonpostTotal].[Medarbejdernr_]));
Avatar billede claesdamlund Nybegynder
23. september 2005 - 14:28 #3
I øvrigt ser det ud som om du henter den samme dato ud 2 gange og konkatenerer dem med et komma og mellemrum imellem:

Last([tempLonpostTotal].[Dato]) & ", " & Last([tempLonpostTotal].[Dato])

Er dét meningen?
Avatar billede puppetmaster Nybegynder
23. september 2005 - 14:29 #4
:)
(det nåede jeg vist at rette før du post'ede)
Avatar billede claesdamlund Nybegynder
23. september 2005 - 14:33 #5
Hvis du laver det i forespørgsler, så lav en ny forespørgsel (aggregatforespørgsel), hvor du grupperer efter medarbejdernummer og laver en Last på din dato (kald evt. feltet for SenesteDato). I din Update forespørgsel henter du aggregatforespørgslen og Medarbejdere tabellen ind og joiner dem (laver en relation) på medarbejdernummer. Derefter kan du lave din update uden at skulle bruge Last funktionen, idet du blot opdaterer Beregningdgrundlag til SenesteDato.
Avatar billede puppetmaster Nybegynder
23. september 2005 - 14:41 #6
Så får jeg en "Handlingen skal bruge en opdaterbar forespørgsel" fejl.
Avatar billede puppetmaster Nybegynder
23. september 2005 - 14:43 #7
UPDATE tempLonpostTotal, Medarbejdere
INNER JOIN qryLastUpdate
ON Medarbejdere.Nummer = qryLastUpdate.Medarbejdernr_ SET Medarbejdere.[Genn_snitløn-var] = tempLonpostTotal.Tot, Medarbejdere.Beregningsgrundlag = [qryLastUpdate].[SenesteDato]
WHERE (((Medarbejdere.Nummer)=[tempLonpostTotal].[Medarbejdernr_]));
Avatar billede claesdamlund Nybegynder
23. september 2005 - 14:56 #8
Du skal også joine Medarbejdere og tempLonostTotal, så din SQL stning kommer til at hedde noget i retning af:

UPDATE Medarbejdere
INNER JOIN tempLonpostTotal
ON Medarbejdere.Nummer=[tempLonpostTotal].[Medarbejdernr_ ]
INNER JOIN qryLastUpdate
ON Medarbejdere.Nummer = qryLastUpdate.Medarbejdernr_ SET Medarbejdere.[Genn_snitløn-var] = tempLonpostTotal.Tot, Medarbejdere.Beregningsgrundlag = [qryLastUpdate].[SenesteDato];

Men Access vil gerne have en frygteligt masse paranteser med når man joiner flere tabeller, så jeg ved ikke om du kan paste sætningen direkte ind.
Avatar billede puppetmaster Nybegynder
23. september 2005 - 15:12 #9
Jeg har prøvet i editoren at få det til at se korrekt ud, "grafisk", men der vises samme fejl.

UPDATE (Medarbejdere INNER JOIN qryLastUpdate ON Medarbejdere.Nummer = qryLastUpdate.Medarbejdernr_) INNER JOIN tempLonpostTotal ON Medarbejdere.Nummer = tempLonpostTotal.Medarbejdernr_ SET Medarbejdere.[Genn_snitløn-var] = tempLonpostTotal.Tot, Medarbejdere.Beregningsgrundlag = [qryLastUpdate].[SenesteDato]
WHERE (((Medarbejdere.Nummer)=[tempLonpostTotal].[Medarbejdernr_]));
Avatar billede puppetmaster Nybegynder
23. september 2005 - 15:14 #10
qryLastUpdate er jo selvfølgelig lavet som en udvælgelsesforespørgsel...
Avatar billede claesdamlund Nybegynder
23. september 2005 - 15:22 #11
Access er ikke god til at følge standard SQL, så prøv evt. følgende:

UPDATE Medarbejdere INNER JOIN tempLonpostTotal ON Medarbejdere.Nummer = tempLonpostTotal.Medarbejdernr_ SET Medarbejdere.[Genn_snitløn-var] = DLookUp("SenesteDato","qryLastUpdate","Medarbejdernr_ = " & [Medarbejdere].[Nummer]);
Avatar billede puppetmaster Nybegynder
10. oktober 2005 - 10:13 #12
claes, smid et svar.
Avatar billede puppetmaster Nybegynder
05. december 2005 - 13:40 #13
Hmmm... :(
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

IT-JOB