03. juli 2008 - 16:06Der er
9 kommentarer og 1 løsning
Indsæt dato i rapport for at udregne antal dage i en periode
Jeg har en database som blandt andet bruges til at holde styr på antal dage fra startdato til slutdato per sag. Til hver sag er der knyttet 8 datosæt (startdato1-slutdato1, startdato2-slutdato2 osv. - den forrige periode skal afsluttes før den næste kan aktiveres).
Hvert datosæt rummer en periode, hvor sagen har været eller stadig er aktiv og da ikke alle sager udvikler sig ens, dækker sagerne ikke nødvendigvis over samme antal afsluttede perioder og derfor er den ikke-afsluttede periode ikke nødvendigvis at finde i samme datosæt.
Når en periode afsluttes skrives slutdatoen ind i databasen via en formular og databasen udregner herefter antal dage, hvor den enkelte sag har været aktiv, men kun for sagens afsluttede perioder. Summen af antal dage i en sags afsluttede perioder gemmes i variablen totaldage (der altså er lig med dagene fra startdato1-slutdato1 + startdato2-slutdato2 … + startdato8-slutdato8).
Mit problem er, at der skal laves månedlige udtræk med et total tal for antal aktive dage for alle sager - jeg har derfor behov for at finde en metode der i forbindelse med en rapport kan udregne antal dage fra starten på en sags aktive periode (dvs. den eventuelle periode som ikke er blevet afsluttet som beskrevet ovenfor) frem til udtræksdatoen (sidste dag i måneden). Det skal selvfølgelig gøres uden at afslutte sagerne i selve databasen. Dette antal dage skal så lægges sammen med det totale antal aktive dage for alle sager (totaldage*antal sager). Det optimale ville være, hvis den automatisk kunne indsætte sidste dag i hver måned således, at rapporten kom ud med opdaterede udregninger for de foregående måneder samtidig med at den lavede en fremskrivning i forhold til resten af året.
I forbindelse med dit spørgsmål som du sender som svar på min mail, så skal du nok gøre det at du laver en formular hvor du beder om en indtastning af en dato og så sender den med som parameter til funktionen. Du kan evt. gøre parametren optional så funktionen bare bruger dags dato hvis der ikke sendes parameter med. Hvis du gerne vil, så kan jeg godt lave det for dig på mandag. Jeg skal ud og arbejde her fra 17 til 06 og igen fra 17 til 07 i morgen så weekenden er væk :-) Endvidere ligger eksemplet jeg sendte på mit arbejde så jeg kan ikke få fat på den da jeg ikke har gemt den på den server jeg kan logge på hjemmefra.
Jeg vil blive meget glad, hvis du vil udbygge dit allerede velfungerende eksempel. Jeg har ikke så stor erfaring med at arbejde med funktioner, da jeg hidtid har kunnet klare mig med sub'er og SQL.
Til jer som er med på en kigger, vil jeg i løbet af mandag eller tirsdag i næste uge gøre koden tilgængelig her på siden.
Så har jeg fået testet det hele og det virker perfekt. Det fylder en del nedenfor, så jeg starter lige med at sige tusind tak for hjælpen til hugopedersen. Jeg er ny her på eksperten.dk, men er der ikke noget med, at du skal svare for at jeg kan give dig dine point? Under alle omstændigheder er opskriften som følger:
Tabellen hedder tbldates og datosættene hedder fldStart_Date_1 og fldStop_Date_1 (_2, _3 ect.). Variablen fldLast_Start viser start datoen for den ikke-afsluttede periode, fldRun_Date viser kørselsdatoen (dags dato hvis man ikke angiver en i formularen) og fldActive_Days "gemmer" antal dage fra seneste startdato til kørselsdatoen.
---------------- Formularen hvor evt. brugerbestemt kørselsdato indtastes hedder frmRundate og har følgende VBA-kode tilknyttet:
Private Sub cmdCalculate_Click() On Error GoTo Err_cmdCalculate_Click Dim datInputdate As Date
datInputdate = Nz(Me.txtRundate, Date) If IsDate(datInputdate) Then fhpUpdate_Active_Days datInputdate Else fhpUpdate_Active_Days Date End If
-------------------- Funktionen (mod_Daycalc), der jo laver det meste af arbejdet ser ud som følger:
Public Function fhpUpdate_Active_Days(Optional datRundate As Date) As Integer ' ----------------------------------------------------------------------------------- ' Purpose : Finder antal dage et projekt har været aktivt ' Parameters : ' Returns : Integer ' Created : 04-07-2008 ' Modified : ' Remarks : ' ----------------------------------------------------------------------------------- On Error GoTo Error_fhpUpdate_Active_Days Const conField_Prefix_Start As String = "fldStart_Date_" Const conField_Prefix_Stop As String = "fldStop_Date_" Const conField_Max As Integer = 4
Dim strSQL As String Dim intCount As Integer Dim intDays As Integer Dim strField_Name_Start As String Dim strField_Name_Stop As String Dim intField_Index As Integer Dim rst As New ADODB.Recordset
'Check for manglende parameter If IsMissing(datRundate) Then datRundate = Date End If
While Not rst.EOF intDays = 0 For intCount = conField_Max To 1 Step -1 strField_Name_Start = conField_Prefix_Start & Trim(Str(intCount)) strField_Name_Stop = conField_Prefix_Stop & Trim(Str(intCount)) If Nz(rst(strField_Name_Stop), "01-01-1900") = "01-01-1900" Then If Nz(rst(strField_Name_Start), "01-01-1900") <> "01-01-1900" Then intDays = DateDiff("d", Nz(rst(strField_Name_Start), Now), CDate(datRundate)) rst!fldRun_Date = datRundate rst!fldLast_Start = rst(strField_Name_Start) End If 'Nz(rst(strField_Name_Start) End If 'Nz(rst(strField_Name_Stop) Next intCount rst!fldActive_Days = intDays rst.Update rst.MoveNext Wend
rst.Close Set rst = Nothing
Exit_fhpUpdate_Active_Days: Exit Function
Error_fhpUpdate_Active_Days: fhpUpdate_Active_Days = -32768 Select Case Err.Number Case 3021 Case 2501 Case Else MsgBox Err.Number & ": " & Err.Description, vbOKOnly + vbCritical, "Error in procedure 'fhpUpdate_Active_Days'" End Select Resume Exit_fhpUpdate_Active_Days
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.