Avatar billede svjensen Nybegynder
08. maj 2003 - 09:17 Der 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.
Avatar billede svjensen Nybegynder
08. maj 2003 - 09:19 #1
Jeg glemte lige at nævne at 'kombi' naturligvis også har et kombi_id felt.
Avatar billede mortrr Praktikant
08. maj 2003 - 09:30 #2
Du skriver ikke hvilken database du bruger.

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)


Sån cirka da. ;-)
Avatar billede svjensen Nybegynder
08. maj 2003 - 09:36 #3
jeg bruger MS SQL.
Jeg prøver lige at arbejde lidt med dit forslag.

I'll be back
Avatar billede mortrr Praktikant
08. maj 2003 - 09:41 #4
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 & ")"
Avatar billede svjensen Nybegynder
08. maj 2003 - 10:59 #5
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.
Avatar billede mortrr Praktikant
08. maj 2003 - 11:42 #6
Det bedste er at udvælge de specifikke felter, da du har flere felter med samme navn.

Set rsDeltagere=conn.Execute("SELECT navne.navne_id, navne.personnavn, kombi.event_id FROM navne left join kombi on navne.navn_id=kombi.event_id")

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
Avatar billede svjensen Nybegynder
08. maj 2003 - 12:11 #7
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.

Her er den kode jeg har p.t.:

while not rs1.EOF
    .
    .
    .
    .
    .
    .
    .
    Response.write "<TD class=TDRadioButton><INPUT TYPE='checkbox' value=" & rs1("navn_id") & " name='chk4'     class=raiodbutton></td>"
    .
    .
    .
    .
    .
    .
    .
wend

--------
Hvordan skal jeg anvende dit forslag:

/ 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
Avatar billede mortrr Praktikant
08. maj 2003 - 12:19 #8
Å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
Avatar billede svjensen Nybegynder
08. maj 2003 - 12:52 #9
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.

Søren
Avatar billede mortrr Praktikant
08. maj 2003 - 13:07 #10
Jo - du kan sagtens lave inner og left join i samme.
Avatar billede svjensen Nybegynder
08. maj 2003 - 13:07 #11
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"?
Avatar billede mortrr Praktikant
08. maj 2003 - 13:10 #12
exists (der mangler et s)

Ellers ser den meget rigtig ud.
Avatar billede svjensen Nybegynder
08. maj 2003 - 13:19 #13
Det prøver jeg lige.

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
Avatar billede svjensen Nybegynder
08. maj 2003 - 13:23 #14
Skrive SQL'en virker stadig ikke. I forhold til en "normal" INSERT INTO syntes jeg også at jeg mangler VALUES???
Avatar billede mortrr Praktikant
08. maj 2003 - 13:30 #15
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 & ")"

Den anden select ser da meget fin ud.

Så du ikke nogen fejlmeddelelser?
Avatar billede mortrr Praktikant
08. maj 2003 - 13:32 #16
Så = Får
Avatar billede svjensen Nybegynder
08. maj 2003 - 13:46 #17
Væk med paranteserne og det virker. FEDT.

Mht. inner/left join problemet, så får jeg følgende fejlmeddelelse:

error '80040e14'
/iv/openskies/eventdetaljer.asp, line 30

, hvor line 30 er den linie hvor jeg har "set rs = conn.execute(strSQL).

Du må meget gerne hjælpe mig med det, hvis du orker, men du har til fulde fortjent dine point for din indsats indtil videre.

Søren
Avatar billede mortrr Praktikant
08. maj 2003 - 13:50 #18
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
Avatar billede svjensen Nybegynder
08. maj 2003 - 14:04 #19
Det var da det det var.

Jeg takker

Søren
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