<map version="0.7.1">
<node TEXT="GKO, luennot 2.-3.4.2004">
<node TEXT="Delphi" FOLDED="true" POSITION="right">
<node TEXT="Kirja: Delphi-pikakurssi (VL)"/>
<node TEXT="Delphi vs. Visual Basic" FOLDED="true">
<node TEXT="Melkein yht&#xe4; helppok&#xe4;ytt&#xf6;inen kuin VB, mutta monipuolisempi"/>
<node TEXT="Sovelluskehitt&#xe4;j&#xe4; ei ole riippuvainen muilla kielill&#xe4; tehdyist&#xe4; komponenteista, kuten VB:ss&#xe4;"/>
<node TEXT="Delphill&#xe4; voi tehd&#xe4; my&#xf6;s omia komponentteja - vaikka Visual Basiciin (mahdollisuus ActiveX-komponenttien julkaisuun)"/>
<node TEXT="Object Pascal on oliokieli Basic ei (lukuunottamatta mahdollisesti VB:n viimeisimpi&#xe4; versioita)"/>
<node TEXT="Kylixin my&#xf6;t&#xe4; delphill&#xe4; on mahdollista tehd&#xe4; my&#xf6;s Linuxissa k&#xe4;&#xe4;ntyv&#xe4;&#xe4; koodia, mik&#xe4; tuntuu melko kaukaiselta ajatukselta VB:ssa :-)"/>
</node>
<node TEXT="K&#xe4;ytt&#xf6;liittym&#xe4;n esittely" FOLDED="true">
<node TEXT="komponenttipaletti"/>
<node TEXT="object inspector"/>
<node TEXT="k&#xe4;ytt&#xf6;liittym&#xe4;koodi ja pascal-koodi erotettu toisistaan"/>
<node TEXT="eritt&#xe4;in nopea k&#xe4;&#xe4;nn&#xf6;s (varsinkin C++:aan verrattuna)"/>
</node>
<node TEXT="object pascal -kielest&#xe4;" FOLDED="true">
<node TEXT="kehitetty borlandin turbo pascalista (DOS-ohjelmoijat muistanevat) =)"/>
<node TEXT="el&#xe4;inesimerkki"/>
<node TEXT="hybridikieli C++:n tapaan: rakenteinen ohjelmointikieli laajennettuna oliopiirteill&#xe4;" FOLDED="true">
<node TEXT="olioista huolimatta monet asiat tehd&#xe4;&#xe4;n edelleen rakenteisesti: perusaliohjelmakirjastot ovat _funktio_, ei oliokirjastoja (vrt. java)"/>
<node TEXT="rakenteiset tyypit laajasti k&#xe4;yt&#xf6;ss&#xe4;: tietueet, luetellut tyypit, joukot"/>
<node TEXT="Object Pascal vs. C++">
<node TEXT="C++:aan verrattuna huomattavasti luettavampi (makuasia?) ja havainnollisempi syntaksi, joka tosin vaatii enemm&#xe4;n tilaa">
<node TEXT="{ == begin, } == end, = == :=, == == = jne"/>
<node TEXT="aliluokkiin ei tarvitse kirjoittaa konstruktoria, jos muutoksia yliluokkaan verrattuna ei ole"/>
<node TEXT="virtuaalifunktiot ja niiden syrj&#xe4;ytt&#xe4;minen (override) merkitt&#xe4;v&#xe4; eksplisiittisesti koodiin (hyv&#xe4;!)"/>
<node TEXT="yliluokan metodeja kutsuttaessa avainsana inherited"/>
</node>
<node TEXT="Object Pascal ei tue moniperint&#xe4;&#xe4;, malleja (Templatet) eik&#xe4; operaattorien kuormitusta">
<node TEXT="moniperinn&#xe4;n voi osittain korvata rajapinnoilla ja koostamisella (t&#xe4;st&#xe4; lis&#xe4;&#xe4; my&#xf6;hemmin)"/>
<node TEXT="mallifunktioitakin voi &apos;matkia&apos; yksinkertaisissa tilanteissa"/>
</node>
<node TEXT="Metodiosoittimet C++:aa joustavammat ja huomattavasti helpommat k&#xe4;ytt&#xe4;&#xe4;">
<node TEXT="K&#xe4;ytet&#xe4;&#xe4;n tapahtumav&#xe4;lityksess&#xe4;"/>
<node TEXT="Metodiosoitin ei v&#xe4;ltt&#xe4;m&#xe4;tt&#xe4; ota kantaa olion luokkaan, kuten C++:ssa"/>
</node>
<node TEXT="Olioihin viitataan koodissa oletuksena viittein&#xe4;, C++:n &apos;automaattisia konkreettisia olioita&apos; ei ole"/>
<node TEXT="Perustyypit ja rakenteiset tyypit ovat konkreettisia (ei tarvita erillist&#xe4; muistinvarausta- ja vapautusta) "/>
<node TEXT="Kieless&#xe4; mukana dynaamiset taulukot ja aidot merkkijonot"/>
<node TEXT="C++:aa vahvempi tyypitys (esim. int ja boolean eiv&#xe4;t ole sama asia!)"/>
</node>
<node TEXT="oliot tapana nimet&#xe4; T-etuliitteell&#xe4; (Esim. TObject, TEdit, TLabel, TIniFile)">
<node TEXT="T == &quot;Type&quot;"/>
<node TEXT="painolastia Turbo Pascalista..."/>
</node>
<node TEXT="huom. delphiss&#xe4; on nyky&#xe4;&#xe4;n funktioiden kuormitus (vrt. delphi-moniste))"/>
</node>
<node TEXT="delphiss&#xe4; komponentti == TComponent-luokasta peritty olio" FOLDED="true">
<node TEXT="sis&#xe4;lt&#xe4;&#xe4; ominaisuuksia (propertyt) ja tapahtumia"/>
<node TEXT="komponentti voi olla visuaalinen (n&#xe4;kyy ruudulla, peritty TControl-luokasta) tai n&#xe4;kym&#xe4;t&#xf6;n (esim. tietokantayhteys)"/>
<node TEXT="ominaisuudet ovat er&#xe4;&#xe4;nlainen julkinen rajapinta tiettyihin attribuutteihin, osaa ominaisuuksista voidaan s&#xe4;&#xe4;t&#xe4;&#xe4; suunnitteluaikana"/>
<node TEXT="tapahtumat ovat k&#xe4;ytt&#xe4;j&#xe4;n (tai ohjelman) toimintoja, jotka aktivoivat tietyn kohdan ohjelmakoodissa (tapahtumak&#xe4;sittelij&#xe4;n)"/>
<node TEXT="komponentteja voidaan rekister&#xf6;id&#xe4; osaksi delphin k&#xe4;ytt&#xf6;liittym&#xe4;&#xe4; komponenttipalettiin"/>
<node TEXT="fyysisesti komponentit sijaitsevat BPL-kirjastoissa, jotka ovat muunneltuja DLL:ia."/>
<node TEXT="C++ Builder ja Delphi (uusimmat versiot) voivat k&#xe4;ytt&#xe4;&#xe4; samoja BPL-kirjastoja"/>
</node>
</node>
<node TEXT="Esimerkkiohjelma: autolaskuri" FOLDED="true">
<node TEXT="graafisten k&#xe4;ytt&#xf6;liittymien &quot;hello world&quot;"/>
<node TEXT="ohjelma sopii eri k&#xe4;ytt&#xf6;liittym&#xe4;kirjastojen perusideoiden esittelyyn"/>
</node>
<node LINK="http://community.borland.com/delphi/0,1419,1,00.html" TEXT="Lis&#xe4;materiaalia: Borland Developer network ja Delphin dokumentaatio"/>
</node>
<node TEXT="Tapahtumat" FOLDED="true" POSITION="left">
<node TEXT="Metodiosoittimia!"/>
<node TEXT="abstrahoivat Windowsin oman viestinv&#xe4;litysmekanismin (t&#xe4;st&#xe4; lis&#xe4;&#xe4; WinAPI-luennolla)"/>
<node TEXT="voidaan s&#xe4;&#xe4;t&#xe4;&#xe4; object inspectorista tai (usein joustavampaa) suoraan ohjelmakoodissa"/>
<node TEXT="tapahtumak&#xe4;sittelij&#xe4; voi sijaita miss&#xe4; osassa koodia tahansa, kunhan se on jossain oliossa" FOLDED="true">
<node TEXT="k&#xe4;sittelij&#xf6;iden sijoittelussa kannattaa noudattaa tervett&#xe4; j&#xe4;rke&#xe4;..."/>
<node TEXT="usein k&#xe4;sittelij&#xe4;n sijoittaminen kohdelomakkeelle (delphin oletus) on hyv&#xe4; ratkaisu"/>
<node TEXT="jos komponentit ja k&#xe4;sittelij&#xe4;t sijaitsevat samalla lomakkeella, delphin viitelaskuri hoitaa olioiden tuhoamisen"/>
<node TEXT="jos halutaan automatisoida suurta m&#xe4;&#xe4;r&#xe4;&#xe4; tapahtumia, jotka esim. sijaitsevat eri lomakkeilla, voi harkita esim. omaa luokkaa tapahtumak&#xe4;sittelyyn, jonne eri lomakkeiden tapahtumat ohjautuvat" FOLDED="true">
<node TEXT="esim. javassa melko yleist&#xe4; (javassa tapahtumak&#xe4;sittelij&#xe4;t ovat usein omissa olioissaan, mutta periaate on sama)">
<edge WIDTH="thin"/>
<font NAME="SansSerif" SIZE="12"/>
</node>
<node TEXT="t&#xe4;ll&#xf6;in muistinhallinnan kanssa on oltava tarkkana"/>
<node TEXT="jos tapahtumaluokan olio tuhotaan, siit&#xe4; on l&#xe4;hetett&#xe4;v&#xe4; ilmoitus kaikille, jotka sit&#xe4; k&#xe4;ytt&#xe4;v&#xe4;t (t&#xe4;m&#xe4; p&#xe4;tee yleisesti my&#xf6;s olioarvoisille ominaisuuksille)"/>
<node TEXT="ilmoitukset voi hoitaa TComponentit FreeNotification-metodilla (t&#xe4;st&#xe4; lis&#xe4;&#xe4; my&#xf6;hemminkin)"/>
</node>
</node>
<node TEXT="tapahtumia voi m&#xe4;&#xe4;ritell&#xe4; itsekin" FOLDED="true">
<node TEXT="t&#xe4;ll&#xf6;in k&#xe4;ytet&#xe4;&#xe4;n Pascalin tyyppim&#xe4;&#xe4;rityst&#xe4;"/>
<node TEXT="Mahdollistaa l&#xe4;hett&#xe4;j&#xe4;olion (Sender) k&#xe4;sittelyn ilman Typecasteja"/>
<node TEXT="lis&#xe4;&#xe4; luennolla &apos;Omat komponentit&apos;"/>
</node>
<node TEXT="Huom. ajettaessa tapahtumapohjaista ohjelmaa n&#xe4;ytt&#xe4;&#xe4; silt&#xe4;, ett&#xe4; tapahtumia kutsutaan &apos;itsest&#xe4;&#xe4;n&apos;" FOLDED="true">
<node TEXT="todellisuudessa tapahtumien pohjalla on edelleen periaatteessa switch/case/if-silmukka, joka k&#xe4;y jatkuvasti l&#xe4;pi mahdollisia tapahtumia">
<node TEXT="siis: windows-ohjelma(kin) on sy&#xf6;te/k&#xe4;sittely/tuloste-muotoa oleva, p&#xe4;&#xe4;ohjelmasta ja aliohjemista muodostuva ohjelma"/>
<node TEXT="p&#xe4;&#xe4;ohjelma ja kaikille ohjelmille yhteiset alustukset piilotettu k&#xe4;ytt&#xe4;j&#xe4;lt&#xe4; (sovelluskehys, Application Framework)"/>
</node>
<node TEXT="sovelluskehitt&#xe4;j&#xe4;n ei yleens&#xe4; (onneksi!) tarvitse v&#xe4;litt&#xe4;&#xe4; t&#xe4;st&#xe4; ns. Windowsin viestisilmukasta"/>
<node TEXT="tapahtumakutsut ovat tavallisia funktiokutsuja, jotka esim. kasvattavat kutsupinoa (ks. debug)"/>
<node TEXT="VAROITUS: toisiaan kutsuvien tapahtumak&#xe4;sittelij&#xf6;iden avulla on yll&#xe4;tt&#xe4;v&#xe4;n helppoa tehd&#xe4; ikuinen silmukka..."/>
<node TEXT="jos k&#xe4;sittelij&#xf6;it&#xe4; on PAKKO kutsua &apos;p&#xe4;&#xe4;llekk&#xe4;in&apos;, kannattaa k&#xe4;ytt&#xe4;&#xe4; esim. laskuria tai muuta tilamuuttujaa, joka varmistaa, ettei ikuista silmukkaa p&#xe4;&#xe4;se syntym&#xe4;&#xe4;n"/>
</node>
</node>
<node TEXT="Autolaskuri jatkuu..." FOLDED="true" POSITION="left">
<node TEXT="About-dialogi, drag&amp;drop"/>
</node>
<node TEXT="Tietokannat" POSITION="right">
<node TEXT="Tietokantapalvelimia" FOLDED="true">
<node TEXT="Kaupallisia: Oracle, MS SQL, ..."/>
<node TEXT="Open Source -ohjelmistoja: MySQL, PostgreSQL, FirebirdSQL (entinen InterBase)">
<node TEXT="MySQL laajasti k&#xe4;yt&#xf6;ss&#xe4; erityisesti Web-sovelluksissa"/>
</node>
<node TEXT="&quot;Lelu&quot;ohjelmia (desktop databases): MS Access, Paradox">
<node TEXT="Huom. soveltuvat hyvin henk. koht k&#xe4;ytt&#xf6;&#xf6;n ja tietokantaohjelmoinnin testaukseen"/>
<node TEXT="Ohjelmoinnin kannalta on melkein sama k&#xe4;ytet&#xe4;&#xe4;nk&#xf6; palvelinta vai desktop-tietokantaa"/>
</node>
</node>
<node TEXT="Yhteystyyppej&#xe4;" FOLDED="true">
<node TEXT="ODBC (Open DataBase Connectivity)" FOLDED="true">
<node TEXT="Microsoftin kehitt&#xe4;m&#xe4; yleisrajapinta yhteyksiin kaikkiin tietokantapalvelimiin verkon yli."/>
<node TEXT="K&#xe4;ytt&#xf6; vaatii palvelinkohtaisen ODBC-ajurin asennuksen kaikille asiakaskoneille."/>
<node TEXT="Sovellus kommunikoi palvelimen kanssa SQL-kielell&#xe4;">
<node TEXT="Sovellus ei ota kantaa palvelimeen, vaan ainoastaan ajurin nimeen"/>
<node TEXT="Mahdollistaa palvelimen vaihdon &quot;lennossa&quot; (tietokannan sis&#xe4;lt&#xf6; t&#xe4;ytyy tietysti siirt&#xe4;&#xe4; erikseen, t&#xe4;h&#xe4;n k&#xe4;y esim. Borlandin DataPump)"/>
<node TEXT="K&#xe4;yt&#xe4;nn&#xf6;ss&#xe4; eri palvelimien SQL-murteiden erot voivat aiheuttaa muutoksia koodiin">
<node TEXT="Turvallisinta k&#xe4;ytt&#xe4;&#xe4; Standardia SQL-koodia (SQL92 laajasti tuettu, uudemmissa palvelimissa SQL99)"/>
<node TEXT="SQL-koodin tarkastamiseen ks. Mimer SQL Validator"/>
<node TEXT="Ainoa t&#xe4;ysin SQL-standardia noudattava palvelin Ocelot"/>
<node TEXT="Muissa palvelimissa puutteita (esim. MySQL:n vanhemmat versiot eiv&#xe4;t tue alikyselyit&#xe4;) ja ep&#xe4;standardeja lis&#xe4;yksi&#xe4; (esim. AUTO_INCREMENT-kentt&#xe4;, k&#xe4;ytt&#xe4;j&#xe4;hallinta)"/>
</node>
</node>
<node TEXT="Eritt&#xe4;in laajalle levinnyt. K&#xe4;yt&#xe4;nn&#xf6;ss&#xe4; jokainen tietokantapalvelin tarjoaa ODBC-ajurin.&#xa;"/>
<node TEXT=" Java-pohjaisilla sovelluksilla vastaava rajapinta JDBC (Java DataBase Connectivity)">
<node TEXT="JDBC-ajureilla voidaan ottaa yhteys ODBC-kantoihin JDBC-ODBC -sillan kautta"/>
</node>
</node>
<node TEXT="ADO ja OleDB" FOLDED="true">
<node TEXT="OleDB = Microsoftin kehitt&#xe4;m&#xe4; uudempi COM-pohjainen rajapinta tietokantayhteyksiin" FOLDED="true">
<node TEXT="ODBC:n tapaan jokaiselle palvelimelle tarvitaan oma OleDB-ajuri"/>
<node TEXT="OleDB-ajurit ovat erikoistuneempia kuin ODBC-ajurit, mik&#xe4; mahdollistaa periaatteessa ODBC:t&#xe4; nopeamman yhteyden"/>
<node TEXT="ODBC:t&#xe4; monipuolisempi tietokannan k&#xe4;site: esim. s&#xe4;hk&#xf6;postikokoelma voidaan tulkita OleDB-&quot;tietokannaksi&quot;"/>
<node TEXT="Ei viel&#xe4; yht&#xe4; levinnyt kuin ODBC, ajurit eiv&#xe4;t yht&#xe4; luotettavia" FOLDED="true">
<node TEXT="Esim. MySQL:n OleDB-ajuri ei toimi kunnolla (kokeiltu on...)"/>
<node TEXT="T&#xe4;ll&#xe4; hetkell&#xe4; yleisin OleDB:n k&#xe4;ytt&#xf6;tapa on yhteys ODBC-ajuriin OleDB:ll&#xe4; (hidasta, mutta ohjelmointi suoraa ODBC:n k&#xe4;ytt&#xf6;&#xe4; helpompaa)"/>
</node>
</node>
<node TEXT="ADO (ActiveX Data Objects) = Kokoelma COM-komponentteja OleDB-yhteyksien k&#xe4;sittelyyn" FOLDED="true">
<node TEXT="Yksinkertaistaa huomattavasti OleDB:n ohjelmointia"/>
<node TEXT="K&#xe4;yt&#xf6;ss&#xe4; Delphin ADO-komponenteissa"/>
</node>
</node>
<node TEXT="Tietokantojen omat kehitysrajapinnat (APIt)" FOLDED="true">
<node TEXT="Yleens&#xe4; nopeampia kuin standardirajapinnat"/>
<node TEXT="Tietokantapohjaisten rajapintojen k&#xe4;ytt&#xf6; vaatii sitoutumista tietyn valmistajan komponentteihin"/>
<node TEXT="Jos tietokantapalvelinta t&#xe4;ytyy vaihtaa, my&#xf6;s osa koodista menee t&#xe4;ll&#xf6;in uusiksi"/>
</node>
<node LINK="http://searchdatabase.techtarget.com/sDefinition/0,,sid13_gci213238,00.html" TEXT="ODBC:st&#xe4;, ADO:sta ja OleDB:st&#xe4; lis&#xe4;tietoa Microsoftin sivuilla"/>
</node>
<node TEXT="Delphin tietokantakomponentit" FOLDED="true">
<node TEXT="Esimerkkiohjelma: TietokantaForm"/>
<node TEXT="Yleiskomponentit" FOLDED="true">
<node TEXT="TDataSet" FOLDED="true">
<node TEXT="Yhteinen yliluokka kaikille tietojoukoille!"/>
<node TEXT="Sis&#xe4;lt&#xe4;&#xe4; perusmetodit taulun selaamiseen (first, next, prev ym), tietojen p&#xe4;ivitykseen (edit, post, cancel) ja siirtoon muihin komponentteihin (FieldByName, yhteys k&#xe4;ytt&#xf6;liittym&#xe4;komponentteihin DataSourcen avulla)"/>
<node TEXT="Abstrakti luokka. Erikoistietokantoja varten k&#xe4;ytt&#xe4;j&#xe4; voi m&#xe4;&#xe4;ritell&#xe4; vaikka oman DataSet-aliluokkansa"/>
<node TEXT="Kehitt&#xe4;j&#xe4; voi m&#xe4;&#xe4;ritell&#xe4; manuaalisesti k&#xe4;ytt&#xf6;liittym&#xe4;komponenteissa n&#xe4;kyvien kenttien ominaisuuksia (Field-komponentit)">
<node TEXT="Kun SQL-kysely tehd&#xe4;&#xe4;n, Queryn oletustoteutus luo kent&#xe4;t &apos;lennossa&apos;"/>
<node TEXT="Omia s&#xe4;&#xe4;t&#xf6;j&#xe4; kannattaa tehd&#xe4;, jos k&#xe4;ytet&#xe4;&#xe4;n esim. ruudustoa ja lookup-kentti&#xe4;"/>
</node>
</node>
<node TEXT="TDataSource" FOLDED="true">
<node TEXT="Yhteyskomponentti TDataSet-luokan ja k&#xe4;ytt&#xf6;liittym&#xe4;komponenttien v&#xe4;lill&#xe4;"/>
<node TEXT="Mahdollistaa k&#xe4;ytt&#xf6;liittym&#xe4;n riippumattomuuden tietokantayhteyden tyypist&#xe4;"/>
</node>
<node TEXT="K&#xe4;ytt&#xf6;liittym&#xe4;komponentit" FOLDED="true">
<node TEXT="Ruudusto, Edit, Memo, ComboBox ym..." FOLDED="true">
<node TEXT="Jos DataSet-komponetti n&#xe4;ytt&#xe4;&#xe4; vain yhden taulun tietoja kerrallaan, kentti&#xe4; voi editoida suoraan!"/>
<node TEXT="Tietoja voi hakea editointia varten rajoitetusti my&#xf6;s toisesta taulusta (ns. lookup list, M-1 -suhde)"/>
<node TEXT="1-M -suhteiden n&#xe4;ytt&#xf6; (esim. henkil&#xf6;n puhelinnumerot) mahdollista m&#xe4;&#xe4;rittelem&#xe4;ll&#xe4; Master-Detail -suhde taulujen v&#xe4;lille"/>
<node TEXT="jopa M-M -suhteiden editointi mahdollista yhdist&#xe4;m&#xe4;ll&#xe4; Master-Detail tauluun Lookup-kentt&#xe4;!">
<edge WIDTH="thin"/>
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
<node TEXT="My&#xf6;s kuvat ja bin&#xe4;&#xe4;ridata (BLOB) mahdollisia"/>
<node TEXT="&apos;Data-aware&apos;-komponentteja: kun k&#xe4;ytt&#xe4;j&#xe4; alkaa editoida jotain kentt&#xe4;&#xe4;, DataSet-olio siirtyy muokkaustilaan"/>
<node TEXT="Kun k&#xe4;ytt&#xe4;j&#xe4; on tehnyt muutoksensa, ne v&#xe4;littyv&#xe4;t suoraan DataSet-komponentin avulla tietokantaan"/>
<node TEXT="Ei tarvita v&#xe4;ltt&#xe4;m&#xe4;ll&#xe4; SQL Update -lauseita (ainakaan, jos editoidaan yht&#xe4; tai kahta taulua kerrallaan)"/>
<node TEXT="Monimutkaisissa lomakkeissa voidaan tarvita my&#xf6;s omia s&#xe4;&#xe4;t&#xf6;j&#xe4; (erityisesti sy&#xf6;tteen tarkistukset). Mukautetut, useita tauluja sis&#xe4;lt&#xe4;v&#xe4;t kyselyt hakutoimintoja tai raportteja varten on tietysti teht&#xe4;v&#xe4; SQL:lla."/>
</node>
<node TEXT="VAROITUS: Delphin arkkitehtuuri mahdollistaa eritt&#xe4;in monipuoliset tietokantayhteydet yleisk&#xe4;ytt&#xf6;isill&#xe4; tietokantakomponenteilla, mutta niiden toimivuus on aina testattava! Palvelimissa, Windowsissa, ajureissa JA Delphin komponenteissa saattaa olla bugeja, jolloin m&#xe4;&#xe4;r&#xe4;tty palvelin-ajuri-yhteys-k&#xe4;ytt&#xf6;liittym&#xe4;yhdistelm&#xe4; ei toimi oikein!" FOLDED="true">
<edge WIDTH="thin"/>
<font NAME="SansSerif" BOLD="true" SIZE="12"/>
<node TEXT="Eri palvelimien SQL-murteissa eroja"/>
<node TEXT="Tarkista erityisesti lookup-kenttien toimiminen! (ADO+ODBC+MySQL delphin vanhemmalla versiolla: ep&#xe4;m&#xe4;&#xe4;r&#xe4;isi&#xe4; ongelmia lookup-kenttien tietojen p&#xe4;ivityksess&#xe4;!) :-(">
<edge WIDTH="thin"/>
<font NAME="SansSerif" SIZE="12"/>
</node>
<node TEXT="K&#xe4;yt&#xe4;nn&#xf6;ss&#xe4; Microsoftin j&#xe4;rjestelm&#xe4;t toimivat hyvin ADO:lla ja esim. Paradox ja muut borlandin omat ajurit BDE:ll&#xe4;"/>
<node TEXT="dbExpress ja ADO:n OLEDB ovat viel&#xe4; niin uusia tekniikoita, ett&#xe4; ajureissa saattaa olla virheit&#xe4; (ainakin MySQL)"/>
<node TEXT="ODBC:t&#xe4; pidet&#xe4;&#xe4;n hitaana, mutta toimii k&#xe4;yt&#xe4;nn&#xf6;ss&#xe4; hyvin l&#xe4;hes kaikilla tietokannoilla"/>
<node TEXT="Jos data-aktiiviset komponentit eiv&#xe4;t toimi oikein, suorat SQL-kyselyt ja p&#xe4;ivitykset Query-komponentilla toimivat kyll&#xe4;. T&#xe4;ll&#xf6;in k&#xe4;ytt&#xf6;liittym&#xe4;n voi tehd&#xe4; vaikka tavallisilla komponenteilla (ty&#xf6;l&#xe4;st&#xe4;, mutta toimii varmasti)"/>
</node>
</node>
<node TEXT="BDE" FOLDED="true">
<node TEXT="Natiiviajureita (esim. Paradox), ODBC..."/>
<node TEXT="BDE-yhteyksi&#xe4; hallitaan Borlandin BDE Administratorilla (l&#xf6;ytyy esim. Delphin p&#xe4;&#xe4;valikosta Database-&gt;Explore"/>
<node TEXT="Tietokantayhteys TDataBase-komponentilla, yhteyden tyyppi m&#xe4;&#xe4;ritell&#xe4;&#xe4;n BDE:n aliaksena, lis&#xe4;parametreja (esim. hakemistotiedot) voidaan antaa my&#xf6;s TSession-komponentilla"/>
</node>
<node TEXT="ADO" FOLDED="true">
<node TEXT="OLEDB-natiiviajureita (esim. Access), my&#xf6;s ODBC-yhteys mahdollinen"/>
<node TEXT="Tietokantayhteys TAdoConnection-komponentilla, parametrit m&#xe4;&#xe4;ritell&#xe4;&#xe4;n ConnectionString-merkkijonon avulla (voidaan tehd&#xe4; komponentin &apos;wizardilla&apos; tai k&#xe4;sin)."/>
</node>
<node TEXT="dbExpress" FOLDED="true">
<node TEXT="Vain tietokantakohtaiset dbExpress-ajurit"/>
<node TEXT="1-suuntainen DataSet (vain first- ja next -operaatiot)" FOLDED="true">
<node TEXT="Ruudustokomponenttia ei voi k&#xe4;ytt&#xe4;&#xe4; suoraan"/>
<node TEXT="Soveltuu esim. web-sovelluksiin, joissa tietokannan tulosteen generoidaan joka tapauksessa erikseen =&gt; ei tarvita &apos;aktiivisia&apos; tietokantakomponentteja"/>
<node TEXT="Datajoukon saa paikallisesti 2-suuntaiseksi yhdist&#xe4;m&#xe4;ll&#xe4; se ClientDataSet-komponenttiin"/>
</node>
<node TEXT="Nopea."/>
</node>
<node TEXT="Hajautettu tietokannan k&#xe4;sittely (ClientDataSet)" FOLDED="true">
<node TEXT="Tietojoukko kopioidaan editoinnin ajaksi sovelluksen muistiin, tietokantaa ei editoida suoraan kuten muilla yhteystyypeill&#xe4;"/>
<node TEXT="P&#xe4;ivitykset voidaan tehd&#xe4; keskitetysti kutsumalla TClientDataSetin metodia ApplyUpdates"/>
<node TEXT="Mahdollistaa tietokannan &apos;offline&apos;-editoinnin (&apos;briefcase model&apos;)"/>
<node TEXT="Yhteys tietokantaan Provider-komponenttien avulla. T&#xe4;ss&#xe4; &apos;tietokanta&apos; voi olla toinen samassa projektissa oleva DataSet tai XML-tietovirta"/>
</node>
</node>
<node TEXT="Tietokantasovelluksen suunnittelusta" FOLDED="true">
<node TEXT="Delphin &apos;database expert&apos;-velhojen ja vastaavien avulla ei oikeasti saa tehty&#xe4; leluohjelmia kummempia sovelluksia"/>
<node TEXT="Kaikkien lomakkeiden suunnittelu Delphin IDE:n avulla k&#xe4;sin on mahdollista, mutta suurissa sovelluksissa eritt&#xe4;in ty&#xf6;l&#xe4;st&#xe4; ja herkk&#xe4;&#xe4; tietokannan rakenteen muutoksille"/>
<node TEXT="Ihannetapauksessa (koodaajan kannalta) koko k&#xe4;ytt&#xf6;liittym&#xe4; luotaisiin dynaamisesti SQL-kyselyjen perusteella"/>
<node TEXT="K&#xe4;yt&#xe4;nn&#xf6;ss&#xe4; kaikkea ei kuitenkaan voida luoda t&#xe4;ysin dynaamisesti (k&#xe4;ytt&#xe4;j&#xe4;t vaativat sovitetun k&#xe4;ytt&#xf6;liittym&#xe4;n, 1-M ja M-M -suhteet vaativat erillist&#xe4; k&#xe4;sittely&#xe4;)"/>
<node TEXT="Sovellusta suunniteltaessa otettava huomioon mahdollinen tarve tietokannan rakenteen muutoksille">
<node TEXT="Klassinen tapaus: 1-M -suhde muutettava M-M-suhteeksi"/>
</node>
<node TEXT="Ratkaisuja " FOLDED="true">
<node TEXT="Mahdollisimman v&#xe4;h&#xe4;n &apos;k&#xe4;sin kirjoitettua&apos; SQL:aa. Tarvittavat SQL-lauseet keskitet&#xe4;&#xe4;n yhteen luokkaan tai luodaan dynaamisesti"/>
<node TEXT="Joskus osa rutiinitoimenpiteist&#xe4; kannattaa sijoittaan omaan DataSetista (tai Querysta) perittyyn luokkaan."/>
<node TEXT="Mahdollisiman v&#xe4;h&#xe4;n kytk&#xf6;ksi&#xe4; eri lomakkeiden v&#xe4;lille"/>
<node TEXT="Perinn&#xe4;n avulla voi s&#xe4;&#xe4;st&#xe4;&#xe4; huomattavasti koodia, jos tietokannassa on yleistyssuhteita"/>
<node TEXT="&apos;metaluokkien&apos; k&#xe4;ytt&#xf6;: jos kannassa on runsaasti samaa rakennetta olevia, mutta merkitykselt&#xe4;&#xe4;n erilaisia tauluja, k&#xe4;ytt&#xf6;liittym&#xe4;t niille kannattaa luoda dynaamisesti saman luokan variaatioina."/>
</node>
</node>
<node TEXT="Tietokantakursseja:" FOLDED="true">
<node TEXT="Tietokannat ja tiedonhallinta (ks. moniste)"/>
</node>
</node>
<node TEXT="Esimerkkiohjelma: Kerhon j&#xe4;senrekisteri ADO-komponenteilla" FOLDED="true" POSITION="right">
<node TEXT="Kyselyt ja taulut keskitetysti DataModuulissa"/>
<node TEXT="Master-Detail -suhteita ja lookup-kentti&#xe4; voi m&#xe4;&#xe4;ritell&#xe4; Diagrammina">
<node TEXT="Toimii samalla tietokannan dokumentaationa"/>
</node>
<node TEXT="Huom! Ei sis&#xe4;ll&#xe4; sy&#xf6;tteen tarkistuksia eik&#xe4; kunnollista raportointia eik&#xe4; hakutoimintoa"/>
<node TEXT="Malli sopii my&#xf6;s harkkaty&#xf6;n pohjaksi, jos aikomuksena tehd&#xe4; tietokantasovellus"/>
</node>
<node TEXT="Esimerkkiohjelma: puhlu" FOLDED="true" POSITION="right">
<node TEXT="ks. delphi-moniste, dynaamisesti luotavat datakontrollit"/>
<node TEXT="&apos;dynaaminen&apos; tietokantasovellus"/>
<node TEXT="K&#xe4;ytt&#xf6;liittym&#xe4;komponentit luodaan &apos;lennossa&apos; kyselyn perusteella, bonuksena html-ulostulo ja xml-synkronointi">
<node TEXT="Huom. my&#xf6;s XML-liit&#xe4;nt&#xe4;&#xe4; k&#xe4;ytet&#xe4;&#xe4;n ClientDataSetin kautta"/>
<node TEXT="XML:aa tarvitaan l&#xe4;hinn&#xe4;, jos tarkoituksena yhdist&#xe4;&#xe4; kahden ep&#xe4;yhteensopivan j&#xe4;rjestelm&#xe4;n tietoja"/>
</node>
<node TEXT="Jos k&#xe4;sitelt&#xe4;v&#xe4; tietokanta on laaja tai tietokannan rakenteeseen on odotettavissa muutoksia, t&#xe4;m&#xe4; on hyv&#xe4; tapa"/>
</node>
</node>
</map>
