Avatar billede macho Praktikant
28. juni 2003 - 11:51 Der er 47 kommentarer og
1 løsning

Beregning af hele antal dage mellem to datofelter

Jeg mangler én sidste (ønskelig) funktion i en formular, hvor jeg har to dato-felter (firstinput og secondinput). I felterne indtastes dato for første nat (DD/MM/ÅÅÅÅ) og dato for sidste nat (DD/MM/ÅÅÅÅ). Hvorledes tilføjer jeg et felt, hvori der automatisk skal blive skrevet antal overnatninger ud fra indtastningerne i dato-felterne? Det skal bemærkes, at datoen i de to dato-felter godt kan være ens (f.eks. 28/06/2003 i begge), og resultatet skal så være "1" i mit nye ønskelige felt, "Antal overnatninger".

I øvrigt kan min nuværende formular ses som test her:
http://www.staal-larsen.dk/mail/contact_test2.htm

Noget bud?
Avatar billede roenving Novice
28. juni 2003 - 12:01 #1
Har du ikke allerede fat i datoerne i valideringen, eller har du brug for det på et tidligere tidspunkt (under udfyldelsen) ...
Avatar billede macho Praktikant
28. juni 2003 - 12:06 #2
Der bliver allerede valideret på datoerne nu i min nuværende funktion. Det eneste jeg mangler er som sagt en udregning af samlede antal dage, som en ekstra oplysning til bestillingen.
Avatar billede roenving Novice
28. juni 2003 - 12:22 #3
Jeg flettede den ind i dato-check'en (som jeg stadig havde liggende ,-), men hvis du vil ahve den et andet sted hen, må vi lige kigge på det:

    if (f=='[object]'){(f.forskel.value=Math.floor((tdate.getTime()-dato1)/86400000));}
    else return errorMsg;

-- og grunden til det er selvfølgelig, at det er håbløst at teste på forskelle i dage, hvis datoerne ikke er i orden !-)
Avatar billede macho Praktikant
28. juni 2003 - 12:41 #4
Ikke helt forstået, Rønving.

Scriptet for dato-check'en ser således ud i øjeblikket:

    regex =/^(3[01]|0[0-9]|[12]\d)\/(0[1-9]|1[012])\/\d{4}/;
    dato1 = "0"

    //Check for firstinput
    dat = document.frmEnquiry.firstinput.value;
    if (dat == ""||!regex.test(dat)){
        errorMsg += "\n\tFørste overnatning \t- Indtast første nat i dette format: (DD/MM/ÅÅÅÅ)\n";
    }else{
      dat = dat.split("/");
      var tdate = new Date(parseInt(dat[2]),parseInt(dat[1])-1,parseInt(dat[0]));
      if (tdate.getDate()!=parseInt(dat[0])||tdate.getMonth()+1!=parseInt(dat[1])||tdate.getFullYear()!=parseInt(dat[2])){
        errorMsg += "\n\tFørste overnatning \t- Ugyldig dato (DD/MM/ÅÅÅÅ)\n";
      }else{dato1=tdate.getTime();
        var chdato = new Date().getTime()+ (24*60*60*1000);
        if (chdato>dato1)
          errorMsg += "\n\tFørste overnatning \t- Når du benytter denne formular,\n\t\t\t  kan du tidligst bestille to dage frem\n"
      };
    }

   
   
    //Check for secondinput
    dat = document.frmEnquiry.secondinput.value;
//    alert(dat);
    if (dat == ""||!regex.test(dat)){
        errorMsg += "\n\tSidste overnatning \t- Indtast sidste nat i dette format: (DD/MM/ÅÅÅÅ)\n";
    }else{
      dat = dat.split("/");
      var tdate = new Date(parseInt(dat[2]),parseInt(dat[1])-1,parseInt(dat[0]));
      if (tdate.getDate()!=parseInt(dat[0])||tdate.getMonth()+1!=parseInt(dat[1])||tdate.getFullYear()!=parseInt(dat[2])){
        errorMsg += "\n\tSidste overnatning \t- Ugyldig dato (DD/MM/ÅÅÅÅ)\n";
      }else{
          if(dato1>tdate.getTime())
              errorMsg += "\n\tSidste overnatning \t- Dato kan ikke være tidligere end første nat\n"
          }
     
    }




