Avatar billede reino Nybegynder
18. august 2003 - 10:05 Der er 8 kommentarer og
1 løsning

Combo boks

Hej igen,

I forlængelse af spørgsmål 387131 ønsker jeg sluttelig at udvide forespørgslen udfra 5 tabeller :). Har selv prøvet at ændre koden, mend desværre uden held.

Koden er som følger:

<html>
<head>

<%
set conn = server.CreateObject("ADODB.Connection")
conn.Open db

SQL = "SELECT [type], [Producent], [printer], [tonerprodukter], [Varenummer] FROM produkter ORDER BY [type], [producent], [printer], [tonerprodukter], [Varenummer]"

Set rs = Conn.Execute(SQL)

rsArr = rs.GetRows()
Conn.Close
%>

<script language="javascript" type="text/javascript">
var arr = [
<%
oldValg1 = ""
oldValg2 = ""
oldValg3 = ""
oldValg4 = ""
for i = 0 to ubound(rsArr,2)
  if oldValg1 <> rsArr(0,i) then
    Response.write "['" & rsArr(0,i) & "', [" & vbCrLf
    oldValg1 = rsArr(0,i)
  end if

  if oldValg2 <> rsArr(1,i) then
    Response.write "['" & rsArr(1,i) & "'"
    oldValg2 = rsArr(1,i)
    newValg2 = true
  end if
  if newValg2 then
    Response.write "," & vbCrLf & "["
    newValg2 = false
  end if

  if oldValg3 <> rsArr(2,i) then
    Response.write "['" & rsArr(2,i) & "'"
    oldValg3 = rsArr(2,i)
    newValg3 = true
  end if
  if newValg3 then
    Response.write "," & vbCrLf & "["
    newValg3 = false
  end if
 
    if oldValg4 <> rsArr(3,i) then
    Response.write "['" & rsArr(3,i) & "'"
    oldValg4 = rsArr(3,i)
    newValg4 = true
  end if
  if newValg4 then
    Response.write "," & vbCrLf & "["
    newValg4 = false
  end if

  Response.write "'" & rsArr(4,i) & "'"
 
  t = i+1
  if t <= ubound(rsArr,2) then
    endValg = false
    if oldValg4 <> rsArr(3,t) then
      Response.write "]]"
      endValg = true
    end if
    if oldValg3 <> rsArr(2,t) then
      Response.write "]]"
      endValg = true
    end if
    if oldValg2 <> rsArr(1,t) then
      Response.write "]]"
      endValg = true
    end if
    if oldValg1 <> rsArr(0,t) then
      Response.write "]]"
      endValg = true
    end if
    Response.write ","
    if endValg = true then response.write vbCrLf
  else
    Response.write "]]]]]]"
  end if

next
%>
];
</script>
</head>
<body>
<script language="javascript" type="text/javascript">
function initSels(){
    createOpts(document.getElementById('sel1'));
}

function createOpts(sel){
    var s = new Array();
    var num = 0, txt = "arr";
    var ar = opt = null;
    var n = sel.selectedIndex;
    var args = createOpts.arguments.length;
    for(var i=1;args>i;i++){
        s[i-1] = document.getElementById(createOpts.arguments[i]);
        if(s[i-1]==sel)num=i;
    }
    if(args>1){
        if(s[num])sel = s[num];
        else return;
    }
    if(n==0&&args>1){
        for(i=num;args>i+1;i++){
            s[i].length = 0;
            opt = document.createElement('OPTION');
            s[i].appendChild(opt);
            opt.value = "";
            opt.text = "\74-- Vælg --";
        }
        return true
    };
    for(i=0;num>i;i++){
        txt+="["+(s[i].selectedIndex-1)+"][1]";
    }
    ar = eval(txt);
    sel.length = 0;
    opt = document.createElement('OPTION');
    sel.appendChild(opt);
  opt.value = "";
  opt.text = "-- Vælg --";
    for(i=0;ar.length>i;i++){
        opt = document.createElement('OPTION');
        sel.appendChild(opt);
        if(typeof ar[i] == 'object'){
          opt.value = ar[i][0];
          opt.text = ar[i][0];
        }else{
          opt.value = ar[i];
          opt.text = ar[i];
      }
    }
    if(args>num+2){
        for(i=num+1;args-1>i;i++){
            s[i].length = 0;
            opt = document.createElement('OPTION');
            s[i].appendChild(opt);
            opt.value = "";
            opt.text = "\74-- Vælg --";
        }
    }
}
</script>
</head>

<body onload="initSels()">

<br>
Type:
<select name="sel1" id="sel1" onchange="createOpts(this,'sel1','sel2','sel3','sel4','sel5');">
  <option value="" selected>Vis alle</option>
