Avatar billede pelskee Nybegynder
02. februar 2004 - 12:54 Der er 26 kommentarer og
1 løsning

Form validation

jeg har en indkøbskurv hvor brugeren skal kunne opdatere indholdet. til hvert produkt er der knyttet 2 priser (1 stk pris og 6 stk pris) - hvordan laver jeg et form check hvor feltet der opdateres skal kunne deles med 6 hvis prisen i kurven er en 6 stk pris ?

dummy :)

If Indkoebskurv.Pris = Indkoebskurv.Pris_DKK
Then opdaterFelt skal kunne divideres med 6
alert ("tallet skal kunne divideres med 6")
Else submit form

kode:
<form name="opdater" method="POST" action="<%=MM_editAction%>"><td width="120" align="right" valign="top">
      <input name="opdater" type="text" class="fields_mini" id="opdater" value="<%=(rsIndkoebskurv.Fields.Item("Antal").Value)%>" align="right">
    <input name="Submit5" type="submit" class="buttons" value="Opdater">
    <input type="hidden" name="MM_update" value="opdater">
    <input type="hidden" name="MM_recordId" value="<%= rsIndkoebskurv.Fields.Item("IDkurv").Value %>">
</td>
    </form>
Avatar billede nute Nybegynder
02. februar 2004 - 13:12 #1
du skal bruge modulus (%) operatoren

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

<html>
<head>
    <title>Untitled</title>
    <script language="JavaScript" type="text/javascript">
    <!--
    function validate()
    {
        var objField = document.getElementById( "txt" );
        if( objField.value % 6 != 0 )
        {
            alert( "tallet skal kunne divideres med 6" );
            return false;
        }
        return true;
    }
    //-->
    </script>
</head>

<body>
<form id="frm" onsubmit="return validate()">
<input type="text" id="txt"><br>
<input type="submit">
</form>
</body>
</html>

/nute
Avatar billede pelskee Nybegynder
02. februar 2004 - 13:19 #2
hvad gør denne ?: var objField = document.getElementById( "txt" );
ved ikke hvad jeg skal angive i txt feltet

jeg skal teste om den 'Pris' der er angivet for den pågælende record er den samme som 'Pris_DKK_v6' fra rsIndkoebskurv. hvis den er det skal tallet kunne divideres med 6
Avatar billede nute Nybegynder
02. februar 2004 - 13:33 #3
var objField = document.getElementById( "txt" );

denne linje hiver fat i det form element på siden. Dette form element hedder 'txt'. hvis du skal have fat i et andet form element, så skal du bare angive id'et til dette felt istedet for 'txt'

Du skriver: "jeg skal teste om den 'Pris' der er angivet for den pågælende record er den samme som 'Pris_DKK_v6' fra rsIndkoebskurv. hvis den er det skal tallet kunne divideres med 6". når jeg kigger på den kode du har postet, så er det ikke noget af det du skriver der står i stil med koden. kan du ikke poste en record fra den færdige HTML istedenfor noget ASP kode ?

/nute
Avatar billede pelskee Nybegynder
02. februar 2004 - 13:37 #4
recordset:
<%
Dim rsIndkoebskurv__MMColParam
rsIndkoebskurv__MMColParam = Session.SessionID
%>
<%
Dim rsIndkoebskurv
Dim rsIndkoebskurv_numRows

Set rsIndkoebskurv = Server.CreateObject("ADODB.Recordset")
rsIndkoebskurv.ActiveConnection = MM_scandlines_STRING
rsIndkoebskurv.Source = "SELECT *  FROM Indkoebskurv, Vin  WHERE SessionID = " + Replace(rsIndkoebskurv__MMColParam, "'", "''") + " AND VinID = IDvin  GROUP BY Pris, Overskrift ORDER BY Overskrift ASC"
rsIndkoebskurv.CursorType = 0
rsIndkoebskurv.CursorLocation = 2
rsIndkoebskurv.LockType = 1
rsIndkoebskurv.Open()

rsIndkoebskurv_numRows = 0
%>

