13. maj 2015 - 09:54Der 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.
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.
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.
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).
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?
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 ...
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> <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=''"> DD </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>
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.
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.
'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
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.
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?
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.
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.