Derudover bruger jeg følgende input-maske (også lavet af dig):


//Script til inputmaske for datofeltet. START
var newVal="";
var dd=0;
var mm=0;
var repeatRemove=0;

function getCharCode(e){
return (e.which)?e.which:e.keyCode;
}

function restoreVal(eC,fld){
    if (eC==8||repeatRemove>0){
        if (newVal.length>repeatRemove){
              newVal=newVal.substring(0,newVal.length-repeatRemove)
        }else{
            newVal="";
        }
    }
    repeatRemove=0;
    fld.value=newVal;
}

function inputDate(e,fld){
removeChar=false;
newVal=fld.value;
charCode = getCharCode(e);
if ((fld.value.length==2 || fld.value.length==5) && charCode==47){newVal+="/";return true;}
if (fld.value.length==10 || charCode>57 || charCode<48){
    return false;
    }
   
newVal=fld.value+String.fromCharCode(charCode)

switch (fld.value.length){
    case 0:
          if (+newVal>3){repeatRemove++;return false;}
          break;
      case 1:
          if (+newVal>31){repeatRemove++;return false;}
          if (+newVal==00){repeatRemove++;return false;}
          dd = +newVal;
          newVal+="/";
          break;
      case 2:
          newVal=fld.value+"-"+String.fromCharCode(charCode)
          if (charCode>49){repeatRemove++;return false;}
          break;
      case 3:
          if (charCode>49){repeatRemove++;return false;}
          break;
      case 4:
        var mm = parseInt(newVal.substring(3),10);
        if (mm==2 && dd>29 || mm>12 || mm==00){repeatRemove++;return false;}
        if (dd==31 && (mm==4 || mm==6 || mm==9 || mm==11)){repeatRemove++;return false;}
        newVal+="/";
        break;
    case 5:
          newVal=fld.value+"-"+String.fromCharCode(charCode)
          break;
      case 6:
          if (charCode<50 || charCode>50){repeatRemove++;return false;} //Tillader 2 som første tal i årstal
          break;
      case 7:
          var yy = parseInt(newVal.substring(6));
          if (yy<20 || yy>20){repeatRemove++;return false;} //Tillader 20 som første to tal i årstal
          break;
      case 8:
          var yyy = parseInt(newVal.substring(6));
          if (yyy>200){repeatRemove++;return false;} //Tillader kun 0 som trejde tal, hvis første to er 2 og 0.
          break;

}
return true;
}
//Script til inputmaske for datofelt. SLUT



Hvordan fletter jeg det du nu har lavet, ind i ovenstående?
Avatar billede roenving Novice
29. juni 2003 - 01:00 #5
-- helt forstået (tror jeg ,-)

-- jeg tog selve dato-testen og brugte den (de øverste 20 - 30 linjer) fordi den indeholder en rigtig dato som en del af valideringen ...

-- egentlig var det fordi jeg var doven -- det ligger naturligt for mig *-]

-- men da jeg var igang gik det op for mig, at det kun giver mening at snakke om forskelle i dage, hvis datoerne dur, så min konklusion blev til at vi skulle flette det ind i dit live-script, so from here we go !-)

Lav datochecket til en selvstændig funktion, som kaldes under valideringen med et eller andet som 'dummy'-argument -- f.eks. datocheck('valider') altså skal funktionen datocheck pilles ud af dit checkscript og være noget for sig selv ...

På onchange-eventen på den anden dato kalder du så din datochecker med datocheck(this.form) og indsætter de linjer jeg refererede til i stedet for den (sikkert) manglende afsluning du har i dag:

    if (f=='[object]'){(f.forskel.value=Math.floor((tdate.getTime()-dato1)/86400000));}
    else return errorMsg;