i dette recordset er der er felt der hedder Pris og et der hedder Pris_DKK_v6
Avatar billede pelskee Nybegynder
02. februar 2004 - 13:47 #5
rsIndkoebskurv.Fields.Item("Pris").Value = rsIndkoebskurv.Fields.Item("Pris_DKK_v6").Value
Avatar billede nute Nybegynder
02. februar 2004 - 13:52 #6
jeg spurgte om noget HTML kode ... ikke ASP kode ;-)

hvordan ser en linje fra din færdig udskrevne HTML tabel ud ? Der hvor brugeren kan taste ind ny pris
Avatar billede pelskee Nybegynder
02. februar 2004 - 13:56 #7
det er nyt antal han kan taste, men koden er her :)


<td height="20"><%=(rsIndkoebskurv.Fields.Item("Overskrift").Value)%> (<%=(rsIndkoebskurv.Fields.Item("Land").Value)%>) </td>
    <script language="JavaScript" type="text/javascript">
    <!--
    function validate()
    {
        var objField = document.getElementById( "opdaterField" );
        if( objField.value % 6 != 0 )
        {
            alert( "tallet skal kunne divideres med 6" );
            return false;
        }
        return true;
    }
    //-->
    </script>
    <form name="opdater" method="POST" action="<%=MM_editAction%>" onsubmit="return validate()">
      <td width="120" align="right" valign="top">
        <input name="opdaterField" type="text" class="fields_mini" id="opdaterField" value="<%=(rsIndkoebskurv.Fields.Item("Antal").Value)%>" align="right">
        <input name="Submit5" type="submit" class="buttons" value="Opdater">
        <input type="hidden" name="MM_update" value="opdater">
        <input type="hidden" name="MM_recordId" value="<%= rsIndkoebskurv.Fields.Item("IDkurv").Value %>">
      </td>
    </form>
    <td align="right"><div align="right"><%=FormatNumber(CDbl(Replace(rsIndkoebskurv("Pris"),",",".")),2)%></div></td>
    <td align="right"><%=FormatNumber((Replace(rsIndkoebskurv("Pris"),",","."))*(rsIndkoebskurv.Fields.Item("Antal").Value),2)%></td>
    <form action="<%=MM_editAction%>" method="POST" name="slet" id="slet">
      <td>&nbsp;&nbsp;
          <input name="Submit4" type="submit" class="buttons" value="Slet">
          <input type="hidden" name="MM_delete" value="slet">
          <input type="hidden" name="MM_recordId" value="<%= rsIndkoebskurv.Fields.Item("IDkurv").Value %>">
      </td>
Avatar billede pelskee Nybegynder
02. februar 2004 - 14:12 #8
er det til at overskue ?
Avatar billede nute Nybegynder
02. februar 2004 - 14:25 #9
Hmm ... jeg tror jeg ville have gjort det på en anden måde. som jeg har forstået det, så skal du lade brugeren kunne angive enten 1 eller 6 i feltet 'opdaterField', men såvidt jeg kan se, så kan ikke brugeren ændre prisen på varen. Jeg ville have gjort det på den måde at *jeg* bestemmer hvad brugeren kan få lov til at angive ... på den måde bliver brugervenligheden større. Jeg ville have gjort det på den måde at 'opdaterField' er en 'select' box, med værdierne 1 og 6... MEN ... værdien 6 bliver kun akrevet ud *hvis* værdien i 'Pris_DKK_v6' er delelig med 6 - u c ? Dit formular ser dermed sådan ud:

<td width="120" align="right" valign="top">
    <select name="opdaterField">
        <option value="1">1</option>
        <%
        if( CInt( rsIndkoebskurv.Fields.Item("Pris_DKK_v6").Value ) % 6 = 0 ) then
            Response.Write( "<option value=""6"">6</option>" )
        end if
        %>
    </select>
      <input name="Submit5" type="submit" class="buttons" value="Opdater">
      <input type="hidden" name="MM_update" value="opdater">
      <input type="hidden" name="MM_recordId" value="<%= rsIndkoebskurv.Fields.Item("IDkurv").Value %>">
</td>

Alternativt er du nødt til at skrive ud værdien i 'Pris_DKK_v6' til et hidden field som du så tjekker op mod:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

<html>
<head>
    <title>Untitled</title>
    <script language="JavaScript" type="text/javascript">
    <!--
    function validate( objForm )
    {
        if( objForm.opdaterField.value % 6 == 0 )
        {
            if( objForm.MM_pris_dkk_v6.value % 6 != 0 )
            {
                alert( "Tallet skal kunne deles med 6" );
            }
        }
    }
    //-->
    </script>
