15. september 2005 - 16:34Der er
41 kommentarer og 1 løsning
Perioder i tabel
Jeg har en tabel som består af flere felter, men der er 2 felter, hvor det ene viser aller datoer, og det andet hvilket projekt brugeren var tilknyttet denne dato. Eks. 1-1-5 Køkken 2-1-5 Køkken 3-1-5 Køkken 4-1-5 Pakkeriet 5-1-5 Pakkeriet 6-1-5 Pakkeriet 7-1-5 Køkken 8-1-5 Køkken osv.der er selvfølgelig mange flere rekords, der er faktisk over 120000 Det sammem projekt kan fremkomme i flere perioder. Jeg skal så lave en forespørgsel som giver de perioder der har været, så resultatet bliver start slut projekt 1-1-5 3-1-5 Køkken 4-1-5 6-1-5 Pakkeriet 7-1-5 8-1-5 Køkken Altså ved hver ændring af feltet projekt. Hvis der ikke var gentagelser, kan jeg godt finde ud af at lave det ved hjælp af totaler og så grupper efter, men det virker ikke den slår så alle perioder for et projekt sammen.
I dette særtema om aspekter af AI ser vi på skiftet fra sprogmodeller til AI-agenter, og hvordan virksomheder kan navigere i spændet mellem teknologisk hastighed og behovet for menneskelig kontrol.
Undskyld, så ikke det med flere perioder. Kan ikke lade sig gøre med mindre du kan identificere perioderne, eller på anden måde har en fast regel for, hvordan en periode skal defineres.
Som Claes skriver, er du nødt til at have en navigérbar periodeadskiller a'la
SELECT Tabel1.Periode, Min(Tabel1.Dato) AS StartDato, Max(Tabel1.Dato) AS SlutDato, Tabel1.Projekt FROM Tabel1 GROUP BY Tabel1.Periode, Tabel1.Projekt;
Jeg er ikke skrap til sql, men kan nok tygge mig igennem det. Der er mange felter i tabellen, men de 2 jeg skal bruge er et datofelt, hvor hver arbejdsdag har en dato, og et felt med det projekt brugeren var tilknyttet pågældende dato. Det der så viser hvornår en periode starter er hver gang, der kommer et nyt projekt i projekt feltet. Den første dato her, bliver så startdato, og den sidste dato(inden et nyt projekt) bliver så slutdatoen.
Det kan du ikke i SQL. Det kræver at du kan sammenligne værdier på tværs af poster i forespørgslen - hvilket kun kan gøres ved hjælp af kode. Men kom med nogle feltnavne og fortæl om du bruger DAO eller ADO (afhængig af din Access version), så kan jeg bakse et eksempel sammen.
Der er et tekstfelt der hedder 'område' og her står projekt navnet, og så er der et datofelt (dato og klokkeslet) der bare hedder 'dato'. Det er så et tredie felt 'cpr' jeg skal bruge, så jeg har en bruger og kan sætte de nævnte perioder på for denne. Det er ikke noget der haster, jeg kommer tidligst til at arbejde videre med dette på tirsdag.
Jeg glemte lige de med dao eller ado, så vidt jeg kan se er det ADO, i en gammel vejledning kan jeg se: Tools->references og sæt kryds i "Microsoft ADO Ext. 2.x for DLL and security".
Opret en ny tabel med navnet tblTmp, med felterne PeriodeStart, PeriodeSlut og Periode, som hhv dato, dato og tekst datatyper. Herefter burde denne kode (i et standardmodul) fylde dine perioder i:
Private Sub Perioder() Dim CON As ADODB.Connection, RS As ADODB.Recordset, strSQL As String, strProjekt As String, datStartDato as Date, datSlutDato as Date
Set Con = CurrentProject.Connection Set RS = New ADODB.Recordset
CON.Execute "Delete * From tblTmp"
strSQL = "Select dato, område from tabel order by dato"
Den går i stå i sidste linie af denne kode: Do Until RS.EOF If strProjekt = "" Then strProjekt = RS!Område datStartDato = RS!Dato datSlutDato = RS!Dato Else If RS!Område = strProjekt Then
med en compile og syntax error. Jeg ved ikke om det er fordi du kalder det tredie felt 'Periode', det skulle måske hedde 'Projekt' ??, men det er nok fordi jeg ikke forstår, hvad koden laver. Der er jo ingen data i den tomme tabel, skal der ikke være det? og hvordan afvikler jeg koden? Jeg er helt på bar bund, når det drejer sig om koder.
ja mærkelig nok er der en bruger, der ikke har påført et projekt, dette burde ikke kunne lade sig gøre. Jeg kan laven en forespørgsel, der tilføjer teksten 'manglende område', løser det problemet?
Hvis ikke-udfyldte projekter skal ignoreres kan du udskifte sætningen strSQL = "Select dato, område from tabel order by dato" med strSQL = "Select dato, område from tabel where område is not null order by dato"
Jeg tror faktisk det virker nu, men hvis jeg ikke er for krævende, kunne du så få det fjerde felt 'cpr' med for at jeg kan se hvilken bruger der har haft den pågældende periode (det nævnte jeg ikke fra starten, så du har fortjent dine points nu så rigeligt, men alligevel...) felterne i tabellen er cpr - område - dato
I tabellen tblTmp skal du oprette endnu et felt, Cpr, som tekst-datatype, og din kode skal nu se således ud (håber jeg har fået rettet fejl, men husk lige tabel-navnet igen):
Private Sub Perioder() Dim CON As ADODB.Connection, RS As ADODB.Recordset, strSQL As String, strProjekt As String, datStartDato as Date, datSlutDato as Date, strCpr As String
Set Con = CurrentProject.Connection Set RS = New ADODB.Recordset
CON.Execute "Delete * From tblTmp"
strSQL = "Select dato, område, cpr from tabel where område is not null order by dato"
PeriodeStart PeriodeSlut Projekt cpr men jeg kan hurtigt omdøbe eller ændre rækkefølgen. PS jeg får ikke tid til at arbejde med basen i dag, men i morgen er der forhåbentlig god tid.
Programmet kører nu, men resultatet er mystisk. Den tabel dataene kommer fra ser således ud (cprnumrene er anonymiserede, der er 2 forekellige i mit udrag): Cpr Område Dato 0101xx-xxxx Barsel/længerevarende sygdom 02-01-2003 0101xx-xxxx Barsel/længerevarende sygdom 03-01-2003 0101xx-xxxx Barsel/længerevarende sygdom 06-01-2003 0101xx-xxxx Barsel/længerevarende sygdom 07-01-2003 0101xx-xxxx Barsel/længerevarende sygdom 08-01-2003 0101xx-xxxx Barsel/længerevarende sygdom 09-01-2003 0101xx-xxxx Barsel/længerevarende sygdom 10-01-2003 0101xx-xxxx Barsel/længerevarende sygdom 13-01-2003 0101xx-xxxx Barsel/længerevarende sygdom 14-01-2003 0101xx-xxxx Barsel/længerevarende sygdom 15-01-2003 0101xx-xxxx Barsel/længerevarende sygdom 16-01-2003 0101xx-xxxx Barsel/længerevarende sygdom 17-01-2003 0101xx-xxxx Barsel/længerevarende sygdom 20-01-2003 0101xx-xxxx Barsel/længerevarende sygdom 21-01-2003 0101xx-xxxx Barsel/længerevarende sygdom 22-01-2003 0101xx-xxxx Barsel/længerevarende sygdom 23-01-2003 0101xx-xxxx Barsel/længerevarende sygdom 24-01-2003 0101xx-xxxx Barsel/længerevarende sygdom 27-01-2003 0101xx-xxxx Barsel/længerevarende sygdom 28-01-2003 0101xx-xxxx Barsel/længerevarende sygdom 29-01-2003 0101xx-xxxx Barsel/længerevarende sygdom 31-01-2003 0101yy-yyyy manglende område 02-01-2003 0101yy-yyyy manglende område 03-01-2003 etc............................
Resultatet i den nye tabel ser således ud: PeriodeStart PeriodeSlut Projekt cpr 18-11-2002 31-12-2002 Udehold 2708xx-xxxx 01-01-2003 01-01-2003 Østværksted 0709xx-xxxx 01-01-2003 01-01-2003 Udehold 2708xx-xxxx 01-01-2003 01-01-2003 Pakkeriet 1403xx-xxxx 02-01-2003 02-01-2003 Metalværksted 1004xx-xxxx 02-01-2003 02-01-2003 Køkken/service 0802xx-xxxx 02-01-2003 02-01-2003 pakkeriet 2609xx-xxxx
Det skulle jo gerne have set sådan ud: PeriodeStart PeriodeSlut Projekt cpr 02-02-2003 31-01-2003 Barsel/længerevarende sygdom 0101xx-xxxx 02-01-2003 xx-xx-xxxx manglende område 0101yy-yyyy etc... Der er 3539 records i den nye tabel(tblTmp) og 3979 i den oprindelige tabel. Jeg håber du kan bruge dette til noget, når vi nu er så tæt på målet.
Jeg er ikke helt sikker på jeg forstår problemet. Kan du give et konkret eksempel på hvad der er galt?
I den oprindelige tabel hedder feltet Område ("Barsel/læng..." mv.) og i den temporære tabel har vi kaldt det Projekt. Men det dækker da over de samme data ikk´?
Du skriver at det gerne skulle have set sådan ud: PeriodeStart PeriodeSlut Projekt cpr 02-02-2003 31-01-2003 Barsel/længerevarende sygdom 0101xx-xxxx 02-01-2003 xx-xx-xxxx manglende område 0101yy-yyyy etc...
Men hvordan kan en periodestart (02-02-2003) ligge EFTER en periodeslut (31-01-2003)?
Jeg skrev forkert dato, det skulle have været 02-01-2003. Det eksempel, jeg har foroven er de første records i tabellen. Og den første dag for cpr 0101xx-xxxx med område(projekt)Barsel/længerevarende.. er 02-01-2003 og den sidste record 31-01-2003, derfor bliver prioden for dette cprnummer og dette projekt fra 02-01-23003 til 31-01-2003.
Dete er jo det der er problemet, tabel tblTmp starter som jeg beskriver ovenfor, hvor jeg beskriver de første 7 records. Jeg tror jeg vil lave en tabel med kun få perioder i, so kan vi bedre gennemskue det. Det laver jeg lige
PeriodeStart PeriodeSlut Projekt cpr Nu ser den således ud: 02-01-2003 07-01-2003 Barsel/længerevarende sygdom 0101 08-01-2003 10-01-2003 manglende område 0101 13-01-2003 17-01-2003 Barsel/længerevarende sygdom 01017PeriodeStart PeriodeSlut Projekt cpr 02-01-2003 07-01-2003 Barsel/længerevarende sygdom 010177-2802 08-01-2003 10-01-2003 manglende område 010177-2802 13-01-2003 17-01-2003 Barsel/længerevarende sygdom 010177-2802 02-01-2003 07-01-2003 manglende område 0101 16-01-2003 21-01-2003 Barsel/længerevarende sygdom 0106 02-01-2003 07-01-2003 manglende område 0101 16-01-2003 21-01-2003 Barsel/længerevarende sygdom 01067 og det er helt rigtigt, bortset fra den sidste periode: 02-01-2003 06-01-2003 metalværksted 0107....... ikke kommer med. Jeg kan fortælle at jeg, som tabellen ovenfor viser, sorterer tabellen med cpr og dernæst dato, for at perioderne kommer til at stå rigtigt, men hvis man i dit program kan sortere på 2 felter, kan det være det kan lægges ind, så jeg ikke behøver at sortere tabellen først. Det ser ud til at den er ved at være der, vi mangler bare den sidste periode.
Det ser helt rigtigt ud, det er da mageløst hvad du kan lave. Du fortjener dine point og egentlig mange flere. Jeg er meget imponeret. Er der ikke noget med at du skal lægge en bestemt slags indlæg ind for at jeg kan give points.
jeg kom til at lægge et svar, og det er åbenbart det du skal gøre, jeg har afvist mig svar, jeg skal ikke have points for det. Jeg er først tilbage tirsdag, så har du nok sendt svarret.
jeg har trykket accepter flere gange til dig, men kan ikke se der sker noget, det må være noget med opdatering, hvis du ikke får dine velfortjente points så giv mig besked. Jeg gav dig også noget karma, som du har fortjent, men kom ved en fejl først til at give dig dårlig, og derefter gav jeg dig meget dog, jeg håber så resultatet er i dig favør, ellers sig til så giver jeg dig noget mere, du har fortjent det. ib
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.