Avatar billede wolmer Nybegynder
22. juni 2012 - 12:04 Der er 25 kommentarer og
1 løsning

Vis alle checkboxe og marker de valgte

I retprodukt.asp mangler jeg en løsning der kan vise alle checkboxe fra en tabel og markere de valgt fra en anden tabel i en form.

Dette eksempel virker ikke !

<%
Set oConn = Server.CreateObject("ADODB.Connection")
oConn.Open myDSN

Set rs2 = oconn.execute("SELECT * FROM farver_varelager where varelagerIdx="&vareid)
Set rs3 = oconn.execute("SELECT * FROM farver order by sort asc")

while not (rs3.EOF)
mark=""
While not (rs2.EOF)
if rs2("farve")=rs3("farve") and rs2("mark")="ON" then
mark="checked"
end if
rs2.movenext
%>

<input type="checkbox" name="f<%=rs3("farveId")%>" value="ON" <%=mark%>></font><%=rs3("farve")%><br>

<%
rs3.movenext
WEnd   
WEnd
%>
Avatar billede claes57 Ekspert
22. juni 2012 - 12:34 #1
prøv med

<%
Set oConn = Server.CreateObject("ADODB.Connection")
oConn.Open myDSN

Set rs2 = oconn.execute("SELECT * FROM farver_varelager where varelagerIdx="&vareid)
Set rs3 = oconn.execute("SELECT * FROM farver order by sort asc")

while not (rs3.EOF)
    Set rs2 = oconn.execute("SELECT * FROM farver_varelager where varelagerIdx=" & vareid & " and farve='" & rs3("farve") & "'")

    mark=""
    if not (rs2.EOF)
        if rs2("mark")="ON" then mark="checked"
    end if
%>
<input type="checkbox" name="f<%=rs3("farveId")%>" value="ON" <%=mark%>></font><%=rs3("farve")%><br>
<%
rs3.movenext
Wend
%>
Avatar billede softspot Forsker
22. juni 2012 - 13:35 #2
Hvad er sammenhænget mellem de to tabeller? Dvs. hvilken tabel indeholder alle elementer og hvilken tabel indeholder de valgte og hvad er kriteriet for at et element er valgt?

Jeg forestiller mig at du kan lave det hele i en SQL-sætning med en LEFT OUTER JOIN eller noget i den stil, men jeg vil gerne lige have forklaret hvad der hoved og hale i dette setup...
Avatar billede softspot Forsker
22. juni 2012 - 13:35 #3
Og hvilken database benytter du?
Avatar billede wolmer Nybegynder
22. juni 2012 - 14:54 #4
Access mdb database
Tabellen farver indeholder alle elementer.
Tabellen farver_varelager indeholder de valgte elementer.
Kriterie for et element er valgt er flg.:
farver_varelager.farve=farver.farve og varelagerIdx=vareId
Er dette svar nok ?
Avatar billede claes57 Ekspert
22. juni 2012 - 14:59 #5
dvs for et varenummer (vareId) skal den finde alle farver, og så ud fra den anden tabel finde de markerede?
og hvorfor er 'farver' sorteret (skal alle varenumre med på udtrækket?)
Avatar billede wolmer Nybegynder
22. juni 2012 - 15:17 #6
Præcis claes, men det er nok med et varenummer da det er form til at rette med.
Der findes en tredje tabel der hedder varelager.
tabellen farver.varelager har relation til denne.
Avatar billede softspot Forsker
22. juni 2012 - 15:18 #7
Jeg vil tro du bruge noget i stil med flg. SQL:

SELECT f.*, fv.mark
FROM farver f
LEFT JOIN farver_varelager fv ON f.farve = fv.farve
WHERE f.varelagerIdx = ?
ORDER BY f.sort ASC

Med ovenstående SQL-sætning i en variabel, kan du så benytte flg. til at at udtrække data:

<%
Set oConn = Server.CreateObject("ADODB.Connection")
oConn.Open myDSN

sql = "SELECT f.*, fv.mark " & _
      "FROM farver f " & _
      "LEFT JOIN farver_varelager fv ON f.farve = fv.farve " & _
      "WHERE f.varelagerIdx = ? " & _
      "ORDER BY f.sort ASC"

set cmd = Server.CreateObject("ADODB.Command")
set cmd.ActiveConnection = oConn
cmd.CommandType = 1
cmd.CommandText = sql

set rs = cmd.Execute(, array(vareid))