</head>
<body>
    <form name="opdater" method="POST" action="<%=MM_editAction%>" onsubmit="return validate( this )">
      <td width="120" align="right" valign="top">
        <input name="opdaterField" type="text" class="fields_mini" id="opdaterField" value="<%=(rsIndkoebskurv.Fields.Item("Antal").Value)%>" align="right">
        <input name="Submit5" type="submit" class="buttons" value="Opdater">
        <input type="hidden" name="MM_update" value="opdater">
        <input type="hidden" name="MM_recordId" value="<%= rsIndkoebskurv.Fields.Item("IDkurv").Value %>">
        <input type="hidden" name="MM_pris_dkk_v6" value="<%= rsIndkoebskurv.Fields.Item("Pris_DKK_v6").Value %>">
      </td>
    </form>
</body>
</html>

Personlig ville jeg have foretrukket løsningsforslag nummer 1)

/nute
Avatar billede pelskee Nybegynder
02. februar 2004 - 14:37 #10
jeg er nødt til at gøre det som løsning 2 - for de skal kunne indaste 4 hvis det er 1 stk prisen og 18 hvis det er 6 stk prisen. min kode ser sådan ud, men det virker ikke:

<script language="JavaScript" type="text/javascript">
    <!--
    function validate( objForm )
    {
        if( objForm.opdaterField.value % 6 == 0 )
        {
            if( objForm.MM_pris_dkk_v6.value % 6 != 0 )
            {
                alert( "Tallet skal kunne deles med 6" );
            }
        }
    }
    //-->
    </script>
    <form name="opdater" method="POST" action="<%=MM_editAction%>" onsubmit="return validate(this)">
      <td width="120" align="right" valign="top">
        <input name="opdaterField" type="text" class="fields_mini" id="opdaterField" value="<%=(rsIndkoebskurv.Fields.Item("Antal").Value)%>" align="right">
        <input name="Submit5" type="submit" class="buttons" value="Opdater">
        <input type="hidden" name="MM_update" value="opdater">
        <input name="MM_pris_dkk_v6" type="hidden" id="MM_pris_dkk_v6" value="<%=(rsIndkoebskurv.Fields.Item("Pris_DKK_v6").Value)%>">
        <input type="hidden" name="MM_recordId" value="<%= rsIndkoebskurv.Fields.Item("IDkurv").Value %>">
      </td>
    </form>
Avatar billede nute Nybegynder
02. februar 2004 - 14:44 #11
"virker ikke" ?? hvad betyder det ? at den ikke gør noget fornuftig ? at din maskine rebooter ? at der ikke sker nogen ting ?

/nute
Avatar billede pelskee Nybegynder
02. februar 2004 - 14:46 #12
http://border-wines.dk.virker.nu/sortiment.asp - den siger ingen ting
prøv og ligge nogle varer i kurven og så gå til dette link: http://border-wines.dk.virker.nu/indkoebskurv_oversigt1.asp
Avatar billede nute Nybegynder
02. februar 2004 - 14:56 #13
hmm ... måske jeg har misforstået.

for det første, så må jeg sige at det ikke ser ud til at være kodet særlig smart :-| no offence, men hvorfor skriver du ud javascriptet i hver eneste iteration i din loop??.

Anyway ... har jeg ret i at du skal *kun* tjekke for om antallet er deleligt med 6 hvis der er angivet en pris i 'Pris_DKK_v6' ??

/nute
Avatar billede pelskee Nybegynder
02. februar 2004 - 14:59 #14
kodningen - det har du ret i, jeg er en kegle.
skal jeg tage javascriptet længere ud af koden

ja - det har du ret i:
hvis rsIndkoebskurv.Fields.Item("Pris").Value = rsIndkoebskurv.Fields.Item("Pris_DKK_v6").Value så skal den checke om det er deleligt med 6
Avatar billede nute Nybegynder
02. februar 2004 - 15:26 #15
function validate( objForm )
{
    if( objForm.MM_pris_dkk_v6.value != "0" && objForm.MM_pris_dkk_v6.value % 6 == 0 )
    {
        if( objForm.opdaterField.value % 6 != 0 )
        {
            alert( "Tallet skal kunne deles med 6" );
                        return false;
        }
    }
        return true;
}

