Avatar billede pladehoved Nybegynder
03. juli 2008 - 16:06 Der 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.
Avatar billede hugopedersen Nybegynder
04. juli 2008 - 07:33 #1
Har du en mailadresse, så vil jeg godt lige sende dig et eksempel der kan gøre det.
Der er dog nogle forudsætninger i koden som du skal være OBS på.
Avatar billede pladehoved Nybegynder
04. juli 2008 - 10:34 #2
Det lyder fint. Du kan sende dit eksempel til accesssvar@gmail.com
Avatar billede hugopedersen Nybegynder
04. juli 2008 - 11:14 #3
Eksemplet er sendt til adressen
Avatar billede hugopedersen Nybegynder
04. juli 2008 - 15:51 #4
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.
Avatar billede hugopedersen Nybegynder
04. juli 2008 - 15:51 #5
PS: Sørger du for at koden bliver smidt her hvis der er nogen der vil se den
Avatar billede pladehoved Nybegynder
06. juli 2008 - 01:26 #6
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.
Avatar billede pladehoved Nybegynder
08. juli 2008 - 16:09 #7
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

  DoCmd.OpenReport "rptDates", acViewPreview
 
Exit_cmdCalculate_Click:
  Exit Sub

Err_cmdCalculate_Click:
  MsgBox Err.Description
  Resume Exit_cmdCalculate_Click
   
End Sub

--------------------
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
 
  strSQL = "SELECT * FROM tblDates"
  rst.Open strSQL, CurrentProject.Connection, adOpenStatic, adLockOptimistic
   
  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

End Function
Avatar billede hugopedersen Nybegynder
08. juli 2008 - 20:05 #8
Det var godt at du fik det til at spille.
Avatar billede pladehoved Nybegynder
21. august 2008 - 13:40 #9
Endnu engang mange tak for svaret og undskyld den lange point-ventetid
Avatar billede hugopedersen Nybegynder
21. august 2008 - 13:46 #10
Bedre sent end aldrig som man siger
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