Avatar billede bbkdk Seniormester
13. maj 2015 - 09:54 Der er 16 kommentarer og
1 løsning

Forudfyldt formular

Jeg har lavet et lille tidsregistreringssystem.

Med dato, samt komme og gå tid, og en saldo, der vises i indberetningsformularen. Ved månedens slutning nulstilles formularen, idet dataene overføres til en tabel med tidligere data.

Men er det muligt at lave en "forudfyldt" formular, der viser alle hverdage (mandag, tirsdag, onsdag, torsdag og fredag) i den aktuelle måned, således at der ikke skal indberettes dato.

Det skal nævnes, at der er tale om et enkeltbrugersystem, dvs. at alle brugere har deres egen database på deres pc.

Det gælder i øvrigt også andre sammenhænge, hvor man ønsker et antal poster i en formular vist ved åbning, f.eks. i et spørgeskema.
Avatar billede terry Ekspert
13. maj 2015 - 10:13 #1
I'm sure it is possible to do what you ask but a bit more information would help.

I assume days ( (mandag, tirsdag, onsdag, torsdag og fredag) don't need to be stored in the dB so could be labels on the form, and you could use "Default Value" to show days date and month.

For "spørgeskema" I assume the actual question could be a text field or label showing question, unless you want to store that in the dB along with the answer to each question.
Avatar billede claes57 Ekspert
13. maj 2015 - 10:24 #2
du kan lave en fast række felter fra 1-31 med plads til ugedage.
Du ved hvor mange dage, der er i en måned, så overskydende felter skjules.
Så sætter du dato og ugedag på tekstfelt (brug gerne fast-bredde tegn, så det står pænt, og blank foran 1-9, fx " 1 Man").
En let måde at styre februar/skudår er at tage dato 1. marts, trække en dag fra, og så har du længden på feb.
Avatar billede claes57 Ekspert
13. maj 2015 - 10:28 #3
btw: jeg har en lille asp-rutine, der beregner helligdage i året - hvis du kører den ind også, så kan lør/søn og helligdage have rød tekst (eller skjules).
Avatar billede bbkdk Seniormester
13. maj 2015 - 11:50 #4
Tak for indlæg til både Terry og claes57.

Min tanke er, at hvis den aktuelle måned er f.eks. marts, og der er 22 dage i marts ekskl. lørdage og søndage, skulle formularen åbne med 23 poster, hvor datoen er forudfyldt for alle dage, selvom vi f.eks. kun er kommet til den 3. marts. Der skal så indberettes komme og gå tider, efterhånden som måneden skrider frem.
Det tager ikke lang tid at indberette en dato, men årsagen til mit ønske er, at nogle af mine kolleger udfylder hele måneden på forskud. Og så tager det trods alt tid at udfylde alle datofelterne.
Men kunne det eventuelt være noget med, at i VBA at sætte måned og år  = den aktuelle måned og det aktuelle år, og derefter lave et gennemløb, der opretter en post for hver dato, hvor ugedagen er = 1,2,3,4 eller 5? Men hvordan skulle en sådan kode se ud - hvis ideen da overhovedet duer? og kunne alle poser for et år så oprettes i en tabel, hvorefter en forespørgsel så fremfandt posterne for den aktuelle måned, og viste disse i formularen?
Avatar billede terry Ekspert
13. maj 2015 - 13:53 #5
How about having a button on the form which user can press to create records for current year/month?

If claes57 could supply you with code to calculate "helligdage" then its just a case of looping through days and inserting necessary information into table. Then requery form to show records.

If records have already been created then disable button ...
Avatar billede claes57 Ekspert
13. maj 2015 - 14:43 #6
Dette er lavet til en blomsterbutik - og har derfor også advent og mors dag med. Du må selv rette kode til til dit brug - primært slår den en dag op ad gangen, så for marts skal der kaldes 31 gange (hvis du inden da springer lør/søndage over, så sparer du tid).

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html><head>
<title>Bare end kalender...</title>
<SCRIPT language=JavaScript>
  var browserID = "n";
  if (navigator.appName.indexOf("Microsoft")>=0){browserID="i";}
</script>
</head>
<body>
<%
sidenavn = LCase(Request.Servervariables("SCRIPT_NAME"))

Function getdaysinmonth(strmonth,stryear)
  datoen=cdate("01-" & strmonth & "-" & stryear)
  datoen=dateadd("m",1,datoen)
  datoen=dateadd("d",-1,datoen)
  getDaysInMonth=datepart("d",datoen)
End Function

Function SkrivStortBogstav(tekst)
  SkrivStortBogstav=ucase(left(tekst,1)) & lcase(mid(tekst,2,len(tekst)))
End Function

Function Helligdage(strdato)
aar=CInt(datepart("yyyy",strdato))  'skal være mellem 1901 & 2199
m= array(0,1,4,4,0,2,5,0,3,6,1,4,6)
gyldental=(aar+1) mod 19
if gyldental=0 then gyldental=19
epakt= ((gyldental-1)*11)mod 30
if aar>1899 and aar<2200 then epakt=epakt-1
epakt=epakt mod 30
DagTilFj=80
if gyldental=6 or gyldental=17 then DagTilFj=81
alder=(epakt+DagTilFj) mod 30
if alder<=13 then antaldg=13-alder
if alder>13 then antaldg=43-alder
fuldmaane=21+antaldg
if fuldmaane<=31 then
    dato=fuldmaane
    maaned=3
else
    dato=fuldmaane-31
    maaned=4
end if
korrektion=(5+aar+aar\4-aar\100+aar\400) mod 7
if aar/4=int(aar/4) and (maaned=1 or maaned=2) then
    if aar/100<>int(aar/100) then korrektion=korrektion-1
    if aar/100 =int(aar/100) then korrektion=korrektion-1
end if
u=(dato+m(maaned)+korrektion)mod 7
paaske=dato+7-u
if paaske>31 then
    paaske=paaske-31
    maaned=4
end if
str = paaske & "-" & maaned &"-"& aar
datoto = cdate("24-12-" & datepart("yyyy",strdato))
juldag = weekday(datoto, vbMonday)
soendag = dateadd("d",0-juldag,datoto)

if strdato = cdate(str)-49 then
  Helligdage = "Fastelavn"
elseif strdato = cdate(str)-7  then
  Helligdage = "Palmesøndag"
elseif strdato = cdate(str)-3  then
  Helligdage = "Skærtorsdag"
elseif strdato = cdate(str)-2  then
  Helligdage = "Langfredag"
elseif strdato = cdate(str)    then
  Helligdage = "Påskedag"
elseif strdato = cdate(str)+1  then
  Helligdage = "2. Påskedag"
elseif strdato = cdate(str)+26 then
  Helligdage = "St. Bededag"
elseif strdato = cdate(str)+39 then
  Helligdage = "Kr. Himmelfartsdag"
elseif strdato = cdate(str)+49 then
  Helligdage = "Pinsedag"
elseif strdato = cdate(str)+50 then
  Helligdage = "2. Pinsedag"
elseif strdato = cdate("1-1-" & datepart("yyyy",strdato)) then
  Helligdage = "Nytårsdag"
elseif strdato = cdate("5-6-" & datepart("yyyy",strdato)) then
  Helligdage = "Grundlovsdag / Fars dag"
elseif strdato = cdate("24-12-" & datepart("yyyy",strdato)) then
  Helligdage = "Juleaften"
elseif strdato = cdate("25-12-" & datepart("yyyy",strdato)) then
  Helligdage = "Juledag"
elseif strdato = cdate("26-12-" & datepart("yyyy",strdato)) then
  Helligdage = "2. Juledag"
elseif strdato = cdate("31-12-" & datepart("yyyy",strdato)) then
  Helligdage = "Nytårsaften"
elseif strdato = soendag then
  Helligdage = "4. søndag i Advent"
elseif strdato = dateadd("ww",-1,soendag) then
  Helligdage = "3. søndag i Advent"
elseif strdato = dateadd("ww",-2,soendag) then
  Helligdage = "2. søndag i Advent"
elseif strdato = dateadd("ww",-3,soendag) then
  Helligdage = "1. søndag i Advent"
else
  Helligdage = ""
end if
End Function

strtoday = Date()
stryear = Year(strtoday)
strmonth = Month(strtoday)
If Request("month") <> "" Then strmonth = request("month")
If Request("year") <> "" Then stryear = request("year")

strdaysinmonth = getdaysinmonth(strmonth,stryear)
%>
<table border="0" bgcolor="#C0C0C0" width="490" height="145" style="border: 1px solid #000000;">
  <tr>
  <td>
Kalender for <Select size="1"
                    id="months"
                    name="months"
                    onchange="if (browserID=='n'){months = document.getElementById('months'); years = document.getElementById('years');};location.href ='<%=sidenavn%>?month='+months.value+'&year='+years.value">
<%
    For i = 1 To 12
      Response.Write "<option value=" & i
      If CInt(strmonth) = i Then Response.Write " SELECTED"
      Response.Write "> " & SkrivStortBogstav(MonthName(i,false))
      Response.Write " </option>" & vbCrLf
    Next
%>
</Select>&nbsp;&nbsp;
<Select size="1"
        name="years"
        id="years"
        onchange="if (browserID=='n'){months = document.getElementById('months'); years = document.getElementById('years');};location.href ='<%=sidenavn%>?month='+months.value+'&year='+years.value">
<%
for i = CInt(stryear)-10 to CInt(stryear)+10
    Response.Write "<option value=" & i
    If CInt(stryear) = i Then Response.Write " SELECTED"
    Response.Write ">" & i & "</option>" & vbCrLf
next
%>
</Select>
</td><td align="right">
                    <a href="<%=sidenavn%>?month=<%=datepart("m",strtoday)%>&year=<%=datepart("yyyy",strtoday)%>"
                        title="Vis aktuel måneds kalender"
                        onMouseOver="window.status=''; return true"
                        onMouseOut="window.status=''">&nbsp;DD&nbsp;</a>
  </td>
  </tr>
  <tr>
    <td width="280" align="left" valign="top">
        <table cellpadding="0" cellspacing="0" border="0" bgcolor="#FFFFFF" width="100%" height="100%" style="border: 1px solid #000000;">
        <tr bgcolor="#CFCFCF">
<%
  for i=1 to 7
        response.write "<td align=""center"" width=""40""><b>"
      if i=7 then response.write "<font color=""#FF0000"">"
      response.write SkrivStortBogstav(left(weekdayname(i,false,vbMonday),3))
      if i=7 then response.write "</font>"
      response.write "</b></td>"
  next
%>
        </tr>
        <tr bgcolor="#CFCFCF"><td colspan="7"><hr></td></tr>
<!-- Kalender laves her -->
<%
datoen = CDate("01-" & strmonth & "-" & stryear)
firstday = Weekday(datoen, vbMonday)
aktday = 0
if (CInt(strmonth)=CInt(Month(strtoday))) and (CInt(stryear)=CInt(Year(strtoday))) then aktday = CInt(datepart("d",date))
tomme=firstday-1
if tomme>0 then
  response.write "<tr>" & vbCrLf
  lastmonth=cint(strmonth)-1
  lastyear=cint(stryear)
  if lastmonth=0 then
    lastmonth=12
    lastyear=lastyear-1
  end if
  for i=1 to tomme
    response.write "<td align=""center"" bgcolor=""#C0C0C0"" "
    response.write "onclick=""location.href ='" & sidenavn & "?month=" & lastmonth & "&year=" & lastyear & "'"""
    response.write "><font color=""#808080"">"
    response.write datepart("d",dateadd("d",i-(tomme+1),datoen))
    response.write "</font></td>" & vbCrLf
  next
end if
mddag=9-firstday
for i=1 to strdaysinmonth
  if i=aktday then
    strItToday = "<td align=""center"" style=""border: 1px solid #000000;""><font color=""#000000"">"
  else
    strItToday = "<td align=""center""><font color=""#000000"">"
  end if
  if (7+i-mddag) MOD 7 =6 then
    if i=aktday then
      strItToday = "<td align=""center"" bgcolor=""#FF8080"" style=""border: 1px solid #000000;""><font color=""#000000"">"
    else
      strItToday = "<td align=""center"" bgcolor=""#FF8080""><font color=""#000000"">"
    end if
  end if
  datoen = CDate(i & "-" & strmonth & "-" & stryear)
  strtxt = Helligdage(datoen)
  if CInt(strmonth)=5 and i>7 and i<15 and (7+i-mddag) MOD 7 = 6 then
    if strtxt="" then
      strtxt = "Mors dag"
    else
      strtxt = strtxt &  " / Mors dag"
    end if
  end if
  if len(strtxt) > 0 then
    if i=aktday then
      strItToday = "<td align=""center"" bgcolor=""#FF8080""style=""border: 1px solid #000000;"" onmouseover=""if (browserID=='n'){texter = document.getElementById('texter');}; texter.innerHTML='" & strtxt & "';"" onmouseout=""if (browserID=='n'){texter = document.getElementById('texter');}; texter.innerHTML='';""><font color=""#000000"">"
    else
      strItToday = "<td align=""center"" bgcolor=""#FF8080"" onmouseover=""if (browserID=='n'){texter = document.getElementById('texter');}; texter.innerHTML='" & strtxt & "';"" onmouseout=""if (browserID=='n'){texter = document.getElementById('texter');}; texter.innerHTML='';""><font color=""#000000"">"
    end if
  end if
  if (i-mddag) MOD 7 = 0 then response.write "<tr>" & vbCrLf
  response.write strItToday & i & "</td>" & vbCrLf
  if (i-mddag) MOD 7 = 6 then response.write "</tr>" & vbCrLf
next
if (firstday+strdaysinmonth-1) MOD 7 > 0 then
  nextmonth=cint(strmonth)+1
  nextyear=cint(stryear)
  if nextmonth=13 then
    nextmonth=1
    nextyear=nextyear+1
  end if
  for i=1 to 7-((firstday+strdaysinmonth-1) MOD 7)
    response.write "<td align=""center"" bgcolor=""#C0C0C0"""
    response.write "onclick=""location.href ='" & sidenavn & "?month=" & nextmonth & "&year=" & nextyear & "'"""
    response.write "><font color=""#808080"">" & i & "</font></td>" & vbCrLf
  next
  response.write "</tr>"
end if
%>
<!-- Kalender slut her -->
      </table>
        </td>
    <td valign="top" width="190">
    <table cellpadding="0" cellspacing="0" border="0" bgcolor="#FFFFFF" style="border: 1px solid #000000;" height="100%" width="100%">
    <tr bgcolor="#CFCFCF">
    <td><b>Dagens note:</b></td>
    </tr>
      <tr bgcolor="#CFCFCF"><td><hr></td></tr>
    <tr>
    <td height="100%" valign="top"><div id="texter" style="width:99%; height:99%;"></div></td>
    </tr>
    </table>
    </td>
  </tr>
</table>
</body></html>
Avatar billede bbkdk Seniormester
13. maj 2015 - 14:52 #7
Hej Terry
Din ide ligner noget der kan bruges - men har du et forslag til, hvordan koden (for jeg går ud fra, at tabellen med datoer skal laves ved hjælp af en VBA-sætning)skal se ud. Det gør så ikke så meget, hvis helligdagene er med.
Da vi har samme arbejdstid for alle dage, nemlig 7 timer og 36 minutter, gør det egentligt heller ikke noget, hvis lørdag og søndag er med, idet de så bare kan blive stående i med standardtiden 08:00 til 15:36.
Og det kan da også ske, at vi arbejder en helligdag, eller en lørdag/søndag.
Så en VBA, der opretter samtlige dage i et år, og en forespørgsel, der åbner formularen med den aktuelle måneds oplysninger, ville nok være det bedste.
Avatar billede bbkdk Seniormester
13. maj 2015 - 15:30 #8
Hej claes57
Tak for indslaget - det var da en imponerende kode ..
Håber I også kommer med et forslag til koden, der kan oprette årets dage i en tabel.
Der går desværre 3-4 dage, inden jeg kan komme på Eksperten igen, så I må lige have lidt tålmodighed med mig.
Avatar billede terry Ekspert
13. maj 2015 - 16:49 #9
Is it possible for you to send an example of dB?
ekspertenATsanthell.dk
AT=@
I'll try and put some code together over next few days, rather busy ....
Avatar billede bbkdk Seniormester
14. maj 2015 - 17:47 #10
Hej Terry
Er det i orden, hvis jeg først sender databasen på mandag, hvor jeg er tilbage på arbejde.
Avatar billede terry Ekspert
14. maj 2015 - 22:26 #11
No problem, enjoy the weekend :-)
Avatar billede terry Ekspert
19. maj 2015 - 14:36 #12
This code doesn't take into account weekends and holidays as I assume it could be allowed to work on those days too.

