PEGEL technische beschrijving pag 5.01 5.1 scheiding logika/teksten In PEGEL zijn de teksten strikt gescheiden van het logisch ont- werp zoals dat in het programma PEGEL vastligt. De teksten zijn alle opgenomen in de datafile PGL. Daardoor is er een grote vrijheid om de teksten aan te passen. Alle records, met uitzon- dering van 01, 18, 42 en 62, zijn afgesloten met CR. Onder- staand volgt de betekenis van de diverse tekstrecords. 01 plaatsing van de symbolen (in deze volgorde) voor: -back space -clear screen -cursor home -cursor right -cursor down -correctie toets -"donker symbool" waarmee het jaartal wordt geprint -CHR$(13) of "correctie" voor Korte resp. Lange budgetcode 02 maanden van het jaar, de maanden moeten worden gescheiden door een speciaal karakter; het aantal posities moet (inklu- sief scheidingsteken: 4 per maand zijn 03 alle uppercase letters: A..Z 04 alle lowercase letters: a..z 05 betaalcodes 06 [ongebruikt record] 07 kopregel voor het start- en stopscherm 08 programmanaam: === P E G E L === 09 het woord: "versie:" ten behoeve van start- en stopscherm 10 t/m 16 jaartal in grote letters (start- en stopscherm) 17 copyrightregel [niet wijzigen!!] 18 tekst op startscherm voor datum 19 uitschakelboodschap (stopscherm) 20 kop van het menu: " == balans totalen ==" 21 tekst menuscherm rubriek 1: "1 vast bezit" 22 t/m 31 idem voor de overige rubrieken (+ stoppen) 32 tekstregel menu-scherm: " eigen vermogen:" 33 tekstregel menu-scherm: "vlottend vermogen:" 34 kopregel voor rubriek 1 35 t/m 43 idem voor de rubrieken 2 t/m 9, 0 44 uitbreiding kopregel "afschrift" voor rubrieken 2, 4 en 5 45 uitbreiding kopregel "budget" voor de rubrieken 7 en 8 46 kopregel voor print historische uitgaven (PGLPRINT) 47 t/m 56 mutatiecodes (woorden) voor de rubrieken 1 t/m 9, 0 de werkelijke mutatiecodes zijn de beginletters van deze woorden, zij worden programmatisch uit de opgegeven teksten afgeleid 57 het eerste woord ("Pagina") is de uitbreiding van de muta- tiecodes als er meerdere pagina's zijn; de rest van dit re- cord is de tekst op regel 23 van de rubriek "uitgaven" 58 tekst mutatiecode "Overboeken" (rubrieken 2 en 4) 59 tekst als bij Overboeken (rubrieken 2 en 4) naar een andere pagina wordt gegaan 60 tekst mutatiecode "Lenen", rubriek 5 61 tekst overboeken rubriek "uitgaven" 62 tekst mutatiecode "Aflossen" rubriek 5 63 foutboodschap: "NIET TOEGESTAAN" 64 foutboodschap: "NIET AANWEZIG" 65 foutboodschap: "RUBRIEK VOL" 66 tekst bij verhogen (+) of verlagen (-) saldo 67 tekst bij doorboeken (ontvangen) debiteur), rubriek 3 68-69 [ongebruikte records] Voor de indeling van de datarecords geldt: 070 systeemdatum en balanstotalen 071-080 volgordes binnen de rubrieken; vertaling logisch volg- nummer naar fysiek record 081-130 rubriek 1: vast bezit 131-180 rubriek 2: reserveringen 181-230 rubriek 3: debiteuren 231-280 rubriek 9: ontvangsten onderweg 281-330 rubriek 5: leningen 331-380 rubriek 6: bestellingen 381-430 rubriek 7: rekeningen 431-480 rubriek 8: afschrijvingen onderweg 481-530 rubriek 4: liquide middelen 481 giro 482 bank 483 kas 531-550 rubriek 0: uitgaven 551-... historische uitgaven Dat de rubrieken 4 en 9 niet een "normale" volgorde hebben lijkt op het eerste gezicht vreemd. In feite is er ook wat ex- tra coding nodig geweest om dit te realiseren, zie bijvoorbeeld de funktie definitie FNREC% op regel 150 van PEGEL. Er is ech- ter een groot operationeel voordeel om die records daar te plaatsen. Bij de mutatiecodes die een groter aantal records "aanraken", zal het aantal armbewegingen zijn geminimaliseerd zodat de de toegangstijd van de floppy niet storend lang is. Voor het hoofdprogramma BUDGET geldt in aan aantal gevallen ook een scheiding tussen de logika en de teksten. Deze scheiding is echter niet zo strikt als dat in PEGEL het geval is. De records 1 tot en met 4 van BDG bevatten de tekst van het menu-scherm, record 5 de kopregel van de schermen H en U, terwijl de records 6 en 7 vrij zijn. Record 8 geeft de aan/afwezigheid van de sub- rubrieken van de hoofdrubrieken 1 tot en met 10; record 9 geeft de aan/afwezigheid van de subrubrieken die bij de hoofdrubrie- ken 11 tot en met 20 horen. Uiteraard worden systeemafhankelij- ke parameters (clear screen en dergelijke) wel uit de datafile PGL ingelezen. Wat dat betreft is er dus geen programmawijzi- ging nodig bij een ander type computer. 5.2 uitdraai PGLREC Het programma PGLREC geeft een uitdraai van de aktuele inhoud van de records 2 t/m 69. Record 1 wordt als "dummy" geprint (er wordt geen inhoud afgedrukt). Voor de inhoud daarvan zie para- graaf 5.1. De records 10 t/m 16 geven hier geen inhoud te zien, dat komt omdat het gebruikte karakter CHR$(127) een niet-print- baar karakter (op de OKI u80 printer) oplevert. 5.3 opbouw programma Hoe goed een programma ook gestruktureerd is of modulair is op- gezet, in een taal als BASIC is het nu eenmaal buitengewoon moeilijk om een programma dat iemand anders heeft geschreven te begrijpen. Uit overwegingen van geheugengebruik is bovendien al het commentaar, dat in de listing aanwezig was, verwijderd. Ook is het "logische inspringen" verwijderd. Hierdoor is het "waarom" van bepaalde coderegels -ook voor een ervaren programmeur- wel zeer lastig te doorgronden. Dit neemt niet weg dat iemand die er de moeite voor neemt, er wel uit moet kunnen komen. Een goede leiddraad waar de verwerking van de diverse submutatiecodes (SB%) van de mutatiecodes (Q%) plaatsvindt geven de regels 1100 t/m 1200 van PEGEL. Zelf heb ik een dergelijk programma al drie jaar zeer intensief in gebruik; daarbij heb ik toen van Exidy mogelijkheden gebruik gemaakt waardoor een en ander niet meer systeemonafhankelijk was. Dit programma is geheel herschreven (vandaar versie 2.0) met in de eerste plaats een drie-jarige applicatie ervaring in het hoofd. Uiteraard is de struktuur en gebruikersvriendelijk- heid nu vele malen beter dan dat een eerste keer het geval is. Zorgvuldig heb ik erop gelet dat alles systeemonafhankelijk is, hierdoor is ook een "vertaling" in bijvoorbeeld Engels mogelijk geworden. Uit overwegingen van beperking van het geheugen is het onvermijdelijk geweest om af en toe een wat minder fraaie oplossing voor de code te gebruiken. Wel is er een uitgebreid gebruik gemaakt van de mogelijkheden die funkties bieden. Wat betreft het gebruik van "GOTO" heb ik dat zoveel mogelijk be- perkt tot die gevallen waar voortijdig een subroutine of "FOR- loop" moet worden verlaten. Er wordt in die gevallen dan steeds naar RETURN respektievelijk NEXT gesprongen. Zelden bevat een subroutine meerdere RETURNs. Dat is wel het geval bij het start/stopscherm (regels 1330 t/m 1660), die routine is gecom- bineerd met (en gaat over in) de inputroutine voor de datum (1440 t/m 1660). Bij de foutafhandeling in de submutatiecodes wordt vaak niet naar het einde van de eigen subroutine ge- sprongen, maar naar het printen van de foutmelding met de bij- behorende RETURN. Bijvoorbeeld bij de routine voor het door- boeken van een bestelling naar rekeningen (regels 4260 t/m 4320) wordt bij onvoldoende ruimte in de rubriek rekeningen op regel 4260 naar de foutmelding op 2950 gesprongen, de RETURN vindt dan plaats op regel 2960. Bij de verwerking van de submutatiecodes (regels 3070 t/m 4930) was een veelvuldiger gebruik van GOTO's onvermijdelijk. Van een gedetailleerde beschrijving van de code zie ik om prak- tische redenen af. Afgezien van de hierboven beschreven "ont- sporingen", is PEGEL logisch van opzet en struktuur. Wie PEGEL echt wil begrijpen, moet met schaar en lijmpot de listing ver- delen in logische brokken en die van commentaar voorzien. Ik ben overigens van mening dat dit een programma is dat gemaakt is om gebruikt te worden; wijziging is vrij gevaarlijk als die wordt uitgevoerd door iemand die niet erg goed op de hoogte is. Dat is er dan ook de reden voor dat de opzet zo is, dat de teksten kunnen worden gewijzigd zonder het programma te veran- deren en opnieuw te compileren. 5.4 maintenance en uitbreidingen Met dit -herschreven- programma heb ik nog geen uitgebreide er- varing, het is daarom niet uitgesloten dat er nog onverwachte fouten in staan. Foutloze software is zoiets als het zoeken naar een perpetuum mobile. Voor een melding van geconstateerde tekortkomingen of bedieningsongemakken houd ik mij aanbevolen; ik ben bereid om die te corrigeren. Omdat het versienummer niet in de file staat maar in het programma is opgenomen, is het eenvoudig om een nieuwe versie te onderscheiden van een oudere versie. Er zijn diverse uitbreidingen denkbaar die nog niet zijn gerea- liseerd. Zo is er bijvoorbeeld nog geen programma aanwezig dat controleert of alle gegevens wel consistent zijn. Als er tij- dens de verwerking van mutaties een storing in de computer of de elektriciteitsleverantie optreedt, is de kans op verkeerde registratie van data (bij PEGEL) levensgroot aanwezig. Met een programma is het mogelijk om die fouten op te sporen en te her- stellen. N.B.: dit programma is nu toegevoegd: PGL-BDG. Ook is het denkbaar dat gebruikers bij een jaarovergang heel andere dingen willen doen dan in PGLJAAR gebeurt. Denkbaar is dat alle oude BUDGET gegevens behouden moeten blijven en er op die manier de files BDG84, BDG85 etc worden aangemaakt. De di- verse budgetprogramma's zijn eenvoudig te begrijpen en zelf te schrijven (anders dan PEGEL). 5.5 wijziging teksten Bij het wijzigen van teksten is er een grote mate van vrijheid. Iemand die bijvoorbeeld de rubriek 7 liever niet "rekeningen" maar "crediteuren" wil noemen, moet de volgende akties onderne- men. 10 OPEN "R",1,"PGL",50 20 FIELD 1,50 AS REC$ 30 ' 40 LSET REC$="7 crediteuren"+CHR$(13) 50 PUT 1,27 60 ' 70 R$="nr code datum bedrag CREDITEUR"+SPACE$(15) 80 LSET REC$=R$+CHR$(13) 90 PUT 1,40 95 CLOSE Het is hierbij wel zaak om op het juiste aantal spaties te let- ten. Voor alle records (met uitzondering van 01, 18, 42 en 62) is dit te vinden door te zoeken naar de plaats waar de carriage return in het record is opgenomen. Het eenvoudigste gaat dat met de statements: GET 1,REC% PRINT INSTR(REC$,CHR$(13)) Op analoge wijze zijn de andere teksten ook aan te passen. Er moet er wel op worden gelet dat de "invulpuntjes" op dezelfde plaats beginnen. Als het symbool waarmee het jaartal wordt geprint, moet worden veranderd in bijvoorbeeld "*", moet je het volgende doen: 10 OPEN "R",1,"PGL",50 20 FIELD 1,50 AS REC$ 30 GET 1,1 40 R$=REC$ 50 MID$(R$,7,1)="*" 60 LSET REC$=R$ 70 PUT 1,1 80 CLOSE Deze wijziging wordt pas effectief nadat PGLJAAR of PGLINIT zijn gedraaid, omdat die programma's het jaartal in de file aanbrengen. Natuurlijk is het ook mogelijk om zelf die records aan te passen, dan is de wijziging onmiddellijk effektief. De aanwezige code CHR$(127) wordt veranderd in "*": 10 OPEN "R",1,"PGL",50 20 FIELD 1,50 AS REC$ 30 FOR REC%=10 TO 16 40 GET 1,REC% 50 R$=REC$ 60 DOORGAAN%=-1 70 WHILE DOORGAAN% 80 R%=INSTR(R$,CHR$(127)) 90 IF R%>0 THEN MID$(R$,R%,1)="*" ELSE DOORGAAN%=0 100 WEND 110 LSET REC$=R$ 120 PUT 1,REC% 130 NEXT 140 CLOSE Er is slechts een tekst in PEGEL die niet in de file kan worden veranderd. Dat is de tekst "nr:" zoals die te zien is bij bij- voorbeeld verwijdering van posten. Deze tekst is echter al be- hoorlijk "internationaal". 5.6 wijziging mutatiecodes De mutatiecodes 1 t/m 9, 0 en S van het menu-scherm kunnen niet worden gewijzigd zonder programma-wijziging. Alle overige muta- tiecodes van de diverse schermen (subcodes) kunnen worden ge- wijzigd. De mutatiecode is steeds gelijk aan de beginletter van de omschrijving zoals die op regel 24 wordt getoond. Deze om- schrijvingen zijn vrij aan te passen (records 47 t/m 56). De omschrijving is vrij met dien verstande dat: 1. de beginletter ongelijk is aan: 0 t/m 9 en "S"; 2. binnen een code geen spatie voorkomt; 3. de diverse beginletters verschillend zijn. De wijziging is effectief zodra de records 47 t/m 56 zijn aan- gepast. Alle symbolen zijn toegestaan, er wordt geen onder- scheid gemaakt tussen hoofdletters en kleine letters. Als bij- voorbeeld de mutatiecode "Geboekt" bij afschrijvingen onderweg (rubriek 8) moet worden veranderd in "Bevestigd", is de enige aktie die moet worden ondernomen (na openen file): LSET REC$="T Herstellen Bevestigd"+CHR$(13) PUT 1,54 Vanaf dat moment geldt niet meer de code "g", maar de code "b" voor deze mutatie. De submutatiecode "P" (pagina) wordt gewijzigd door het eerste woord van record 57 te veranderen. e "b" voor deze mutatie. De submutatiecode "P" (pagina) wordt gewijzigd door het eerste woord van record 57 te verand