64b0e41b1aaf7a95eb970654b81d74e3.ppt
- Количество слайдов: 163
Sjablonen Aldfaer 3. 3 Han Kortekaas Bron: Dick de Boer
Index ¡ ¡ ¡ ¡ ¡ september 2004 Inleiding Voorbeeld sjabloon Vergelijkingen Enige notities De verzameling (set) Deel III Schrijven van bestanden Deel II Selectie Tags met een vertaaloptie Metatags Datum formattering 2
¡ In deze presentatie zijn ook volledig uitgewerkte sjabloonvoorbeelden. ¡ Zie je de bovenstaande icoon, klik dan met de rechtermuis en ga naar de spreker notities. ¡ Met CTRL A en CTRL C selecteer en kopieer je de notitie en met CTRL V plak je de regels in een Kladblokbestand. september 2004 3
Wat zijn sjablonen ¡ ¡ Templates, waar de gebruiker zelf programmeercode in kan opnemen. Aldfaer vult met behulp van deze sjablonen de rapporten met de gevraagde gegevens. Door deze open structuur is het voor de gebruiker mogelijk om eigen rapporten te ontwikkelen. Het sjabloon kan met Kladblok (of andere teksteditor) geopend worden. Inleiding sjabloon algemeen 4
Naamgeving ¡ ¡ Naam van het sjabloon is vrij. Voor herkenbaarheid is de extensie verplicht. Er zijn twee soorten sjablonen 1. ‘normaal’ xxxxxx. asj 2. ‘bibliotheek’ xxxxxx. asjl Voorbeeld: 1. Geboorte. Namen. asj 2. Dutch. Date. Format. asjl Inleiding sjabloon algemeen 5
Normaal sjabloon ¡ ¡ In het sjabloon worden de codes die voor de uitvoer nodig zijn opgenomen. Als een voorgeprogrammeerde functie in een bibliotheek beschikbaar is, dan kan deze bibliotheek ‘gelinked’ worden. Het sjabloon wordt onder de map conform de InstellingenBestandenEigen sjablonen opgeslagen. Suggestie …AldfaerEigen Sjabloneneventueel submapxxxx. asj Inleiding sjabloon algemeen 6
Hoe krijg ik mijn rapport ¡ Het rapport wordt verkregen door in Aldfaer in de werkbalk op Overzichten Eigen rapporten eventueel submap het gewenste rapport aan te klikken (of het desbetreffende rapport-icoontje) ¡ Wij gebruiken als submap Lessen Inleiding sjabloon algemeen 7
Bibliotheek ¡ ¡ ¡ Omdat een bepaald gegeven meerdere keren opgevraagd kan worden is het handig om een apart sjabloon te maken voor deze terugkerende, dezelfde serie van codes; Bijvoorbeeld de opmaak van de datum Nederlands Engels Of de opmaak van zinsbouw Inleiding sjabloon algemeen 8
Programmeercode ¡ ¡ Om de Aldfaer data base te benaderen zijn een aantal codes ontwikkeld, de zogenaamde _TAGs. Als deze code wordt opgenomen in een sjabloon dan zal de _TAG gevuld worden met de inhoud van het data veld. Naast deze _TAGs kan ook Javascript en html gebruikt worden. De Aldfaer Help heeft een volledige lijst van de _TAGs. Inleiding sjabloon algemeen 9
Blok informatie ¡ ¡ De Tags vallen uiteen in een aantal soorten. Eén van de groepen Tags omsluit een blok. Als je de kinderen uit jouw gezin wilt zien dan kun je bedenken dat eerste blok ben jezelf tweede blok is je vader derde blok is de partner van je vader vierde blok zijn de kinderen Als je dus programma schrijft denk dan in deze stappen en teken dit eventueel uit. Een voorbeeld in sjabloontaal is dan: Inleiding sjabloon algemeen 10
Blok informatie ¡ Mijn naam is _NAMEFIRS _SURN en mijn vader is _FATHBEGI() _BIRTDATE() en mijn moeder_RELABEGI() _NAMEFIRS _SURN is _BIRTDATE geboren. Zij zijn _RELASTAR getrouwd. Hun kinderschaar bestaat uit _CHILBEGI() _LAST? _BEGI en _NAMENICK. _ELSE _NAMENICK _END _CHILEND _RELAEND _FATHEND ¡ Het bovenstaande is in een sjabloon beter in blokvorm op te schrijven: Inleiding sjabloon algemeen 11
Blok informatie ¡ Mijn naam is _NAMEFIRS _SURN en mijn vader is _FATHBEGI() _BIRTDATE() en mijn moeder _RELABEGI() _NAMEFIRS _SURN is _BIRTDATE() geboren. Zij zijn _RELASTAR() getrouwd. Hun kinderschaar bestaat uit _CHILBEGI() _LAST? _BEGI en _NAMENICK. _RELAEND _FATHEND ¡ ¡ _ELSE _NAMENICK _END _CHILEND Waarbij de tekst en informatie. Tags dus tussen de blokken staan. Elk blok is gerelateerd aan het voorgaande blok. Inleiding sjabloon algemeen 12
De TAG ¡ ¡ Voorbeeld van een _TAG: _BIRTDATE() = geboortedatum _SURN = achternaam _NAMEFIRS = voornamen Een zin als: Piet Jansen is op 25 januari 1984 geboren wordt in code _NAMEFIRS _SURN is _BIRTDATE() geboren. Tagnaam = uitsluitend hoofdletters Inleiding sjabloon algemeen 13
Soorten Tags ¡ Tags geven een waarde terug en zijn gerubriceerd in: groep 1 tekst groep 2 getallen, die met vertaal opties kunnen worden omgezet in tekst. groep 3 datum groep 4 tijd groep 5 parameter in een selectie groep 6 filters groep 7 loop-tags, met selectie mogelijkheid groep 8 loop-tags, zonder selectie mogelijkheid groep 9 end-tags die bij 7 en 8 horen groep 10 tags die niets retouneren groep 11 en 12 zijn de TAGs welke alleen nog voor compatibiliteit bestaan. Inleiding sjabloon algemeen 14
Voorbeeld soorten Tags ¡ ¡ ¡ groep 1 _SURN groep 2 _SEX(“Man; Vrouw; Onbekend”) groep 3 _BIRTDATE() groep 4 _BIRTTIME groep 5 _FAMIFILE groep 6 _UPPE groep 7 _FUNCBEGI( _T_TAG) groep 8 _WRITBEGI groep 9 _WRITEND groep 10 _SETDEF Er zijn GEEN Tags waarmee je kunt rekenen Sommige Tags worden met () geschreven. Hoewel de haken zonder de optie niet echt nodig is het beter om je er aan te wennen ze wél te schrijven. Inleiding sjabloon algemeen 15
Voorbeeld sjabloon Geboren. asj ¡ ¡ ¡ Open Kladblok of een andere tekst editor. Type op één regel _NAMEFIRS _SURN is _BIRTDATE() geboren. Sla het bestand op onder “alle type bestanden” AldfaerEigen. SjablonenLessenGeboren. asj Zoek het rapport onder de Aldfaer werkbalk Overzichten-Eigen rapporten-Lessen en klik aan. Het programma neemt automatisch de gegevens van de persoon in het hoofdvenster. Voorbeeld sjabloon 16
Het eerste resultaat ¡ ¡ ¡ De datum geeft standaard de voluit geschreven Nederlandse notatie met als voorvoegsel ‘op’ als de dag bekend is. Is alleen de maand bekend dan wordt het voorvoegsel ‘in’. Zo wordt ook ‘ongeveer’, ‘na’ en ‘vóór’ in de datumnotatie opgenomen. Voorbeeld sjabloon 17
Als er geen geboortedatum is? ¡ ¡ ¡ Het programma staat toe dat er vergelijkingen worden gemaakt. Stel voor dat de geboortedatum ontbreekt maar de doopdatum is wél bekend. Dan wordt de code: _NAMEFIRS _SURN is [: _BIRTDATE() geboren. : ]|[: _BAPTDATE() gedoopt. : ] Verander de regel in het sjabloon Geboren. asj en sla het sjabloon op als Geboren. Doop. asj Maak het rapport en merk het verschil. Voorbeeld sjabloon 18
En óók geen doopdatum? ¡ ¡ ¡ Dan loopt de zin niet lekker en wil je waarschijnlijk hebben Piet Jansen is op onbekende datum geboren. Dan wordt de code _NAMEFIRS _SURN is [: _BIRTDATE() geboren. : ]|[: _BAPTDATE() gedoopt. : ]|[&op onbekende datum geboren&] Sla op als Geboren. Doop. Onbekend. asj en bekijk het rapport. Voorbeeld sjabloon 19
De vergelijking ¡ ¡ ¡ Er zijn de volgende vergelijkingen | het alternatief [: : ] het OF blok [& &] het EN blok [? ? ] het TEST blok De vergelijking wordt altijd in combinatie met een Tag uitgevoerd. Vergelijkingen 20
Het alternatief ¡ ¡ ¡ Als je schrijft _BIRTDATE()|_BAPTDATE() dan zal éérst gekeken worden of de geboortedatum bekend is. De regel is: eerste _TAG bekend, dan expandeert die. Zo niet de eerstvolgende _TAG Enzovoorts. In een zin zul je méér leestekens willen opnemen. Vergelijkingen 21
¡ ¡ ¡ Bijvoorbeeld: [: *_BIRTDATE(): ]|[: ~_BAPTDATE(): ] om aan te geven welke datum het is geworden. Andere leestekens mogen dan niet afgedrukt worden. Het alternatiefteken wordt dan in combinatie met andere vergelijkingsblokken gebruikt. Vergelijkingen 22
Het OF blok ¡ ¡ ¡ [: . . : ] Alles binnen deze haken wordt geprint zodra er minstens één Tag expandeert. [: _SURN is in _BIRTPLAC geboren. : ] Zal dus expanderen zodra óf de naam óf de geboorteplaats gevuld worden. (Niet zo netjes want als de geboorteplaats niet bekend is krijg je Jansen is in geboren. ) dubbele spatie!! [: Dit is een test: ] expandeert niet want er is geen Tag die expandeert. Vergelijkingen 23
Het EN blok [&. . &] ¡ Alles binnen deze haken wordt geprint zodra alle Tags expanderen. ¡ De zin met codes [& _NAME is geboren op _BIRTDATE() &] geeft dus alléén output als zowel _NAME EN _BIRTDATE() zijn ingevuld. Vergelijkingen 24
Het TEST blok [? . . ? ] ¡ Alles binnen deze haken wordt nooit geprint. Er wordt geëvalueerd of de gebruikte Tag(s) gevuld is/zijn of niet. ¡ [: [? _BIRTDATE()? ]De geboortedatum is ingevuld. : ] Geeft alléén output als de datum ingevuld is. ¡ Vergelijkingen 25
Zoek op met [? . . ? ]| ¡ ¡ ¡ [? _BIRTDATE()? ]|[&De geboortedatum is niet ingevuld&] Deze code vergelijkt of de _BIRTDATE() gevuld is. Niet gevuld, dan wordt het alternatief genomen én geprint want de zin staat in een EN blok terwijl er géén Tags zijn die niet expanderen. Vergelijkingen 26
Zoek op met [? . . ? ]? ¡ ¡ ¡ In plaats van de vergelijkingsblokken te hanteren kan de ‘zoekfunktie’ ook anders geschreven worden. [? _BIRTDATE()? ]? _BEGI _ELSE De geboortedatum is niet ingevuld. _END Deze schrijfwijze bevordert de leesbaarheid en opent meerdere loop mogelijkheden. Vergelijkingen 27
Vergelijkingen in het [? . . ? ] blok. ¡ Operatoren: == gelijk? ! ongelijk? > groter dan? < kleiner dan? ¡ Deze operatoren mogen worden gebruikt bij een tekenstring of een getal. Vergelijkingen 28
¡ [? _NAME. _UPPE < B? ] zal kijken of de naam alfabetisch gezien kleiner is dan 'B'. Resultaat is dus met een 'A' beginnend. Het filter voor hoofd - en kleine letters _UPPE wordt hier gebruikt om te zorgen dat een 'b' en een 'B' hetzelfde behandeld wordt. Vergelijkingen 29
¡ [: [? _CHILAMOU == 1? ]Kind: : ]|[&Kinderen: &] print, ervan uitgaande dat er één of meer kinderen zijn, het woord 'Kind: ' indien er slechts één kind is, en 'Kinderen: ' indien er meer kinderen zijn. Let op dat, als er geen kinderen zijn, de bovenstaande formule het alternatief kiest omdat de eerste Tag geen “true” geeft. Vergelijkingen 30
¡ [: [? _CHILAMOU == 1? ]Kind: : ]| [: [? _CHILAMOU > 1? ]Kinderen: : ]| [&geen kinderen. &] is dus een betere functie omdat er nu wordt voorzien in de mogelijkheid dat er géén kinderen zijn. Vergelijkingen 31
De. _FILL tag ¡ ¡ Deze Tag is handig om een vergelijking te maken op een bepaalde string. De Tag kan zowel links, als rechts de te maken string opvullen (als dat nodig is) met een bepaald karakter. BIRTPLAC. _FILL (“*“; 10) geeft voor ‘De Lier’ De Lier**** BIRTPLAC. _FILL (10; ”*”) geeft voor ‘Amersfoort’ ***Amersfo Vergelijkingen 32
Let op ¡ ¡ Bij sommige (numerieke) _Tags werkt de vergelijking niet [? _TAG > 1? ] Maak dan eenvoudigweg een grotere vergelijking door [? A _TAG > A 1? ] (let op de spatie!!) Vergelijkingen 33
Commentaar (remarks) ¡ ¡ ¡ In een sjabloon is het aan te bevelen om notities te maken. Daarvoor wordt : . gebruikt. Alles na : . wordt als commentaar gezien, dus Als : . aan het begin van een sjabloonregel staat dan is die regel een opmerking. Staat : . na code dan wordt alles vanaf dat punt op die regel gezien als een opmerking en… Er wordt dan ook geen witruimte gegenereerd. Enige notities 34
Voorbeeld ¡ : . De volgende regel betekent dat …. ¡ _BIRTDATE() : . Deze tag wordt genomen omdat ……. Enige notities 35
Witruimte ¡ ¡ Het vermijden van spaties in een aangeroepen Tag luistert nauwkeurig. Een functie geeft exact wat er staat. _FUNCBEGI( x ) _FUNCEND geeft een spatie omdat die tussen de “) _” staat. Oplossing is _FUNCBEGI( x )[: : ]_FUNCEND Enige notities 36
Toetscombinaties ¡ ¡ Om een sjabloon vanuit Aldfaer te openen dan: Laat Windows het bestandtype extensie asj en asjl openen met jouw editor, bijvoorbeeld Crimson of Telch (volgende slide voor stappen) Ga naar Aldfaer werkbalk OverzichtenEigen rapportensubmap gebruik toets CTRL Shift en klik het rapport aan. Het sjabloon wordt geopend. Enige notities 37
Windows 2000 bestandstype invoeren ¡ ¡ ¡ ¡ Ga naar bureaublad en maak nieuwe map Open de map en klik werkbalk Extra Kies voor mapopties Kies bestandstypen Klik op Nieuw geavanceerd Vul in bij de extensie : ASJ en de naam ASJ bestand. Doe hetzelfde voor ASJL Verbind vervolgens de editor (zie volgende slide) Enige notities 38
Windows 2000 programma koppelen ¡ ¡ ¡ Ga naar het gemaakte sjabloon Geboren. asj Klik rechtermuis en kies ‘openen met’ En vervolgens ‘programma selecteren’ Uit de programmalijst klik je op de door jou gewenste editor en vink dan aan dat dit type altijd met dat programma geopend moet worden. Doe hetzelfde voor het type asjl Enige notities 39
Verzameling Set I inleiding t/m voorbeelden Set II nadere set tags en stringset Set III de moederset 40
Gegevensverzameling ¡ ¡ ¡ Om een verzameling van gegevens, verder een set genoemd, te maken is een zogenaamde _SETDEF() instructie. Er zijn twee sets mogelijk óf Personen óf Teksten, de ‘stringset’ genaamd (dus niet door elkaar in één set) Een persoon of een string (reeks van tekens) kan maar één keer in de set voorkomen. Verzamelingen Set Deel I 41
De Set deel I ¡ ¡ De set heeft een naam _SETDEF( piet ) Er zijn in één sjabloon meerdere sets mogelijk. Als de set niet meer nodig is kan die met _SETDEL( piet ) gesloten worden. De gegevens uit een set verwijderen doe je met _SETCLR( piet ) Verzamelingen Set Deel I 42
De set vullen ¡ ¡ ¡ Er zijn twee Tags om de set te vullen met gegevens: _SETADD( naam van de set ) _SETFILL( naam van de set ) We gaan eerst in op de _SETADD() In Deel III komt de _SETFILL() aan de orde Verzamelingen Set Deel I 43
De _SETADD(…) ¡ ¡ ¡ _SETADD( piet ) voegt de huidige persoon, waardoor al zijn gegevens opvraagbaar zijn, toe aan de set. _SETADD( piet , “dit is de eerste” ) voegt de tekst ‘dit is de eerste’ toe aan de set. _SETADD( piet , “_BIRTDATE() _SURN” ) voegt de geboortedatum en de naam toe aan de set. Verzamelingen Set Deel I 44
De set openen ¡ Om de gegevens van de set bijvoorbeeld af te drukken moet deze geopend worden met _SETBEGI( piet ) wat moet afgedrukt worden _SURN _BIRTDATE() als de loop klaar is sluit je de set met _SETEND Verzamelingen Set Deel I 45
Sjabloon leesbaarheid ¡ ¡ ¡ Merk op dat het de leesbaarheid van een sjabloon verbetert als de verschillende instructie’paren’ duidelijk zichtbaar blijven _SETBEGI( piet ) actie Tags _SETEND _FUNCBEGI( S_datum ) actie Tags _FUNCEND Verzamelingen Set Deel I 46
Voorbeeld ¡ ¡ Maak een sjabloon met de volgende regels _SETDEF( broers ) _FATHBEGI() : . Hier begint de vaderset _CHILBEGI() : . En de kinderset van de vader _MALE? : . Selectie op mannen _BEGI _SETADD( broers ) _END _CHILEND _FATHEND _SETSUB( broers ) : . verwijder huidige persoon _SETBEGI( broers ): . Open de set en druk af _NAME[: _NAMEPREF: ] _SURN _SETEND En bewaar als ………Broers. asj Verzamelingen Set Deel I 47
Rapport Broers ¡ ¡ ¡ Maak het rapport ‘broers’ Geen output? Tikfoutje? Heeft de huidige persoon wel een vader? Heeft de huidige persoon wel broers? Verzamelingen Set Deel I 48
Set operatoren ¡ ¡ ¡ _SETAMOU( broers ) geeft het aantal personen in de set Tik de volgende regel in het sjabloon ‘Broers. asj’ na _SETSUB( broers ) Er zijn _SETAMOU( broers ) broers: Sla op als Boers. Aantal. asj Maak het rapport Verzamelingen Set Deel I 49
Set operatoren ¡ _SETSORT( broers , Tag) sorteert de set op drie gegevens ¡ Voorbeeld: _SETSORT( iedereen, _SURN, _NAMEFIRS, _BIRTDATE()) Verzamelingen Set Deel I 50
De _SETFILL(…) ¡ ¡ ¡ Naast de _SETADD() kennen we deze Tag. De volledige syntax is: _SETFILL( setnaam , bereik , selectie ) Het bereik wordt aangegeven met: _ASCE voorgeslacht _DESC nageslacht _FAMIFILE iedereen _FAMITREE voor en nageslacht De selectie hoeft niet persé opgegeven te worden. Verzamelingen Set Deel I 51
Voorbeeld ¡ Maak een sjabloon met _SETDEF( iedereen ) _SETFILL( iedereen, _FAMIFILE) _SETSORT( iedereen , _SURN, _NAMEFIRS) _SETBEGI( iedereen ) _SURN _NAMEFIRS _BIRTDATE() _BIRTPLAC _SETEND ¡ ¡ Sla sjabloon op als ……Iedereen. asj Maak het rapport Verzamelingen Set Deel I 52
Alleen het voorgeslacht. . ¡ Verander het bereik _FAMIFILE in het sjabloon Iedereen. asj naar _ASCE en wijzig voor de leesbaarheid ‘iedereen’ naar ‘index’ Sla het sjabloon op als Voorgeslacht. asj Maak het rapport ¡ Doe dit ook voor _DESC en _FAMITREE ¡ ¡ Verzamelingen Set Deel I 53
Rapport Voorgeslacht ¡ ¡ Het rapport behoeft verfraaiing Als eerste een kolomindeling Gebruik makend van html Advies schrijf html altijd in kleine letters Verzamelingen Set Deel I 54
De _WRITBEGI en _WRITEND ¡ ¡ Om aan te geven dat het rapport gedeelte begint gebruiken we de Tag _WRITBEGI (hierna dus de regels met af te drukken code) _WRITEND geeft het einde aan De Tag heeft als eigenschap dat Javascript en html codes wel uitgevoerd, maar niet afgedrukt worden. In Set Deel II komen we nader op de Tag terug Verzamelingen Set Deel I 55
Sjabloon Voorgeslacht ¡ _SETDEF( index ) _SETFILL( index, _ASCE) _SETSORT( index , _SURN, _NAMEFIRS, _BIRTDATE()) _WRITBEGI _SETBEGI( index ) <html> <table><table width = "80%"> <tr><td width = "15%">_SURN </td> <td width = "30%">_NAMEFIRS </td> <td width = "20%">_BIRTDATE() </td> <td width = "20%">_BIRTPLAC</td></tr> </table> </html> _SETEND _WRITEND ¡ Wijzig het sjabloon naar dit voorbeeld, sla op en maak het rapport. Verzamelingen Set Deel I 56
Rapport Voorgeslacht_A ¡ ¡ Er zijn nu een aantal kolommen in het sjabloon Voorgeslacht. asj, maar nog geen kopje. Wijzig de regel <html> in de volgende regels. <html> <table width = "80%"> <tr><td width = "15%"><b><u><i>Familienaam</b></u></i></td> <td width = "30%"><b><u><i>Voornamen</b></u></i></td> <td width = "20%"><b><u><i>Geboren d. d. </b></u></i></td> <td width = "20%"><b><u><i>Plaats</b></u></i></td></tr> </table> _SETBEGI( index ) Sla op als Voorgeslacht_A. asj en maak rapport Waarschijnlijk wil je nog iets doen met de datum want die past niet zo goed in de kolom Verzamelingen Set Deel I 57
Datumformat ¡ ¡ t/m hier is de Tag _BIRTDATE() zonder verdere indicatie gebruikt. De standaard output van de datum is de voluit geschreven nederlandse notatie. De syntax bij een datumtag is iedere combinatie van D M of Y _BIRTDATE([: DD MM YYYY: ]) Later staan we nog specifiek stil bij de datumformattering. Verzamelingen Set Deel I 58
Voorgeslacht_B. asj ¡ ¡ Open Voorgeslacht_A. asj Tik op de eerste regel _USES( Dutch. Date. Format ) en wijzig _BIRTDATE() in _BIRTDATE([: DD-MM-YYYY: ]) Sla het sjabloon op als Voorgeslacht_B. asj en maak het rapport De datum past wel in de kolom, maar bij ontbreken van de dag en maand staan er de ‘-’ tekens. Verzamelingen Set Deel I 59
Datum voorbeelden ¡ ¡ ¡ Om te testen maak een sjabloon met de volgende data regels, sla op als Datum. asj en bekijk de output. Kies iemand met een geboortedatum van 1 -2 -1800 dan 02 -1800 _USES( Dutch. Date. Format ) _BIRTDATE([: [: E: ]D MM YYYY: ]) _BIRTDATE([: [: E: ]DDD MMM YYYY: ]) _BIRTDATE([: [: E: ]YYYY-MMMM-DDD: ]) _BIRTDATE([: [: E: ]DDD D MMMM YYYY: ]) Verzamelingen Set Deel I 60
Dutch. Date. Format. asjl ¡ ¡ ¡ Open onder de Program. FilesAldfaer sjablonenLib AldfaerDutch. Date. Format. asjl Zoals je kunt zien is er een aanzienlijk stuk code nodig om de datum goed weer te geven. De code staat dus in een bibliotheek. De bibliotheek is met een Tag te linken aan een sjablooon. _USES( Dutch. Date. Format ) Verzamelingen Set Deel I 61
Functieblokken ¡ ¡ ¡ Een functieblok kan gebruikt worden om een bepaalde reeks van berekeningen éénmalig te maken voor een sjabloon, óf deze toe te voegen aan een bibliotheek, waardoor deze functie ook in andere sjablonen gedeeld kan worden. Voor de leesbaarheid zetten we deze blokken aan het eind van een sjabloon, hoeft niet. Ieder functieblok moet een unieke naam hebben in het sjabloon waarin hij opgeroepen wordt. Verzamelingen Set Deel I 62
Functie ¡ ¡ ¡ _FUNCBEGI( _F_Eigen. Naam ) Tags _FUNCEND Voor de leesbaarheid wordt aanbevolen een naam te kiezen voorafgegaan met _F_ Door in het sjabloon, op de plek waar de functie uitgevoerd moet worden de Tag _F_Eigen. Naam te plaatsen wordt deze geactiveerd. Verzamelingen Set Deel I 63
Map Lib User ¡ De bibliotheek die je zelf maakt moet worden opgeslagen met bijvoorbeeld pad …AldfaerEigen sjablonenLib Usernaam. asjl ¡ Het hoofdpad komt overeen met de Aldfaer Instellingen Bestanden Verzamelingen Set Deel I 64
Voorgeslacht_C. asj ¡ We voegen in Voorgeslacht_B. asj als laatste regels toe: _FUNCBEGI( _F_DAT ) [: E|[: [? D? ]DDD : ]|[? in? ][: D: ] MMM|[&[? ? ]? ? &] YYYY: ] _FUNCEND en wijzigen _BIRTDATE() in _BIRTDATE( [: _F_DAT: ] ) ¡ ¡ Sla dit op als Voorgeslacht_C. asj Wijzig de regel [: E|[: [? D? ]DDD : ]|[? in? ][: D: ] MMM|[&[? ? ]? ? &] YYYY: ] in [: E|[: [? D? ]DDD : ]|[? in? ][: D: ] MM|[&[? ? ]? ? &] YYYY: ] en bekijk het resultaat vóór en na de wijziging Verzamelingen Set Deel I 65
Mijn. Bieb. asjl ¡ ¡ ¡ ¡ We hebben de eerste functieblok gemaakt in Voorgeslacht_C. asj We gaan nu een eigen Bibliotheek bestand aanmaken. Sla Voorgeslacht_C op als Voorgeslacht_D. asj Voeg toe aan Voorgeslacht_D. asj _USES( Mijn. Bieb ) bij de andere _USES Knip de laatste drie regels uit Voorgeslacht_C Open Kladblok –nieuw document Plak de drie regels in dit nieuwe document en sla op als AldfaerEigen sjablonenLib UserMijn. Bieb. asjl Verzamelingen Set Deel I 66
¡ ¡ ¡ Dus Mijn. Bieb. asjl ziet er uit als volgt _FUNCBEGI( _F_DAT ) [: E|[: [? D? ]DDD : ]|[? in? ][: D: ] MMM|[&[? ? ]? ? &] YYYY: ] _FUNCEND Schrijfwijze voor een functie Tag zou kunnen zijn (voorkeur van de schrijver) _F_naam komt uit een bibliotheek. asjl _S_naam staat in het desbetreffende sjabloon. asj. Maak rapport Voorgeslacht_D Verzamelingen Set Deel I 67
Voorgeslacht_D. asj ¡ ¡ ¡ Het rapport is exact gelijk aan zijn voorganger ©, maar er is nu gebruik gemaakt van een eigen bibliotheek. De functie _F_DAT kan dus bij iedere datumtag in welk sjabloon dan ook gebruikt worden. _BAPTDATE( [: _F_DAT: ] ) _RELASTAR( [: _F_DAT: ] ) _BURRDATE( [: _F_DAT: ] ) Datum aanroepen moeten tussen [: : ] Verzamelingen Set Deel I 68
De Set Deel II Verzamelingen Set Deel II 69
Tags verwijdering ¡ Tags die personen uit een set halen: ¡ _SETSUB( broers ) haalt de huidige persoon uit de set _SETTRUNNEXT( broers ) haalt alle personen weg NA de huidige _SETTRUNPREV( broers ) haalt alle personen weg VOOR de huidige _SETCLR( broers ) haalt ALLES weg Tags die de rangorde bepalen _NUMB _SETORDE( broers ) Verzamelingen Set Deel II 70
Voorbeeld ¡ ¡ ¡ We nemen Broers. Aantal. asj als start en voeg aan het eind de volgende regels toe: _SETSORT( broers, _BIRTDATE() ) _SETTRUNNEXT( broers ) Er zijn nog _SETAMOU( broers ) broers in de set. _SETBEGI( broers ) _NAMEFIRS[: _NAMEPREF: ] _SURN _SETEND Sla op als Broers. Next. asj en maak het rapport Wat de toevoeging doet is de set sorteren op geboortedatum en iedereen uit de set halen die jonger is dan de huidige persoon. (Datum = hoger) Verzamelingen Set Deel II 71
Voorbeeld ¡ ¡ ¡ We nemen Broers. Next. asj als start en wijzig _SETTRUNNEXT( broers ) in _SETTRUNPREV( broers ) _NAMEFIRS[: _NAMEPREF: ] _SURN in _NAMEFIRS[: _NAMEPREF: ] _SURN _BIRTDATE() Sla op als Broers. Prev. asj en maak het rapport Wat de toevoeging doet is de set sorteren op geboortedatum en iedereen uit de set halen die ouder is dan de huidige persoon. (Datum = lager) Als de set op voornamen gesorteerd zou zijn, dus _SETSORT( broers, _NAMEFIRS ) dan waren alle alfabetisch lagere namen weg. Verzamelingen Set Deel II 72
Tags verwijdering ¡ ¡ De _SETSUB( naam van de set ) haalt de huidige persoon uit de set en hebben we al eerder gezien. _SETCLR( naam van de set ) verwijdert alles uit de set. De Tag is handig bij gebruik van een ‘tussenfase’ Behoeft nu geen voorbeeld. Verzamelingen Set Deel II 73
Tags rangorde ¡ ¡ _SETORDE( broers ) geeft het volgordenummer terug van de toevoegvolgorde. Dit nummer is vast en wordt niet beïnvloed door latere sortering. Open Broers. Prev. asj en tik op de outputregel voor _NAME de tag _SETORDE( broers ) en voor _NAMEFIRS ook _SETORDE( broers ) Sla het sjabloon op als Broers. Orde. asj en bekijk het rapport. Je ziet dat de eerste set een oplopend nummer heeft en na de verwijdering in de tweede set het oorspronkelijke nummer behoudt. Verzamelingen Set Deel II 74
Tags rangorde ¡ ¡ ¡ Nog duidelijker is het als je vóór de _SETORDE de Tag _NUMB toevoegt. Deze laatste Tag geeft dus het volgordenummer van de set. De _SETORDE geeft 0 terug als de persoon niet in de set voorkomt! Een controleregel: [&_NAME _SURN is als nummer _SETORDE( broer ) ingevoerd&]|[&_NAME _SURN is geen broer&] Open Broers. Aantal. asj en tik de bovenstaande regel na de regel _FATHEND Sla op als Broers. Check. asj en bekijk het rapport. Maak een zus de hoofdpersoon en bekijk het rapport nogmaals. Verzamelingen Set Deel II 75
De Stringset ¡ ¡ Eerder hebben we _SETADD( naam set ) gezien. De Tag vulde de set met de persoonsgegevens. De volgende code voegt een tekst toe, en we spreken dan van een stringset. _SETADD( test , “Tekst string" ) Net als bij personen kunnen er nooit twee dezelfde teksten in de set komen. Je kunt ze ook weer afdrukken met een begincommando, met de naam van de set (er zijn immers meerdere sets mogelijk) tussen haakjes daaraan toegevoegd; _SETBEGI( test ) _NUMB - _SETSTRI _SETEND Verzamelingen Set Deel II 76
De Stringset voorbeeld ¡ ¡ Maak een nieuw sjabloon String_A. asj en tik _SETDEF( probeer ) _SETADD( probeer, "Eerste string" ) _SETADD( probeer, "Andere string" ) _SETADD( probeer, "Zoveelste string" ) _SETADD( probeer, "Eerste string" ) _SETBEGI( probeer ) _NUMB - _SETSTRI _SETEND Sla op en bekijk het rapport Verzamelingen Set Deel II 77
De Stringset voorbeeld ¡ ¡ Dit voorgaande sjabloon voegt slechts 3 van de 4 teksten toe aan de set, want de eerste en de laatste zijn hetzelfde. Met _SETSTRI benader je de string die op enig moment binnen de lus aan de beurt is. Verzamelingen Set Deel II 78
De Stringset volgorde ¡ ¡ De volgorde is de volgorde van toevoegen. Een stringset kent twee mogelijke sorteringen. Toevoegvolgorde óf alfabetisch. Met: _SETSORT( test, _SETSTRI ) wordt er alfabetisch gesorteerd, en met: _SETSORT( test, _SORTORDE ) wordt de sortering weer op toevoeg volgorde. Zonder sorteer opdracht staat de SET (net als bij personen) in toevoegvolgorde. Verzamelingen Set Deel II 79
Voorbeeld sjabloon ¡ ¡ Hoewel je de mogelijkheden wellicht nu nog niet ziet, opent de stringset tal van mogelijkheden. Maak een sjabloon Familie_A. asj _SETDEF( iedereen ) _SETDEF( familienamen ) _SETFILL( iedereen, _FAMIFILE ) _SETBEGI( iedereen ) _SETADD( familienamen, [: _SURN: ] ) _SETEND Deze bestand bevat _SETAMOU( familienamen ) verschillende familienamen. Maak het rapport. Verzamelingen Set Deel II 80
Voorbeeld sjabloon ¡ ¡ ¡ Vervolgens kunnen desgewenst alle namen afgedrukt worden met een _SETBEGI( familienamen ) _NUMB _SETSTRI _SETEND Voeg bovenstaande regels toe aan Familie_A. asj en sla op als Familie_B. asj Bekijk het resultaat Verzamelingen Set Deel II 81
Voorbeeld sjabloon ¡ Even een toelichting op dit stukje sjabloon: Eerst wordt er een set ‘iedereen' gevuld met alle personen uit het bestand. Dit wordt gedaan met _SETFILL. Op deze operator komen we terug in deel III van de SET. Met het commando _SETBEGI( iedereen ) worden vervolgens alle personen van die set doorlopen en steeds wordt met _SETADD( familienamen, [: _SURN: ] ) de familienaam van de betreffende persoon uit de set ‘iedereen’ in de set ‘familienamen’ gezet. Omdat een tekst (naam) maar één keer kan voorkomen, krijg je in de set ‘familienamen’ een unieke lijst van alle voorkomende achternamen. Verzamelingen Set Deel II 82
Voorbeeld notitie ¡ De [: : ] om _SURN zorgt voor een correcte omzetting van de achternaam naar een voor de set geschikte 'tekst'. Hier vervullen de [: : ] dus een afwijkende functie van de normale betekenis. In een toekomstige versie zal deze 'syntactische hobbel' worden rechtgetrokken. Verzamelingen Set Deel II 83
Familienamen rapport met teller ¡ ¡ ¡ Het voorbeeld Familie_B. asj geeft uitsluitend het totaal aantal verschillende namen en daaropvolgend de namen in een alfabetische volgorde. Leuker zou zijn per naam het aantal malen dat die naam voorkomt af te drukken. Dan zie je de voordelen van een stringset. Verzamelingen Set Deel II 84
Familienamen rapport analyse ¡ ¡ Blijkbaar zal er een tussenfase moeten worden ingebouwd om na te gaan hoeveel keer een naam voorkomt. Dus m. a. w. een andere set, één om te tellen en één om te onthouden waar we mee bezig zijn. Neem Familie_B. asj, sla op als Familie_C. asj Voeg bij de definitie toe: _SETDEF( tel ) _SETDEF( laatstenaam ) _SETDEF( rapport ) Verzamelingen Set Deel II 85
Familienamen rapport analyse ¡ ¡ ¡ De techniek die we gaan toepassen is: Vul de set ‘iedereen’ en start de set Bij de eerste van de loop moeten we de set ‘laatstenaam’ bijwerken en de teller op 1 zetten Bij het volgende record vergelijken we de naam met de laatste naam. Als die gelijk is hoeft alleen de teller bijgewerkt te worden. Als de naam niet gelijk is dan moeten we éérst de gegevens overbrengen naar een nieuwe set ‘rapport’ en vervolgens voor het huidige record van ‘iedereen’ de teller en de laatste naam bijwerken Verzamelingen Set Deel II 86
Familienamen rapport analyse ¡ ¡ ¡ Bij de laatste van de set ‘iedereen’ moeten we de gegevens nog wegschrijven naar ‘rapport’. Om e. e. a. te verfraaien voegen we nog een totaaltelling toe aan het ‘rapport’. We drukken eerst een regel af die de totalen van de set ‘iedereen’ en ‘familienamen’ geeft. De set ‘rapport’ is nu aan de beurt om afgedrukt te worden en dat doen we met <html> want daarmee kun je een mooiere opsomming geven. Omdat het laatste record van ‘rapport’ geen familienaam bevat onderdrukken we natuurlijk het volgordenummer van de set. Verzamelingen Set Deel II 87
Familienamen rapport analyse ¡ Aan de slag…… voor de code kun je het beste de notitie van deze slide bekijken. Daarin staat de volledige code die je dus kopieert en opslaat als Familie_C. asj. Verzamelingen Set Deel II 88
Verwijderen uit een stringset ¡ ¡ ¡ Je hebt gezien hoe een actief record uit de set gehaald wordt door de _SETSUB( naam van de set ) Om een record uit een stringset te halen moet je het record wel kennen. De syntax is: _SETSUB( set , “exacte inhoud” ) Als je de volgorde van toevoeging kent kun je natuurlijk met een vergelijking de string uit de set halen. _SETBEGI( set ) _FIRS? _BEGI _SETSUB( set , [: _SETSTRI: ] ) _END _SETEND Verzamelingen Set Deel II 89
¡ ¡ ¡ Of _SETBEGI( set ) [? _NUMB == 3 ? ]? _BEGI _SETSUB( [: _SETSTRI : ] ) _END _SETEND Het aardige is dat na verwijdering van records bij de overgebleven records het oorspronkelijke nummer aanwezig blijft _SETORDE Zie de volgende code. Verzamelingen Set Deel II 90
¡ _SETDEF( test ) _SETADD( test , "HALLO" ) _SETADD( test , "Nee" ) Er zijn _SETAMOU( test ) items: _SETBEGI( test ) _NUMB _SETSTRI _SETEND _SETSUB( test , "HALLO" ) Er zijn na de verwijdering _SETAMOU( test ) items: _SETBEGI(test ) _NUMB _SETSTRI _SETEND Waarvan het oorspronkelijke nummer _SETORDE( test , "Nee") was. Verzamelingen Set Deel II 91
Wat hebben we t/m hier gedaan ¡ ¡ ¡ In het sjabloon Familie_C. asj hebben we alle voorgaande en toegelichte Tags verwerkt met een output die op scherm acceptabel is. Een voorbeeld hoe je een analyse in tekst moet maken alvorens je gaat programmeren. De techniek van normale en stringset is aan de orde geweest. De bibliotheek asjl en functieblokken zijn toegelicht. Van html is beperkt gebruik gemaakt; dit is géén cursus html. Verzamelingen Set Deel II 92
De Set Deel III ¡ ¡ ¡ In dit deel ga je verder in de mogelijkheden van de _SETFILL( set, bereik, selectie ) De set die met deze Tag wordt gevuld heet wel de moederset. Sorteermethoden Verzamelingen Set Deel III 93
De selectie ¡ ¡ De volledige syntax van de Tag is _SETFILL( set, bereik, selectie ) Nu wordt nader op de selectie ingegaan. De selectie moet een functie. Tag zijn waarin bijvoorbeeld wordt opgenomen _MALE alleen mannen _FEMA alleen vrouwen _FAMI alleen mannen en ongehuwde vrouwen maar ook een afvraag op leeftijd die in de functie. Tag is opgenomen. Verzamelingen Set Deel III 94
De selectie ¡ ¡ ¡ De code _SETFILL( index, _FAMIFILE, _S_select ) geeft met het functieblok alle mannelijke personen uit het gehele bestand. _SETDEF( index ) _USES( Dutch. Date. Format ) _SETFILL( index, _FAMIFILE, _S_select ) _SETSORT( index , _SURN , _NAMEFIRS, _BIRTDATE ) _SETBEGI( index ) _SURN[: , _NAMEFIRS: ][: _NAMEPREF: ][: (_NAMENICK): ]; _SETEND _FUNCBEGI( _S_select ) _MALE _FUNCEND Maak een sjabloon Seletie_A. asj Verzamelingen Set Deel III 95
De selectie ¡ ¡ ¡ Een interessante recursieve (zichzelf aanroepend) functie is de volgende: wie is de eerste voorouder in het bestand van de huidige persoon en geef het nageslacht. _SETDEF( nageslacht ) _S_pa _FUNCBEGI( _S_pa ) _FATH? _BEGI _FATHBEGI() _S_pa _FATHEND _ELSE _SETFILL( nageslacht, _DESC ) _END _FUNCEND _SETBEGI( nageslacht ) enzovoorts Maak een sjabloon Seletie_C. asj en bekijk het resultaat. Verzamelingen Set Deel III 96
De selectie ¡ Zoals je ziet voert de regel _S_pa het functieblok uit terwijl in het functieblok zelf de functie óók onderdeel uitmaakt. Zodra de functie één persoon tegenkomt die geen vader heeft, geeft de Tag ‘not true’ terug en wordt de _ELSE Tag doorlopen en de set gevuld met het nageslacht van die persoon. Verzamelingen Set Deel III 97
Schrijven van bestanden Deel I ¡ Tot nu toe werd doorgaands alles wat we probeerden in het detailscherm geschreven. Voor kleine experimentjes (ook voor fout zoeken) is dat een heel praktische methode; je ziet meteen wat er gebeurt. Maar voor een definitief sjabloon moet je natuurlijk ook wel eens een bestand aanmaken. Schrijven van bestanden Deel I 98
Bestand Tags ¡ ¡ Er zijn voor het schrijven van een bestand een aantal Tags: _FILENAME() _FILEMODE() _METAPATH() _METALINK() _WRITBEGI _WRITEND Schrijven van bestanden Deel I 99
_WRITBEGI ¡ ¡ We hebben al een paar keer eerder, bv in sjabloon Voorgeslacht. asj de Tags _WRITBEGI en _WRITEND gebruikt. Met _WRITBEGI. . . _WRITEND omsluit je het blok dat geschreven moet worden. Probeer eens in een testsjabloon, bv Test. Bestand. asj: _WRITBEGI Hallo, dit is een test _WRITEND Hiermee geven we Aldfaer opdracht om de tekst "Hallo, dit is een test" te schrijven naar een bestand. We hebben echter niet opgegeven wat voor soort bestand, hoe het moet heten, en waar het moet worden neergezet. Schrijven van bestanden Deel I 100
Bestand opslaan ¡ ¡ ¡ Als we dit sjabloon uitvoeren en op de icoon ‘bestand’ klikken, verschijnt een bewaar dialoog. Bovenin komt de voorkeursmap te staan welke onder staat onder de werkbalk Overzichten -> Instellingen -> Bestanden. Als die voorkeur niet is gevuld zal er c: tmp staan. In het bewaarvenster staat als bestandsnaam niets ingevuld, er is immers in het sjabloon geen enkele suggestie gedaan. Onderaan is een pulldown (uitklap) venster aanwezig waar het bestandstype kan worden ingesteld. Op dit moment staat hier alleen: Alle formaten(*. *) Iets anders kan niet worden gekozen. Wanneer je nu bij de naam bv test. txt invult, zal er een bestand test. txt in de aangegeven map worden aangemaakt. Schrijven van bestanden Deel I 101
_FILEMODE ¡ ¡ Het is mogelijk om vanuit het sjabloon aan te geven wat het type van het bestand is. Hiermee kun je het filter, waar nu staat 'alle formaten' beïnvloeden. _FILEMODE( "html", if. Newer ) _WRITBEGI Hallo, dit is een test _WRITEND Nu zien we in het bewaardialoog scherm staan: Webpagina(*. html *. htm) Het toevoegen van de filemode heeft als effect dat de harde returns in bv een notitie naar het html equivalent worden vertaald en dat Aldfaer controleert of er ook conversies mogelijk zijn. Een ingegeven bestandsnaam zonder extensie krijgt automatisch de goede extensie Schrijven van bestanden Deel I 102
TXT of RTF ¡ ¡ In het geval van html weet Aldfaer dat er een conversie naar rtf (tekstverwerker formaat) mogelijk is. Op dit moment is dit de enige conversie die Aldfaer kent, maar in de toekomst zou dit kunnen worden uitgebreid. De conversiemogelijkheid is ook zichtbaar door in het bewaarvenster op het uitklappijltje te drukken. Dan is te zien dat ook voor tekstverwerker bestand(*. rtf) kan worden gekozen. Schrijven van bestanden Deel I 103
Bestands afvraag ¡ ¡ De filemode kent ook nog een tweede parameter. Hiermee kan worden opgegeven hoe het bestand moet worden geschreven: if. Newer het bestand wordt alleen geschreven als het qua inhoud is veranderd if. Not. Exist het bestand wordt alleen geschreven als het nog niet bestaat overwrite het bestand wordt altijd geschreven Schrijven van bestanden Deel I 104
if. Newer ¡ Voor eenvoudige toepassingen voldoet if. Newer altijd. De andere opties zijn in bijzondere situaties nodig. ¡ Het voordeel van if. Newer is, dat achteraf te zien is welke bestanden gewijzigd zijn. Dat is met name voor websites van belang. Je wilt dan het liefst alleen de gewijzigde bestanden uploaden naar de provider, want dat kan aardig wat werk schelen. Schrijven van bestanden Deel I 105
if. Not. Exist ¡ ¡ if. Not. Exist wordt gebruikt om te voorkomen dat er iets wordt overschreven wat niet mag. Voorbeeld: Als je met de wizard een webpage genereert, dan komt daar standaard de welkomstpagina: "Gegenereerd met Aldfaer 3. 0". De bedoeling is dat een gebruiker hier een eigen welkomstpagina maakt. Die gebruiker zou het niet op prijs stellen als zijn welkomstpagina weer wordt overschreven elke keer als er weer een update voor de webpagina wordt gemaakt. Daar is dan If. Not. Exist voor. In het begin wordt de 'saaie' Aldfaer welkomstpagina gegenereerd. Eenmaal vervangen door de gebruiker ziet Aldfaer dat de pagina bestaat, en zal er verder van afblijven. Doorgaans bevat zo'n bestand alleen 'vaste' inhoud, niet afhankelijk van de stamboom. Schrijven van bestanden Deel I 106
¡ Een ander voorbeeld is bv een CSS bestand met de formattering van stijlen zoals die in het (html) sjabloon wordt opgepakt. Initieel moet dit bestand gemaakt worden, maar iemand kan de stijl naar zijn eigen smaak aanpassen. . . Ook dan moet Aldfaer er verder van afblijven. Schrijven van bestanden Deel I 107
Overwrite ¡ Bij deze optie wordt het bestand altijd geschreven, ongeacht of het al bestaat. ¡ Deze methode wordt niet zo vaak toegepast, tenzij het inderdaad de bedoeling is dat het bestand iedere iteratie opnieuw wordt ververst. Schrijven van bestanden Deel I 108
Schrijven van bestanden Deel II ¡ ¡ In het vorige deel, schrijven van bestanden (I), hebben we kennis gemaakt met _FILEMODE() Met deze Tag kan het soort bestand worden ingesteld, hetgeen in de sjabloontaal tevens gebruikt wordt voor type afhankelijke vertalingen (zoals <BR> voor een return) om het filter van de bewaardialoog in te stellen inclusief conversie mogelijkheden en om een gekozen bestandsnaam eventueel automatisch van een extensie te voorzien. Schrijven van bestanden Deel II 109
_FILENAME ¡ ¡ ¡ Die bewaardialoog wil je niet altijd. Met name voor bijvoorbeeld een website wordt een groot aantal bestanden (persoonskaarten) gegenereerd, welke bovendien ook een vaste naam moeten hebben. Speciaal voor dit doel kan per bestand ook de filenaam vastgelegd worden: _FILENAME( "index. html" ) De bestandsnaam wordt dus inclusief de extensie gegeven. Vaak zal de extensie dezelfde zijn als de extensie in _FILEMODE(), maar dat hoeft niet! Schrijven van bestanden Deel II 110
Voorbeeld ¡ _FILEMODE( "html", If. Not. Exist ) _FILENAME( "welkom. html" ) _WRITEBEGI <html><head><title>Welkom bij mijn homepage</title></head> <body><p align="Center"> <h 1>Ik heet u welkom op mijn homepage</h 1> </body> </html> _WRITEND ¡ Hier wordt een bestand welkom. html geschreven door het sjabloon. De rode tekst is het deel dat uiteindelijk in het bestand uitkomt. Merk op dat je dus ook zeer wel in staat bent om vaste onderdelen zoals een welkomstpagina, een css stijlbestand, een frameset, of wat dan ook door het sjabloon te laten genereren. Schrijven van bestanden Deel II 111
Voorbeeld Maak. Bestand_A. asj ¡ ¡ We gaan een sjabloon maken met de bovenstaande naam. De bedoeling van het sjabloon is om de naam van het bestand mee te geven. Ook proberen we alle commentaar toe te voegen aan het sjabloon, waardoor de leesbaarheid wordt vergroot, dus ook wijzigingen makkelijker aan te brengen zijn. Tik het volgende: : . Dit sjabloon heeft als doel de personen van het bestand op : . één lijst af te drukken en het bestand op te slaan onder : . de naam Maak. Bestand. html : . _SETDEF( index ) _SETFILL( index, _FAMIFILE ) : . Er is nu een set gemaakt met alle personen van het bestand. : . Vervolgens wil je dit bestand straks alfabetisch afdrukken op : . Volgorde van geboortedatum. Schrijven van bestanden Deel II 112
Voorbeeld Maak. Bestand_A. asj ¡ ¡ : . Omdat we een datum uit onze eigen bibliotheek in het : . resultaat opnemen moeten we eerst die bibliotheken linken : . en daarna sorteren. _USES( Dutch. Date. Format) _USES( Mijn. Bieb ) _SETSORT( index , _SURN , _NAMEFIRS , _BIRTDATE ) : . De set staat nu klaar en gaan we voorbereiden voor de : . schrijfaktie _FILEMODE( "html", If. Not. Exist ) _FILENAME( “Index. html" ) _WRITBEGI : . Het bestand Index. html is nu geopend om te schrijven. : . Eerst laten we weten dat we html code schrijven <html><head><title><h 1>Volledig bestand</h 1><title></head><body> <h 1>Volledig bestand</h 1> : . Nu kan de set geopend worden en alle personen doorlopen _SETBEGI( index ) _SURN _NAMEFIRS _BIRTDATE([: _F_DAT: ]) Schrijven van bestanden Deel II 113
Voorbeeld Maak. Bestand_A. asj ¡ ¡ ¡ : . Als de set klaar is wordt een afsluit. Tag verwacht waarna de : . Gebruikte taal en de schrijfopdracht afgesloten worden. _SETEND </body> </html> _WRITEND Na het uitvoeren van dit sjabloon is er een keurig bestand Index. html aangemaakt. Om de zaken niet te ingewikkeld te maken is alle opmaak uit dit html bestand weggelaten. Het werkt wel, maar het resultaat kan natuurlijk wat opgefleurd worden. Op de voorkeurmap is het bestand aangemaakt terwijl in het dialoogvenster hetzelfde bestand ook elders opgeslagen kan worden. Schrijven van bestanden Deel II 114
Persoonskaart OF lijst ¡ ¡ De plaats waar _FILENAME() staat is bepalend. Als _FILENAME() vóór de _ WRITBEGI staat, dan wordt slechts één keer een bestand aangemaakt. Voorgaande voorbeelden gaven doorgaands een lijst. Staat de _FILENAME() echter na de _SETBEGI() gevolgd door de _WRITBEGI, dan wordt bij iedere iteratie van de loop een bestand weggeschreven want bij ieder volgend record van de set wordt de naam overnieuw bepaald door de instructie _FILENAME() en daarna door de _WRITBEGI aangemaakt. Dat betekent dan ook dat de naam van het bestand persoon uniek moet zijn. Er wordt dan ook vaak de _CODEINTE in de naam verwerkt. Deze Tag is door Aldfaer aan een persoonsrecord toegewezen en kan niet gewijzigd worden. Schrijven van bestanden Deel II 115
Persoonskaart voorbeeld ¡ ¡ We maken een simpel voorbeeld Maak. Bestand_B. asj. _SETDEF( index ) _SETFILL( index, _FAMIFILE ) _FILEMODE( "html", if. Newer ) _SETBEGI( index ) _FILENAME( "_CODEINTE. html" ) _WRITBEGI <html> <head><title>Kaart van _NAME[: _NAMEPREF: ] _SURN</title></head> <body> Gegevens van _NAMEFIRS [: _NAMEPREF : ]_SURN _WRITEND _SETEND </body> </html> Schrijven van bestanden Deel II 116
¡ ¡ Je ziet nu in de voorkeursmap dat het sjabloon Maak. Bestand_B. asj voor iedere persoon een bestand heeft aangemaakt. In combinatie met een index kunnen deze persoonskaarten dus op het scherm geprojecteerd worden. Om dat te kunnen is een hyperlink nodig die in het volgende deel III wordt behandeld. Merk op dat als je de html bestanden via de browser opent datgene tussen <title>. . </title> in de naambalk verschijnt. Schrijven van bestanden Deel II 117
Schrijven van bestanden Deel III ¡ ¡ ¡ De Hyperlink Voorbeeld Index met link Het Metapad Selectie Tags Numerieke Tags Speciale _FILL opties Schrijven van bestanden Deel III 118
De hyperlink ¡ ¡ ¡ Wanneer je in een index een hyperlink wilt maken naar de persoonsbestanden moet je iets maken als: <A HREF = "_CODEINTE. HTML"> _NAME[: _NAMEPREF: ] _SURN </A> en dat voor elke persoon in een SET. Het zal duidelijk zijn dat de manier waarop een bestandsnaam wordt gegenereerd, EN de manier waarop een link wordt gemaakt overeen moeten komen. Als je als bestandsnaam _CODEINTE. HTML opgeeft en met de Aldfaer code _LINK de link maakt, leidt dat beslist tot teleurstelling. De code _LINK , welke normaal gesproken in sjablonen wordt gebruikt, is samengesteld uit naam en de interne code. Schrijven van bestanden Deel III 119
_METALINK ¡ ¡ ¡ Speciaal om er voor te zorgen dat de _FILENAME( bestandsnaam ) en de _LINK met elkaar overeenkomen is de Tag: _METALINK( patroon ) in het leven geroepen. Als patroon kun je opgeven uit welke bestandsdelen een link/bestandsnaam is opgebouwd. Voer bv bijvoorbeeld de volgende code eens uit: _FILEMODE( “html", if. Newer ) _METALINK( "_CODEINTE[: : ]file. html" ) _LINK In het detailvenster geeft de Tag _LINK als output: 123456 file. html Schrijven van bestanden Deel III 120
¡ ¡ Omdat we nu met _METALINK() hebben aangegeven hoe een bestandsnaam is opgebouwd, zal de _LINK Tag dit schema altijd volgen. En voor de filenaam kun je dan schrijven: _FILENAME( _METALINK ) waardoor hetzelfde patroon als filenaam wordt gebruikt. De Tag _METALINK() heeft een goede default, en wanneer je niets bijzonders wilt hoef je de _METALINK() niet te veranderen. Je moet wel aangeven dat de filenaam het metalink patroon volgt, maar verder gaat alles vanzelf goed. Schrijven van bestanden Deel III 121
Index met link persoonskaarten ¡ ¡ In het volgende stuk ga je een sjabloon maken dat zowel een index heeft als de bijbehorende persoonskaarten. De index en persoonskaarten beperken we tot de letters A en B. Noem het sjabloon Maak. Bestand_D. asj Je ziet dus het gebruik van de hyperlink vanuit een indexpagina naar bijvoorbeeld de persoonskaart. Schrijven van bestanden Deel III 122
Maak. Bestand_D. asj ¡ _USES( Dutch. Date. Format ) _SETDEF( index ) _SETFILL( index , _FAMIFILE , _S_selectie ) _SETSORT(index , _SURN, _NAMEFIRS, _BIRTDATE ) _FILEMODE( "html", if. Newer ) _FILENAME( “Index. html" ) _WRITBEGI <html> <head><title>Index volledig bestand</title></ head > <body> _SETBEGI( index ) <a href="_LINK">_SURN, _NAMEFIRS[: (*_BIRTDATE([: DD MM YYYY: ])): ]</a> _SETEND </ body > </ html > _WRITEND : . Klaar met de index, we gaan door met de kaarten. : . De set index is nog steeds aanwezig Schrijven van bestanden Deel III 123
Maak. Bestand_D. asj ¡ _SETBEGI( index ) _FILENAME( _METALINK ) _WRITBEGI <html> <head><title>Kaart van _NAME[: _NAMEPREF: ] _SURN</title></head> <body> Gegevens van _NAMEFIRS [: _NAMEPREF : ]_SURN _WRITEND _SETEND _FUNCBEGI( _S_selectie ) [? _SURN < C? ]? _BEGI ja opnemen _END _FUNCEND ¡ Na het draaien van het sjabloon zal altijd het laatst aangemaakte bestandje geopend worden. In ons voorbeeld dus lastig om vanuit de index te werken. Die vind je op de voorkeurmap van de overzichten. Schrijven van bestanden Deel III 124
Pad meegeven van het bestand ¡ ¡ ¡ Aan de hand van het voorgaande voorbeeld zie je dat het lastig is om de output te regelen. Je weet niet wat er nog allemaal onder die voorkeursmap staat. Beter is dus om voor bepaalde output een vaste ‘eigen’ mapstructuur te maken. De schrijver heeft de voorkeur om als er twee partities, bijvoorbeeld C: en D: zijn de output altijd naar D: te schrijven. Dat is onder meer makkelijk voor back-ups. In het voorbeeld zullen we echter C: gebruiken. Schrijven van bestanden Deel III 125
_METAPATH() ¡ ¡ ¡ Bij het genereren van een website is het gebruikelijk dat een exacte kopie van die site aanwezig is op de locale PC. Het zou dus comfortabel zijn als het sjabloon er voor kan zorgen dat de gegenereerde pagina's meteen op de goede plaats terecht komen. Speciaal hiervoor is: _METAPATH( “naam pad” , “g” , ”c”) (c en g zijn optioneel) Na het toepassen van bovenstaande regel zullen sjablonen die een _FILENAME() Tag gebruiken de bestanden meteen in bijvoorbeeld C: localweb wegschrijven. De beide letters ("g" en "c") zijn optioneel: g - Als de map niet bestaat, maak hem aan c - Maak de map leeg voor gebruik Schrijven van bestanden Deel III 126
_METAPATH(“…. ”, ”g” , “c”) ¡ ¡ ¡ Met de "g" optie kan een complete mappenstructuur op de PC gegenereerd worden. De "c" optie moet met beleid gebruikt worden. Met name de filemode if. Newer heeft natuurlijk alleen zin als de oude bestanden nog in de map staan. Deze optie opent een dialoogvenster waarin wordt gevraagd of de map ja dan nee geleegd moet worden. Als de map eerst wordt leeggemaakt zullen alle bestanden geschreven worden. Deze optie ‘c’ heeft meestal alleen zin in een testfase, waar je er zeker van wilt zijn dat alles wat je ziet is gegenereerd door het sjabloon. Schrijven van bestanden Deel III 127
_METAPATH() ¡ ¡ ¡ De _METAPATH(optie) is dus met name van belang voor sjablonen die een website genereren. Daarbij geldt dus dat elk sjabloon zijn eigen doelmap moet krijgen. Alleen zo weet elk sjabloon ook zeker dat er geen vervuiling in de map staat. Vooral de filemode If. Not. Exist, die alleen schrijft als een bestand er nog niet is, kan een chaos veroorzaken als meer sjablonen in dezelfde map schrijven. Schrijven van bestanden Deel III 128
Voorbeeld _METAPATH() ¡ ¡ Neem sjabloon Maakbestand_D. asj en sla op als Maakbestand_E. asj Tik de volgende regels vóór alle andere: _METAINFO _METAPATH( "C: AldfaerTemp" , "g" ) _METALINK( "_CODEINTE[: : ]. html" ) _METAEND ¡ Zoals je ziet staat de code in een ‘paar’ _METAINFO _METAEND ¡ Hoewel Aldfaer het laatst geopende bestand laat zien kun je het beste naar de map van de metalink gaan en daar het bestand openen. Schrijven van bestanden Deel III 129
Javascript ¡ ¡ Sjablonen kunnen ook Javascript in de output opnemen. Sommige scripts geven een foutmelding als zij vanuit Aldfaer gestart worden. Start dus altijd de output vanuit de verkenner. Je kunt dus een geheugensteuntje inbouwen aan het eind van Maak. Bestand_E. asj. Immers de laatste opdracht zal op het Aldfaer scherm geopend worden. _FILEMODE( "html", if. Newer ) _FILENAME( "Gereedmelding. html" ) _WRITBEGI <b>Open nu via de verkenner de startpagina C: AldfaerTempIndex. html <b> _WRITEND Schrijven van bestanden Deel III 130
Selectie. Tags - gezin ¡ ¡ ¡ In de inleiding werd al vermeld dat een aantal Tags zoals _FATHBEGI() tussen de haakjes een parameter kan meekrijgen. _FATHBEGI(selectie) _MOTHBEGI(selectie) _CHILBEGI(selectie) De mogelijke selecties voor deze drie zijn: _ADOP adoptie _FOST pleegvader, -moeder, -kind _BIOL biologisch De syntax is dus bijvoorbeeld _FATHBEGI(_BIOL ) Selectie Tags 131
¡ ¡ ¡ Bekijk het vanuit de actieve persoon: heeft iemand een biologische vader of moeder en daarnaast een pleegvader of moeder, dan zal _FATHBEGI(_FOST) _NAME _FATHEND alleen de naam van de pleegvader laten zien; zet je niets tussen de haakjes, dan krijg je uiteraard beide vaders. Hetzelfde geldt voor _CHILBEGI() en _MOTHBEGI(), waardoor je een lijstje kunt opvragen van respectievelijk natuurlijke, adoptie en pleegkinderen. Selectie Tags 132
Selectie. Tags - feiten ¡ ¡ Een andere code met een selectie is _FACTBEGI(selectie) Als selectie is hier onder meer mogelijk (zie Aldfaer Help voor volledige lijst): _OCCU beroepen _RELI religie _ADDR adres _MISC overigen Zo geeft bv _FACTBEGI( _OCCU) uitsluitend beroepen, en hiervoor bestaan weer een serie Tags voor de subdelen van het beroepenveld: _FACTSTAR(), _FACTSTOP(), _FACTSOUR, _FACTNOTE en _FACTOCCU. Selectie Tags 133
¡ ¡ Je moet als je niet de selectie-optie gebruikt eerst testen of je wel met bijvoorbeeld een beroep te maken hebt voordat je de eigenlijke Tag gebruikt. Als je geen selectie gebruikt ziet het er zo uit, er wordt per feit getest wat voor feit, en daarna de juiste code aangeroepen: _FACT? _BEGI _FACTBEGI() _OCCU? _BEGI _FACTOCCU _END _RELI? _BEGI _FACTRELI _END _FACTEND _END Selectie Tags 134
¡ ¡ ¡ Maak je wél gebruik van de selectie-optie dan schrijf je _FACTBEGI(_OCCU) _FACTOCCU _FACTEND of _FACTBEGI(_RELI) _FACTRELI _FACTEND Daarmee kun je dus heel goed de output regelen in de volgorde die je wil. Selectie Tags 135
Feiten - overig ¡ ¡ ¡ In de rubriek "Feiten" kun je onder "overig" zelf een aantal categorieën vastleggen. Ik heb daar onder meer een item “E-mail" en “Telefoon” omdat Aldfaer dat niet als veld ondersteunt. In mijn bibliotheek. asjl heb ik dus een functie gemaakt die je in andere sjablonen kunt oproepen. _FUNCBEGI( _T_telefoon ) _FACT? _BEGI _FACTBEGI(_MISC) [? _FACTCAT. _UPPE == TELEFOON? ]? _BEGI telefoon _FACTNOTE _END _FACTEND _FUNCEND In mijn sjabloon. asj staat dus … Piet heeft _T_telefoon …. . Selectie Tags 136
Tags met een vertaaloptie – SEX() ¡ ¡ ¡ Als optie kunnen eigen teksten worden meegegeven aan de _SEX(), die standaard in de uitvoer voor resp. M, V en onbekend kunnen worden afgedrukt. De teksten moeten tussen dubbele aanhalingstekens staan en worden gescheiden door een puntkomma (; ). Bijvoorbeeld: _SEX() geeft in de uitvoer “M” voor een maar _SEX("zoon; dochter; kind") geeft in de uitvoer zoon in plaats van M Je kunt ook testen op een getal: [? _SEX(“ 1; 2; ") == 2? ]? Zal expanderen indien het een vrouw betreft. Tags met een vertaaloptie 137
¡ ¡ ¡ Wil je zoals de schrijver testen op personen in plaats van bedrijven (die de schrijver ook in zijn bestand heeft opgenomen) dan doe je dat: [? _SEX(“ 1; 1; ") == 1? ]? Omdat alle bedrijven niet “M” of “V” hebben zal de selectie de bedrijven overslaan. Waarom heeft de schrijver bedrijven opgenomen in zijn bestand? Omdat hij die bedrijven en/of personen wel eens een brief schrijft en daarvoor heeft hij een sjabloon gemaakt die automatisch alle naam - en adresgegevens overhevelt naar Word en de brief opslaat in een aparte map. Tags met een vertaaloptie 138
Numerieke Tags ¡ ¡ Alle Tags die een getal opleveren kun je op die manier vertalen dus ook bijvoorbeeld _RELATYPE() geeft standaard 1, 2 enz met een standaard vertaling door Aldfaer in huwelijk, geregistreerd partnerschap, samenleven, relatie maar _RELATYPE("huwde; ging een geregistreerd partnerschap aan; ging samenleven; kreeg een relatie") geeft in de uitvoer huwde in plaats van huwelijk en in de combinatie om alleen de geregistreerde partnerschappen te krijgen schrijf je [: ? _RELATYPE(“; 1; ; ") == 1? ]? Tags met een vertaaloptie 139
Opties van _SETFILL ¡ ¡ Er zijn een aantal syntaxen van deze Tag die in belangrijke mate voldoen aan een afbreek (truncate) functie. Voorbeeld: de eerste van een aantal voornamen of een tekst inkorten. De syntax die we al kennen is: _SETFILL( naam set , bereik , selectie ) of eenvoudigweg _SETFILL( naam set , bereik) Nu uitgebreider met vier mogelijkheden. De speciale opties van de _SETFILL 140
_SETFILL(naam, string, ”sep”) ¡ ¡ Breekt de string op een van de separator (slechts één) karakters. Let op dat het een stringset wordt! Voorbeeld om de eerste voonaam te krijgen: _SETDEF( voornaam ) _SETFILL( voornaam , [: _NAMEFIRS: ], " " ) _SETBEGI( voornaam ) _FIRS? _BEGI[: : ]_SETSTRI _END _SETEND Bovenstaand voorbeeld zoekt in de string van de voornamen naar de separator “ “ (blank) en zal de eerste voornaam geven. Laat je _FIRS? weg, dan krijg je alle voornamen gesplitst. De speciale opties van de _SETFILL 141
¡ ¡ Het ligt dus voor de hand om in je eigen bibliotheek een functie weg te zetten die er als volgt uit kan zien: _SETBEGI(_T_eerste_voornaam) _SETDEF( voornaam ) _SETFILL( voornaam , [: _NAMEFIRS: ], " " ) _SETBEGI( voornaam ) _FIRS? _BEGI[: : ]_SETSTRI _END _SETEND _FUNCEND Wil je naar iets anders, bijvoorbeeld * zoeken? _SETFILL( voornaam , [: _NAMEFIRS: ], “*" ) De speciale opties van de _SETFILL 142
_SETFILL(naam, string, min, ”sep”) ¡ ¡ Breekt de string op na , <min> posities van de separator. Let op dat de separator hoofdlettergevoelig is! Dus als je in voorgaand voorbeeld en bij iemand met een voornaamreeks van Johannes Hendricus Maria Anthonius _SETFILL( voornaam , [: _NAMEFIRS: ], 12 , “n" ) zet dan krijg je als output Johannes Hen 12 tekens! En de andere strings na de _FIRS? zijn dricus Anthon het afgebroken deel na de ‘n’ ius Maria en de rest De speciale opties van de _SETFILL 143
_SETFILL(naam , string, count) ¡ ¡ Breekt de string op in een aantal gelijke delen. Dus als je in voorgaand voorbeeld en bij iemand met een voornaamreeks van Johannes Hendricus Maria Anthonius _SETFILL( voornaam , [: _NAMEFIRS: ], 10) zet dan krijg je als output (zonder _FIRS? ) Johannes H 10 tekens! endricus A nthonius M arianaam De speciale opties van de _SETFILL 144
_SETFILL(naam, string, min, max, sep) ¡ ¡ Breek de string op de separator karakter, NA <min> posities, en ten hoogste <max> karakters. Dus als je in voorgaand voorbeeld en bij iemand met een voornaamreeks van Johannes Hendricus Maria Anthonius _SETFILL( voornaam , [: _NAMEFIRS: ], 4, 6 , ”n”) Johan nes He ndricu s An thon ius Ma ria de eerste separatie de tweede van 6 de derde van 6 de vierde tot met de separator de vijfde tot met de separator de zesde van 6 De speciale opties van de _SETFILL 145
Gedcom ¡ Het hoeft geen betoog dat een export GEDCOM tot de mogelijkheden behoort omdat nu de lange teksten in delen kunnen worden opgesplitst. ¡ Immers met ¡ Maak je van een lange tekstregel stukjes van 60 karakters lang, zet daar het bijbehorende Gedcom indicaties vóór en schrijf weg naar het bestand. _SETFILL( opknip, [: _BIRTNOTE: ], 60 ) _SETBEGI(opknip ) 1 CONC _SETSTRI _SETEND De speciale opties van de _SETFILL 146
Metatags ¡ ¡ ¡ _METAINFO en _METAEND, zoals we in voorgaande voorbeelden bij de _METAPATH() hebben gezien, zijn typische NON codes; ze doen helemaal niets. Ze komen altijd als ‘paar’ voor waarbinnen dus de andere metatags zijn opgenomen. Eén verdient nog wat speciale aandacht _METAPRIV(trigger, niveau ) in combinatie met de Tag _PRIV()? _METAPRIVATE is een metacode die de werking van _PRIV beïnvloedt. Met _PRIV kun je delen van je sjabloon uitschakelen voor privacy doeleinden Metatags 147
_METAPRIV( “trigger”, “niveau” ) ¡ ¡ ¡ Met de trigger stel je in ‘levend’ of ‘priv’ dus _METAPRIV( “priv” , “ 0” ) waardoor de _PRIV? In het sjabloon werkt als een test of het vinkje "privé in rapport" op de tab diversen aan staat. Wordt de trigger _METAPRIV( “levend” , “ 0” ) dan zal de test _PRIV? Dezelfde functie hebben als _DEAT? (maar dan zonder de _METALINK()) De niveau-optie is verouderd, maar behoort nog bij de syntax geschreven te worden. Metatags 148
Voorbeeld vinkje privé ¡ ¡ ¡ Het volgend stukje sjabloon zal alle personen laten zien die het vinkje privé aan hebben staan. _METAINFO _METAPRIVATE("priv", "0") _METAEND _SETDEF( iedereen ) _SETFILL( iedereen, _FAMIFILE, _S_selectie) _SETBEGI( iedereen ) _SURN _NAMEFIRS _BIRTDATE _BIRTPLAC _SETEND _FUNCBEGI( _S_selectie ) _PRIV? _BEGI opnemen _END _FUNCEND En met _PRIV? _BEGI _ELSE opnemen _END neem je privé personen niet in de set op. Metatags 149
Voorbeeld vinkjes privé - 2 ¡ ¡ ¡ Het volgend stukje sjabloon zal alle personen van het bestand wel opnemen, maar alleen die laten zien bij het afdrukken die de vink privé ‘aan’ hebben. _METAINFO _METAPRIVATE("priv", "0") _METAEND _SETDEF( iedereen ) _SETFILL( iedereen, _FAMIFILE) Er zijn _SETAMOU( iedereen ) personen in de set. Waarvan privé: _SETBEGI( iedereen ) _PRIV? _BEGI _SURN _NAMEFIRS _BIRTDATE _BIRTPLAC _END _SETEND Dus per onderwerp uit te sluiten. Metatags 150
Datum formattering ¡ ¡ ¡ De formatteer gegevens van de datum bestaat uit een stukje sjabloon code _BIRTDATE( [: _D-_M-_Y: ] ) waarbij gebruik is gemaakt van de numerieke Tags _D() dagnummer binnen de maand _M() maand nummer _Y() jaartal Het ophalen van een datum moet tussen [: : ] haken Net als bij andere componenten kan er getest worden op de aanwezigheid van de verschillende componenten: _BIRTDATE( [: [: [: _D-: ]_M-: ]_Y: ] ) Datum formattering 151
¡ ¡ Hier zorgt de [: en : ] om de Tag _D() er voor dat het streepje achter de dag alleen wordt getoond indien de dag is ingevuld. De Tags _D(), _M() en _Y() zijn numerieke Tags, dus je kunt er een vertaalstring aan meegeven. Dus bij de maand zal dit zo kunnen: _M("; januari; februari; maart; april; mei; juni; juli; augustus; september; oktober; november; december") en je hebt de maand als tekst. Het is nu ook een koud kunstje om hier een vertaling van te maken naar bv het engels. Datum formattering 152
¡ ¡ Voor de dag van de week heb je het dagnummer binnen de week nodig. Hiervoor bestaat de code _WD() deze code geeft een dagnummer (1. . 7) terug of 0 indien geen dag ingevuld. Met de vertaalstring kun je krijgen: _WD("; zondag; maandag; dinsdag; woensdag; donderdag; vrijdag; zaterdag") Datum formattering 153
Datum nauwkeurigheid ¡ Er is een numerieke Tag _E() welke de 'Exactheid' van de datum teruggeeft: 0 - geen bijzonderheden 1 - na datum 2 - vóór datum 3 - ongeveer ¡ En ook dit kan weer met vertaaloptie worden geschreven: _E("; na; voor; ongeveer") of _E("; >; <; ±") Maar dus ook in het Engels als _E("; after; before; about") Datum formattering 154
Datum bibliotheek ¡ ¡ Het zal je niet verbazen dat er een Aldfaer standaard datum bibliotheek bestaat om de (lastige) code éénmalig uit te schrijven. Je vindt die onder de installatiemap van Aldfaer in de map Lib Aldfaer. Dutch. Date. Format. asjl Op vrij eenvoudige manier kun je hier een engels formaat maken: wijzig in het asjl de regels die de vertaling weergeven en sla op onder je eigen Lib User als UKDate. Format. asjl Voeg aan dit nieuwe sjabloon de volgende regels toe: Datum formattering 155
UKDate. Format. asjl ¡ ¡ _FUNCBEGI( _F_UKdatum_kort ) [: E|[: [? D? ]DDD : ]|[? in? ]MMM [: D, : ]|[&[? ? ]? ? &] YYYY: ] _FUNCEND _FUNCBEGI( _F_UKdatum_lang ) [: EE|[: [? D? ]DDDD : ]|[? in? ]MMMM [: D, : ]|[&[? ? ]? ? &] YYYY: ] _FUNCEND En maak vervolgens een klein sjabloontje Datum_UK. asj waarin deze twee functies opgeroepen worden: _USES( UKDate. Format ) _BIRTDATE([: _F_UKdatum_kort: ]) _BIRTDATE([: _F_UKdatum_lang: ]) ¡ en bekijk het resultaat. Let op dat je niet de Dutch. Date. Format. asjl en een andere zoals de UKDate. Format. asjl tegelijkertijd oproept. Datum formattering 156
Datum – datum = ? ¡ Dan is er nog een Tag die een verschil tussen twee datums uitrekent: _DIFFDATE() deze code zorgt voor het verschil tussen de te formatteren datum en de datum tussen de haakjes. _CURRDATE( [: _DIFFDATE( _DEATDATE)[: _Y jaar: ]|[: _M maanden: ]|[: _D dagen: ] geleden overleden: ] ) door gebruik van de alternatief operator krijg je hier hoelang geleden iemand is overleden in jaren, tenzij het nog maar kort geleden was, dan zie je hoelang geleden het was in maanden. Datum formattering 157
Datum – datum = ? ¡ Omdat het verschil positief wordt genomen mag je _CURRDATE en _DEATDATE ook van plaats verwisselen, dat geeft hetzelfde resultaat. Datum formattering 158
Een sjabloon ¡ ¡ ¡ Na het lezen van deze notitie duizelt het waarschijnlijk want de mogelijkheden zijn talloos. De schrijver heeft als gewoonte om voor de overzichtelijkheid de volgende regels in acht te nemen: Een sjabloon heeft altijd een bepaalde volgorde : . Commentaar m. b. t. het doel van het sjabloon : . en het versienummer met de wijzigingen _META blok _SETDEF blok met het vullen _FILE blok _WRIT blok _FUNC blok en dat alles doorspekt met commentaarregels. Einde sjabloon 159
Een sjabloon – vervolg 1 ¡ ¡ ¡ Zodra het maar even kan worden de functies die bij herhaling nodig zijn toegevoegd aan de eigen bibliotheek. asjl. Zijn functieblokken tijdelijk, dus éénmalig, dan worden deze altijd onderin het sjabloon gezet en in het _WRIT blok opgehaald met de eigen Tag _S_naam. Schrijf de loops (lussen) altijd met inspringen dus _FUNCBEGI( naam ) eerste fase doe iets met informatie. Tags eind eerste fase _FUNCEND Einde sjabloon 160
Een sjabloon – vervolg 2 ¡ ¡ Zorg in het _META blok dat de output altijd naar een unieke map wordt geschreven. Dat voorkomt narigheid. Rubriceer de eigen sjablonen in submappen waardoor het rapport makkelijker te vinden is. Einde sjabloon 161
Einde sjabloon 162
Suggesties / verbeteringen ¡ Suggesties ter verbetering of verdere uitwerkingen of vragen zie ik gaarne tegemoet op mijn e-mail jham. kortekaas@hetnet. nl 163
64b0e41b1aaf7a95eb970654b81d74e3.ppt