Code should take into account leap year.


Function CreateRecordsForMonth() As Boolean
Dim workDay As Date
Dim lastDay As Date
   
   
    workDay = dhFirstDayInMonth
    lastDay = dhLastDayInMonth
 
    'No warning about records being inserted or if insert fails (if record excist) ...
    DoCmd.SetWarnings False
    Do
        DoCmd.RunSQL "INSERT INTO Tidsregistreringsdata (Dato) Values(#" & Format(workDay, "YYYY/MM/DD") & "#)"
       
        workDay = DateAdd("d", 1, workDay)
       
    Loop Until workDay > lastDay
   
    DoCmd.SetWarnings True
   
    CreateRecordsForMonth = True
   
End Function

'https://msdn.microsoft.com/en-us/library/aa227522%28v=vs.60%29.aspx?f=255&MSPPError=-2147217396
Function dhFirstDayInMonth(Optional dtmDate As Date = 0) As Date
    ' Return the first day in the specified month.
    If dtmDate = 0 Then
        ' Did the caller pass in a date? If not, use
        ' the current date.
        dtmDate = Date
    End If
    dhFirstDayInMonth = DateSerial(Year(dtmDate), Month(dtmDate), 1)
End Function

Function dhLastDayInMonth(Optional dtmDate As Date = 0) As Date
    ' Return the last day in the specified month.
    If dtmDate = 0 Then
        ' Did the caller pass in a date? If not, use
        ' the current date.
        dtmDate = Date
    End If
    dhLastDayInMonth = DateSerial(Year(dtmDate), Month(dtmDate) + 1, 0)
