Michel Vuijlsteke's weblog

Tales of Drudgery & Boredom.

Een dynamische website

Verzoeknummer voor Wannes: héél in de snelte een adresboek in een dynamische webpagina met een Accessdatabankje erachter. Ik ga ervaan uit dat het allemaal niet te complex moet zijn, dat de server een standaard-Windowsmachien is, en dat het beheer in Access zelf gebeurt.

Maak een nieuwe database in Access. De database zal maar een paar tabellen bevatten:

  • tblPostcodes: tabel met postcodes en gemeenten (die ik van alhier gaan halen ben, alleen die van Gent, ha!)
    • postcode_id: autonumber-veld, unieke code
    • postcode_code: eum, code
    • postcode_gemeente: naam van de gemeente
  • tblPersonen
    • pers_id: autonumber-veld, unieke code om de persoon mee te identificeren
    • pers_voornaam: tekstveld
    • pers_familienaam: tekstveld
    • pers_straat: tekstveld, bevat straat en nummer en wat er nog nodig zou zijn van het adres (ik moet zeggen dat ik maar zeer zelden een noodzaak vind om straat en nummer afzonderlijk te zetten, maar voel u vrij om het te doen als het nodig zou zijn)
    • pers_postcode_id: nummer dat verwijst naar de tabel met de Belgische postcodes. Voel u vrij om hier een tekstveld van te maken met gewoon “postcode / gemeente” in, of om dàt in het adresveld te steken en hier een land-code van te maken, maar goed.

Omdat ik het toch niet kan laten om het een béétje moeilijk te maken: contactmogelijkheden. Een mens die het allemaal zeer naief bekijkt, zou de tblPersonen-tabel bijvoorbeeld aanvullen op deze wijze:

  • tblPersonen, vervolg
    • pers_telefoon
    • pers_fax
    • pers_gsm
    • pers_email
    • pers_website

…om dat in de miserie te zitten als de persoon blijkt (zoals ik) meer dan één telefonnummer te hebben, of meer dan één e-mailadres of meer dan één website. Diezelfde mens zou dan misschien gaan doen van:

  • tblPersonen, vervolg
    twee

    • pers_telefoon2
    • pers_email2
    • pers_email3
    • pers_website2
    • pers_website3

…maar het mag duidelijk zijn dat dat een straatje zonder einde is. Er zijn gelukkig een aantal verschillende mogelijke oplossingen, waarvan dit er één is:

  • tblContact: een tabel met alle mogelijke contactmiddelen erin, zoals daar zouden kunnen zijn: telefoon, fax, e-mail, website, msn, deaftel, telex, etc. etc.
    • contact_id
    • contact_naam
  • tblPersoon_Contact: een tabel waarin alle telefoonnummer, e-mails etc. zitten, telkens met de code van de persoon van wie het ding is
    • pc_id: niet echt nodig, maar alla
    • pc_pers_id: unieke code van de persoon
    • pc_contact_id: unieke code van het soort contactmiddel
    • pc_data: het eigenlijke telefoonnummer of e-mailadres, msn ID, etc.

Al die dingen aangemaakt in Access, en dan naar het Relationship-venster gegaan, en lijntjes trekken:

Adressen

Een beheerformuliertje in Access: niets zo gemakkelijk. Create form in design view vind ik hier het gemakkelijkst. Als je bij de form properties (dat kleine vierkantje linksboven, daar rechtermuisknop > properties doen) de Record Source op tblPersonen zet, kun je een field list tevoorschijn toveren:

Fieldlist

Versleep voornaam, familienaam en straat en postcode naar het formulier, en dat geef dan dit:

Adres1

Volgende stap: ervoor zorgen dat die ostcode een dropdowntje wordt in plaats van een invulveld voor een getal. Easy peasy: rechterklik op het postcodeveld, convert to > combobox, weer rechtermuisklik, properties, bij Data de Row Source op tblPostcodes zetten, Column Count op 3 (zodat ID en code en naam te zien zijn), en width op “0;.8cm” zetten zodat het id niet meer te zien is en de postcode wat minder ruimte dan standaard inneemt. Resultaat:

Adres2

(natuurlijk zou het ook kunnen om in de plaats daarvan de Row Source te zetten op SELECT tblPostcodes.postcode_id, postcode_code & ' ' & postcode_gemeente AS gemeente FROM tblPostcodes order by postcode_gemeente;, dan moeten er maar twee kolommen zijn en kan Width op 0cm staan, simpeler dan trial and error zoeken naar de breedte voor de postcode) (in fact, ik ga het zo doen:)

