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

sundberg76

Medlem
  • Antal inlägg

    8
  • Gick med

  • Senaste besök

  1. 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).
  2. 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
  3. 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
  4. Och de var ju busenkelt att applicera index på tabellerna genom "CREATE INDEX". Nu tar rapporten c:a 5 minuter att köra. Helt galet! Ett superduperstort tack Mr Andersson! Hälsningar Joel
  5. Det första jag ska göra är att kyssa dina fötter! Från 2½ timme till <1 minut på en av frågorna! Ett herrejistanes stort tack till dig, Mr Andersson! =)) Nu skall jag bara komma på hur jag får till indexering per automagik; Somliga tabeller skapas via länkade tabeller från Oracle. ex: SELECT lnk_UserContracts.* INTO UserContractsFROM lnk_UserContracts; Andra tabeller finns redan i Access-databasen men är tomma (en default-databas kopieras vid start av rapport-programmet) - där borde jag kunna ange indexering. Hälsningar Joel
  6. Jag hoppas att det finns någon som vet ett sätt att få fram den här informationen snabbare. Beskrivningen är något förenklad, men kärnfrågan är kvar; Hur kan jag optimera SQL-syntaxen så att frågan körs snabbare. Jag antar att det framförallt är kruxet med att det bara finns ett startdatum i tabellen Categories som gör att det tar tid. Idag körs frågorna i Access, men möjlighet finns att helt eller delvis ta Oracle-db till hjälp (t.ex. exportera data nattetid till en tabell.. kanske Categories med från- och tilldatum om det skulle underlätta). Jag har en databas med tre tabeller UserData UserHistory Categories i UserData finns följande kolumner: UserName & UserID ex: John, 12345 Billy, 54321 i Categories finns följande kolumner UserID, Category, AsOf, Data ex: 12345, color, 1000, blue 12345, color, 1500, white 12345, height, 1200, 60 54321, color, 600, red 54321, height, 800, 18 AsOf är antalet dagar från 1990-01-01 (1000 är alltså: 1992-09-27) I UserHistory finns följande kolumner UserName, UHDate, & Color(som skall uppdateras/populeras). ex: John, 2015-10-01, John, 2015-10-02, John, 2015-10-03, För varje datum vill jag veta vilket värde personen har (i det här fallet i kategorin "color"). I ovanstående exempel blir det 12345, 2015-10-01, white 12345, 2015-10-02, white 12345, 2015-10-03, white eftersom det värde som gäller för dessa datum i tabellen Categories för 12345, John är white. Syntaxen som den ser ut idag är som följer: UPDATE UserData AS UD, UserHistory AS UH, Categories AS CAT SET UH.Color = CAT.Data WHERE CAT.UserID = UD.UserID AND UD.UserName = UH.UserName AND CAT.Category = "Color" AND CAT.AsOf = (SELECT MAX(CAT2.AsOf) FROM Categories AS CAT2 WHERE CAT.UserID = CAT2.UserID AND CAT2.AsOf <= DateDiff('d', #1/1/1990#,UH.UHDate) AND CAT2.Category = "Color"); Den här SQL'en ingår tillsammans med 9 st liknande i en rapport och den tar 8-10 timmar att ta fram. Ovanstående exempel går relativt snabbt - 8 minuter Baserat på 738 records i UserData, 46633 records i Category och 22333 records i UserHistory. Vore ytterst tacksam om någon kunde bistå med hjälp eller med något förslag om var man kan vända sig. Hälsningar Joel
  7. Hej, jag har kört fast ordentligt. i teorin så borde det här vara väldigt enkelt men jag kan inte hitta en lösning. Jag har ett antal personer som har dels en Funktion och dels flera Kvalifikationer. En funktion består av flera kvalifikationer. ex: Funktion Ambulansförare innehåller kvalifikationerna Körkort & Sjukvårdare. En person som har funktionen Ambulansförare kan också ha andra kvalifikationer, som t.ex. Administratör och Tekniker. Vidare så kan en person ha en Funktion men kanske inte alla kvalifikationer som krävs. I exemplet ovan så skulle man kunna säga en Ambulansförare utan Sjukvårdar-kvalifikation. En person kan dock bara en Funktion (tack o lov). Jag har två tabeller; Employee & Function Tabellen Employee har följande kolumner: EmployeeId, Function, Qualification Data kan t.ex. se ut så här: 12345, Ambulansförare, Sjukvårdare 12345, Ambulansförare, Körkort 12345, Ambulansförare, Tekniker 88888, Ambulansförare, Sjukvårdare 88888, Ambulansförare, Administratör Tabellen Function har följande kolumner: Function, Qualification Data kan t.ex. se ut så här: Ambulansförare, Sjukvårdare Ambulansförare, Körkort SO_lärare, Historia SO_lärare, Geografi SO_lärare, Religion SO_lärare, Samhällskunskap Brandman, Brandsläckare Brandman, Körkort Tabellen Function är alltså en tabell där det står vilka kvalifikationer som en funktion kräver. En kvalifikation kan förekomma i flera Funktioner. Det jag skulle vilja få fram är en lista för varje person där man ser 1) vilken Funktion denne har 2) vilka kvalifikationer som ingår i Funktionen som personen har 3) vilka kvalifikationer som ingår i funktioen som personen inte har 4) vilka kvalifikationer som inte ingfår i funktioen som personen har Har helt kört fast. Arbetar med Access 2000, man kan lika gärna arbeta i Excel (2007) eller i Crystal Reports 9. Är det någon som har något tips som kan hjälpa mig i rätt riktning.
  8. Hej, Ingen vidare rubrik, men det var svårt att sammanfatta det hela. Egentligen skall jag använda datan i Crystal Reports, men det fungerar lika bra med Access. jag har tre tabeller; tbl_Employee som innehåller EmpNo & EmpNo_X tbl_Account som innehåller EmpNo, AccountName, AccountValue & TransactDate tbl_CostCenter som innehåller EmpNo_X, CC_Name & CCFromDate Jag vill kunna få ut Vilket CostCenter som var aktivt vid vilken Kontotransaktion per Anställd. Eftersom jag bara har från-datum på CostCenter så kan det se ut så här i tabellen tbl_CostCenter: EmpNo_x, CC_Name, CCFRomDate 1234567, 75100-01, 2008-10-01 1234567, 75300-01, 2008-10-02 1234567, 75200-01. 2009-03-01 I tabellen tbl_Employee ser det ut så här: EmpNo, EmpNo_X 99999, 1234567 88888, 7654321 I tabellen tbl_Account ser det ut så här: EmpNo, AccountName, AccountValue, TransactDate 99999, Alfa, 20, 2009-02-01 99999, Alfa, 25, 2009-02-02 99999, Beta, 15, 2009-02-02 Det jag vill ha som resultat är: EmpNo, AccountName, AccountValue, TransactDate, CCName 99999, Alfa, 20, 2009-02-01, 75300-01 99999, Alfa, 25, 2009-02-02, 75300-01 99999, Beta, 15, 2009-02-02, 75300-01 Att inte få med CostCenter som ligger framåt i tiden är inget problem, då anger jag bara tblCostCenter.CCFromDate <= tbl_Account.TransactDate . Men, då visas våda de CostCenter som har CCFromdate mindre än Transaktionsdatumet. Av dessa två vill jag ha det "största" värdet eftersom det är det som gäller. Jag har prövat att använda tblCostCenter.CCFromDate <= tbl_Account.TransactDate AND Max(tblCostCenter.CCFromDate) , men det fungerar inte speciellt bra. Måste jag göra det till en två stegsraket där jag först skapar en tabell/fråga som tar fram tblCostCenter.CCFromDate <= tbl_Account.TransactDate och sedan kör en fråga där jag kör Max(tblCostCenter.CCFromDate) ? Någon som har idéer? Tråden flyttad från Access av moderator [inlägget ändrat 2009-02-19 10:05:09 av Cluster]
×
×
  • Skapa nytt...