hth
jes
Avatar billede macho Praktikant
29. juni 2003 - 11:18 #6
-> Rønving,
Jeg må nok bede dig komme med et eksempel (jeg er meget nybegynder indenfor javascript) - eller også må jeg nok opgive; det er jeg selvfølgelig helst fri for. Jeg kan ikke følge dig i din vejledning og aner faktisk ikke, hvad jeg skal ændre og hvor! ;-(

Det kan godt være du er doven (hvilket jeg dog ikke helt tror på), men det er jeg ikke. Jeg leder og forsøger, men det er meget i blinde. Hjælp....
Avatar billede macho Praktikant
29. juni 2003 - 11:42 #7
På min side:
http://www.staal-larsen.dk/mail/contact_test2.htm

har jeg givet en (måske bedre) forklaring af, hvad det er jeg ønsker!

mvh
Avatar billede macho Praktikant
29. juni 2003 - 16:29 #8
Jeg smider lige nogle flere points til løsning af denne opgave... :-)
Avatar billede macho Praktikant
02. juli 2003 - 15:01 #9
Nogen, som har en løsning på denne opgave?
Avatar billede roenving Novice
02. juli 2003 - 16:50 #10
En ny global variabel: fdate defineret samme sted som bla. newVal -- og så:

      case 8:
          var yyy = parseInt(newVal.substring(6));
          if (yyy>200){repeatRemove++;return false;} //Tillader kun 0 som trejde tal, hvis første to er 2 og 0.
          break;
      case 9:
          if(fld.name=='firstinput'){
          fdate = new Date(newVal.substring(6),newVal.substring(3,5),newVal.substring(0,2));
          }else{
          sdate = new Date(newVal.substring(6),newVal.substring(3,5),newVal.substring(0,2));
          }
          var forsk = (fdate-sdate)/(24*60*60*1000);
          fld.form.forskel.value = forsk + 1; //<-- skal den altid lægge en til ?-)
Avatar billede macho Praktikant
03. juli 2003 - 00:37 #11
Jeg opgi'r det her, da jeg ikke kan følge roenving længere... :-(
Avatar billede macho Praktikant
03. juli 2003 - 00:37 #12
->roenving
Ellers mange tak for alle dine forsøg...
Avatar billede roenving Novice
03. juli 2003 - 16:50 #13
Det er kun input-maske-scriptet der skal ændres -- her får du det hele:

//Script til inputmaske for datofeltet. START
var newVal="";
var fdate;
var dd=0;
var mm=0;
var repeatRemove=0;

function getCharCode(e){
return (e.which)?e.which:e.keyCode;
}

function restoreVal(eC,fld){
    if (eC==8||repeatRemove>0){
        if (newVal.length>repeatRemove){
              newVal=newVal.substring(0,newVal.length-repeatRemove)
        }else{
            newVal="";
        }
    }
    repeatRemove=0;
    fld.value=newVal;
}

function inputDate(e,fld){
removeChar=false;
newVal=fld.value;
charCode = getCharCode(e);
if ((fld.value.length==2 || fld.value.length==5) && charCode==47){newVal+="/";return true;}
if (fld.value.length==10 || charCode>57 || charCode<48){
    return false;
    }
   
newVal=fld.value+String.fromCharCode(charCode)

switch (fld.value.length){
    case 0:
          if (+newVal>3){repeatRemove++;return false;}
          break;
      case 1:
          if (+newVal>31){repeatRemove++;return false;}
          if (+newVal==00){repeatRemove++;return false;}
          dd = +newVal;
          newVal+="/";
          break;
      case 2:
          newVal=fld.value+"-"+String.fromCharCode(charCode)
          if (charCode>49){repeatRemove++;return false;}
          break;
      case 3:
          if (charCode>49){repeatRemove++;return false;}
          break;
      case 4:
        var mm = parseInt(newVal.substring(3),10);
        if (mm==2 && dd>29 || mm>12 || mm==00){repeatRemove++;return false;}
        if (dd==31 && (mm==4 || mm==6 || mm==9 || mm==11)){repeatRemove++;return false;}
        newVal+="/";
        break;
    case 5:
          newVal=fld.value+"-"+String.fromCharCode(charCode)
          break;
      case 6:
          if (charCode<50 || charCode>50){repeatRemove++;return false;} //Tillader 2 som første tal i årstal
          break;
      case 7:
          var yy = parseInt(newVal.substring(6));
          if (yy<20 || yy>20){repeatRemove++;return false;} //Tillader 20 som første to tal i årstal
          break;
      case 8:
          var yyy = parseInt(newVal.substring(6));
          if (yyy>200){repeatRemove++;return false;} //Tillader kun 0 som trejde tal, hvis første to er 2 og 0.
          break;
      case 9:
          if(fld.name=='firstinput'){
          fdate = new Date(newVal.substring(6),newVal.substring(3,5),newVal.substring(0,2));
          }else{
          sdate = new Date(newVal.substring(6),newVal.substring(3,5),newVal.substring(0,2));
          }
          var forsk = (fdate-sdate)/(24*60*60*1000);
          fld.form.forskel.value = forsk + 1; //<-- skal den altid lægge en til ?-)
}
return true;
}
//Script til inputmaske for datofelt. SLUT

