08. december 2022 - 18:11Der er
48 kommentarer og 1 løsning
If RS1200.EOF Then - Hvis værdien er 0, forvinder hele linien i tabellen
Jeg forsøger at udskrive brugere i en tabel, kører dem igennem en løkke. De får så præsenteret deres valg i tabellen (3 kolonner, 1 række med 3 submit buttons).
Alt mellem <tbody> og </tbody> forsvinder fuldstændigt:
<tbody class="list align-items-center">
</tbody>
Men KUN hvis RS1200.EOF. Hvis der er mere end én bruger, der har valgt RS1200("status") = 200, virker det fint. Men det er kun hvis der er mere end én bruger, hvor RS1200("status") = 200.
Jeg håber på hjælp, den er for kringlet. Jeg har virkelig lagt timer og forsøgt alt muligt. Spørg, hvis der er noget, der skal uddybes :) På forhånd tak
<% Set RSCountTotalOff = Conn.Execute(SQL1) SQL2 = "SELECT Count(status) AS Number1200 FROM users WHERE status = " & 200 & "" Set RSCountTotal1200 = Conn.Execute(SQL2) SQL3 = "SELECT Count(status) AS Number1230 FROM users WHERE status = " & 300 & "" Set RSCountTotal1230 = Conn.Execute(SQL3) SQL4 = "SELECT Count(status) AS Number1300 FROM users WHERE status = " & 400 & "" Set RSCountTotal1300 = Conn.Execute(SQL4)
Set RS1200 = Conn.Execute("SELECT * FROM users WHERE status = 200 ORDER BY username, category ASC") Set RS1230 = Conn.Execute("SELECT * FROM users WHERE status = 300 ORDER BY username, category ASC") Set RS1300 = Conn.Execute("SELECT * FROM users WHERE status = 400 ORDER BY username, category ASC")
%>
<div class="row mt-5"> <div class="table-responsive-lg"> <table class="table table-striped table-hover table-bordered-columns" id="ownevents"> <thead> <tr class="border-0"> <th class="text-center"><span id="lb1200" class="lead"></span><br>12:00 - 12:30</th> <th class="text-center"><span id="lb1230" class="lead"></span><br>12:30 - 13:00</th> <th class="text-center"><span id="lb1300" class="lead"></span><br>13:00 - 13:30</th> </tr> </thead> <tbody class="list align-items-center"> <% If Not RS1200.EOF OR RS1230.EOF OR RS1300.EOF Then Do Until RS1200.EOF AND RS1230.EOF AND RS1300.EOF %> <tr> <td class="reference text-nowrap"> <% If Not RS1200.EOF Then %> <svg height="14" width="14"><circle cx="7" cy="7" r="7" stroke="black" stroke-width="1" fill="<% If RS1200("category") = 1 Then %>green<% ElseIf RS1200("category") = 2 Then %>yellow<% Else %>red<% End If %>"></svg> <%=RS1200("username")%> <% Else %> - <% End If %> </td> <td class="reference text-nowrap"> <% If Not RS1230.EOF Then %> <svg height="14" width="14"><circle cx="7" cy="7" r="7" stroke="black" stroke-width="1" fill="<% If RS1230("category") = 1 Then %>green<% ElseIf RS1230("category") = 2 Then %>yellow<% Else %>red<% End If %>"></svg> <%=RS1230("username")%> <% Else %> - <% End If %> </td> <td class="reference text-nowrap"> <% If Not RS1300.EOF Then %> <svg height="14" width="14"><circle cx="7" cy="7" r="7" stroke="black" stroke-width="1" fill="<% If RS1300("category") = 1 Then %>green<% ElseIf RS1300("category") = 2 Then %>yellow<% Else %>red<% End If %>"></svg> <%=RS1300("username")%> <% Else %> - <% End If %> </td> </tr> <% If Not RS1200.EOF Then RS1200.MoveNext End If If Not RS1230.EOF Then RS1230.MoveNext End If If Not RS1300.EOF Then RS1300.MoveNext End If Loop End If %> </tbody> </table> </div> </div>
<div class="d-flex justify-content-between align-items-center flex-column flex-lg-row"> <div class="form-group row"> <div class="col-md-4 mb-1"> <button type="submit" name="ActiveChoise" value="200" class="btn btn-<%=btnStyleR1200%> btn-block btn-lg" onclick="this.form.submit();"<% If disableAll = "" Then %><%=disabledR1200%><% Else %><%=disableAll%><% End If %>>12:00</button> </div> <div class="col-md-4"> <button type="submit" name="ActiveChoise" value="300" class="btn btn-<%=btnStyleR1230%> btn-block btn-lg" onclick="this.form.submit();"<% If disableAll = "" Then %><%=disabledR1230%><% Else %><%=disableAll%><% End If %>>12:30</button> </div> <div class="col-md-4"> <button type="submit" name="ActiveChoise" value="400" class="btn btn-<% If RSButtonChosen("status") = 400 Then %>info<% Else %>primary<% End If %> btn-block btn-lg" onclick="this.form.submit();"<%=disableAll%>>13:00</button> </div> </div> </div>
Jeg synes ikke jeg får noget frem på siden med dette:
If Request("mode") = "ChooseLunchbreak" Then Dim tUser, ActiveChoise, SQL tUser = Request.QueryString("user") ActiveChoise = Request.Form("ActiveChoise")
sqlstr = "UPDATE lbusers SET status = " & ActiveChoise & " WHERE username = '" & tUser & "'" Response.Write "sqlstr=" & sqlstr SQL = Conn.Execute(sqlstr)
To tilfældige stykker kode som måske eller måske ikke kan inspirere.
<% function getColA() ' simulate fetch from DB dim res(1) res(0) = 11 res(1) = 12 getColA = res end function
function getColB() ' simulate fetch from DB dim res(2) res(0) = 21 res(1) = 22 res(2) = 23 getColB = res end function
function getColC() ' simulate fetch from DB dim res(0) res(0) = 31 getColC = res end function
function getVal(x, i) if i <= ubound(x) then getVal = x(i) else getVal = "" end if end function %>
<% dim a, b, c a = getColA() b = getColB() c = getColC() dim n n = ubound(a) if ubound(b) > n then n = ubound(b) end if if ubound(c) > n then n = ubound(c) end if %> <table border="1"> <tr> <th>A</th> <th>B</th> <th>C</th> </tr> <% dim i for i = 0 to n %> <tr> <td><%=getVal(a, i)%></td> <td><%=getVal(b, i)%></td> <td><%=getVal(c, i)%></td> </tr> <% next %> </table>
<% function getColA() ' simulate fetch from DB dim res(1) res(0) = 11 res(1) = 12 getColA = res end function
function getColB() ' simulate fetch from DB dim res(2) res(0) = 21 res(1) = 22 res(2) = 23 getColB = res end function
function getColC() ' simulate fetch from DB dim res(0) res(0) = 31 getColC = res end function
function getVal(x, i) if i <= ubound(x) then getVal = x(i) else getVal = "" end if end function %>
<% dim a, b, c a = getColA() b = getColB() c = getColC() dim n n = ubound(a) if ubound(b) > n then n = ubound(b) end if if ubound(c) > n then n = ubound(c) end if %> <table border="1"> <tr> <th>A</th> <th>B</th> <th>C</th> </tr> <tr valign="top"> <td><%=join(a,"<br>")%></td> <td><%=join(b,"<br>")%></td> <td><%=join(c,"<br>")%></td> </tr> </table>
Du har ret, det er svært at overskue. For at gøre en lang historie kort, har jeg prøvet at lave det så brugervenligt og enkelt som overhovedet muligt. For lige kort at ridse det op:
1. Brugerens navn er automatisk valgt i <select>, når brugeren kommer ind på siden. Den pågældende bruger kan også vælge en anden bruger. Man vælger den bruger, som man ønsker at rette statusen på
2. Man trykker på den submit button med den ønskede status, og det bliver automatisk gemt i databsen ved bare at trykke
3. "status" bliver gemt i databasen. Den næste knap kunne have værdien 900. Det er ligegyldigt, man kan trykke sig frem og tilbage efter behag
4. Når der er trykket på en submit, og status ændres f.eks. 200 til 900, bliver det automatisk gemt
Alt det ovenstående virker perfekt, det er stabilt og solidt. Ingen problemer.
Jeg forfatter lige min udfordring, som udelukkende er at få det korrekt i <table></table>. Øjeblik .....
Min udfordring er så med det nedenstående: Hvis jeg rykker BRUGER1 fra status 200 (første kolonne) til status 400 (sidste kolonne), så forsvinder alt mellem <tbody> og </tbody>. Er der en bruger i 1. kolonne, og en bruger i anden kolonne, er det fint nok.
<table> <thead> <tr> <th>A</th> <th>B</th> <th>C</th> </tr> </thead> <tbody> <tr> <td>[BRUGER1],status=200]</td><!-- DENNE KOLONNE BENYTTES TIL status=200 --> <td>[BRUGER2],status=300</td><!-- DENNE KOLONNE BENYTTES TIL status=300 --> <td></td><!-- DENNE KOLONNE BENYTTES TIL status=400 --> </tr> </tbody> </table>
Men trykker jeg BRUGER1 fra 1. kolonne (status=200) til 3. kolonne (status=400), så er det, at alt forsvinder mellem <tbody> og </tbody>
Der burde nu stå
<table> <thead> <tr> <th>A</th> <th>B</th> <th>C</th> </tr> </thead> <tbody> <tr> <td></td><!-- DENNE KOLONNE BENYTTES TIL status=200 --> <td>[BRUGER2],status=300</td><!-- DENNE KOLONNE BENYTTES TIL status=300 --> <td>[BRUGER1],status=400]</td><!-- DENNE KOLONNE BENYTTES TIL status=400 --> </tr> </tbody> </table>
Hvis der er mere end én bruger med status=200 i 1. kolonne, fungerer det fint. Så kan man bare trykke rundt som man lyster.
Det er altså kun, hvis der kun er én bruger med status=200, at kæden hopper af. Måske p.gr.a. noget EOF. Det kan jeg ikke gennemskue.
Det kører gennem en løkke: Hvis der ikke er nogen bruger med status = 200 i første kolonne, så vis en "-". Ellers vis [BRUGER1]. Det er sådan det er tiltænkt. Det samme gælder for kolonne 2 og kolonne 3
Jeg forfatter lige et spørgsmål til dine 2 eksempler, du gav mig (til inspiration), øjeblik ...........
Ja. Den rigtige kode skal hente værdierne fra databasen og ligge dem ind i et array.
Pointen er at det er lidt nemmere at arbejde med et array end en database forbindelse, så DB->array->HTML table er nemmere at styre ebd DB->HTML table, når det er lidt kompliceret.
'CREATE TABLE nums(num INTEGER NOT NULL,PRIMARY KEY(num)) 'GO 'INSERT INTO nums VALUES(11) 'GO 'INSERT INTO nums VALUES(12) 'GO 'INSERT INTO nums VALUES(21) 'GO 'INSERT INTO nums VALUES(22) 'GO 'INSERT INTO nums VALUES(23) 'GO 'INSERT INTO nums VALUES(31) 'GO
function query(sqlstr) Set con = Server.CreateObject("ADODB.Connection") con.Open "Provider=SQLNCLI11; Server=ARNEPC4; Database=Test; Trusted_Connection=yes;" Set rs = Server.CreateObject("ADODB.Recordset") rs.Open sqlstr, con res = rs.GetRows() Set rs = Nothing Set con = Nothing query = res end function
function getColA() getColA = query("SELECT num FROM nums WHERE num BETWEEN 10 AND 19") end function
function getColB() getColB = query("SELECT num FROM nums WHERE num BETWEEN 20 AND 29") end function
function getColC() getColC = query("SELECT num FROM nums WHERE num BETWEEN 30 AND 39") end function
function getVal(x, i) if i <= ubound(x, 2) then getVal = x(0, i) else getVal = "" end if end function %>
<% dim a, b, c a = getColA() b = getColB() c = getColC() dim n n = ubound(a, 2) if ubound(b, 2) > n then n = ubound(b, 2) end if if ubound(c, 2) > n then n = ubound(c, 2) end if %> <table border="1"> <tr> <th>A</th> <th>B</th> <th>C</th> </tr> <% dim i for i = 0 to n %> <tr> <td><%=getVal(a, i)%></td> <td><%=getVal(b, i)%></td> <td><%=getVal(c, i)%></td> </tr> <% next %> </table>
Set RSzx = Server.CreateObject("ADODB.Recordset") RSzx.Open SQLstr, Conn res = RSzx.GetRows() Set RSzx = Nothing Set Conn = Nothing Query = res End Function
Function getColA() getColA = query("SELECT username, category, status status FROM users WHERE status = 200") End Function
Function getColB() getColB = query("SELECT username, category, status FROM users WHERE status = 300") End Function
Function getColC() getColC = query("SELECT username, category, status FROM users WHERE status = 400") End Function %>
ADODB.Recordset error '800a0bcd'
Either BOF or EOF is True, or the current record has been deleted. Requested operation requires a current record.
/includes/functions.asp, line 17
Linie 17 : res = RSzx.GetRows()
Kræver det en - If Not RSzx.EOF Then - et eller andet sted?
'CREATE TABLE nums(num INTEGER NOT NULL,PRIMARY KEY(num)); 'INSERT INTO nums VALUES(11); 'INSERT INTO nums VALUES(12); 'INSERT INTO nums VALUES(21); 'INSERT INTO nums VALUES(22); 'INSERT INTO nums VALUES(23); 'INSERT INTO nums VALUES(31);
function query(sqlstr) Set con = Server.CreateObject("ADODB.Connection") con.Open "Driver={MySQL ODBC 5.3 ANSI Driver};Database=Test;User Id=root;Password=xxxxxx;" Set rs = Server.CreateObject("ADODB.Recordset") rs.Open sqlstr, con res = rs.GetRows() Set rs = Nothing Set con = Nothing query = res end function
function getColA() getColA = query("SELECT num FROM nums WHERE num BETWEEN 10 AND 19") end function
function getColB() getColB = query("SELECT num FROM nums WHERE num BETWEEN 20 AND 29") end function
function getColC() getColC = query("SELECT num FROM nums WHERE num BETWEEN 30 AND 39") end function
function getVal(x, i) if i <= ubound(x, 2) then getVal = x(0, i) else getVal = "" end if end function %>
<% dim a, b, c a = getColA() b = getColB() c = getColC() dim n n = ubound(a, 2) if ubound(b, 2) > n then n = ubound(b, 2) end if if ubound(c, 2) > n then n = ubound(c, 2) end if %> <table border="1"> <tr> <th>A</th> <th>B</th> <th>C</th> </tr> <% dim i for i = 0 to n %> <tr> <td><%=getVal(a, i)%></td> <td><%=getVal(b, i)%></td> <td><%=getVal(c, i)%></td> </tr> <% next %> </table>
Kan det skyldes, at jeg allerede har en Conn.Open på siden? Der bliver jo puttet en ekstra ind. Det eksempel du er kommet med, er vel et unikt eksempel, hvor jeg har forsøgt at implementere det på en eksisterende side, hvor der allerede er åben connection.
Set RSzx = Server.CreateObject("ADODB.Recordset") RSzx.Open SQLstr, Conn res = RSzx.GetRows() Set RSzx = Nothing Set Conn = Nothing Query = res End Function
Function getColA() getColA = query("SELECT username, category, vStatus FROM users WHERE vStatus = 200 ORDER BY category, username DESC") End Function
Function getColB() getColB = query("SELECT username, category, vStatus FROM users WHERE vStatus = 300 ORDER BY category, username DESC") End Function
Function getColC() getColC = query("SELECT username, category, vStatus FROM users WHERE vStatus = 400 ORDER BY category, username DESC") End Function
Function getVal(x, i) If i <= ubound(x, 2) then getVal = x(0, i) Else getVal = "-" End If End Function %>
Set RSzx = Server.CreateObject("ADODB.Recordset") RSzx.Open SQLstr, Conn1 res = RSzx.GetRows() Set RSzx = Nothing Set Conn1 = Nothing Query = res End Function
Function getColA() getColA = query("SELECT vStatus FROM lbusers WHERE vStatus = 200") End Function
Function getColB() getColB = query("SELECT vStatus FROM lbusers WHERE vStatus = 300") End Function
Function getColC() getColC = query("SELECT vStatus FROM lbusers WHERE vStatus = 400") End Function %>
Jeg må indrømme at jeg er lidt på bar bund. Et ligende eksempel virker hos mig. Din kode virker ikke hos dig. Og fejl beskeden er svært at tolke. Jeg tror at den dækker over at query er fejlet men uden at angive hvorfor. Hvis du udfører de eksakte queriews i PHPMyAdmin elle rhvad du nu bruger til at administrere databasen med - hvad sker der så?
Jeg vil prøve som du, at lave denne ene funktion på samme side, en helt ny side uden andre SQL forespørgsler. Virker dét, er der så åbenlyst noget der driller på min nuværende side. Men det er bare mærkeligt, for alt andet styrer uden om dette. Det giver ikke meget mening
Jeg giver snart op, og looper en button for hver bruger i en <div></div>. Det ved jeg da virker. Men så skal der laves 3 seperate divs, en for A, B og C.
Jeg kan bare ikke se hvordan den skal grejes. Og mit gæt er, at det fortsat vil fejle, hvis kolonne A eller B er tom. I det viste eksempel fra w3schools er der jo data i alle felter. Er du også en skrapsak til XML, Arne?
Jeg fik det delvist til at virke, men får den gammelkendte fejl, hvis der kun er én vStatus 200, eller én vStatus 300:
ADODB.Recordset error '800a0bcd'
Either BOF or EOF is True, or the current record has been deleted. Requested operation requires a current record.
/includes/lb_functions.asp, line 17
Set RS = Server.CreateObject("ADODB.Recordset") RS.Open sqlstr, con res = RS.GetRows() <!-- LINE 17 --> Set RS = Nothing Set Con = Nothing query = res End Function
Hvad får du, hvis du kun har én 200, eller én 300?
Det lykkedes ikke. Jeg opretter en enkelt <div></div> for hhv A, B og C, hvor alle brugerne bliver listet i én lang række, som jeg har benyttet tidligere. Utroligt, at noget, som bliver benyttet så mange steder på nettet er så besværligt :p Det havde jeg ikke lige set :) Men 1000 tak, din hjælp er som altid værdsat!
Synes godt om
Ny brugerNybegynder
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.