webForumDet fria alternativet

Lustigt fel i min tidsrapportering

.NET

9 svar · 1 232 visningar · startad av saw

Medlem sedan mars 20011 880 inlägg
Frågan#1

Så här ser min kod ut:

string sStart = (row.FindControl("txtstartTid") as TextBox).Text;
            string sSlut = (row.FindControl("txtslutTid") as TextBox).Text;
            decimal sFullTid =0;
            DateTime startTid;
            DateTime sluttTid;
            TimeSpan tsDiff;
            if (sStart.Length > 0 && sSlut.Length > 0)
            {
                startTid = Convert.ToDateTime(sStart);
                sluttTid = Convert.ToDateTime(sSlut);
                tsDiff = sluttTid.Subtract(startTid);
                DateTime d = new DateTime(tsDiff.Ticks);
                string tidsSkillnad = d.ToString("HH:mm");
                DateTime dD = Convert.ToDateTime(tidsSkillnad);

                string sTemp = dD.ToShortTimeString().Replace(":", ",");
                sFullTid = Convert.ToDecimal(sTemp);
                sFullTid = Webbutill.countRast(startTid.ToShortTimeString(), 
sluttTid.ToShortTimeString(), sFullTid);
//här kollar jag rastern och det ser ut så här
 public static Decimal countRast(string start, string slut,decimal full)
        {
            decimal dTotal = full;
            decimal rast = 0;
            if (start == "07:00" && slut == "15:45")
                rast =Convert.ToDecimal("0,45");
            else if (start == "07:00" && slut == "11:45")
                rast = Convert.ToDecimal("0,15");
            else if (start == "07:00" && slut == "14:00")
                rast = Convert.ToDecimal("0,45");
            else if (start == "07:00" && slut == "11:15")
                rast = Convert.ToDecimal("0,15");
            return dTotal - rast;
        }

Om vi säger att start är 07:00 och slut är 15:45 då blir rasten 0.45 och
dTotal borde vara 8 eller 8,00.
Lokalt på min dator så är det så, men när jag lägger den på min utveklings-
server då blir dTotal 800. Kan någon förklara för mig vad det är som händer här? :o

Medlem sedan juli 20041 183 inlägg
#2

Hmm, jag kanske är trött men förstår inte alls varför du gör som du gör och tycker det liknar brute force programming. Om du talar om vad du försöker göra finns det nog en enklare och bättre lösning. Vad händer t.ex. om du börjar 7:15 eller 8:00? Eller slutar 16:45? På mitt jobb är minsta tidsenhet en halvtimme...

Så till din fråga. Kan det kanske ha att göra med decimaltecknet. Kör du engelskt OS och .Net på din utvecklingsserver och kör du kanske Svenska på din egen maskin? Du kan lägga på en extra parametrar i dina Convert.ToXX() funktioner kallad IFormatProvider. Där ska du kunna sätta vilken "kultur" som skall användas och då tror jag du får samma resultat på både din server och din dator.

I engelskan är väl decimaltecknet en punkt och i svenskan ett komma? Min gissning är att detta är felet. Varav vi kommer tillbaka till, vad försöker du göra? :)

Medlem sedan mars 20011 880 inlägg
#3

Ber om ursäkt lilja, jag var så frusterad igår när jag upptäckte detta felet att jag glömde
förklara. Jag bygger alltså upp en tidsrapportering sida, och just här så skall jag räkna
ut antal timmar per dag som man jobbar på därav startTid och slutTid. Jag tycker nog själv att det ser väldigt bökigt ut, jag har kollat runt på lite olika siter för att få tips, och som sagt, detta fungerade lokalt. Det kanske ligger en del i vad du säger om kulturen,
jag får kolla detta.

Medlem sedan mars 20011 880 inlägg
#4

Nu fungerar der, men du kanske fortfarande tycker att det är klumpigt programmerat...

startTid = DateTime.ParseExact(sBaTid[0].Replace(":", "."), TimeFormat, CultureInfo.InvariantCulture);
            sluttTid = DateTime.ParseExact(sBaTid[1].Replace(":", "."), TimeFormat, CultureInfo.InvariantCulture);
            tsDiff = sluttTid.Subtract(startTid);
            DateTime d = new DateTime(tsDiff.Ticks);
            string tidsSkillnad = d.ToString("HH:mm");
            DateTime dD = Convert.ToDateTime(tidsSkillnad);

            string sTemp = dD.ToShortTimeString().Replace(":", ",");
            sFullTid = Convert.ToDecimal(sTemp);
            sFullTid = Webbutill.countRast(startTid.ToShortTimeString(), sluttTid.ToShortTimeString(), sFullTid);

