Valutazione attuale:  / 0
ScarsoOttimo 

Il General Print

All'arrivo del 360, e precisamente intorno al 1966 cominciai a pensare di scrivere un programma generalizzato che a mio avviso avrebbe consentito di risparmiare molto tempo di programmazione applicativa; descrissi alla Direzione la mia idea e ebbi l'autorizzazione a progettare e a realizzare il programma.

Vista la grande quantità di programmi di stampa che era necessario scrivere per ogni procedura e considerato che:

  • la maggior parte di essi non era altro che la lista di interi files sequenziali prodotti dai vari programmi delle procedure
  • i singoli campi venivano esposti allineati in colonne e quando numerici con la soppressione degli zeri non significativi o anche con la punteggiatura per la suddivisione delle cifre in migliaia
  • le liste erano alcune volte corredate da una testata di pagina e da uno o più righe di totale che totalizzavano uno o più campi esposti nella lista
  • i totali venivano prodotti al cambio di una parte della chiave (ad esempio per un file ordinato per codice filiale, categoria e numero di conto era prevedibile che si volessero avere totali al cambio del conto, al cambio della categoria ed infine al cambio della filiale)
Avevo quindi pensato che sarebbe stato possibile scrivere un programma generalizzato che consentisse di stampare un qualunque file sequenziale producendo una stampa con le caratteristiche volute, semplicemente comunicando ad esso attraverso una serie di schede di controllo la forma richiesta sia per la parte lista che per la testata e per i totali.

Nacque così la prima versione di un programma che chiamai "General Print" o "GP360" e che anticipava gli attuali "Generatori di Reports"; funzionava sotto il sistema operativo DOS e mi piace ricordare che occupava soltanto 18 Kbytes di memoria centrale.

Il programma consentiva di realizzare la maggior parte delle stampe senza che dovesse essere scritta una sola riga di codice, tanto che il manuale che avevo appositamente realizzato veniva utilizzato anche dagli operatori di sala macchina.

Le informazioni parametriche da fornire al programma dovevano essere riportate su un minimo di 1 ed un massimo di 9 schede perforate, che potevano essere preparate utilizzando un particolare modulo sul quel erano riportate tutte le informazioni necessarie alla preparazione.

Il programma consentiva di leggere files sequenziali (su schede, nastri o dischi) contenenti records di qualunque lunghezza purchè fissa, dai quali era in grado di prelevare qualunque campo alfanumerico o numerico sia Zoned che Packed (due dei formati più comuni usati); ciascuno dei campi poteva essere stampato in una qualunque posizione della riga di stampa ed era consentito di esporre quelli numerici con soppressione degli zeri non significativi o con la punteggiatura e la soppressione degli zeri; per ogni riga di stampa era possibile esporre fino a 24 campi e tra essi potevano essere presenti anche campi costante (non provenienti dal record ma riportati nelle control cards).

Per la descrizione dei campi da listare venivano usate un massimo di 4 control cards, infatti su ogni scheda potevano trovar posto le descrizioni di 6 campi; altre due schede di controllo consentivano di elencare un massimo di 5 condizioni in AND e 5 condizioni in OR che rendevano possibile attivare un filtro che avrebbe fatto elaborare dal file di input soltanto i records rispondenti alle condizioni fissate.

Una scheda era poi dedicata a contenere informazioni varie quali il tipo di input (schede, nastro, disco), le interlinee richieste, notizie sui totali e anche informazioni riguardanti il collegamento ad un eventuale programma collegato di cui parlerò successivamente.

Infine due altre schede venivano utilizzate per fornire informazioni sull'eventuale testata di pagina richiesta.