do while not rs.eof
%>
  <input type="checkbox"
        name="f<%=rs("farveId")%>"
        value="ON" <%
  if rs("mark") & "" = "ON" then
        %>checked<%
  end if
        %> /><%=rs("farve")%><br />
<%
  rs.movenext
loop

rs.close
oConn.close
%>
Avatar billede wolmer Nybegynder
22. juni 2012 - 15:43 #8
checker lige en gang
Avatar billede wolmer Nybegynder
22. juni 2012 - 16:58 #9
Softspot. Din løsning viser samtlige elementer fra farver_varelager og ingen checkede boxe

Jeg har måtte ændre i sql-sætningen for at få den til at køre..

sql = "SELECT f.*, fv.mark " & _     
      "FROM farver f " & _     
    "LEFT JOIN farver_varelager fv ON f.farve=fv.farve "&_     
    "WHERE f.varelagerIdx =" & vareid
Avatar billede softspot Forsker
22. juni 2012 - 17:08 #10
Jeg kan ikke helt gennemskue hvilke data du har liggende i de to tabeller. Ligger der kun en række i farve_varelager, hvis farven er valgt eller findes der flere tilstande som beskrives i den relationstabel (farve_varelager)? Kunne du evt. prøve at vise tabeldefinitionerne for alle tre tabeller (farve, farve_varelager og varelager)?

Grunden til at jeg benytter spørgsmåltegnet er at metoden til opslag benytter parametre (som sikrer dig mod SQL-injections), så din ændring burde ikke gøre nogen forskel på selve opslagets resultat.

Prøv evt. med:

sql = "SELECT f.*, fv.mark " & _
      "FROM farver f " & _
      "LEFT JOIN farver_varelager fv ON f.farve = fv.farve " & _
      "WHERE f.varelagerIdx = ? " & _
      "AND fv.vareid = ? " & _
      "ORDER BY f.sort ASC"

set cmd = Server.CreateObject("ADODB.Command")
set cmd.ActiveConnection = oConn
cmd.CommandType = 1
cmd.CommandText = sql

set rs = cmd.Execute(, array(vareid, vareid))
...

Bemærk at variablen med vareid stadig skal være tilgængelig og at det er meningen den forekommer 2 gange i kaldet til cmd.Execute.
Avatar billede softspot Forsker
22. juni 2012 - 17:11 #11
Jeg er ikke helt sikker på om Access tillader at man join'er på flere kriterier, men ellers kunne du forsøge at joine på begge kriterier (farve og vareid):

{div]
sql = "SELECT f.*, fv.mark " & _
      "FROM farver f " & _
      "LEFT JOIN farver_varelager fv " & _
          "ON f.farve = fv.farve AND f.varelagerIdx = fv.vareid " & _
      "WHERE f.varelagerIdx = ? " & _
      "ORDER BY f.sort ASC"
[/div]
I så fald skal du benytte det oprindelige kald til cmd.Execute (med kun én parameter).
Avatar billede softspot Forsker
22. juni 2012 - 17:11 #12
Ups! Se lige bort fra de der div BB-codes :-)
Avatar billede wolmer Nybegynder
22. juni 2012 - 18:02 #13
Tabel 1 navn: farver ingen relationer
farveid
sort
farve

Tabel 2 navn: farver_varelager. varelageridx relation til tabel 3 varelagerid

farveid
farve
mark
varelageridx

Tabel 3 navn: varelager. varelagerid relation til tabel 2 varelageridx

varelagerid
sort
varenummer
varenavn
varebeskriv
varefoto
varepris
---------------
Tabel 1 indeholder alle farver
Tabel 2 indeholder een eller flere valgte farver som er tilføjet fra tabel 1

vareid=varelagerid.

formen skal herefter vise alle farver, hvoraf de valgte skal være checked.
Avatar billede softspot Forsker
22. juni 2012 - 19:11 #14
OK. Opgaven må så kunne opdeles i flg. trin:

1. vælg alle farver

SELECT f.*, fv.mark FROM farver f


2. flet disse farver sammen med alle valgte eller et tomt valg

LEFT JOIN farver_varelager fv ON f.farveid = fv.farveid


3. filtrer på et givet varelagerid, hvor der tages højde for at valget kan risikere at være tomt (altså at farven ikke er valgt)

WHERE fv.varelageridx = <vareid>
OR fv.varelageridx IS NULL


