Avatar billede c-lund Nybegynder
27. februar 2006 - 15:45 Der er 28 kommentarer og
2 løsninger

Postnr og by

Hey, hvordan laver man det system, hvor at man indtaster et postnr og så viser den selv det bynavn der høre til?

og hvor for man den database?

Mvh
Christian
Avatar billede luzk Nybegynder
27. februar 2006 - 15:55 #1
Du kan hente en XML fil med postnumre og byer hos postdanmark.
Filen kan importeres til en database, og herefter er det blot at lave et system der slår op i databasen og returnerer den by der hører til det indtastede postnummer

XLS fil: http://www.postdanmark.dk/iis/postnumre/_content/Download.asp
Avatar billede c-lund Nybegynder
27. februar 2006 - 16:02 #2
ok, tak indtil videre. hvordan gør man det så at den skriver bynavnet når man har skrevet sit postnr. altså uden at man skal trykke på ok knap.
Avatar billede softspot Forsker
27. februar 2006 - 16:06 #3
du kan f.eks. reagere på onchange-eventet på et tekstfelt, som kalder en rutine der enten via AJAX eller via en iframe henter data fra serveren.

Alternativt kan du sende alle postnr og bynavn-informationer med over til klienten i et objektstuktur som genereres på serveren, så du slet ikke behøves beskæftige dig med at forbinde til serveren når der er behov for et bynavn.
Avatar billede c-lund Nybegynder
27. februar 2006 - 16:09 #4
Det var også lidt sådan jeg havde tænkte det "Alternativt kan du sende alle postnr og bynavn-informationer med over til klienten i et objektstuktur som genereres på serveren, så du slet ikke behøves beskæftige dig med at forbinde til serveren når der er behov for et bynavn." men ved ikke hvordan amn gør, har du et script eller et link til et sted hvor man kan finde informationer?
Avatar billede softspot Forsker
27. februar 2006 - 16:22 #5
Du kan linke en asp-side ind i et eksternt javascript-element, således:

<script type="text/javascript" src="postnrtabel.asp"></script>


postnrtabel.asp læser så postnr og bynavne fra dit XLS-dokument eller databasen (alt efter hvad du ønsker). Output af postnrtabel.asp kunne være noget i stil med dette (den skal naturligvis fyldes ud med alle postnr og bynavne):

posttab = {d5000:'Odense',d6000:'Kolding',d7000:'Fredericia',d7100:'Vejle'};

og så kan du evt. lave en funktion der kan finde bynavnet til et givent postnr (kan evt. lægges i det samme output):

function hentBynavn(postnr) {
  return (posttab['d'+postnr]?posttab['d'+postnr]:'Ikke fundet');
}


og så en wrapper-funktion til at indsætte bynavnet i formularfeltet:

function saetBynavn(frm, postnr, bynavnKontrol) {
  if(frm) {
    frm.elements[bynavnKontrol].value = hentBynavn(postnr);
  }
}


din form kunne så se således ud:

<form>
  Postnr: <input type="text" name="postnr" onchange="saetBynavn(this.form,this.value,'bynavn')"><br>
  Bynavn: <input type="text" name="bynavn"><br>
</form>
Avatar billede c-lund Nybegynder
27. februar 2006 - 16:26 #6
ok, tak indtil videre, jeg vender tilbage når jeg har fået testet det :)
Avatar billede luzk Nybegynder
28. februar 2006 - 10:11 #7
Jeg vil fraråde at alle postnumre læses ind i en object struktur, ud fra den betragtning at du oftest kun skal bruge et postnummer. Derved sparer du en masse loadtid hos brugeren og på serveren ved kun at hente det du har behov for.

Ved at hente alle data skal serveren hente alle data og skrive disse i et object. Dette objekt skal herefter sendes over netværket til brugeren. Når brugeren modtager det, skal der søges efter informationer i objektet, og dette skal præsenteres for brugeren.

Ved kun at hente det du har behov for, skal serveren kun hente én record (eller flere hvis der indtastes flere på en gang), og herefter sende de data tilbage du skal bruge. Klienten skal ikke bruge tid på at søge i det modtagne, men kan præsentere det direkte for brugeren.

I dette tilfælde vil jeg mene du kan spare både computerkraft på serveren og klienten, og du sparer netværkstid.

Det er en klassisk situation at afgøre om det er bedst at spare netværkstid eller computer kraft.
Avatar billede softspot Forsker
28. februar 2006 - 10:16 #8
En anden faktor er hvor ofte du har behov for denne feature på klienten. Hvis det er noget der skal bruges ofte, kan det måske alligevel betale sig at sende strukturen ud på klienten (den den kan caches der og dermed ikke skal loades hver gang siden loades).
Avatar billede c-lund Nybegynder
28. februar 2006 - 10:29 #9
det skal bruges til noget bruger oprettelse, så hvilken løsning er bedst?
Avatar billede luzk Nybegynder
28. februar 2006 - 10:39 #10
Der vil jeg mene det er bedst kun at hente det nødvendige, da brugeren typisk blot vil indtaste sit postnummer én gang. De kan selvfølgelig komme til at taste forkert, men alt andet lige sparer du computer kraft og tid ved kun at hente det postnummer brugeren har indtastet
Avatar billede c-lund Nybegynder
28. februar 2006 - 10:43 #11
har du et eks. på dette?
Avatar billede luzk Nybegynder
28. februar 2006 - 11:01 #12
Tjaeh - du kan benytte noget remote scripting.

