08. maj 2003 - 09:17Der er
18 kommentarer og 1 løsning
Knytte deltagere til aktivitet.
Jeg har behov for at kunne knytte deltagere til aktiviteter og gemme det i min database.
Jeg har en tabel med deltagere, der alle har et unikt id: 'navn_id' og aktiviteter med id: event_id. Desuden har jeg en tabel ('kombi') der består af felterne 'event_id' og 'navn_id', og min idé er at for hver deltager i aktiviteten skrives en ny række til 'kombi' med event_id og navn_id. Hvis der er 10 deltagere bliver der altså 10 rækker med samme 'event_id' i 'kombi'.
Jeg har p.t. en asp side der viser detaljerne for aktiviteten, og nedenunder viser en liste over samtlige personer i navnetabellen. Ud for hver af disse er en checkbox.
Jeg forestiller mig, at jeg henter alle rækker i 'kombi' tabellen, og loader navn_id'erne i et array, og sætter checkboxen til 'checked' for dem der er tilknyttet aktiviteten. Man skal så kunne tilføje/fjerne deltagere ved at ændre værdien i checkboxen.
Men så knækker filmen for mig. Jeg har behov for hjælp til: - At ændre checkboxens værdi på baggrund af array'et. - At lave koden der kontrollerer de valgte checkboxe med array'et, og tilføjer poster til 'kombi', når deltageren er ny, og fjerner linien i 'kombi', hvis deltageren er fjernet.
I dette særtema ser vi på, hvordan cloud og AI bliver fundamentet for virksomhedernes digitale forretning, og hvordan de nye muligheder for automatisering og forretningsværdi kan udnyttes uden at miste overblik, sikkerhed og menneskelig kontrol.
Hvis du henter navn og kombi i et recordset med fx SELECT * FROM navne left join kombi on navne.navn_id=kombi.event_id kan du afkrydse checkboxen hvor du har en kombi_id.
Hvis du sætte alle checkboxe til samme navn, og med navn_id som value, kan du requeste alle de tilmeldte på en gang, som en kommasepareret liste. Tilmeldte=Request.Form("Checkboxnavn")
Den kan du bruge med en IN operator i sql: Sql="INSERT INTO kombi (event_id,navn_id) select (" & eventID & ",navn_id) FROM navne WHERE navn_id IN (" & Tilmeldte & ")" conn.execute(Sql) Her får man selvfølgelig problemet med at de allerede kan optræde, men det kan klares i de fleste databaser ved at udvide den til fx: Sql="INSERT INTO kombi (event_id,navn_id) select (" & eventID & ",navn_id) FROM navne WHERE navn_id IN (" & Tilmeldte & ") AND NOT Exist(select navn_id FROM kombi WHERE kombi.navn_id=navne.navn_id)"
og modsat Sql="DELETE FROM kombi WHERE event_id=" & eventID & " AND navn_id NOT IN (" & Tilmeldte & ")" conn.execute(Sql)
Inserten skal lige udvides til også at kigge på eventen. Ellers kan man jo kun blive tilmeldt til én event ;-)
Sql="INSERT INTO kombi (event_id,navn_id) select (" & eventID & ",navn_id) FROM navne WHERE navn_id IN (" & Tilmeldte & ") AND NOT Exist(select navn_id FROM kombi WHERE kombi.navn_id=navne.navn_id AND kombi.event_id=" & eventID & ")"
Jeg har brug for lige at løbe det igennem fra toppen (bl.a. da jeg ikke har brugt left join før).
Hvis jeg bruger: "SELECT * FROM navne left join kombi on navne.navn_id=kombi.event_id" hvad får jeg så ud? Jeg kan ikke helt følge hvorfor jeg skal sætte navne.navn_id lig kombi.event_id.
Mit næste spørgsmål er hvordan jeg rent praktisk skal få afkrydset checkboxen, på baggrund af min query.
rs1 indeholder personernes data. rsdeltagere er dit recordset, men sidste event_id er ændret til navn_id, hvilket giver mig samtlige personer med angivelse af navn_id, navn og event_id, hvis de er knyttet til en event. Hvis de er knyttet til flere kommer der tilsvarende flere rækker i recordset'et.
/ Du kan så kigge på om event_id har et indhold med fx / if "" & rsDeltagere("event_id")="" then / Response.Write " checked" / end if / / eller / if isNull(rsDeltagere("event_id").Value) then
Åh ja. Den skal selvfølgelig lige afgrænses til den aktive event. Set rs1=conn.Execute("SELECT navne.navne_id, navne.personnavn, kombi.event_id FROM navne left join kombi on navne.navn_id=kombi.event_id AND kombi.event_id=" & eventID)
Det kan ikke lægges ind i en where, da der så SKAL optræde en event.
if isNull(rsDeltagere("event_id").Value) then Response.write "<TD class=TDRadioButton><INPUT TYPE='checkbox' value=" & rs1("navn_id") & " name='chk4' checked class=raiodbutton></td>" else Response.write "<TD class=TDRadioButton><INPUT TYPE='checkbox' value=" & rs1("navn_id") & " name='chk4' class=raiodbutton></td>" end if
Så lykkedes den del af det endeligt. I forhold til din kode, var jeg nødt til at lave et par ændringer: - jeg beholdt min rs1, som giver de persondata jeg skal bruge. Det var jeg nødt til, da jeg ikke kunne lave inner og left join i samme sql (eller kan man?). - Min rs2 svarer til din rsdeltagere. - Jeg sørger så for at steppe rs1 og rs2 samtidigt (movenext), og kigge vha. af:
if isNull(rs2("event_id").Value) then Response.write "<TD class=TDRadioButton><INPUT TYPE='checkbox' value=" & rs1("navn_id") & " name='chk4' class=raiodbutton></td>" else Response.write "<TD class=TDRadioButton><INPUT TYPE='checkbox' value=" & rs1("navn_id") & " name='chk4' checked class=raiodbutton></td>" end if
Der var byttet rundt på checked i dit forslag.
Jeg kigger lidt videre på at skrive til databasen, og vender tilbage.
Jeg har ingen problemer med at hente data fra checkboxene. Men den SQL der skal skrive nye rækker, hvis deltageren er ny giver en fejl [Sql="INSERT INTO kombi (event_id,navn_id) select (" & eventID & ",navn_id) FROM navne WHERE navn_id IN (" & Tilmeldte & ") AND NOT Exist(select navn_id FROM kombi WHERE kombi.navn_id=navne.navn_id AND kombi.event_id=" & eventID & ")"]
Til gengæld virker den der skal slette, hvis de er fjernet fra eventen.
Har du et bud på hvad fejlen er i "skrive SQL'en"?
Mht. inner og left join så er her min kombinerede SQL og min "rene" left join SQL. Den første virker ikke. Kan du se hvorfor?
SELECT navn_id, navn_for, navn_mellem, navn_efter, grad, osfunk, osstatus, kombi.event_id FROM osinsp INNER JOIN grad ON osinsp.grad_id = grad.grad_id INNER JOIN osfunk ON osinsp.osfunk_id = osfunk.osfunk_id INNER JOIN osstatus ON osinsp.osstatus_id = osstatus.osstatus_id LEFT JOIN kombi ON osinsp.navn_id = kombi.navn_id AND kombi.event_id = 4
SELECT osinsp.navn_id, osinsp.navn_for, kombi.event_id FROM osinsp LEFT JOIN kombi ON osinsp.navn_id = kombi.navn_id AND kombi.event_id = 4
Smid de to paranteser ud. Ved ikke hvorfor jeg skrev dem.
Sql="INSERT INTO kombi (event_id,navn_id) select " & eventID & ",navn_id FROM navne WHERE navn_id IN (" & Tilmeldte & ") AND NOT Exists(select navn_id FROM kombi WHERE kombi.navn_id=navne.navn_id AND kombi.event_id=" & eventID & ")"
Ah - selvfølgelig. Den ved jo ikke hvilken tabel den skal hente navn_id fra.
SELECT osinp.navn_id, navn_for, navn_mellem, navn_efter, grad, osfunk, osstatus, kombi.event_id FROM osinsp INNER JOIN grad ON osinsp.grad_id = grad.grad_id INNER JOIN osfunk ON osinsp.osfunk_id = osfunk.osfunk_id INNER JOIN osstatus ON osinsp.osstatus_id = osstatus.osstatus_id LEFT JOIN kombi ON osinsp.navn_id = kombi.navn_id AND kombi.event_id = 4
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.