Samlet set burde det give flg. SQL-sætning:

SELECT f.*, fv.mark 
FROM farver f
LEFT JOIN farver_varelager fv ON f.farveid = fv.farveid
WHERE fv.varelageridx = <vareid>
OR fv.varelageridx IS NULL


Hvad er i øvrigt årsagen til at du, tilsyneladende, har indført en redundans i farver_varelager (ved også at gemme farve her)? Det burde ikke være nødvendigt, da informationen kan hentes i farver-tabellen...
Avatar billede wolmer Nybegynder
23. juni 2012 - 12:01 #15
Programmet ser nu således ud og viser alle farver som det skal, men ingen af de valgt er markeret.
Jeg kan godt se hvad du mener med en redundans i farver_varelager, men det burde vel ikke påvirke programmet.

<form method="POST">
<%
vareid=    Request.Querystring("varelagerid")
       
Set oConn = Server.CreateObject ("ADODB.Connection")
oConn.Open myDSN

sql= "SELECT f.*, fv.mark " &_
    "FROM farver f " &_
    "LEFT JOIN farver_varelager fv ON f.farveid = fv.farveid " &_
    "WHERE f.varelagerIdx =  " &vareid&_
    "OR fv.varelageridx IS NULL"   
   
Set cmd = Server.CreateObject("ADODB.Command")
Set cmd.ActiveConnection = oConn
cmd.Commandtype = 1
cmd.Commandtext = sql

Set rs = cmd.execute(, array(vareid))

do while not rs.eof   
%>       

<input type="checkbox"
            name="f<%=rs("farveid")%>"
            value="ON" <%
            if rs("mark") & " " = "ON" then
            %>checked<%
            end if
            %> /><%=rs("farve")%><br />
                   
<%
rs.movenext
loop

rs.close
oConn.Close
%>

        <p><input type="submit" value="Submit" name="B1"><input type="reset" value="Reset" name="B2"></p>
    </form>
Avatar billede softspot Forsker
23. juni 2012 - 12:15 #16
Du har helt ret i, at det ikke betyder noget for den aktuelle udfordring, at der er redundans i relationstabellen. Det er dog med til at gøre løsningen lidt mindre gennemskuelig, så hvis det ikke er nødvendigt, bør den fjernes - men det er off topic i denne sammenhæng :-)

Du er vist kommet til at introducere et mellemrum i den tomme streng i if-sætningen:

if rs("mark") & " " = "ON" then


Det skal være en HELT tom streng, eller bliver rs("mark") aldrig lige med "ON" (allerhøjst "ON ", hvilket jo ikke er det samme) :-)

if rs("mark") & "" = "ON" then


Grunden til at jeg sammensætter rs("mark") med den tom streng er for at undgå et ekstra tjek på null (null & "" => en streng i VBScript).
Avatar billede wolmer Nybegynder
23. juni 2012 - 12:34 #17
Begge er afprøvet uden resultat.
Avatar billede softspot Forsker
23. juni 2012 - 12:43 #18
Har du prøvet at udskrive resultatet af det udtræk? Det kan være med til at åbne øjnene for hvad problemet er.

Det er overordentlig svært for mig at fejlfinde et problem jeg ikke rigtig kender grundlaget for. Du må meget gerne prøve at være lidt proaktiv og levere lidt mere info at arbejde ud fra.

Kort sagt: vis hvilke data der rent faktisk udtrækkes.

En tanke var f.eks. om værdien rent faktisk er "ON" og ikke "on" - der er jo som bekendt forskel på de to strenge...
Avatar billede wolmer Nybegynder
24. juni 2012 - 10:57 #19
Udskrivning af resultatet viser alle farverne som det skal, men ingen af de valgte farver i tabel 2 er markeret.
Jeg får ingen fejlmeldinger.

Tabel 1 navn: farver ingen relationer

farveid: 1 /autonum
sort: 1 /tal (til sortering)
farve: hvid /tekst

Tabel 2 navn: farver_varelager. varelageridx relation til tabel 3 varelagerid

farveid: 1 autonum
farve: hvid /tekst
mark: ON /tekst
varelageridx: 1 /tal

Tabel 3 navn: varelager. varelagerid relation til tabel 2 varelageridx

varelagerid: 1 /autonum
sort: 1 /tal (til sortering)
varenummer: 1 /tal
varenavn: Jakke /tekst
varebeskriv: Sommerj.. /tekst
varefoto: link /tekst
varepris: 875,00 /tal
---------------
Tabel 1 indeholder alle farver
Tabel 2 indeholder een eller flere valgte farver som er tilføjet fra tabel 1