lav en asp side, der tager et postnummer med som parameter i URL. - kaldes fx med get_postnr.asp?nr=2000.

Siden skal fortolkes som en JavaScript side, så derfor skal du have Response.ContentType="text/js" i din fil.

Denne side skal via et SQL kald finde den tilhørende by, og derefter sætte en JavaScript variabel lig den by du henter.

Filen kunne være noget lig følgende (det er ikke testet, så der kan forekomme fejl, og der er ikke validering på. Husk at check om der er en parameter med, om den er et tal etc)
============================
<%@ LANGUAGE = "VBScript" %>
<%
Response.ContentType="text/js"

cn.Open(DSN) 'åbn database connection
Set rs = cn.Execute("SELECT by FROM postnumre WHERE postnummer = " + Request.QueryString("nr")) 'find byen
'tag det første resultat - der bør ikke være mere end et.
'byTxt er feltet i din kode, hvor byen skal stå
%>
document.getElementById("byTxt").value="<%=rs("by")%>";
<%

cn.Close 'luk database connection
%>
============================

Ovenstående benytter et tesktfelt i din kode, der kaldes byTxt, hvor bynavnet skal stå - du kan kalde det hvad du vil, blot koden ændres til det.

For at kalde koden, skal du fortælle browseren at den skal hente et JavaScript. Det kan du gøre ved at benytte følgende kode:
===================================
function loadFile(file)
{
  var scriptTag = document.getElementById('loadScript');
  var head = document.getElementsByTagName('head').item(0)
  if(scriptTag) head.removeChild(scriptTag);
  script = document.createElement('script');
  script.src = file;
  script.type = 'text/javascript';
  script.id = 'loadScript';
  head.appendChild(script)
}
===================================
Koden gør i princippet det, at den tilføjer et script element til din side, der kalder en defineret fil. For at kalde dette script, skal du have noget lignende følgende i din form:

=================================
<input type="text" name="postTxt" value="" onBlur="java script:loadFile('get_postnr.asp?nr='+this.value)">
<input type="text" name="byTxt" value="">
=================================
Når der mistes focus på postTxt kaldes loadFile med den side der skal hentes + det postnummer der er indtastet. ASP siden sætter derefter værdien i byTxt til by navnet.

Der kan selvfølgelig leges med at disable byTxt så brugeren ikke selv kan skrive i det, men for at gøre det, skal du huske at åbne feltet inden du selv skriver i det fra dit skript, og derefter disable det igen.

Håber ovenstående er dækkende og forståeligt.
Avatar billede luzk Nybegynder
28. februar 2006 - 11:02 #13
Ups - glemte lige at input elementerne skal have ID'er der svarer til deres navne for at ovenstående virker, så det skal være
<input type="text" id="postTxt" name="postTxt" value="" onBlur="java script:loadFile('get_postnr.asp?nr='+this.value)">
<input type="text" id="byTxt" name="byTxt" value="">
Avatar billede softspot Forsker
28. februar 2006 - 11:29 #14
Det er måske stadig en idé at bibeholde opdatering af bynavn på onchange, så der kun hentes data når der rent faktisk bliver ændret i data - apropos optimering af resurseforbrug.
Avatar billede softspot Forsker
28. februar 2006 - 11:31 #15
Ydermere har jeg ladet mig fortælle at man ikke må bruge javascript-prologen i event-rutiner, dvs. væk med java script: i event-rutinen.
Avatar billede luzk Nybegynder
28. februar 2006 - 13:44 #16
Det er derfor at der benyttes en onBlur, så der først hentes data når brugeren er færdig med at indtaste i postnummer feltet, og går væk fra det. Hvis onchange benyttes vil den blive fyret afsted hver gang brugeren indtaster/sletter et nummer i feltet, og det vil skabe flere requests samt gøre det mere besværligt at validere, da man i princippet skal tage højde for om brugeren er færdig med at indtaste etc.

Hvis du har en reference til noget god dokumentation der argumenterer for ikke at benytte JavaScript i event routiner vil jeg være meget interesseret i det, for indtil videre har jeg ikke fundet noget negativ dokumentation om emnet, og det er altid godt at revurdere sin opfattelse af tekniker :-)

I princippet er mit forslag det samme der sker når man laver de meget fancy mouseover effekter der var højeste mode i tidernes morgen. I dem sker det blot uden udvikleren selv skal lave routinerne.