Jag får nu samma resultat så väl lokalt som på servern :D

Medlem sedan juli 20041 183 inlägg
#5

Kul att du fick det att fungera! :) Om du undrar vad jag reagerade på så är det främst din if-sats med start och sluttid. Hur kan du vara så säker på att du alltid börjar 07:00? Tänk om du försover dig en morgon eller vill starta dagen med ett tandläkarbesök?

Vad är det du försöker åstadkomma? Ska du bara omvandla ex. 07:00-15:45 till 8:45? Ska detta sparas någonstans eller skrivs det bara ut i gridden?

Medlem sedan mars 20011 880 inlägg
#6

Hej.
Nja först skall jag ha fram schema lagda tider, och de kan variera väldigt mycket.
En del har tider 7:00-15:45 5 dggr veckan
andra 7:00-15:45 2 dggr veckan
eller 7:00-11:45. Det första som jag räknar ut där är den procentsats de har, om man säger att 8 tim/dag * 5 dag ger 100%, så får vi en scemalagd %-sats.
Nästa steg är att fylla i den verkliga tiden, och sedan gör jag en gämmförelse med den
scemalagda tiden. Då kan man se om det stämmer eller om någonting blir fel.

Medlem sedan juni 20003 076 inlägg
#7

Och man kan inte bara ange antalet totala timmar för varje anställd och sedan räkna av därifrån?
Stefan = 40 timmar
Gunnar = 35 timmar

Sen repporterar Stefan 6 timmar en dag, han har då 34 kvar att göra för att uppnå 100%.

??

När på dygnet en anställd ska jobba låter spontant oviktigt tycker jag.
Det är bättre då att bara ange verklig tid.
Man kan inte kräva att anställda kommer i tid! ;) I verkligheten, ja, men inte i systemet.
Man kanske fastnar i bilkö eller vad som helst.

/RED
Det är klart att det kan vara vettigt att veta när på dygnet en anställd jobbar för att kunna planera jobb m.m. men inte för att rapportera tid.

Medlem sedan mars 20011 880 inlägg
#8

Du har så rätt, men eftersom företaget hela tiden har haft principen att vid anställning
tala om att anställning gäller för tiden ..:.. så för att göra det enkelt för mig, så fortsatte
jag på det spåret. Nu när jag fick bort min bug, så upplever jag det inte som någon direkt nackdel. Detta är ju sedan till för att jämmföras med den verkliga tiden.

Medlem sedan juli 20041 183 inlägg
#9

Varför kan du då inte bara använda dig av en select-lista där den anställda får välja sin tid och använda value-tiden till den tid en anställd jobbar? Så slipper du göra en massa onödiga beräkningar. Dessutom slipper användaren skriva in sin tid varje dag då det räcker med att välja den i en lista. Om du vill göra det lite mer dynamiskt kopplar du denna listan mot en databastabell där användaren kan lägga till värden om det saknas.

Om det då tillkommer en annan tid är det bara att ändra aspx sidan och du slipper kompilera om siten. Gör du detta med en databas blir det ännu mer flexibelt, även om användaren inte kan lägga till värden själv.

Jag tänker också att du kanske tänker lite fel? Du utgår från hur det fungerade på papper (och excel?) och vill ha exakt samma fast på en webbsida. Både till utseende och funktion? Detta är ett gyllene tillfälle att göra det smartare och jag tycker du bör tänka igenom din lösning så att du får bra grunddata som är lätt att hantera. Sådana här system tendera att växa när ledningen vill ha mer statistik eller detaljer och då vill man inte ha "ett gammalt skitsystem" att förändra. "Ett gammalt skitsystem" är rätt vanligt inom denna branschen och gemensamma nämnaren är att ingen vill jobba med dem :)

Medlem sedan mars 20011 880 inlägg
#10

Tack för dina synpunkter, jag skall iakta dem väldigt noga.

256 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
122 ms — deklarationer (db)
0 ms — hämta statistik (cache)
130 ms — hämta tråd, inlägg och bilagor (db)
124 ms — ändringar (db)