17. januar 2008 - 11:27Der er
33 kommentarer og 2 løsninger
Tidsudregning - får forkert resultat ved > 1 døgn
Har felt FRA (Standard Dato Format) og felt TIL (Samme format)i tabel. Har lavet formular med felterne (et DATAARK) og ønsker at udregne difference (Nogle differencer er på > 1 døgn). Har lavet ubundet felt til difference og prøvet at skrive =[Til]-[Fra]. Dette fungerer godt nok så længe der ikke er mere end 1 døgn, hvis jeg f.eks. har 1 døgn+16 timer skrives der som resultat: -1899 16.00.00 og 2 døgn+16 timer giver -1900 16.00.00 Har valgt Standard Dato format for feltet. Hvad gør jeg forkert???
Får resultat ved dage: 2,1666666666 Sætter jeg FORMAT til Standard og 0 decimaler skrives der 2. Hvis jeg vil gange med 24 - så husker den vel stadig decimaler - kan jeg slippe af med dem?
Kan jeg lave felterne i en forespørgsel (med kilde fra min indtastning)og samtidig lave et felt som ganger dag med 24 timer. Og på den måde få et samlet timetal ind i formularen?
Dim booCalcYears As Boolean Dim booCalcMonths As Boolean Dim booCalcDays As Boolean Dim booCalcHours As Boolean Dim booCalcMinutes As Boolean Dim booCalcSeconds As Boolean Dim booSwapped As Boolean Dim dtTemp As Date Dim intCounter As Integer Dim lngDiffYears As Long Dim lngDiffMonths As Long Dim lngDiffDays As Long Dim lngDiffHours As Long Dim lngDiffMinutes As Long Dim lngDiffSeconds As Long Dim varTemp As Variant
Const INTERVALS As String = "dmyhns"
'Check that Interval contains only valid characters Interval = LCase$(Interval) For intCounter = 1 To Len(Interval) If InStr(1, INTERVALS, Mid$(Interval, intCounter, 1)) = 0 Then Exit Function End If Next intCounter
'Check that valid dates have been entered If Not (IsDate(Date1)) Then Exit Function If Not (IsDate(Date2)) Then Exit Function
'If necessary, swap the dates, to ensure that 'Date1 is lower than Date2 If Date1 > Date2 Then dtTemp = Date1 Date1 = Date2 Date2 = dtTemp booSwapped = True End If
'Get the cumulative differences If booCalcYears Then lngDiffYears = Abs(DateDiff("yyyy", Date1, Date2)) - _ IIf(Format$(Date1, "mmddhhnnss") <= Format$(Date2, "mmddhhnnss"), 0, 1) Date1 = DateAdd("yyyy", lngDiffYears, Date1) End If
If booCalcMonths Then lngDiffMonths = Abs(DateDiff("m", Date1, Date2)) - _ IIf(Format$(Date1, "ddhhnnss") <= Format$(Date2, "ddhhnnss"), 0, 1) Date1 = DateAdd("m", lngDiffMonths, Date1) End If
If booCalcDays Then lngDiffDays = Abs(DateDiff("d", Date1, Date2)) - _ IIf(Format$(Date1, "hhnnss") <= Format$(Date2, "hhnnss"), 0, 1) Date1 = DateAdd("d", lngDiffDays, Date1) End If
If booCalcHours Then lngDiffHours = Abs(DateDiff("h", Date1, Date2)) - _ IIf(Format$(Date1, "nnss") <= Format$(Date2, "nnss"), 0, 1) Date1 = DateAdd("h", lngDiffHours, Date1) End If
If booCalcMinutes Then lngDiffMinutes = Abs(DateDiff("n", Date1, Date2)) - _ IIf(Format$(Date1, "ss") <= Format$(Date2, "ss"), 0, 1) Date1 = DateAdd("n", lngDiffMinutes, Date1) End If
If booCalcSeconds Then lngDiffSeconds = Abs(DateDiff("s", Date1, Date2)) Date1 = DateAdd("s", lngDiffSeconds, Date1) End If
If booCalcYears And (lngDiffYears > 0 Or ShowZero) Then varTemp = lngDiffYears & IIf(lngDiffYears <> 1, " years", " year") End If
If booCalcMonths And (lngDiffMonths > 0 Or ShowZero) Then If booCalcMonths Then varTemp = varTemp & IIf(IsNull(varTemp), Null, " ") & _ lngDiffMonths & IIf(lngDiffMonths <> 1, " months", " month") End If End If
If booCalcDays And (lngDiffDays > 0 Or ShowZero) Then If booCalcDays Then varTemp = varTemp & IIf(IsNull(varTemp), Null, " ") & _ lngDiffDays & IIf(lngDiffDays <> 1, " days", " day") End If End If
If booCalcHours And (lngDiffHours > 0 Or ShowZero) Then If booCalcHours Then varTemp = varTemp & IIf(IsNull(varTemp), Null, " ") & _ lngDiffHours & IIf(lngDiffHours <> 1, " hours", " hour") End If End If
If booCalcMinutes And (lngDiffMinutes > 0 Or ShowZero) Then If booCalcMinutes Then varTemp = varTemp & IIf(IsNull(varTemp), Null, " ") & _ lngDiffMinutes & IIf(lngDiffMinutes <> 1, " minutes", " minute") End If End If
If booCalcSeconds And (lngDiffSeconds > 0 Or ShowZero) Then If booCalcSeconds Then varTemp = varTemp & IIf(IsNull(varTemp), Null, " ") & _ lngDiffSeconds & IIf(lngDiffSeconds <> 1, " seconds", " second") End If End If
If booSwapped Then varTemp = "-" & varTemp End If
Diff2Dates = Trim$(varTemp)
End_Diff2Dates: Exit Function
Err_Diff2Dates: Resume End_Diff2Dates
End Function '************** Code End *****************
?Diff2Dates("y", #06/01/1998#, #06/26/2002#) 4 years ?Diff2Dates("ymd", #06/01/1998#, #06/26/2002#) 4 years 25 days ?Diff2Dates("ymd", #06/01/1998#, #06/26/2002#, True) 4 years 0 months 25 days ?Diff2Dates("d", #06/01/1998#, #06/26/2002#) 1486 days
Jeg skal bruge både timer og minutter - eller et decimaltal som kan ganges med 24 og derved giver total antal timer mellem 2 datoer og klokkeslet.
TERRY - hvor sætter jeg koderne ind - det her er min første "rigtige" database. Jeg kan se at jeg skal omdøbe mine indputfelter til Date1 og Date2 Skal der "bare" oprettet et nyt ubundet felt og så kopieres kode ind i kodegenerator (Visual Basic) - Udregningen skulle gerne ske når jeg har indtastet i Date 1 og 2 og så bruger tabulator for at komme til næste felt.
HNTEKNIK - datediff giver mærkeligt resultat Lige nu får jeg med Datediff følgende: Fra 01-01-2008 22:00 Til 02-01-2008 02:00 Resultat -6 timer. Ændres klokkeslet i Til - 08:00 får jeg 0,00 som reslutat.
SPK Det virker bortset fra at når jeg så ganger dag med 24 timer får jeg et forkert resultat pga skjulte decimaler i feltet der udregner antal dage.
Jeg ved ikke hvad det er der går galt i formularen når jeg vil putte DateDiff ind i feltet men----- Tak for jeres hjælp - her er hvad jeg har fået til at fungere. Jeg forsøgte følgende som kontrolkildeelement =[Til]-[Fra] Format "0" Decimaler 2 Og nu giver den resultat korrekt i decimaltal - og det ser ud til at virke hver gang. Jeg ganger så i næste felt med 24 og det fungerer også.
DateDiff vil ikke rigtigt fungere. hnteknik - Er dit eksempel fra en formular hvor alt laves i felterne?? I så fald kunne jeg godt tænke mig at se den. exbil@mail.dk MVH Vagn
You can put the code in a module. and you dont have to rename your input fields to Date1 and Date2. The function declaration can use any names an dthey dont have to be the same as those which are sent to the function.
So if you use this example ?Diff2Dates("hns", #01/25/2002 01:23:01#, #01/26/2002 20:10:34#) 42 hours 47 minutes 33 seconds
In stead DateDiff you would use Diff2Dates("hns", [Fra], [Til])
SELECT datediff.[Fra], datediff.[Til], DateDiff("h",datediff![Fra],datediff![Til]) AS timer, DateDiff("n",datediff![Fra],datediff![Til]) AS Minutter, DateDiff("n",datediff![Fra],datediff![Til])/60 AS timerminut FROM datediff;
spg - din formel med datadiff giver forkert resultat - den regner antal hele døgn og viser derfor hele tiden 24 timer i feltet uanset timetal. Den simple som vi startede med viser korrekt hele tiden - jeg har lært at paranteser hjælper med at udvide beregning så nu laver jeg det i et felt ved at skrive dette som kontrolelement: =([Til]-[Fra])*24 I format skrives 0 Og jeg vælger 2 decimaler - nu får jeg resultat som decimaltal og kan anvende det.
Terry Jeg har kopieret hele programkoden ind i Visual Basic Jeg har lavet et nyt felt i formularen (ubundet) og skrevet følgende i kontrolkilde element: Diff2Dates("hns", [Fra], [Til]) Desværre viser feltet bare: #Navn? Format feltet er tomt. Jeg vil gerne have dette til at virke da jeg så har en mulighed for at få vist dage,timer,minutter. Jeg har oprettet et ekstra spørgsmål med 100 points til dig hvis jeg får det igang. Det er ikke sådan at jeg skal indsætte formlen i fanen hændelser.
HNTEKNIK - det er en underformular som jeg arbejder i og den får felter direkte fra tabel. Vil jeg være bedre tjent med (hurtigere database) ved altid at lave en forespørgsel som så ligger til grund for mine formularer?
TNTEKNIK Det er en underformular med alle felter fra en tabel jeg har. Vil jeg være bedre tjent med at lade den gå via en forespørgsel og så lade formular hente felter fra forespørgsel - hurtigere database???
SPG Fantastisk - nu kommer der bare et komplet resultat med alle informationer - tak for den ihærdighed som alle har. I har alle fortjent at få hver 100 points for dette kæmpe arbejde.
En sidste ting - hvad gør jeg ved inputmaske så jeg undgår at indtaste årstal og mellemrum. Har brugt 00-00-0000 00:00 - men så skal jeg indtaste alt hver gang jeg vil rette. Sekunder fylder den selv på når jeg hopper til næste felt - de vil altid være 00 og jeg kan ikke undgå dem ser det ud til.
Terry Den returnerer stadig: #Navn? Jeg indsætter formlen i kontrolkildeelement og ændrer intet ved format - feltet er tomt.
Koderne: Klikket på Programkode i værktøjslinien og kopieret kode ind i vindue som åbnes og vindue viser at det er gemt med tilknytning til min Underformular hvor tingene indtastes. Option Compare Database - teksten starter således og så er der en streg hele vejen over - herefter er dine koder indsat.
Ja - lad din underformular hente data fra en forespørgsel gemt ved navn. Det er relativt nemmere at rette i forespørgelsen - og så kan du jo have de beregnende felter gemt der. Og jo mere databasen kan regne ud selv - uden at skulle over noget VBA udenfor - jo hurtigere afvikles tingene.
>Det er en underformular med alle felter fra en tabel jeg har. >Vil jeg være bedre tjent med at lade den gå via en forespørgsel og så lade formular >hente felter fra forespørgsel - hurtigere database???
it works here too, but quite often introducing calculated fields can make the data read only. Are you using Access 2007 by any chance?
Synes godt om
Ny brugerNybegynder
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.