End Function
Avatar billede bbkdk Seniormester
20. maj 2015 - 09:18 #13
Hej Terry
Det virker - hurra. Og mange tak for hjælpen.
Og når jeg har set nærmere på systemet, giver det nok anledning til yderligere nogle spørgsmål:

Feltet til opsummering virker ikke, idet der er en fejl i min VBA, som jeg ikke lige kan forstå.
Når databasen åbnes, skal markøren stille sig i feltet for dagens dato.
Og få markeret, hvilke dage der er weekends (hvordan kan det vises, så det er tydeligt for brugeren?)

Men det oprette jeg formentligt på et tidspunkt som selvstændige spørgsmål, så andre også kan få glæde af svaret.

Også tak til Claes57, selvom jer er lidt i tvivl om, hvorledes koden skal bruger.

Så Terry får alle points - håber det er ok
Avatar billede terry Ekspert
20. maj 2015 - 09:35 #14
Thanks Knud.

Sorry for not answering your question regarding "opsummering", forgot all about it :-(

Where is the code for this, I didn't see any!
Avatar billede bbkdk Seniormester
20. maj 2015 - 10:25 #15
Hej Terry
Koden ser således ud:

Private Sub Tekst64_Exit(Cancel As Integer)
Dim rst As Recordset
Dim prevval As Double
Set rst = CurrentDb.OpenRecordset("select * from Tidsregistreringsdata")
While Not rst.EOF
rst.Edit
rst("Tekst64") = prevval + rst([+/-])
rst.Update
prevval = rst("Tekst64")
rst.MoveNext
Wend
End Sub

Når jeg åbner formularen, og sætter markøren i feltet "Opsummering", der hedder Tekst64, får jeg en fejl, idet den ikke kender Tekst64.

Hvad der lige er galt, kan jeg ikke umiddelbart se.

Jeg er i øvrigt ikke sikker på, at koden viser den rigtige værdi, da det jo kun er månedens tal, jeg ønsker sammentalt. Og vil koden ikke givet en sammentælling af alle tallene i tabellen?
Avatar billede terry Ekspert
20. maj 2015 - 11:22 #16
The problem in your code is that Tekst64 isn't a part of the recordset as its unbound.
I think I have another solution, back ASAP
Avatar billede terry Ekspert
20. maj 2015 - 12:43 #17
I have altered query so it calls a function to calculate "Opsummering". Tried using a sub select but this makes the query read only!

Code:
Public Function MonthTotal(d As Date) As Double
Dim y As Integer
Dim m As Integer

    y = Year(d)
    m = Month(d)
   
    On Error GoTo Err
   
    MonthTotal = DSum("[+/-]", "Tidsregistreringsdata", "Dato <= #" & Format(d, "YYYY/MM/DD") & "# AND Year(Dato) = " & y & " AND Month(Dato) = " & m)
   

    Exit Function
Err:
    MonthTotal = 0

End Function

Also used conditional formatting to show weekends in red.
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