Javascriptet sætter du ind helt i toppen af din side. det er ikke noget point i at du inkluderer det mere end én gang.

denne stump kode gør følgende:

*hvis* der er angivet en værdi i 'Pris_DKK_v6', så tjekker den om værdien i 'Pris_DKK_v6' er delelig med 6. hvis værdien er delelig med 6, så tjekkes der på værdien der er skrevet ind i 'antal' feltet. hvis denne værdi ikke er delelig med 6, så kommer der en alert.

hvis det ikke er dette du skal have, så må du forklare dig bedre. dette er et *meget* simpelt "problem", men med dårlige forklaringer, så er det nærmest umuligt at forstå. du skal huske på at jeg overhovedet ikke kender dit system eller hvad det er du prøver på. nogle gange kan det være smart at prøve at formulere sig "udenfor" sit egentlige problemområde ... prøve at formulere sig på en mere generel måde der ikke relaterer sig til dit faktiske problem... fx sådan:

jeg har et problem med noget validering af nogle felter. min bruger skal få lov til at taste ind et tal i en textbox. denne værdi skal jeg tjekke op mod en anden værdi, på den måde at hvis denne anden værdi er sådan og sådan, så skal den indtastede værdi kunne deles med 6 og blablabla ... eller bla bla bla

/nute
Avatar billede pelskee Nybegynder
02. februar 2004 - 15:46 #16
undskyld nute

brugeren ligger produkter i kurven, jeg gemmer pris på produktet og antallet der ligges i kurven. i oversigten skal brugeren kunne opdatere antallet. bestiller brugeren 6 stk af produktet får de det til en billigere pris, men i oversigten skal de derfor også kun have mulighed for at hæve eller sænke antallet med en værdi der kan deles med 6. i mit recordset trækker jeg både indkobskurv og vin tabellen ud. der er i alt 3 priser i de to tabeller. i vin tabellen hvor produkterne oprettes er der Pris_DKK og Pris_DKK_v6 og i indkobskurv tabellen er der Pris. alt efter om brugeren køber 1 eller 6 flasker lagrer jeg den pågældende pris i 'Pris' kolonnen.

når brugeren så skal kunne opdatere indholdet i kurven så skal han for de produkter hvor Pris = Pris_DKK_v6 kun kunne opdatere med et antal der kan deles med 6

er det til at forstå ... jeg synes det er svært at forklare så det giver mening - håber dette hjælper
Avatar billede nute Nybegynder
02. februar 2004 - 15:57 #17
det var meget nemmere at forstå.

Men ... vil det så sige at jeg ikke kan få købe 7 flasker vin af en flaske der er tilbud på, ved køb af 6 stk?

hvis fx. en flaske koster 69 kr ved køb af 1, men 59 kr ved køb af 6. hvis jeg ønsker 8 af denne, så ville det vel være normalt at skulle betale:

(6*59) + (2*69) kr ?

er dette korrekt ?

/nute
Avatar billede pelskee Nybegynder
02. februar 2004 - 16:28 #18
:) - nogen gange ved jeg bare ikke om jeg så forklarer for meget og skræmmer jer væk

ja - ved køb af 6 stk kan du kun købe et antal der kan deles med 6.

beregning er helt præcis/perfekt.
Avatar billede nute Nybegynder
02. februar 2004 - 16:45 #19
man skræmmer væk hvis man *ikke* forklarer sig godt nok ;-)

"ja - ved køb af 6 stk kan du kun købe et antal der kan deles med 6.
beregning er helt præcis/perfekt."

hvis min beregning er korrekt, så ville jeg overhovedet ikke tænkt over at tjekke for om "antal" kan deles med 6 eller ikke, så ville jeg hellere have foretaget beregningen på ASP siden når siden bliver postet.

hvis dette er din asp side der modtager formularet:

antal = Request("opdaterField")
prisv6 = Request( "Pris_DKK_v6" )
pris  = Request( "Pris" )

nyPris = 0
if( prisv6 <> "" ) then
    rest = CInt(antal) mod 6
    antalv6 = ( ( Cint(antal) - rest ) )
    nyPris = (antalv6*prisv6) + (rest*pris)
