Just nu i M3-nätverket
Gå till innehåll

Uppdateringsfråga som anger näst högsta värdet


sundberg76

Rekommendera Poster

Hej,

Jag försöker skapa en uppdateringsfråga i Access som skall ange det föregående värdet i SD-kolumnen i ED-kolumnen.

Tabellen ser ut som bifogad fil. 

 

För 10431498 vill jag alltså att det skall stå 7483 på 1:a raden och 7539 på den andra raden, den tredje raden lämnas orörd eftersom det inte finns någon mer SD.

 

Så här långt har jag kommit i Access SQL, men det blir bara tomma rader:

UPDATE SfpData AS S1, SfpData AS S2

SET S1.ED = (

SELECT MIN(S2.SD)

FROM S2

WHERE S1.MANR_F=S2.MANR_F

AND S2.SD >S1.SD);

 

Om man kör nedan SQL i Oracle så fungerar det fint:

UPDATE SfpData S1
SET ED = (
    SELECT MIN(S2.SD)
    FROM SfpData S2
    WHERE S1.MANR_F = S2.MANR_F
    AND S2.SD > S1.SD)

 

Är det någon som har en idé om hur detta kan lösas i Access? 

Hälsningar

Joel

access_sfpdata_table.jpg

Länk till kommentar
Dela på andra webbplatser

Mr Andersson

Ska du verkligen ha med "SfpData as S2" i UPDATE-satsen (Access)? Det har du inte i Oracle-versionen. 

 

Om det inte funkar, så ändra Access till att förstå "normal" SQL (Arkiv > Alternativ > Objektdesigner > SQL-server kompatibel SQL).

 

 

Länk till kommentar
Dela på andra webbplatser

Tack för svaret, Mr Andersson :)

Jag testade att ändra så att from-raden blir mer lik Oracle: 

UPDATE SfpData AS S1 SET S1.ED = (
SELECT MIN(S2.SD) 
FROM SfpData AS S2
WHERE S1.MANR_F=S2.MANR_F 
AND S2.SD >S1.SD);

 

Jag skapade en helt ny databas med endast tabellen SfpData i och angav att den skulle vara SQL-Server kompatibel, men tyvärr ger inte det heller något resultat. 

Men.. jag upptäckte en annan miss jag gjort och det är att bara välja Visa fråga i Access och inte Kör fråga. När jag väljer Kör så får jag upp felmeddelande som säger "Operationen måste använda en fråga som kan uppdateras".

 

Följande kod fungerar utan felmeddelande, men då får både rad 1 & 2 i exemplet ovan värdet 7539 i kolumnen ED.

UPDATE SfpData AS S1, SfpData As S2 SET S1.ED = S2.SD 
WHERE S1.MANR_F=S2.MANR_F 
AND S2.SD >S1.SD;

 

 

Känns som att jag fastnat på att det fungerar så fint i Oracle, så jag bara slumpmässigt testar olika varianter på ovan kod :( 

 

 

Länk till kommentar
Dela på andra webbplatser

Mr Andersson

Testa att gör en VY för SfpData (select * from SpfData) och kalla den för SfpDataVy och använd den i FROM istället för tabellen. Ibland är Access helknas på att tolka SQL. Sånt som fungerar i "normala" databaser fungerar inte i Access... 

Länk till kommentar
Dela på andra webbplatser

Tack igen! :)

Jag testade det (antar att vy är samma sak som fråga i Access), men det hjälpte tyvärr inte. Snurrade runt på Stackoverflow och testade att göra dela upp frågan i flera steg, men jag har helt enkelt för dålig koll på Access för att få det att fungera.  

Jag kommer så långt att jag får ett min-värde per MANR_F, men jag vill ju ha ett min-värde per MANR_F & SD.

 

Kanske kan det hjälpa om jag förklarar vad tabellen innehåller :

  • MANR_F = pekare på anställningsnummer
  • Avdelning = (dold i bilden ovan) 
  • SD = startdatum (antal dagar sedan 1990-01-01).

Tabellen visar alltså personers avdelning med startdatum.

Eftersom man endast kan tillhöra en avdelning åt gången (och man måste tillhöra en avdelning) så lagar systemet inget slutdatum.

Jag vill kunna visa start- och slutdatum för varje persons avdelningshistorik och har därför skapat kolumnen ED som jag nu försöker fylla med efterföljande avdelnings startdatum (egentligen efterföljande avdelnings startdatum-1, men just -1 är ju inte ett problem).

Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.

×
×
  • Skapa nytt...