Desuden er det samme principper der benyttes i AJAX, hvilket jo for tiden er det eneste rigtige at benytte hvis man spørger alle dem der er med på noderne (hvilket vil sige alle andre end undertegnede) :-)
Avatar billede softspot Forsker
28. februar 2006 - 13:57 #17
ang. onchange: nej, den fyrer først bår brugeren forlader feltet og kun hvis der er ændret i feltet, onblur fyrer hver gang man forlader feltet - uanset om der er ændret eller ej.

ang. javascript-prologen: min reference er roenving, jeg har ikke selv læst det, men jeg stoler blindt på en af roenvings kæpheste ;-)

AJAX: det er ganske givet ret genialt, det eneste jeg er lidt forbeholden overfor er kompatibilitet, men jeg skal absolut ikke være den der er fortaler for at bremse udviklingen fordi der sidder en lille flok brugere som ikke kan finde ud af at opdatere deres browsere... :)
Avatar billede luzk Nybegynder
28. februar 2006 - 14:06 #18
Sorry - du har ret! det er onchange der skal benyttes istedet... har åbenbart placeret mit hovede et sted uden lys ;-)

Jeg giver dig medhold i det er fornuftigt at høre efter hvad roenving siger, men indtil jeg har noget dokumentation der kan overbevise mig beholder jeg min holdning :o)

Og så lige din kommentar om AJAX - jeg kan kun være enig. Men sådan er det når noget bliver et buzzword - så skal alle benytte det (selvom det har kunnet lade sig gøre i mange år efterhånden)
Avatar billede c-lund Nybegynder
01. marts 2006 - 12:48 #19
Hey det virker kanon, men jeg vil også gerne have udskrevet værdien i value?
<input type="text" id="byTxt" name="byTxt" value="?">
Avatar billede luzk Nybegynder
01. marts 2006 - 14:44 #20
Hvilken værdi vil du gerne have skrevet i by feltet?
Linien document.getElementById("byTxt").value="<%=rs("by")%>"; skulle allerede gerne skrive i feltet...
Avatar billede c-lund Nybegynder
01. marts 2006 - 14:49 #21
ja, men den bliver ikke skrevet i value så jeg kan hive den med over, men jeg har klaret det på en anden måde
Avatar billede luzk Nybegynder
01. marts 2006 - 15:16 #22
Jeg er ikke helt med.
ASP siden skulle allerede skrive i value feltet, så der skulle ikke være grund til at hive noget over. ASP siden der bliver kaldt, bliver afviklet som en JS fil, og derfor skulle den gerne snakke direkte sammen med din side, og feltet skulle derved gerne blive skrevet.
Avatar billede softspot Forsker
01. marts 2006 - 15:23 #23
Der er ikke taget højde for ikke eksisterende postnumre i koden, så det kan være kaldet til scriptet fejler på serveren. Prøv evt. at indsætte en dummy-tekst i det tilfælde at postnr ikke findes.

<%@ LANGUAGE = "VBScript" %>
<%
Response.ContentType="text/js"

cn.Open(DSN) 'åbn database connection
Set rs = cn.Execute("SELECT by FROM postnumre WHERE postnummer = " + Request.QueryString("nr")) 'find byen
'tag det første resultat - der bør ikke være mere end et.
'byTxt er feltet i din kode, hvor byen skal stå
if not rs.eof then
%>
document.getElementById("byTxt").value="<%=rs("by")%>";
<%
else
%>
document.getElementById("byTxt").value="Ikke fundet";
<%
end if
rs.close
cn.Close 'luk database connection
%>
Avatar billede c-lund Nybegynder
01. marts 2006 - 15:24 #24
man kan se navnet i input feltet, men hvis man ser kilde koden, står det ikke noget i value="" feltet
Avatar billede softspot Forsker
01. marts 2006 - 15:31 #25
Det er fordi det du ser i kildekoden er den kode som loades når siden hentes fra serveren - den ændrer sig ikke dynamisk sammen med den bagvedliggende DOM - desværre. Så skal du bruge andre værktøjer (jeg har hørt at FireFox har en DOM inspector, men det er vist ikke noget IE har som standard).
Avatar billede luzk Nybegynder
02. marts 2006 - 09:23 #26
Ah ok - så er jeg med :-)
Det er helt korrekt som softspot siger, og ja det er trist DOM ikke opdateres.

Heldigvis betyder det dog ikke du ikke kan sende/modtage værdien, så du kan sende din form som du normalt ville gøre.

Går udfra løsningen har løst dit problem, så jeg tillader mig at poste dette som et svar
Avatar billede c-lund Nybegynder
02. marts 2006 - 10:16 #27
ja problemet er løst :) tak for det. hvis softspot også poster et svar så  er det kanon
Avatar billede softspot Forsker
02. marts 2006 - 10:19 #28
Ja, det skal jeg gerne gøre :)
Avatar billede softspot Forsker
02. marts 2006 - 10:54 #29
Tak for point :)
Avatar billede luzk Nybegynder
02. marts 2006 - 16:49 #30
Super du fik det til at virke
Tak for point :-)
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