</select>
<br>
Producent:
<select name="sel2" id="sel2" onchange="createOpts(this,'sel1','sel2','sel3','sel4','sel5');">
  <option value="" selected>Vis alle</option>
</select>
<br>
Printer:
<select name="sel3" id="sel3" onchange="createOpts(this,'sel1','sel2','sel3','sel4','sel5');">
<option value="" selected>&lt;-- Vælg --</option>
</select>
<br>
Tonerprodukter:
<select name="sel4" id="sel4" onchange="createOpts(this,'sel1','sel2','sel3','sel4','sel5');">
<option value="" selected>&lt;-- Vælg --</option>
</select>
<br>
Varenummer:
<select name="sel5" id="sel5">
<option value="" selected>&lt;-- Vælg --</option>
</select>


</body>
</html>
Avatar billede eagleeye Praktikant
18. august 2003 - 13:31 #1
Umiddelbart ser det gankse fornuftigt ud og det enste jeg lige umiddelbart kan se her er prøv at rette:

Response.write "]]]]]]"

Til:

Response.write "]]]]]]]]"

Så den lukker alle de åbne [ som laves.

Eller får du en fejl ?
Avatar billede reino Nybegynder
19. august 2003 - 08:43 #2
Hejsa, nej, den får først en javafejl når jeg tilføjer nogle ekstra lukkeklammer.

Men den laver en fejl ved 2. comboboks hvor den pludselig blander data fra tabel producent med data fra tabel printer. Det ser ud som om at der den fejler er ved de felter hvor tonerprodukter er udfyldt ...
Avatar billede eagleeye Praktikant
26. august 2003 - 23:31 #3
Hej
Jeg havde næsten glemt dette spørgsmål..

Jeg har prøvet at lave koden og umiddelbart kan jeg ikke få den til at blande data fra flere combo bokse. Jeg kan dog kun få det til at virke hvis jeg har 8 klammer i den sidste linje som vist i svaret.
Avatar billede eagleeye Praktikant
26. august 2003 - 23:39 #4
Ok, jeg har prøvet noget.

Javascriptet er meget følsomt over for ' i teksten. Hvis teksten i en af kolonnerne indeholder et ' så kommer der fejl i javascriptet.
Avatar billede eagleeye Praktikant
26. august 2003 - 23:51 #5
Det findes der work around for at ' i en streng skal skrives som \'
så det ikke skal ændre i teksten i databasen.


Så alle steder hvor rsArr(X,i) indgår i en Response.wwrite linje tilføjes en replace(rsArr(X,i),"'","\'")

Sådan eksvis denne linje:
Response.write "['" & rsArr(0,i) & "', [" & vbCrLf

Bliver til:
Response.write "['" & replace(rsArr(0,i),"'","\'") & "', [" & vbCrLf
Avatar billede eagleeye Praktikant
26. august 2003 - 23:59 #6
Faktisk gælder det samme for \ at der skal være to \\ for at den udsrkvier en \ rigtigt så det med replace skal laves lidt om så den kalder en funktion eksvis kaldes fixString og den ligges ind som sådan her:



<script language="javascript" type="text/javascript">
var arr = [
<%
function fixString(str)
  str = replace(str, "\", "\\") 'Denne skal være første.
  str = replace(str, "'", "\'")
  fixString = str
end function

oldValg1 = ""
oldValg2 = ""
oldValg3 = ""
oldValg4 = ""



Det samme gælder igen, alle de steder hvor rsArr(X,i) indgår i en Response.write linje tilføjes en fixString(rsArr(X,i))

Sådan eksvis denne linje:
Response.write "['" & rsArr(0,i) & "', [" & vbCrLf

Bliver til:
Response.write "['" & fixString(rsArr(0,i)) & "', [" & vbCrLf
Avatar billede reino Nybegynder
29. august 2003 - 06:40 #7
Hej Eagleeye. Tak endnu engang. Dog blev denne ikke aktuelt men så ud til at virke. :)
Avatar billede reino Nybegynder
03. september 2003 - 06:58 #8
Hej Eagleeye, så er jeg tilbage på banen. Jeg har siddet og rodet lidt med det og har nu brug for samme script, hvor der nu kun skal være 2 muligheder. Jeg kan du ikke få det til at virke, selvom det burde være mere simpelt....

Any ideas ?. Jeg opretter gladeligt nyt spørgsmål hvis de kan give mig de vise ord :)
Avatar billede reino Nybegynder
03. september 2003 - 12:55 #9
hej igen, never mind :), fandt ud af det.
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