-- jeg har kaldt feltet for forskel, så det skal du lige tilpasse ,-)
Prøv det !-)
Avatar billede macho Praktikant
03. juli 2003 - 17:34 #14
Okay, jeg har nu indsat den nye inputmaske og tilføjet feltet "forskel" i min formular. Der sker bare ikke noget. Selvom jeg indtaster en dato i begge felterne "firstinput" og "secondinput" sker der intet i feltet "forskel", som jo gerne skulle vise antal dage ??

mvh
Avatar billede roenving Novice
03. juli 2003 - 19:07 #15
Kan ikke lige forstå, men jeg har heller ikke testet funktionaliteten, din form er jo blevet noget kompleks efterhånden *g*

-- prøv lige efter case 9: at indsætte:
alert(fld.name+" | "+fdate)
- og lige efter fdate = new Date(newVal.substring(6),newVal.substring(3,5),newVal.substring(0,2)); at indsætte:
alert(fdate)

-- fjerndebugging, men forhåbentlig kan vi også få sådan noget til at spille -- i teorien skulle der ikke være noget galt ...
Avatar billede macho Praktikant
03. juli 2003 - 21:01 #16
'fdate' er ikke defineret
linje 92 tegn 10

det er denne linje:
alert(fld.name+" | "+fdate)

tegn 10 er først i linjen!
Avatar billede roenving Novice
03. juli 2003 - 21:13 #17
gaab, vi skal lige initialisere fdate ...

-- s***** så man bliver overseende, når man ik' li'e kan skifte over til test ...

find linjen med var fdate og skriv:
var fdate = null;
Avatar billede macho Praktikant
03. juli 2003 - 21:32 #18
'sdate' er ikke defineret
linje 100 tegn 10

det er så denne linje:
var forsk = (fdate-sdate)/(24*60*60*1000);

her er tegn 10 først i linjen!

??
Avatar billede roenving Novice
03. juli 2003 - 21:38 #19
Hvad siger alerten ?-)
Avatar billede macho Praktikant
03. juli 2003 - 21:47 #20
Efter indtastning i "firstinput", kommer denne alert:

"  firstinput |  null    "

Derefter får jeg fejlen med at 'sdate' ikke er defineret.

Efter indtastning i "secondinput", kommer denne alert:

"  secondinput |  Mon Jan 12 00:00:00 UTC+0100 2004    "
samt en ekstra alert med dette alene:
"  Mon Jan 12 00:00:00 UTC+0100 2004  "

og derefter denne script-fejl:
"Et objekt er obligatorisk"
linje 101 tegn 10

Dette er linje 101:
fld.form.forskel.value = forsk + 1; //<-- skal den altid lægge en til ?-)

?
Avatar billede roenving Novice
03. juli 2003 - 22:27 #21
s'ry man ...

Det er ikke det bedste med fjerne-debugging, men vi kommer forhåbentlig igennem alligevel ,-)

Start med at ændre:

      case 9:
          if(fld.name=='firstinput'){
          fdate = new Date(newVal.substring(6),newVal.substring(3,5),newVal.substring(0,2));
          }else{
          sdate = new Date(newVal.substring(6),newVal.substring(3,5),newVal.substring(0,2));
          }
          var forsk = (fdate-sdate)/(24*60*60*1000);
          fld.form.forskel.value = forsk + 1; //<-- skal den altid lægge en til ?-)
}
--- til:

      case 9:
          if(fld.name=='firstinput'){
          fdate = new Date(newVal.substring(6),newVal.substring(3,5),newVal.substring(0,2));
          }else{
          sdate = new Date(newVal.substring(6),newVal.substring(3,5),newVal.substring(0,2));
          var forsk = (fdate-sdate)/(24*60*60*1000);
          alert(forsk+" | "+fld.form.forskel.name);
          fld.form.forskel.value = forsk + 1;
          }
}

