http://www.cuci.nl/~pscheele/ACorner

Concatenatie in Squirrel
Léon Ruwette
5 mei 1999
Concatenatie

!Squirrel is in staat om tekstvelden 'op te tellen'. Dit verschijnsel heet concatenatie. Laten we eens kijken, wanneer het nuttig is om dit te doen.

In het algemeen is het nuttig als je een veld met steeds wisselende informatie wil combineren met dezelfde soort van informatie. Je wil bijvoorbeeld de naam van een geadresseerde iedere keer vooraf laten gaan door: 'Dhr". En toch wil je selecties blijven maken op het veld met de achternaam. Of, zoals verderop in dit verhaal; je wil de gegevens voorzien van HTML-code.

In ieder geval: Voor het maken van selecties wil je gebruik blijven maken van de voordelen van een database; je wil selecties kunnen maken. Terwijl voor de presentatie van die data het vaak van belang is dat deze op een standaard manier worden gepresenteerd.

Een voorbeeld: stel je een eenvoudig adressenbestand voor: Hoe berg je daar een naam als: Dhr. A.B. van der Aa in op?

Een mogelijkheid is:
veldnaam:      inhoud:
titel:         Dhr.
voorletters:   A.B.
tussenvoegsel: van der
achternaam:    Aa
Alle data die mogelijk van betekenis kunnen zijn, zijn hier apart beschikbaar. Maar om in een reportfile een aardige weergave te krijgen is veel uitproberen nodig met de lengte van de report-onderdelen, fonts en lettergroottes.
En dan nog is niet gegarandeerd dat alle namen uit die database dan dezelfde weergave zullen hebben. Waarschijnlijk hebben namen zonder tussenvoegsel een raar gat tussen voorletters en achternaam. Zou je het 'pas' gemaakt hebben op een tussenvoegsel zoals 'te', zou 'van der' waarschijnlijk niet gepast hebben.
Oplossing: Handhaaf deze velden (vanwege de selecties) en voeg extra velden toe waarin bestaande velden opgeteld worden. Bijvoorbeeld het veld:

hele naam:
De inhoud hiervan wordt:

titel+voorletters+tussenvoegsel+achternaam

Hiervoor worden de interne namen van de velden van de database gebruikt. Omdat er natuurlijk een spatie tussen de onderdelen moet zitten; moeten spaties toegevoegd worden:

titel+' '+voorletters+' '+tussenvoegsel+' '+achternaam

Alle toe te voegen tekst moet tussen '' staan.

Eigenlijk kunnen alleen maar velden op deze manier opgeteld worden als zowel de op te tellen velden als ook het extra veld van het type 'string' zijn. De extra velden moeten in het begin, of achteraf, toegevoegd worden aan de database. (Natuurlijk is het ook mogelijk om velden te ontwerpen en toe te voegen aan een Query, maar deze zijn eigenlijk alleen maar te gebruiken om getallen rekenkundig te bewerken. In een Query zij de te ontwerpen velden alleen maar van het type 'number'; floating point.)

De Query waaruit de presentatie van de gegevens plaatsvindt, bevat in zijn Edit Report alleen maar dit extra veld: 'hele naam'; en niet meer de vier afzonderlijke velden.
In de ontworpen Query wordt er dan gekozen voor 'Batch operations' 'Update'. Vervolgens wordt het extra veld binnen het batch update venster gesleept en kan de 'new value' ingevuld worden. Deze moet voorafgegaan worden door het teken '=' In de (Pascal-)betekenis: de inhoud van dit veld WORDT.

dus:

field      new value
hele naam =titel+' '+voorletters+' '+tussenvoegsel+' '+achternaam
Door de Query nu te bewaren, wordt, behalve de daarin gemaakte selectie, ook het Batch Update veld bewaard. En, zoals bekend, een binnen de Query gemaakte opmaak van de Report functie wordt ook bewaard. Daarmee zijn alle samenhangende problemen en hun oplossingen aan elkaar gekoppeld.

We hebben al gezien, hoe eenvoudig spaties als tekst toegevoegd kunnen worden aan een reeks van veld-inhouden. Welnu; daar hoeft natuurlijk niet alleen maar een spatie te staan.

Veronderstel nu eens, dat wij van alle inhouden van 'hele veld' een lijst, een opsomming, willen maken in een HTML document: Hoe zou dat dan moeten?

Wel, voor het opgesomde is er dan een 'tag' nodig, en wel: <li>.

De oplossing is dan:

field: new value:
hele naam ='<li>'+titel+' '+voorletters+' '+tussenvoegsel+' '+achternaam
(Er is geen spatie nodig achter <li>)

In de reportfile die hieruit voortvloeit wordt dat in het betreffende document ingevoegd tussen de tags <ul> en </ul>:

<ul>
      <li>Dhr. A.B. van der Aa
      <li>Mevr. C.D. Dekwaadtsteniet
      <li>…
</ul>

Dit ziet er dan zo uit:

• Dhr. A.B. van der Aa
• Mevr. C.D. Dekwaadtsteniet
• …

Waarschijnlijk zijn er nog meer zaken mogelijk. Waarschijnlijk kan een veld gevuld worden met de 'kop' van een HTML document en een ander veld met de 'staart':

('kop':
   <html>
      <body>
'staart':
      </body>
   </html>)

Door vervolgens in de Query de velden een sortering te geven en in de Report Editing de juiste headers en footers te benoemen en de velden te rangschikken onder de juiste headers is het waarschijnlijk mogelijk om de 'kop' en 'staart' slechts één keer in de reportfile op te laten nemen, met daartussen de gewenste opsomming. Ook de tags <ul> en </ul> zouden dan opgenomen kunnen worden, met als resultaat:

<html>
   <body>
      <ul>
         <li>Dhr. A.B. van der Aa
         <li>…
         <li>…
      </ul>
   </body>
</html>

Op deze manier zou je een compleet HTML-document genereren. Binnen de opmaak van een report. Alleen, dat heb ik nog niet geprobeerd.

Tot zover de weerslag van datgene wat er op de clubavond is besproken.

Intussen heeft Peter Scheele wel een oplossing geleverd voor deze kwestie: Hij leverde de code voor een Obey file die het werk doet. Door deze file als allerlaatste aan te roepen (en automatisch) en uit te laten voeren, voegt deze de stukjes HTML-document naadloos samen met de gegenereerde stukjes reportfiles.

Concreet:
Op deze manier is een document gemaakt, waarin doorverwijzingen opgenomen zijn naar inhouden van tijdschriftartikelen. Deze doorverwijzingen zijn met behulp van !Squirrel thematisch gerangschikt. Op deze manier heb ik van 23 thema's lijsten van artikelen gekregen, die in het document op de goede plaats in een tabel moeten worden opgenomen. Hierdoor wordt er niet binnen een report van een !Squirrel bestand geprobeerd om een compleet HTML-document samen te stellen, maar op het niveau van het document zelf. Dit is veel inzichtelijker en gemakkelijker te realiseren.

Als voorbeeld:

Het HTML document dat de tabel met verwijzingen bevat, is in 24 stukken (begin blok1 blok2 blok3 ... eind) geknipt; waar de 23 lijsten (lijsta lijstb lijstc lijstd...) tussen passen. De lijsten zijn reports vanuit !Squirrel, waarbij iedere keer een Query een lijst genereert én automatisch de volgende Query start, totdat alle lijsten zijn aangemaakt. De laatste Query start dan de volgende Obey file:

*Create <obey$dir>.nieuw

(nieuw is de bestandsnaam)

*Type <obey$dir>.best1 { >> <obey$dir>.nieuw }

(Accolades, spaties en >> zijn van belang.
Herhaal deze regel voor ieder bestand dat toegevoegd moet worden waarbij natuurlijk best1 steeds de naam krijgt van het desbetreffende bestand)

*Close

In mijn geval wordt dat:

*Create <obey$dir>.ArcNw/html
*Type <obey$dir>.begin { >> <obey$dir>.ArcNw/html }
*Type <obey$dir>.lijsta { >> <obey$dir>.ArcNw/html }
*Type <obey$dir>.blok01 { >> <obey$dir>.ArcNw/html }
*Type <obey$dir>.lijstb { >> <obey$dir>.ArcNw/html }
*Type <obey$dir>.blok02 { >> <obey$dir>.ArcNw/html }
*Type <obey$dir>.lijstc { >> <obey$dir>.ArcNw/html }
*Type <obey$dir>.blok03 { >> <obey$dir>.ArcNw/html }
*Type <obey$dir>. lijst …
*Type <obey$dir>.blok …
*Close


Dit resulteert in een databestand ArcNw/html, dat ik daarna van bestandstype verander (faf) zodat het HTML document klaar is!

Dit bestand is met één druk op de knop ontstaan: door de eerste Query te starten. Daardoor werden de 23 lijsten gegenereerd; waarna als laatste het Obey-bestand start. Dit laatste breit dan de 24 documentbrokken samen met de 23 lijsten.
In totaal 106 verschillende verwijzingen, die ieder een of meer keren in deze thematische lijsten staan (immers: ieder artikel kan meer dan een thema bestrijken) zijn dan op een gestuctureerde en overzichtelijke manier bereikbaar gemaakt.

Als je de tekst van de hier volgende page ophaalt, kun je zien dat ik met kommentaren in het document het begin en einde van ieder in te voegen stukje heb ingevoerd:
http://www.ursula.nl/anw/arcindex.htm

mei 1999,
Léon Ruwette