Ritenendo che in qualche caso sarebbe stato utile affiancare al lavoro fatto da questo programma generalizzato delle routines scritte dal programmatore, avevo provveduto anche a realizzare un aggancio ad un modulo scritto ovviamente in assembler che poteva contenere un certo numero di routines richiamabili dal GP; al verificarsi di determinati eventi (si noti quanto tempo prima avevo immaginato quello che si fa comunemente oggi) potevano infatti essere eseguite delle altre funzioni necessarie appositamente programmate; gli eventi disponibili (allora li chiamavamo exits) potevano essere attivati a mezzo di appositi parametri da inserire nelle control cards, le exits disponibili erano:

  • Exit di house-keeping che si verificava subito dopo che i files di lettura e di stampa erano stati aperti dal GP; questa exit forniva come parametro all'applicativo un campo di 24 bytes presente sulle control cards (serviva quindi a far arrivare dall'esterno dei parametri al modulo assembler collegato)
  • Exit per record elementare che si verificava immediatamente dopo la lettura di un record dal file di input; il programma riceveva l'indirizzo del record, quello dell'area di stampa, quello del DTF (tabella di definizione) del file di stampa ed aveva accesso a tutti i campi di totale; nella routine introdotta da questa exit era possibile esaminare e modificare il record appena letto o chiedere al GP di eliminarlo dall'elaborazione
  • Exit per rigo analitico di stampa che si verificava immediatamente prima che un rigo di stampa preparata dal GP fosse mandato alla stampante; il programmatore che riceveva sia il record corrente che l'area di stampa poteva modificare quest'ultima o anche chiedere al GP di eliminarla.
  • Exit per testata che si verificava dopo che la testata era stata preparata da GP, ma immediatamente prima che fosse mandata in stampa
  • Exits per totali minore, intermedio e maggiore che si verificavano al momento in cui era stata rispettivamente preparata la riga del totale minore, intermedio o maggiore; il programmatore aveva la possibilità sia di modificare quanto stava per essere stampato, sia di chiedere al GP di eliminare quella riga
  • Exit di EOF che si verificava immediatamente prima della chiusura del file di input e di quello di stampa
Durante le exits era possiile per il programmatore inserire righe di stampa accedendo al DTF che gli veniva fornito dal GP o più facilmente usando una macroistruzione (la PUTGP) che avevo appositamente scritto.

Un'altra macroistrozione (la LOADGP) infine consentiva al programmatore di richiamare il GP da programma passandogli un'area di memoria nella quale dovevano essere contenute le informazioni altrimenti scritte nelle control cards; in questa maniera il programma generalizzato finiva per integrarsi completamente con i programmi elaborativi, veniva caricato solo quando era necessario e riceveva i dati da trattare direttamente dal programma che lo aveva richiamato.

Il GP360 fu largamente usato per molti anni e quando il Banco passò dal sistema operativo DOS all'OS, come tutti gli altri programmi dovette subire un aggiornamento; in quell'occasione approfittai per aggiungervi la possibilità di stampare una eventuale supertestata che doveva servire a contenere il nome dell'elaborato e che riportava anche la data e l'ora di produzione dello stesso, nonchè il numero di pagina (il mio obiettivo era quello di far sì che un qualunque foglio anche sciolto, doveva avere indicazioni sufficienti per poter essere riconosciuto ed essere ricollocato al suo posto); il nuovo programma, poichè ormai eravamo nell'epoca del 370, si chiamò GP370.

Tutte le funzioni del GP360 rimasero disponibili nel GP370; il collegamento con le routines di modifica fu migliorato con l'utilizzo di una nuova macroistruzione (la MODGP).

In una versione poi immediatamente successiva il GP370 divenne una funzione disponibile nella macroistruzione OUTPUT, consentendo a tutti i programmatori di inserire fine a 6 files di stampa nel proprio programma elaborativo.

 

Curiosità 
Vorrei ricordare che tutte le istruzioni necessarie per l'esposizione dei campi, e per la somma nei contatori destinati a contenere i totali, erano generate "dal nulla"; ricordo infatti che immediatamente dopo le istruzioni che mi erano servite a leggere un record, avevo definita un'area completamente vuota di 1600 bytes; prima di avviare il programma, un'apposita routine che si serviva ovviamente dei parametri scritti nelle control cards, provvedeva a generare in quell'area le istruzioni necessarie sia per esporre i dati nell'area di stampa sia per sommarli eventualmente negli appositi contatori; ogni istruzione era quindi generata con l'opportuno codice operativo, con l'opportuno registro base e il displacement necessario e con le informazioni di lunghezza che ciascun tipo di istruzione prevedeva; il numero di istruzioni generato, dipendeva naturalmente dal numero di campi da trattare e al termine di tutte veniva aggiunta un'istruzione di salto che provvedeva a far tornare alla lettura del record successivo.