-- den eliminerer med sikkerhed den første fejl -- og så må vi debugge den anden !o]
Avatar billede macho Praktikant
03. juli 2003 - 22:35 #22
Dette sker nu:
Efter indtastning af dato i begge felter får jeg denne script-fejl:
"Et objekt er obligatorisk"
linje 98 tegn 10

og det er jo så denne linje:
fld.form.forskel.value = forsk + 1;

Der sker stadig ikke noget i feltet "forskel"

?
Avatar billede macho Praktikant
03. juli 2003 - 22:45 #23
Der er i øvrigt sket noget andet (underligt) i f.m. indsættelse af case 9:

Det er ikke længere muligt at nulstille min formular ved hjælp af "Nulstil felter" knappen ????
Avatar billede roenving Novice
03. juli 2003 - 22:48 #24
Fik du ikke nogen alert ?-)

Gjorde du ikke, gætter jeg på, at det var linjen:

          alert(forsk+" | "+fld.form.forskel.name);

som giver fejlen, ændr den til:

          alert(forsk+" | "+fld.form.name);
Avatar billede macho Praktikant
03. juli 2003 - 22:53 #25
Nej, jeg får ingen alert - heller ikke efter jeg har ændret den til:

alert(forsk+" | "+fld.form.name);

kun samme fejl med at "Et tegn er obligatorisk"
Avatar billede roenving Novice
03. juli 2003 - 23:16 #26
-- et objekt vel ...

men så:
alert(forsk+" | "+fld.name);

-- da jeg sidst så på dit eksempel sikrede jeg mig, at der var en aktiv form -- det er vel ikke ændret ?-)
Avatar billede macho Praktikant
03. juli 2003 - 23:33 #27
Efter at have rettet til:
alert(forsk+" | "+fld.name);

får jeg nu en alert:

"  -1  |  secondinput  "
og derefter en scriptfejl:
"Et objekt er obligatorisk"
linje 100 tegn 11:

fld.form.forskel.value = forsk + 1;

  quote
  -- da jeg sidst så på dit eksempel sikrede jeg mig, at der var en aktiv form
  -- det er vel ikke ændret ?-)
  unquote

Nej, det eneste jeg har ændret er den automatiske opdatering af datoen i feltet "secondinput" i forhold til "firstinput" (secondupdate), da det gav nogle problemer, hvis man skulle rette i feltet "secondinput".

Jeg har netop uploaded en version af formularen, som den ser ud netop nu, på adressen: http://www.staal-larsen.dk/mail/contact_test2.htm

Hver "Send"-knappen eller "Nulstil"-knappen virker pt. ?
Avatar billede macho Praktikant
03. juli 2003 - 23:35 #28
Oooooooops - noget er galt - du har dælme ret. Hvordan dælen er min form-start blevet af?

Den flækker jeg lige sammen igen - sri '/¤%"=(%&/&#?()%()=#/¤()!#)
Avatar billede macho Praktikant
03. juli 2003 - 23:46 #29
Nu sker der dælme noget! Straks jeg fik formen aktiv igen bliver der skrevet i "forskel"-feltet - dog regner den lidt forkert, så jeg lavede denne linje:

var forsk = (fdate-sdate)/(24*60*60*1000);

om til dette:

var forsk = (sdate-fdate)/(24*60*60*1000);

så nu funker det simpelthen bare.
Avatar billede roenving Novice
03. juli 2003 - 23:54 #30
(((Gemmer mig straks ned under dynen ;-)))

-- gaab, jeg har nogle problemer med kilde-hentning, så jeg bruger 'anderes Methoden' som desværre ikke kan tage linjeskift med over, så alt bliver en mudderdej -- derfor har jeg ikke haft din kode gennem min egen maskine -- beklager ...
Avatar billede roenving Novice
03. juli 2003 - 23:59 #31
Ha, ha, ha, ha -- jeg skulle jo lige prøve, så nu fandt jeg ud af, der var 1121 overnatninger imellem 20/12-2003 og var det 13/4-2007 ...