vareid=varelagerid.
Avatar billede softspot Forsker
24. juni 2012 - 12:29 #20
Jeg tænkte nu mere på at du skulle udskrive de data der rent faktisk blev udtrukket af den forespørgsel der sendes til databasen. Du kan evt. prøve med denne kode:

<%
vareid=    Request.Querystring("varelagerid")
       
Set oConn = Server.CreateObject ("ADODB.Connection")
oConn.Open myDSN

sql= "SELECT f.*, fv.mark " &_
    "FROM farver f " &_
    "LEFT JOIN farver_varelager fv ON f.farveid = fv.farveid " &_
    "WHERE f.varelagerIdx =  " &vareid&_
    "OR fv.varelageridx IS NULL"   
   
Set cmd = Server.CreateObject("ADODB.Command")
Set cmd.ActiveConnection = oConn
cmd.Commandtype = 1
cmd.Commandtext = sql

Set rs = cmd.execute(, array(vareid))

on error resume next

do while not rs.eof   
  for each fld in rs.Fields
    Response.Write fld.Name & " = "
      Response.Write rs(fld)
    if err.number <> 0 then
      Response.Write "&lt;FEJL!&gt;"
    end if
    Response.Write "<br>"
  next

  rs.movenext
loop

on error goto 0

rs.close
oConn.Close
%>

Så kan du fortælle mig hvad den skriver (helt præcis: kopier og indsæt her i tråden).
Avatar billede wolmer Nybegynder
24. juni 2012 - 12:48 #21
OK Softspot
Der er 3 farver at vælge imellem i tabellen farver
Der er valgt 1 farve i tabellen farver_varelager
Der kommer flg. fejlmeldinger

farveId = <FEJL!>
sort = <FEJL!>
farve = <FEJL!>
mark = <FEJL!>
farveId = <FEJL!>
sort = <FEJL!>
farve = <FEJL!>
mark = <FEJL!>
farveId = <FEJL!>
sort = <FEJL!>
farve = <FEJL!>
mark = <FEJL!>
Avatar billede wolmer Nybegynder
24. juni 2012 - 13:05 #22
farveid fra tabellen farver har ikke samme farveid som farveid i farver_varelager.
De har ingen relationer mellem de to tabeller, kunne fejlen evt. ligge her
Avatar billede wolmer Nybegynder
24. juni 2012 - 13:10 #23
Jeps fejlen er fundet.
I stedet for farveid i sql-sætningen bruger jeg farve og problemet er løst.
Jeg siger mange tak for din hjælp. Hvis du lægger et svar bliver du belønnet.
Avatar billede wolmer Nybegynder
24. juni 2012 - 13:22 #24
Det kan godt være jeg var lidt for hurtig her, fordi jeg får kun een af de valgte farver markeret, når der valgt 2 farver.
Køre lige nogle test.
Avatar billede wolmer Nybegynder
24. juni 2012 - 13:37 #25
Alt fungere fint tak. Smid et svar softspot.
Avatar billede softspot Forsker
24. juni 2012 - 15:07 #26
Velbekomme :-)


Jeg ville dog opfordre dig til at benytte den parameteriserede version af kaldet til databasen i stedet for at flytte vareid ind i SQL-sætningen - det er et potentielt sikkerhedsbrist, at flette parameterværdier ind i SQL-sætninger på den måde. Altså (hvis jeg har forstået dig korrekt mht. relationen mellem farver og farver_varelager-tabellerne):

<%
...
sql= "SELECT f.*, fv.mark " &_
    "FROM farver f " &_
    "LEFT JOIN farver_varelager fv ON f.farve = fv.farve " &_
    "WHERE f.varelagerIdx =  ? " &_
    "OR fv.varelageridx IS NULL"   
   
Set cmd = Server.CreateObject("ADODB.Command")
Set cmd.ActiveConnection = oConn
cmd.Commandtype = 1
cmd.Commandtext = sql

Set rs = cmd.execute(, array(vareid))
...
%>

Lidt off topic, så virker det lidt ulogisk (og dermed som en unødig kompleksitet), at farveid ikke er en fremmednøgle til farver-tabellens farveid. Der bør være konsistens i navngivningen for tydeligt at kommunikere sammenhængene... :-)
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