Avatar billede krasmussen Nybegynder
07. februar 2004 - 17:12 Der er 8 kommentarer og
1 løsning

Gennemløb af tabel, resultat = række2 felt1 - række1 felt 2

Ved et gennemløb vil jeg vise et resultat med en tekstboks som viser et antal minutter +tekst eller en tekst, afhængig af rækkeXFra - (rækkex-1)Til --> Vises ud for rækkeX

Tabellen:
                    Fra      Til      nyt felt
Række1              08:00    09:00    Ingen ledig tid
Række2              09:05    09:30    5 minutter ledig
Række3              09:25    10:00    5 minutter overlap
Række4              10:00    11:00    Ingen ledig tid

Jeg havde tænkt, at vise variablen med et tekstfelt i rapporten.

Alle gode ideer er meget velkomne
Avatar billede nih Novice
08. februar 2004 - 00:40 #1
'Jeg ville lave en foresp. på din tabel med de 3 første felter og beregne det 4. felt vha en function i VBA

Function res(fra As Date, til As Date) As String
    Dim minut As Integer
    minut = Minute(fra - til)
    If minut = 60 Then
        res = "Ingen ledig tid"
    Else
        res = 60 - minut & " minutter ledig"
    End If
End Function

foresp:
select fra, til, (res(fra,til))as nytfelt
from dinTabel

Niels
Avatar billede krasmussen Nybegynder
08. februar 2004 - 08:48 #2
Så returnerer den enten inting, eller #fejl eller en fejl om at typerne er forskellige.
Tanken er, at den skal tage "fra" fra den aktuelle record minus "til" fra den forrige resord.

fra+til er iøvrigt af typen dato klokkeslet (XP DK)
Avatar billede nih Novice
08. februar 2004 - 23:13 #3
ff
Avatar billede nih Novice
08. februar 2004 - 23:14 #4
Sub bygResTabel()
    Dim db As DAO.Database
    Dim rsTid As DAO.Recordset
    Dim rsRes As DAO.Recordset
    Dim sidsteTil As Date
    Dim ekstraTid As Integer
   
    Set db = CurrentDb
    db.Execute "delete * from tblres"
    Set rsTid = db.OpenRecordset("SELECT * FROM tblTid ORDER BY fra;")
    Set rsRes = db.OpenRecordset("tblRes")
   
    Do While Not rsTid.EOF
       
        rsRes.AddNew
        rsRes!fra = rsTid!fra
        rsRes!til = rsTid!til
        If Not sidsteTil = 0 Then
            ekstraTid = Minute(rsTid!fra - sidsteTil)
            If ekstraTid = 0 Then
                rsRes!Tekst = "Ingen ledig tid"
            ElseIf rsTid!fra < sidsteTil Then
                rsRes!Tekst = ekstraTid & " Minutter overlap"
            ElseIf rsTid!fra > sidsteTil Then
                rsRes!Tekst = ekstraTid & " Minutter ledig tid"
            End If
        Else
            rsRes!Tekst = "Ingen ledig tid"
        End If
       
   
        sidsteTil = rsTid!til
        rsRes.Update
        rsTid.MoveNext
    Loop
End Sub
Avatar billede nih Novice
08. februar 2004 - 23:17 #5
Løsningen kunne være at lade din rapport bygge på en temptabel tblRes med felterne fra, til og tekst
Koden ovenfor kopiere fra og til felterne fra den oprindelige tabel tblTid og indsætter minutberegningerne i tekstfeltet.

kør koden inden din rapport kaldes
Avatar billede krasmussen Nybegynder
09. februar 2004 - 18:32 #6
Det er lidt ud over mit niveau i VB & Access, kan du give en kort step-by-step. Jeg kan ikke læse mig til om temptabellerne bliver oprettet aut. og jeg har ingen idé om, hvordan jeg får felter og resultat ind i en foresp. eller rapport
Avatar billede nih Novice
09. februar 2004 - 20:18 #7
du skal have en tabel "tblTid" med 2 felter: fra og til (dato klokkeslet)

og så skal du have en anden tabel "tblRes" med 3 felter fra, til og tekst

Jeg forudsætter du indtaster tiderne i tblTid

Hver gang min kode kører slettes alle poster i tblRes i linjen:
            db.Execute "delete * from tblres"
Dernæst åbnes de 2 tabeller i linjerne:
    Set rsTid = db.OpenRecordset("SELECT * FROM tblTid ORDER BY fra;")
    Set rsRes = db.OpenRecordset("tblRes")
tabellen tbltid løbes igennem række for række og tiderne kopieres ind i tblRes PLUS feltet tekst som tilskrives en tekst alt efter om 'sidsteTil' er lig den nuværende 'fra' ELLER større end ELLER mindre end.

Du kan afprøve koden ved at oprette de to tabeller med de rigtigenavne og rigtige felter.
Min kode kopieres ind  i et nyt modul og med cursoren stående i koden kan du gennemløbe koden vha F5 eller trinvis F8

Til sidst skal jeg sige at Access IKKE er god til at regne med den "sidste værdi" - man skal være sikker på rækkefølgen af posterne og programmere sig ud af det som jeg her har prøvet.

Niels
Avatar billede nih Novice
10. februar 2004 - 22:31 #8
Du kan også lave det i ren SQL, men den synes jeg er svær at forstå - Jeg prøver dog alligevel:

select t1.fra, t1.til, null as Minut
from tbltid as t1
Where fra = (
        select min(fra)
        from  tbltid
        )
UNION ALL
SELECT  t1.fra, t1.til, cint((T2.til -  t1.fra)*1440) AS Minut
FROM  tbltid AS T1 ,  tbltid AS T2
WHERE T2.til = (
        SELECT Max(til)
          FROM  tbltid where til<T1.til
        )
ORDER BY fra;

Der er ingen nem måde at gøre dette på, desværre :(

Niels
Avatar billede krasmussen Nybegynder
15. februar 2004 - 17:40 #9
Hej Niels,
En lidt sen tilbagemelding....sorry, men jeg var faktisk ved at generere en sql a la din - det forstår jeg mig noget bedre på, men den er umiddelbart noget "tungere" en den løsning du gav først. Men jeg prøver mig lidt frem, nu er jeg da på rette spor!.

Tak for hjælpen
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