Men ved lidt frem-og-tilbage på felterne overtog firstinput datoen fra secondinput OG accepterede datoer før idag ??

-- den må vi også lige have med (på en fornuftig måde) -- så er det zq lige før vi har en applikation, som kan sælges *gg*
Avatar billede roenving Novice
04. juli 2003 - 00:02 #32
-- men fra starten har jeg tænkt, at denne slags nok blev fanget ind af checket i submit-funktionen -- så meget nåede jeg ikke at checke det ud nu !-)
Avatar billede macho Praktikant
04. juli 2003 - 00:15 #33
Uuha ja, man er nok lidt hurtig til at juble! Okay, den tæller dage nu - :-) Men hvorfor dælen virker valideringen nu ikke? Siden kan heller ikke sendes til "send_email.asp" mere ??? Har du nogen forklaring på dette fænomen?
Avatar billede macho Praktikant
04. juli 2003 - 00:27 #34
Når jeg forsøger at trykke "send" på formularen, får jeg nu denne (velkendte) fejl: (bare et nyt sted)

"Et objekt var ventet"
linje 244 tegn 1

Linjen er denne:
<form method="post" name="frmEnquiry" action="send_email.asp" onSubmit="return CheckForm();">

Har det mon noget at gøre med onSubmit="return CheckForm();" da jeg jo ikke kan få en validering frem. Det er i min web-editor jeg får alle disse fejl-meldinger - i browseren bliver formularen bare ikke sendt afsted - ej heller valideret ??
Avatar billede macho Praktikant
04. juli 2003 - 00:40 #35
Nej, jeg fandt selv fejlen:

Jeg havde fået sat et tegn et forkert sted. Jeg manglede den sidste "}" i case 9:

case 9:
          if(fld.name=='firstinput'){
          fdate = new Date(newVal.substring(6),newVal.substring(3,5),newVal.substring(0,2));
          }else{
          sdate = new Date(newVal.substring(6),newVal.substring(3,5),newVal.substring(0,2));
          var forsk = (sdate-fdate)/(24*60*60*1000);
          fld.form.forskel.value = forsk + 1;
    }
}
return true;

LOL

Nu er jeg bare i et dilæmma, for hvis jeg vil samtidig vil bruge den lille pop-up kalender ved siden af dato-felterne, regner den helt galt!
Avatar billede roenving Novice
04. juli 2003 - 01:14 #36
Jamen, med den anden funktionalitet, som er lagt ind, ville jeg droppe popup-kalenderen -- vi kunne jo lægge en egentlig validering ind under case 9:

Vi har jo lavet alle grundlæggende valideringer vha. inputmasken, vi mangler sådan set kun at teste om februar godt må have 29 dage det pågældende år -- ikke den helt store udfordring -- vi skal bare gøre opmærksom på, at koden bliver irriterende kompliceret, hvis det skal bruges til datoer forbi d. 28/2/2100 *gg*
Avatar billede roenving Novice
04. juli 2003 - 01:15 #37
-- forøvrigt kan jeg normalt slet ikke bruge popup-kalenderen - min popupstopper stopper den mærkværdigvis ...
Avatar billede macho Praktikant
04. juli 2003 - 01:22 #38
Ja, jeg er også kommet til den konklusion, at jeg dropper den popup tingest. Jeg bruger jo også selv en pop-up stopper, og flere og flere gør det. Hvilket jeg sagtens kan forstå. //.^_^.\\

Det med at februar godt må have 29 dage har jeg ikke lige tænkt over, men det kunne selvfølgelig være godt at få den med.

Meeeeeeeeeen formularen skal bestemt IKKE bruges til efter 28/2/2100  ;-)
Avatar billede macho Praktikant
04. juli 2003 - 01:38 #39
Er det ikke snart på tide, at du får nogle pts. ??
Avatar billede roenving Novice
04. juli 2003 - 02:12 #40
Jeg prøver lige at kigge på det, men gør det så med en gammel udgave, det er jo kun funktionaliteten vi skal bruge *gg*