else
    nyPris = antal*CInt( pris )
end if
%>

derefter har du den prisen der skal betales i variabelen 'nyPris'

/nute
nyPris =
Avatar billede pelskee Nybegynder
02. februar 2004 - 19:42 #20
ja - den havde jeg også tænkt på - men jeg tror bare ikke det giver mening for brugeren. med den løsning synes jeg ikke det er gennemskueligt hvad han betaler hvornår - altså hvornår han får den billige pris og hvornår han får den dyre...

hvad synes du om det ?
Avatar billede nute Nybegynder
02. februar 2004 - 19:59 #21
spørgsmålet er hellere:

er udregningen forkert eller korrekt ?

hvis brugeren køber 19 flasker af en vin der koster 69,- pr styk og 59,- ved køb af 6, skal han så betale:

(18*59) + (1*69) = 1131,-

eller skal han betale

19*69 = 1311,-

eller skal han få rabat på alle flasker

19*59 = 1121,-

??

Hvis den første udregning er korrekt, så skal man jo bare oplyse på sitet at ved køb af hver 6. flaske, så gives der rabat.

/nute
Avatar billede pelskee Nybegynder
02. februar 2004 - 22:16 #22
den første udregning er korrekt - men vi kan ikke oplyse at der gives rabat ved 6 flasker. for det er kun nogen af flaskerne der gives rabat på.

hvis brugeren har købt en vin til 6 flaskers prisen skal han kun have lov til at ændre antaller med noget der kan divideres med 6

hvis han har købt 8 flasker af en vin hvor der ikke er en 6 flaskers pris så skal han have lov til at ændre antallet som ham vil

smutter i seng - så SuperBowl i går og fik næsten ingen søvn. skriver igen i morgen

TAK for al hjælpen indtil videre :)
Avatar billede nute Nybegynder
02. februar 2004 - 22:34 #23
oki ... så skal du lave et hidden field til "pris" og bruge dette felt til at beregne på

<form name="opdater" method="POST" action="<%=MM_editAction%>" onsubmit="return validate(this)">
      <td width="120" align="right" valign="top">
        <input name="opdaterField" type="text" class="fields_mini" id="opdaterField" value="<%=(rsIndkoebskurv.Fields.Item("Antal").Value)%>" align="right">
        <input name="Submit5" type="submit" class="buttons" value="Opdater">
        <input type="hidden" name="MM_update" value="opdater">
        <input name="MM_pris_dkk_v6" type="hidden" id="MM_pris_dkk_v6" value="<%=(rsIndkoebskurv.Fields.Item("Pris_DKK_v6").Value)%>">
<input name="MM_pris" type="hidden" id="MM_pris" value="<%=(rsIndkoebskurv.Fields.Item("Pris").Value)%>">
        <input type="hidden" name="MM_recordId" value="<%= rsIndkoebskurv.Fields.Item("IDkurv").Value %>">
      </td>
    </form>

og javascriptet:

function validate( objForm )
{
    if( objForm.MM_pris.value == objForm.MM_pris_dkk_v6.value )
    {
        if( objForm.opdaterField.value % 6 != 0 )
        {
            alert( "Tallet skal kunne deles med 6" );
            return false;
        }
    }
    return true;
}

/nute
Avatar billede pelskee Nybegynder
03. februar 2004 - 08:51 #24
u the man nute . det virker :)

tak

hvis jeg nu skal lave en længere bedsked til brugeren. hvordan indsætter jeg så linieskrift i "Tallet skal kunne deles med 6"
har prøvet med </p> </br> </n>
Avatar billede nute Nybegynder
03. februar 2004 - 09:34 #25
det var da godt at høre :-)

for at få linjeskift i en alert, skal du bruge "\n". hvis du vil ha en tabulator, skal du bruge "\n"

alert( "Denne linje indeholder\net linjeskift.\n\tDenne linje er rykket ind");

/nute
Avatar billede pelskee Nybegynder
03. februar 2004 - 09:35 #26
thanks m8te
Avatar billede nute Nybegynder
03. februar 2004 - 09:38 #27
anytime :-)
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
Kurser inden for grundlæggende programmering

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