"Henning Smed" <henning at smeds dot dk> wrote in message
news:4b24fe41$0$278$14726298@news.sunsite.dk...
>
> Jeg indtil nu kun anvendt færdige JavaScripts, men nu er der ingen vej
> udenom, jeg må lære at anvende AJAX/Java.
> På
http://www.w3schools.com/Ajax/ajax_database.asp fandt jeg en
beskrivelse,
> som jeg troede kunne løse mit problem men jeg er kørt fast.
Uff - det er vist et gammelt, simpelt forsøg.
Der mangler test på status m.m, så den vil jeg nok ikke anbefale at bruge.
Jeg har heller ikke rigtig fundet nogle gode scripts, så jeg laver dem selv.
Til Ajax brug, har jeg lavet denne gennerelle funktion:
http://w-o-p-r.dk/javascript/callXMLHTTPRequest.js
som jeg inkluderer.
Hvis jeg har brug for at sende data som ISO-8859-1, har jeg lavet denne
funktion:
http://w-o-p-r.dk/javascript/UTF8toAnsi.js
Hvis du er interesseret i at bruge dem, så er du velkommen.
> Jeg har uploaded en demo af mit nuværende resultat og kildekoden, hvor
> Select boksen i række 16 er betinget af indholdet af 9 og 4:
>
http://www.smeds.dk/SpareTst/Card/CardCreateAJAX.asp
>
>
http://www.smeds.dk/SpareTst/Card/ajax.txt
>
> Jeg ønsker at begrænse valgmulighederne i alle Select bokse så:
> Række 9 betinget af række 4 (er OK)
> Række 10 af 4 og 9
> Række 15 af 4, 9 og 10
> Række 16 af 4, 9, 10 og 15
>
> Hvordan kan jeg få alle betingelser opflydt, og hvordan skriver jeg det
> endelige resultat af formularen til databasen, når select boksenes indhold
> findes på flere asp sider?
Hvis vi tager udgangspunkt i mine funktioner, så skal du lave kald for både
række 9,10 og 15.
Hvis jeg forstår dig ret, så kender du cable station (række 4) når du kalder
siden.
Ud fra den danner du Equipment(række 9) - så langt så godt.
Men i dette kald skal du ikke have data i række 10,15 og 16, da disse ikke
er valgt.
Her kan du vælge at lave en tom række, eller en dummy select box, så det
'ligner noget'.
Dvs. ved kald i ASP'en, returnerer du række 9 som nu med en eventhandler på
onchange, lad os kalde den selectcard,
og den funktion kunne så se sådan ud:
.....
function selectcard(station) {
callXMLHTTPRequest('get',url,['station',station],[],showcard,station,false,f
alse,[]);
}
.....
og lægges ind i ASP med
onchange="showSerial(this.value)
Forinden skal du have defineret nogle globale variable:
.....
var selectedstation;
var selectedcard;
var selectedlocation;
.....
I dette kald er defineret en callbackfunktion, showcard, der bliver kaldt
når Ajax er færdigt.
Den kunne se sådan ud:
.....
function showcard(responsedata,returndata,isOK,X) {
if ( isOK ) {
// opdater række 10 med select box fra ASP, incl
onchange="selectlocation(this.value)"
selectedcard = returndata ;
}
}
.....
Når det er lavet, så vil du få en række 10 med de valg, der ligger inden for
række 9.
Eventhandleren til række 10, kan se sådan ud:
.....
function selectlocation(card) {
callXMLHTTPRequest('get',url,['station',selectedstation,'card',card],[],show
location,card,false,false,[]);
}
.....
Callbackfunktionen, som skal danne række 15:
.....
function showlocation(responsedata,returndata,isOK,X) {
if ( isOK ) {
// opdater række 15 med select box fra ASP, incl
onchange="selectserial(this.value)"
selectedstation = returndata ;
}
}
.....
Række 15 er så udvælgelse af serienumre til række 16, kunne se sådan ud:
.....
function selectserial(location) {
callXMLHTTPRequest('get',url,['station',selectedstation,'card',selectedcard,
'location',selectedlocation],[],showserial,card,false,false,[]);
}
.....
Callbackfunktionen, som skal danne række 15:
.....
function showserial(responsedata,returndata,isOK,X) {
if ( isOK ) {
// opdater række 16 med select box fra ASP
}
}
.....
Hvis du klipper disse kodestumper ud, har du stort set det færdige script.
Bemærk, ar den url, der skal kaldes er angivet som en variabel, som du kan
definere globalt,
var url='getdata.asp'.
Der skal ikke tilføjes ? eller & eller andet, det sørger rutinen for.
De data der skal tilføjes (og URI encodes) overføres blot i arrayet som name
value pairs.
Nu har jeg kaldt den getdata.asp, for det er 3 forskellige slags data, der
skal returneres.
Den første funktion vil generere et kald:
getdata.asp?station=<valg>
næste:
getdata.asp?station=<valg>&card=<valg>
og tredje:
getdata.asp?station=<valg>&card=<valg>&location=<valg>
Du kan selv afgøre om du vil have een ASP fil med 3 funktioner eller 3 ASP
filer med 1 funktion.
Hver funktion er ca. den samme som du har i din nuværende ASP.
Du kan også tilføje en funktionsparameter i kaldet, så du er fri for at lave
for mange if'er i ASP en.
Hvis du f.eks. tilføjer 'funktion','1' i første kald, 'funktion','2' i andet
osv, så kan du lave ASP'et a la:
if Request.Querystring("funktion")="1" then
SQL = "SELECT DISTINCT Card FROM tblSpares WHERE TerminalStation = ?
ORDER BY Card ASC"
set rs=query(oConn,SQL,Array(Request.Querystring("station")),1)
osv. - som i din getserial.asp
end if
if Request.Querystring("funktion")="2" then
SQL="SELECT DISTINCT Location FROM tblSpares WHERE TerminalStation = ?
AND Card = ? ORDER BY Location ASC"
set
rs=query(oConn,SQL,Array(Request.Querystring("station"),Request.Querystring(
"card")),2)
osv. - som i din getserial.asp
end if
Her har jeg brugt parameterized queries, så man er sikret mod SQL injection.
Include fil til query funktionen:
http://w-o-p-r.dk/tips/asp/SQL.inc.asp.txt
Det er muligt jeg blander lidt rundt i navnene, men jeg kender ikke dit
system, så jeg har bare brugt station,card,location.
Med hensyn til dit spørgemål om hvordan du skriver data, så bliver dataene
sendt med din form.
Du har ikke nogen action og method på, så den bliver 'sendt til sig selv'.
Jeg bruger selv en konstruktion a la:
if Request.Servervariables("REQUEST_METHOD") = "GET" then
.... her viser vi form med data
else ' POST
.... her modtager, og opdaterer vi data
end if
Hvis du vil bruge den metode, skal du rette din <form> til <form
method="post" action="">
Men husk at de modtagne data så ligger i Request.Form, og ikke i
Request.Querystring.
Det med den optræder på flere sider, forestiller jeg mig kan løses med at
lægge disse dele i en include fil, og inkludere den hvor den skal bruges.
Umiddelbart fremgpr det ikke om du bruger include filer eller ej, men jeg
bruger f.eks. denne her til databaser:
.....
<%
Dim oConn
Dim oConnString
Set oConn = Server.CreateObject("ADODB.Connection")
oConnString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" +
Server.MapPath("/") + "/../database/notesdb.mdb;Persist Security Info=False"
oConn.Open oConnString
%>
.....
De steder hvor jeg skal bruge databasen bruger jeg:
<!--#include file="notesdb.inc.asp"-->
Nu må vi se om du kan komme videre, men du har i hvert fald fået noget at
tænke over.
--
Med venlig hilsen/Best regards
Stig Johansen