-- og points, nå ja, tja, bum, bum, jae, jeg kan vel betale huslejen og indernet-forbindelsen '-)
Avatar billede roenving Novice
04. juli 2003 - 03:35 #41
Sådan:
      case 9:
          var yyyy = parseInt(newVal.substring(6));
          if (mm == 2 && dd == 29 && yyyy%4 !=0){repeatRemove+=8;return false;}

Sådan fjerner den simpelthen tegn helt tilbage til de 29, men ved at ændre 8-tallet kan du jo regulere:

9 vil kun efterlade et 2-tal i feltet
7 vil efterlade '29/'
6 vil efterlade '29/0'

-- og jeg fandt lige en fejl ved case 4: -- det skal være sådan:

    case 4:
        mm = parseInt(newVal.substring(3),10);

-- desuden var der ikke konsekvensrettet helt to steder:
ved case 2:
      case 2:
          newVal=fld.value+"/"+String.fromCharCode(charCode)

og ved case 5:
      case 5:
          newVal=fld.value+"/"+String.fromCharCode(charCode)

De to sidste kan kun forekomme, hvis man sletter flere tegn ved at holde <Backspace> nede, men skal vel også være på plads ...
Avatar billede macho Praktikant
04. juli 2003 - 10:25 #42
Det var godt nok en smart måde at få tjekket på på datoen 29/2 - det med at den fjerner tegn tilbage til 29.


Men jeg har faktisk opdaget en lille ting: Hvis datoerne involverer et månedskifte med mindre end 31 dage, bliver der talt forkert !!! Jeg har siddet og tjekket efter med gammeldags fingerregning og enkalender. ;:(

Kan det mon rettes et sted?

Øvrige rettelser har jeg fået lavet!
Avatar billede macho Praktikant
04. juli 2003 - 11:14 #43
Lige et par eksempler på, at der regnes forkert:
Eks. 1:
Dato 1: 28/02/2004
Dato 2: 02/03/2004
Resultat: 5.958333333333333 (burde have været 4)

Eks. 2:
Dato 1: 28/04/2004
Dato 2: 10/05/2004
Resultat: 14 (burde have været 13)

Eks. 3:
Dato 1: 28/09/2004
Dato 2: 05/10/2004
Resultat: 9.041666666666666 (burde have været 8)
Avatar billede macho Praktikant
04. juli 2003 - 12:48 #44
Nu er der dælme endnu et problem med dato-felterne! Felterne accepterer ikke, hvis jeg indtaster september som dato.
Har oprettet problemet i et nyt spørgsmål:
http://www.eksperten.dk/spm/372564

/mvh
Staal
Avatar billede roenving Novice
04. juli 2003 - 13:27 #45
Again s'ry man ...

Dato-objekterne skal oprettes med månedsværdier ordentlig, hvilket de ikke er -- øjeblik
Avatar billede roenving Novice
04. juli 2003 - 13:37 #46
Sådan skulle den opføre sig ordentligt:

    case 9:
          var yyyy = parseInt(newVal.substring(6));
          if (mm == 2 && dd == 29 && yyyy%4 !=0){repeatRemove+=8;return false;}

          if(fld.name=='firstinput'){
          fdate = new Date(newVal.substring(6),parseInt(newVal.substring(3,5),10)-1,parseInt(newVal.substring(0,2),10));
          }else{
          sdate = new Date(newVal.substring(6),parseInt(newVal.substring(3,5),10)-1,parseInt(newVal.substring(0,2),10));
          var forsk = Math.round((sdate-fdate)/(24*60*60*1000));
          fld.form.forskel.value = forsk + 1;
    }
}
return true;

Den grundlæggende fejl var at den sidste algoritme ikke havde taget højde for javascripts idiosynkrasi med månedsnumre -- de er jo en mindre end månedsnummeret ...

Derudover skulle jeg lige checke hvorfor den pludselig gave ikke hele tal -- det var simpelthen pga. sommertid, så der må vi regulere for den time mere eller mindre -- nemmest med en round
Avatar billede macho Praktikant
04. juli 2003 - 15:12 #47
Som sagt i andet spørgsmål, så virker alt som det skal nu! - Many thanks, Rønving...
Avatar billede roenving Novice
04. juli 2003 - 15:33 #48
Velbekomme -- og takker også her for points ;~}
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
Vi tilbyder markedets bedste kurser inden for webudvikling

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