Op deze website gebruiken we cookies om content en advertenties te personaliseren, om functies voor social media te bieden en om ons websiteverkeer te analyseren. Ook delen we informatie over uw gebruik van onze site met onze partners voor social media, adverteren en analyse. Deze partners kunnen deze gegevens combineren met andere informatie die u aan ze heeft verstrekt of die ze hebben verzameld op basis van uw gebruik van hun services. Meer informatie.

Akkoord

Vraag & Antwoord

Webprogrammeren & scripting

[ASP] Meerdere tabellen

active85
8 antwoorden
  • Ik heb een MySQL tabel kader en een tabel teams.
    In de tabel kader staan trainergegevens en bij welk team ze horen. In de tabel teams staan de gegevens van de teams (hoe kan het he).

    Door te klikken op een link wordt een team gekozen. Er wordt dus een SELECT gemaakt op beide tabellen op de teamnaam. Met een LOOP worden de trainers van het geselecteerde team netjes onder elkaar getoond in een <TABLE>. Werkt perfect.

    Daarna moet eenmalig de klasse van een team worden weergegeven uit de tabel teams. En daar gaat het fout. Wie weet raad ?

    Ik hoop dat ik het zo voldoende duidelijk omschreven heb.
  • zou je misschien de code die je nu gebruikt kunnen posten en hoe je database eruit ziet?
  • Dit is de code, weet alleen niet waar ik het gedeelte van de teamklasse moet laten

    set objRS=objConnection.execute("SELECT NAWkader.Functie, NAWkader.Voornaam, NAWkader.Tussenvoegsel, NAWkader.Achternaam, NAWkader.Telefoon, NAWkader.Mobiel, NAWkader.Email, teams.team, teams.klasse, teams.knvbnajaar, teams.knvbvoorjaar, teams.fotolink, teams.alttekstfoto, teams.sitelink FROM NAWkader, teams WHERE NAWkader.TeamNU = '"& strTeam &"' ORDER BY NAWkader.groep1, NAWkader.groep2, NAWkader.groep3 ")

    While Not objRS.EOF
    Response.Write "<tr><td><b>" & objRS.Fields("Functie") & "</b></td><td>" & objRS.Fields("Voornaam") & " " & objRS.Fields("Tussenvoegsel") & " " & objRS.Fields("Achternaam") & "</td><td>" & objRS.Fields("Telefoon") & "<br>" & objRS.Fields("Mobiel") & "</td><td><a href='mailto:" & objRS.Fields("Email") & "'>" &"mail" & "</a></td></tr>"
    objRS.MoveNext
    Wend

    Response.Write objRS.Fields("klasse")

    objRS.Close
    Set objRS=Nothing
    objConnection.Close
    Set objConnection=Nothing
    %>
  • doe een GROUP BY classe in je query

    edit: we waren tegelijk aan het posten :)
    ik zie dat je hem al output. je kan het ook bewaren in een variable en na de loop die variabele uitlezen.
  • Ik ben nog niet zo goed in ASP, hoe zet ik de waarde in een variabele en hoe lees ik die dan uit ? En vooral, waar lees ik die dan uit.
  • Dit is één van de mogelijkheden. Een beetje suf om bij elke loop de klasse opnieuw te 'zetten', de waarde wijzigt immers niet, maar dat ga je in performance niet merken.

    [code:1:79254d71af]
    Dim klasse

    While Not objRS.EOF
    klasse = objRS.Fields("klasse")

    Response.Write "<tr><td><b>" & objRS.Fields("Functie") & "</b></td><td>" & objRS.Fields("Voornaam") & " " & objRS.Fields("Tussenvoegsel") & " " & objRS.Fields("Achternaam") & "</td><td>" & objRS.Fields("Telefoon") & "<br>" & objRS.Fields("Mobiel") & "</td><td><a href='mailto:" & objRS.Fields("Email") & "'>" &"mail" & "</a></td></tr>"
    objRS.MoveNext
    Wend

    Response.Write klasse
    [/code:1:79254d71af]

    Tip: een snellere manier om in je ADO recordset een value op te halen is via de Collect method.
  • Dank voor jullie snelle antwoorden.
    Ik heb e.e.a. aangepast zoals door jullie vermeld.

    Code ziet er nu zo uit:
    <%
    set objRS=objConnection.execute("SELECT NAWkader.Functie, NAWkader.Voornaam, NAWkader.Tussenvoegsel, NAWkader.Achternaam, NAWkader.Telefoon, NAWkader.Mobiel, NAWkader.Email, teams.team, teams.klasse, teams.knvbnajaar, teams.knvbvoorjaar, teams.fotolink, teams.alttekstfoto, teams.sitelink FROM NAWkader, teams WHERE NAWkader.TeamNU = '"& strTeam &"' ORDER BY NAWkader.groep1, NAWkader.groep2, NAWkader.groep3 ")

    While Not objRS.EOF

    klasse = objRS.Fields("klasse")

    Response.Write "<tr><td><b>" & objRS.Fields("Functie") & "</b></td><td>" & objRS.Fields("Voornaam") & " " & objRS.Fields("Tussenvoegsel") & " " & objRS.Fields("Achternaam") & "</td><td>" & objRS.Fields("Telefoon") & "<br>" & objRS.Fields("Mobiel") & "</td><td><a href='mailto:" & objRS.Fields("Email") & "'>" &"mail" & "</a></td></tr>"
    objRS.MoveNext
    Wend

    Response.Write klasse

    objRS.Close
    Set objRS=Nothing
    objConnection.Close
    Set objConnection=Nothing
    %>

    Ik krijg nu de klasse bovenaan te staan en de gegevens van de trainers eronder, maar dan elke trainer 2x, dus als volgt:

    2e klasse K
    Trainer Jan
    Trainer Jan
    Leider Piet
    Leider Piet

    Vreemd, ik zou toch verwachten dat eerst de While Wend wordt afgewerkt en dan de klasse pas wordt getoond. Het is nu net andersom.
    Bovendien krijg ik de klassegegevens van de eerste record in de tabel te zien, terwijl dat een andere record zou moeten zijn.
  • De reden dat je de trainers meerdere keren ziet, is dat je een join uitvoert tussen twee tabellen [b:b697296390]zonder[/b:b697296390] daarbij aan te geven waarop je de relatie legt. Je krijgt dan een cartesisch product van de twee tabellen.

    Een voorbeeldje van een join waarbij die relatie wel wordt gelegd:

    SELECT A.kolom, B.kolom, …
    FROM A, B
    WHERE [b:b697296390]A.fkId = B.Id[/b:b697296390]
    AND …[/color:b697296390]

    Het dikgedrukte deel is het punt waar je de relatie legt. Alleen de records waarvoor geldt dat de Foreign Key van tabel A (A.fkId) gelijk is aan de Primary key van tabel B (B.Id). Ik raad je aan om je wat in te lezen in deze materie. Niet alleen het joinen (of outerjoinen), maar ook andere SQL zaken (zoals bijv: group by) zul je nog vaak nodig hebben als je bezig bent met webscripting.

    by the way, een andere notatie van bovenstaande query is:

    SELECT A.kolom, B.kolom, …
    FROM A
    JOIN B ON [b:b697296390]A.fkId = B.Id[/b:b697296390]
    WHERE …[/color:b697296390]


    Ik vermoed dat je code dus iets moet worden als:

    [code:1:b697296390]
    set objRS=objConnection.execute("SELECT NAWkader.Functie, NAWkader.Voornaam, NAWkader.Tussenvoegsel, NAWkader.Achternaam, NAWkader.Telefoon, NAWkader.Mobiel, NAWkader.Email, teams.team, teams.klasse, teams.knvbnajaar, teams.knvbvoorjaar, teams.fotolink, teams.alttekstfoto, teams.sitelink FROM NAWkader, teams WHERE NAWkader.TeamNU = '"& strTeam &"' AND NAWkader.TeamNU = teams.team ORDER BY NAWkader.groep1, NAWkader.groep2, NAWkader.groep3 ")
    [/code:1:b697296390]

    Ik heb het volgende toegevoegd aan je where clause: AND NAWkader.TeamNU = teams.team[/color:b697296390].
    Maar zonder je tabeldefinitie is dat wel een wilde gok.

    Dat je klasse nu boven de tabel wordt geplaatst, komt waarschijnlijk omdat je de tabel niet afsluit na de loop.

    Dus:
    [code:1:b697296390]
    while …

    wend

    response.write "</table>"
    response.write klasse
    [/code:1:b697296390]

Beantwoord deze vraag

Dit is een gearchiveerde pagina. Antwoorden is niet meer mogelijk.