Adres2b

En dan nu, voor de piece de résistance: een subformulier met de contactmogelijkheden voor elke persoon. Als je op de subform-knop duwt (Subform), krijg je een wizard te doorlopen. De defaultkeuzes zouden ervoor moeten zorgen dat alles in orde komt, maar als dat niet het geval is:

  • Record source voor het subformulier is SELECT * FROM tblContact INNER JOIN tblPersoon_Contact ON tblContact.contact_id=tblPersoon_Contact.pc_contact_id;
  • link master field is pers_id, link child field is pc_pers_id

Verwijder alle velden behalve pc_contact_id en pc_data, en converteer pcontacid naar een combobox. Resultaat zou iets in deze zin moeten zijn:

Adres3

Enfin, zou moeten.

Download adres.zip mocht het niet zijn wat het moet zijn 🙂

Next: het ding op een website pleuren. De database ergens zetten en er een ODBC-connectie naar leggen (ik heb ze, heel creatief, “adres” genoemd). Een asp-pagina aanmaken (opnieuw heel erg creatief, “default.asp” genoemd), en de connectie opensmijten, bijvoorbeeld (want er zijn weer stapels verschillende wijzen) op deze manier:

dim cn, rs, qry
set cn=Server.CreateObject("ADODB.Connection")
set rs=Server.CreateObject("ADODB.Recordset")
cn.open "DATA SOURCE=adres;"

cn is de connectie, rs is, erm, de recordset, en qry is een variabele waar later een query string in komt.

…next, data in de recordset krijgen:

qry="select * from tblPersonen order by pers_familienaam"
rs.open qry,cn

en nu dat het in rs helemaal vol data zit, die data er weer uit halen.

do while not rs.EOF ' zolang er gerief in zit
   response.write rs.fields("pers_voornaam")&" <a href=""persoon.asp?p="&rs.fields("pers_id")&""">"&rs.fields("pers_familienaam")&"</a><br />"
   rs.MoveNext
loop

…en eens dat alles getoond is: proper de recordset en de connectie weer toedoen:

rs.close
cn.close

Dat geeft een lijst van alle personen in de database, met een link op hun achternaam naar een nieuwe pagina, waar het id van die persoon wordt naar meegegeven in de url. Iets als persoon.asp?p=3.

Ja, dat zou ook allemaal properder kunnen en zo, maar bon. In persoon.asp zou je dan precies etzelfde kunnen doen, maar dan met alle data uit de database en niet alleen de naam. Dus precies hetzelfde maar met deze query in de plaats van de vorige:

qry="select * from tblPersonen, tblPostcodes where tblPersonen.pers_postcode_id=tblPostcodes.postcode_id and tblPersonen.pers_id="&request.querystring("p")

Die worden getoond:

do while not rs.eof
   response.write "<p><strong>"&rs.fields("pers_voornaam")&" "&rs.fields("pers_familienaam")&"</strong><br />"
   response.write rs.fields("pers_straat")&"<br />"
   response.write rs.fields("postcode_code")&" "&rs.fields("postcode_gemeente")&"</p>"
   rs.movenext
loop

…en dan worden de contactmiddelen van die persoon opgesnord en getoond, bijvoorbeeld op deze manier:

qry="select * from tblContact, tblPersoon_contact where tblPersoon_contact.pc_contact_id=tblContact.contact_id and tblPersoon_contact.pc_pers_id="&request.querystring("p")
rs.open qry, cn

response.write "<p>"
do while not rs.eof
   response.write "<em>"&rs.fields("contact_naam")&"</em> "&rs.fields("pc_data")&"<br />"
   rs.movenext
loop
response.write "</p>"

Download de asp-files. Geen idee of dit is wat Wannes in gedachten had, maar moeilijker dan dat is het dus niet om een dynamische webpagina te maken.

3 Reacties

  1. Wat een geweldig begin van de dag!
    Ik geloof dat ik hier wel een tijdje zoet mee ben!
    I’ll keep you posted!

  2. àlle postcodes vind je gratis, voor niets bij… de… post (website).

Zeg uw gedacht

© 2017 Michel Vuijlsteke's weblog

Thema gemaakt door Anders NorenBoven ↑