Form (data) validering i beans!
Hvorfor bliver mine data ikke valideret korrekt??"Kort" går mit problem ud på at jeg har en formular side hvor der skal indtastes en hel del data (firma- og kontaktperson-data), men disse data bliver via en FrontControlServlet (screen-flow-manager) lagt ned i to forskellige bønner med hver sin valideringsmetode som kaldes fra "FCServletten". Problemet er at jeg rent faktisk kan indtaste noget sludder i felterne og derefter få præsenteret en jsp-side(success) - hvilket jeg jo ikke ønsker. Selve flowet og de sider brugeren præsenteres for
bestemmes på et gemt inputsfelts værdi som "FCServletten" tjekker på.
Jeg har vedlagt det meste kode i det efterfølgende og det skal lige nævnes at atl kompilere som det skal og resin-serveren melder ikke nogle fejl.
FrontControlServlet (screen-flow-manager):
/********************************************************
*@author MN
*
*Formål:
*Denne servlet har til formål at modtage alle request samt uddelegere ansvaret for
*de forskellige opgaver
*
*Beskrivelse:
*Ethver JSP eller HTML side der forespørger denne servlet vil blive håndteret vha.
*et skjult action felt på den spørgende side. Dette action felts værdi tjekkes så
*der kan forewardes til den rigtige side.
**********************************************************/
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
import Portalen_Nylle_Classes.FormBeanOpretKontaktPersonVirk;
import Portalen_Nylle_Classes.FormBeanOpretVirksomhed;
import Portalen_Nylle_Classes.DBConnFirmaBean;
public class FrontControlServlet extends HttpServlet
{
//Denne metode kaldes når Servletten hentes første gang
public void init(ServletConfig conf) throws ServletException
{
//Kald til superklassens init metode
super.init(conf);
}
// Denne metode kaldes for at håndtere alle HTTP GET Requests
protected void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException
{
// Opret et context objekt sc med oplysninger om webserver m.m.;
ServletContext sc = getServletContext();
RequestDispatcher rd;
String action = req.getParameter("action");
HttpSession session = req.getSession(true);
//Det første tjek der udføres fra URL'en; http://localhost:8080/servlet/FrontControlServlet
if (action==null || action.equals(""))
{
rd = sc.getRequestDispatcher("/Metnet Portal/Portalen_Nylle/Index.jsp");
rd.forward(req, res);
}
//Hvis brugeren kommer fra enten OpretForm1.htm eller OpretForm1_Retry siden udføres
//kodeblokken i if-sætningen
else if (action.equals("opret1"))
{
//Opretter et beanobjekt hvor vi ønsker at sætte alle attributterne for firma
FormBeanOpretVirksomhed fbov = new FormBeanOpretVirksomhed();
//Mapper alle parameterne fra requested til firma-bønnens attributterne
fbov.setFirmaNavn(req.getParameter("firmaNavn"));
fbov.setAdresse(req.getParameter("adresse"));
fbov.setPostNr(req.getParameter("postNr"));
fbov.setCity(req.getParameter("by"));
fbov.setTelefonNr(req.getParameter("telefonNr"));
fbov.setFaxNr (req.getParameter("faxNr"));
fbov.setPostBox(req.getParameter("postBox"));
fbov.setEmail(req.getParameter("email"));
fbov.setWebAdresse (req.getParameter ("webAdresse"));
fbov.setSeNr (req.getParameter ("seNr"));
fbov.setKvalitetsCertificering (req.getParameter ("kvalitetsCertificering"));
fbov.setBrugerNavn(req.getParameter("brugerNavn"));
fbov.setPassword1(req.getParameter("password1"));
fbov.setPassword2(req.getParameter("password2"));
//Opretter et beanobjekt hvor vi ønsker at sætte alle attributterne for en kontaktpersonen
FormBeanOpretKontaktPersonVirk fbokpv = new FormBeanOpretKontaktPersonVirk();
//Mapper alle parameterne fra requested til firma-bønnens attributter
fbokpv.setForNavn(req.getParameter("forNavn"));
fbokpv.setEfterNavn(req.getParameter("efterNavn"));
fbokpv.setTelefonNr(req.getParameter("telefonNr_kp"));
fbokpv.setMobilNr(req.getParameter("mobilNr_kp"));
fbokpv.setEmail(req.getParameter("email_kp"));
fbokpv.setFaxNr(req.getParameter("faxNr_kp"));
//I session-scopet sættes eller tilknyttes bønnen "fbov" et navn, nemlig f_beanObj og
//bønnen fbokpv får navnet kpv_beanObj
session.setAttribute("f_beanObj", fbov);
session.setAttribute("kpv_beanObj", fbokpv);
req.setAttribute("action", "opretvirksomhed");
/*Hvis metoderne validate i de to bønner returnerer true vil brugeren få
vist en jsp-side (OpretForm1_Success) med de data hun har oprettet.
Inden siden vises vil de validerede data dog blive lagt ned i en database*/
if (fbov.validate() && fbokpv.validate())
{
//try
//{
//Her oprettes en bønne. Derefter kaldes en metode i denne bønne som modtager en anden bønne
//DBConnFirmaBean dbfb = new DBConnFirmaBean();
//dbfb.insertKontaktPersonVirk(fbokpv);
//dbfb.insertFirma(fbov);
//}
//catch (Exception e)
//{
// System.err.println("Ingen kontakt til databasen");
//}
//Brugeren har indtastet de nødvendige data på formularen
rd = sc.getRequestDispatcher("/Metnet Portal/Portalen_Nylle/OpretForm1_Success.jsp");
rd.forward (req, res);
}
//Brugeren mangler at indtaste noget i mindst et af de påkrævede felter.
else
{
rd = sc.getRequestDispatcher("/Metnet Portal/Portalen_Nylle/OpretForm1_Retry.jsp");
rd.forward (req, res);
}
}
}
}
OpretForm1_Retry:-----Der findes også en statisk html-side med oprettelsesformen som kaldes først!!!
***********************************************************
<%--
Formål:
Jsp sidens formål er at fortælle brugeren at der er indtastet ugyldig data på
registreringsformularen
Beskrivelse:
Hvis en bruger har tastet ugyldig data ind på formularen benytter vi en af de to eller
begge bønner til at fortælle hvor på formularen det er gået galt.
Dette gøres ved at benytte de to bønners get-metoder.
--%>
<%@ page import="Portalen_Nylle_Classes.*" contentType="text/html; charset=ISO-8859-1" session="true" %>
<%
//For at benytte de to valideringsbønner som frontkontrolservletten har oprettet
//er vi nødt til at typecaste bønnerne så de kan benyttes fra denne JSP side - samtidigt
//sætter vi disse bønners scope (levetid) til at vare en hel bruger session
FormBeanOpretVirksomhed fbov =
(FormBeanOpretVirksomhed) session.getAttribute("f_beanObj");
FormBeanOpretKontaktPersonVirk fbokpv =
(FormBeanOpretKontaktPersonVirk) session.getAttribute("kpv_beanObj");
%>
<html>
<head><title>Opret Firmadata_RETRY siden</title>
<link rel="stylesheet" type="text/css" href="../Portalen_Nylle/css/StyleSheets_Metnet.css"/>
<style type="text/css">
.opretfirmadataRetry
{
font-family: Tahoma, Arial, Helvetica, sans-serif;
font-size: 11px;
color: black;
font-weight: bold;
}
sup
{
font-size: 12px;
color:red
}
font
{
font-family: Tahoma;
}
</style>
</head>
<body>
<form name= opretFirmaData_RETRY action= "/servlet/FrontControlServlet" method="get">
<table border=0 cellSpacing=1 cellPadding=4 align=center valign=top width=600 bgColor=#cad2e3>
<thead>
<th colspan=4>
<font size=4> Firma Registrering</font>
<br>
<font size=1 color=black><sup>*</sup> Påkrævet Felter</font>
<br>
</th>
</thead>
<!--****************************FIRMADATA*******************************************-->
<tbody>
<tr valign=top>
<td class="opretfirmadataRetry" colspan=4 bgColor=#004080>
<font color=white>
Firmadata:
</font>
</td>
</tr>
<tr>
<td width=135 class= "opretfirmadataRetry" valign=middel>
<label for="firmaNavn"> Firmanavn<sup>*</sup></label>
</td>
<td>
<input type="text" name="firmaNavn" id="firmaNavn" value='<%=fbov.getFirmaNavn()%>' size=30 maxlength=50 valign=top>
<font size=1 color=red><%=fbov.getErrorMsg("firmaNavn")%></font>
</td>
<td width=135 class="opretfirmadataRetry" valign=middel>
<label for="email"> Email<sup>*</sup></label>
</td>
<td>
<input type="text" name="email" id="email" value='<%=fbov.getEmail()%>' size=30 maxlength=60 valign=top>
<font size=1 color=red><%=fbov.getErrorMsg("email")%></font>
</td>
</tr>
<tr>
<td width=135 class="opretfirmadataRetry" valign=middel>
<label for="adresse"> Adresse<sup>*</sup></label>
</td>
<td>
<input type="text" name="adresse" id="adresse" value='<%=fbov.getAdresse()%>' size=30 maxlength=80 valign=top>
<font size=1 color=red><%=fbov.getErrorMsg("adresse")%></font>
</td>
<td width=135 class="opretfirmadataRetry" valign=middel>
<label for="webAdresse"> Web-adresse</label>
</td>
<td valign=top>
<input type="text" name="webAdresse" id="webAdresse" value='<%=fbov.getWebAdresse()%>' size=30 maxlength=100 valign=top>
<font size=1 color=red><%=fbov.getErrorMsg("webAdresse")%></font>
</td>
</tr>
<tr>
<td width=135 class="opretfirmadataRetry" valign=middel>
<label for="postNr"> Postnr.<sup>*</sup></label>
</td>
<td>
<input type="text" name="postNr" id="postNr" value='<%=fbov.getPostNr()%>' size=30 maxlength=4 valign=top>
<font size=1 color=red><%=fbov.getErrorMsg("postNr")%></font>
</td>
<td width=135 class="opretfirmadataRetry" valign=middel>
<label for="seNr"> SEnr.</label>
</td>
<td valign=top>
<input type="text" name="seNr" id="seNr" value='<%=fbov.getSeNr()%>' size=30 maxlength=30 valign=top>
<font size=1 color=red><%=fbov.getErrorMsg("seNr")%></font>
</td>
</tr>
<tr>
<td width=135 class="opretfirmadataRetry" valign=middel>
<label for="by"> By<sup>*</sup></label>
</td>
<td>
<input type="text" name="by" id="by" value='<%=fbov.getCity()%>' size=30 maxlength=30 valign=top>
<font size=1 color=red><%=fbov.getErrorMsg("city")%></font>
</td>
<td width=135 class="opretfirmadataRetry" valign=middel>
<label for="kvalitetsCertificering"> Kvalitetscertificering</label>
</td>
<td>
<input type="text" name="kvalitetsCertificering" id="kvalitetsCertificering" value='<%=fbov.getKvalitetsCertificering()%>' size=30 maxlength=30 valign=top>
<font size=1 color=red><%=fbov.getErrorMsg("kvalitetsCertificering")%></font>
</td>
</tr>
<tr>
<td width=135 class="opretfirmadataRetry" valign=middel>
<label for="telefonNr"> Telefonnr<sup>*</sup></label>
</td>
<td>
<input type="text" name="telefonNr" id="telefonNr" value='<%=fbov.getTelefonNr()%>' size=30 maxlength=20 valign=top>
<font size=1 color=red><%=fbov.getErrorMsg("telefonNr")%></font>
</td>
<td width=135 class="opretfirmadataRetry" valign=middel>
<label for="brugerNavn"> Brugernavn<sup>*</sup></label>
</td>
<td>
<input type="text" name="brugerNavn" id="brugerNavn" value='<%=fbov.getBrugerNavn()%>' size=30 maxlength=30 valign=top>
<font size=1 color=red><%=fbov.getErrorMsg("brugerNavn")%></font>
</td>
</tr>
<tr>
<td width=135 class="opretfirmadataRetry" valign=middel>
<label for="faxNr"> Faxnr.</label>
</td>
<td>
<input type="text" name="faxNr" id="faxNr" value='<%=fbov.getFaxNr()%>' size=30 maxlength=20 valign=top>
<font size=1 color=red><%=fbov.getErrorMsg("faxNr")%></font>
</td>
<td width=135 class="opretfirmadataRetry" valign=middel>
<label for="password1"> Password<sup>*</sup></label>
</td>
<td>
<input type="text" name="password1" id="password1" value='<%=fbov.getPassword1()%>' size=30 maxlength=30 valign=top>
<font size=1 color=red><%=fbov.getErrorMsg("password1")%></font>
</td>
</tr>
<tr>
<td width=135 class="opretfirmadataRetry" valign=middel>
<label for="postBox"> PostBox </label>
</td>
<td>
<input type="text" name="postBox" id="postBox" value='<%=fbov.getPostBox()%>' size=30 maxlength=30 valign=top>
<font size=1 color=red><%=fbov.getErrorMsg("postBox")%></font>
</td>
<td width=135 class="opretfirmadataRetry" valign=middel>
<label for="password2"> Gentag Password<sup>*</sup> </label>
<br>
<td>
<input type="text" name="password2" id="password2" value='<%=fbov.getPassword2()%>' size=30 maxlength=30 valign=top>
<font size=1 color=red><%=fbov.getErrorMsg("password2")%></font>
</td>
</tr>
<!--****************************KONTAKTPERSON*******************************************-->
<tr>
<td class="opretfirmadataRetry" colspan=4 bgColor=#004080>
<font color=white>
Kontaktperson:
</font>
</td>
</tr>
<tr>
<td width=135 class="opretfirmadataRetry" valign=middel>
<label for="forNavn"> Fornavn<sup>*</sup></label>
</td>
<td>
<input type="text" name="forNavn" id="forNavn" value='<%=fbokpv.getForNavn()%>' size=30 maxlength=50 valign=top>
<font size=1 color=red><%=fbokpv.getErrorMsg("forNavn")%></font>
</td>
<td width=135 class="opretfirmadataRetry" valign=middel>
<label for="telefonNr_kp"> Telefonnr.</label>
</td>
<td>
<input type="text" name="telefonNr_kp" id="telefonNr_kp" value='<%=fbokpv.getTelefonNr()%>' size=30 maxlength=20 valign=top>
<font size=1 color=red><%=fbokpv.getErrorMsg("telefonNr")%></font>
</td>
</tr>
<tr>
<td width=135 class="opretfirmadataRetry" valign=middel>
<label for="efterNavn"> Efternavn<sup>*</sup></label>
</td>
<td>
<input type="text" name="efterNavn" id="efterNavn" value='<%=fbokpv.getEfterNavn()%>' size=30 maxlength=50 valign=top>
<font size=1 color=red><%=fbokpv.getErrorMsg("efterNavn")%></font>
</td>
<td width=135 class="opretfirmadataRetry" valign=middel>
<label for="mobilNr_kp"> Mobilnr.</label>
</td>
<td>
<input type="text" name="mobilNr_kp" id="mobilNr_kp" value='<%=fbokpv.getMobilNr()%>' size=30 maxlength=20 valign=top>
<font size=1 color=red><%=fbokpv.getErrorMsg("mobilNr")%></font>
</td>
</tr>
<tr>
<td width=135 class="opretfirmadataRetry" valign=middel>
<label for="email_kp"> Email</label>
</td>
<td>
<input type="text" name="email_kp" id="email_kp" value='<%=fbokpv.getEmail()%>' size=30 maxlength=60 valign=top>
<font size=1 color=red><%=fbokpv.getErrorMsg("email")%></font>
</td>
<td width=135 class="opretfirmadataRetry" valign=middel>
<label for="faxNr_kp"> Faxnr.</label>
</td>
<td>
<input type="text" name="faxNr_kp" id="faxNr_kp" value='<%=fbokpv.getFaxNr()%>' size=30 maxlength=20 valign=top>
<font size=1 color=red><%=fbokpv.getErrorMsg("faxNr")%></font>
</td>
</tr>
</tbody>
<tfoot>
<tr>
<td colspan=4 align=center>
<input type="HIDDEN" name="action" value="opret1">
<input type="submit" value="Opret">
<input type="reset" value="Reset">
</td>
</tr>
</tfoot>
</table>
</form>
</body>
</html>
FormBeanOpretVirksomhed.java:
/**********************************************************
*@author MN
*
*Formål:
*Bønnens formål er at sætte alle attributter for en virksomhed der findes på
*oprettelses siden (OpretForm1.htm) samtidigt med at disse bliver valideret
*
*Beskrivelse:
*FrontControlServletten som modtager alle parameterne fra oprettelses siden
*sætter eller kalder samtidigt alle bønnens set-metoder for disse parametre.
*FrontControlServletten kalder derefter valideringsmetoden i denne bønne som
*tjekker og de modtagne parametre er valide - er dette ikke tilfældet oprettes
*der en tabel (HashTable errors) med notifikation om at brugeren skal udfylde
*feltet med korrekt data.
*
**********************************************************/
package Portalen_Nylle_Classes;
import java.util.*;
public class FormBeanOpretVirksomhed
{
private String firmaNavn;
private String adresse;
private String postNr;
private String city;
private String telefonNr;
private String faxNr;
private String postBox;
private String email;
private String webAdresse;
private String seNr;
private String kvalitetsCertificering;
private String brugerNavn;
private String password1;
private String password2;
private Hashtable errors;
//Tom Konstruktør - en bønnes kon.. skal altid være tom
public FormBeanOpretVirksomhed()
{
firmaNavn="";
adresse="";
postNr=null;
city="";
telefonNr=null;
faxNr=null;
postBox="";
email="";
webAdresse="";
seNr=null;
kvalitetsCertificering="";
brugerNavn="";
password1="";
password2="";
errors = new Hashtable();
}
//Valider data metoden kaldes fra FrontControlServletten. Metoden tester om
//der er tastet valid data ind i de påkrævede felter på registreringssiden OpretForm1.htm
//eller OpretForm1_Retry.jsp siden.
public boolean validate()
{
boolean allOk=true;
//Firmanavn påkrævet
if (firmaNavn == null || firmaNavn.equals(""))
{
errors.put("firmaNavn","Tilføj firmanavn");
firmaNavn="";
allOk=false;
}
//Adresse påkrævet
if (adresse == null || adresse.equals(""))
{
errors.put("adresse","Tilføj firmaadresse");
adresse="";
allOk=false;
}
//Postnr opkrævet
if (postNr == null || postNr.length() !=4)
{
errors.put("postNr","Tilføj Postnr.");
postNr="";
allOk=false;
}
else
{
try
{
int x = Integer.parseInt(postNr);
}
catch (NumberFormatException e)
{
errors.put("postNr","Tilføj et gyldigt Postnr.");
postNr="";
allOk=false;
}
}
//By påkrævet
if (city == null || city.equals(""))
{
errors.put ("city", "Tilføj Bynavn");
city="";
allOk=false;
}
//Telefonnummer påkrævet
if (telefonNr == null || telefonNr.equals(""))
{
errors.put ("telefonNr", "Tilføj Telefonnr");
telefonNr="";
allOk=false;
}
else if (!(telefonNr == null || telefonNr.equals("")) && telefonNr.length() <8 )
{
errors.put ("telefonNr", "Tilføj et gyldigt Telefonnr");
telefonNr="";
allOk=false;
}
else
{
try
{
int x = Integer.parseInt(telefonNr);
}
catch (NumberFormatException e)
{
errors.put ("telefonNr", "Tilføj et gyldigt Telefonnr");
telefonNr="";
allOk=false;
}
}
//Faxnummer
//FELTET BEHØVES IKKE VÆRE UDFYLDT
if (!(faxNr == null || faxNr.equals("")) && faxNr.length() <8)
{
errors.put ("faxNr", "Tilføj et gyldigt Faxnr");
faxNr="";
allOk=false;
}
else if (!(faxNr == null || faxNr.equals("")) && faxNr.length() >=8)
{
try
{
int x = Integer.parseInt(faxNr);
}
catch (NumberFormatException e)
{
errors.put ("faxNr", "Tilføj et gyldigt Faxnr");
faxNr="";
allOk=false;
}
}
//Postboxnummer
//FELTET BEHØVES IKKE VÆRE UDFYLDT
if (!(postBox == null || postBox.equals("")) && postBox.length() !=4)
{
errors.put ("postBox", "Tilføj et gyldigt Postboxnr");
postBox="";
allOk=false;
}
//E-mail påkrævet
if (email == null || email.equals(""))
{
errors.put("email", "Tilføj en Email-adresse");
email="";
allOk=false;
}
else if (!(email == null || email.equals("")) && !(email.indexOf("@") >0))
{
errors.put("email", "Tilføj en gyldig Email");
email="";
allOk=false;
}
//Webadresse
//FELTET BEHØVES IKKE VÆRE UDFYLDT
if (webAdresse == null || webAdresse.equals (""))
{
//errors.put ("webAdresse", "Tilføj webadresse"); Benyttes ikke da feltet ikke er påkrævet
webAdresse="";
allOk=true;
}
//se-nummer
//FELTET BEHØVES IKKE VÆRE UDFYLDT
if (seNr == null || seNr.equals(""))
{
seNr="";
allOk=true;
}
else if (!(seNr == null || seNr.equals("")) && seNr.length() <10)
{
errors.put ("seNr", "Tilføj et gyldigt SEnr");
seNr="";
allOk=false;
}
else if (!(seNr == null || seNr.equals("")) && seNr.length() >=10)
{
try
{
int x = Integer.parseInt(seNr);
}
catch (NumberFormatException e)
{
errors.put ("seNr", "Tilføj et gyldigt SEnr");
seNr="";
allOk=false;
}
}
//Kvalitetscertificering
//FELTET BEHØVES IKKE VÆRE UDFYLDT
if (kvalitetsCertificering == null || kvalitetsCertificering.equals(""))
{
//errors.put ("kvalitetsCertificering", "Tilføj kvalitetsCertificering");
kvalitetsCertificering="";
allOk=true;
}
//Brugernavn påkrævet
if (brugerNavn == null || brugerNavn.equals(""))
{
errors.put("brugerNavn","Tilføj Brugernavn");
brugerNavn="";
allOk=false;
}
//Password1 påkrævet
if (password1 == null || password1.equals(""))
{
errors.put("password1","Tilføj et gyldigt Password");
password1="";
allOk=false;
}
//password2 påkrævet
if (!password1.equals("") && (password2.equals("") || !password1.equals(password2)))
{
errors.put("password2","Bekræft venligst password");
password2="";
allOk=false;
}
return allOk;
}
//Her starter get-metoderne for alle de erklærede attributter
//som JSP siden (OpretForm1_Retry) benytter
public String getErrorMsg(String s)
{
String errorMsg =(String)errors.get(s.trim());
return (errorMsg == null) ? "":errorMsg;
}
public String getFirmaNavn()
{
return firmaNavn;
}
public String getAdresse()
{
return adresse;
}
public String getPostNr ()
{
return postNr;
}
public String getCity ()
{
return city;
}
public String getTelefonNr ()
{
return telefonNr;
}
public String getFaxNr ()
{
return faxNr;
}
public String getPostBox ()
{
return postBox;
}
public String getEmail()
{
return email;
}
public String getWebAdresse ()
{
return webAdresse;
}
public String getSeNr ()
{
return seNr;
}
public String getKvalitetsCertificering ()
{
return kvalitetsCertificering;
}
public String getBrugerNavn()
{
return brugerNavn;
}
public String getPassword1()
{
return password1;
}
public String getPassword2()
{
return password2;
}
//I det følgende er de respektive set-metoder for de erklærede attributter som
//frontcontrol Servletten (FrontControlServlet) benytter.
public void setErrors(String key, String msg)
{
errors.put(key,msg);
}
public void setFirmaNavn(String fn)
{
firmaNavn = fn;
}
public void setAdresse(String adr)
{
adresse = adr;
}
public void setPostNr (String pn)
{
postNr = pn;
}
public void setCity (String cy)
{
city = cy;
}
public void setTelefonNr (String tlf)
{
telefonNr = tlf;
}
public void setFaxNr (String fax)
{
faxNr = fax;
}
public void setPostBox (String pb)
{
postBox = pb;
}
public void setEmail(String eml)
{
email = eml;
}
public void setWebAdresse (String web)
{
webAdresse = web;
}
public void setSeNr (String se)
{
seNr = se;
}
public void setKvalitetsCertificering (String kc)
{
kvalitetsCertificering = kc;
}
public void setBrugerNavn(String bn)
{
brugerNavn = bn;
}
public void setPassword1(String p1)
{
password1 = p1;
}
public void setPassword2(String p2)
{
password2 = p2;
}
}
Valideringsbønnen for virksomhedens KontaktPerson er efter samme princip som ovenstående!!!!!
Jeg håber der er nogle der kan hjælpe mig da jeg ikke kan gennemskue dette problem - på forhånd tak for hjælpen.
hilsen Nylle
