logologo2

CORSO SAP R/3 - PROGRAMMAZIONE ABAP/4 - Report

Pagina 1 di 4 - Pagina 2 di 4 - Pagina 3 di 4 - Pagina 4 di 4

Indice

Sono programmi che ottengono stampe di vario tipo a partire dalle tabelle presenti in SAP. Esempi di reports possono essere: lista dei fornitori, elenco dei materiali, stampa fatture, elenco dipendenti per reparto di appartenenza, …

  1. Introduzione;
  2. L’archivio “Estratto”;
  3. Dichiarazioni;
  4. Le tabelle interne;
  5. La videata di selezione;
  6. Fase Elaborativa vera e propria – Routines (FORM);
  7. Tabulati Iterativi;
  8. Trattamento di Archivi Sequenziali Esterni;
  9. I Campi Simbolici (Field Symbols).

Introduzione

Con la parola REPORT si intende un programma che accedendo ad archivi SAP (TABLES) produce normalmente l’emissione di un listato comunque complesso.

Digitando il codice transazione SE38 si entra nella videata per la gestione ABAP/4.

Normalmente quando si esegue un REPORT il sistema emette automaticamente una videata di selezione utilizzata dall’utente per far sì che il programma si limiti a considerare solo particolari range di valori. Ad esempio un programma di stampa fornitori normalmente emette in maniera automatica una videata che permette all’utente di limitare la lista ai soli fornitori il cui codice risulta compreso entro particolari limiti. La struttura ed i campi campi richiesti nella videata di selezione dipendono dal data base logico e dalle tabelle a cui il programma accede; il programmatore può aggiungere nuovi criteri di selezione.

Un esempio di videata di selezione potrebbe essere simile alla seguente:

COD. FORNITORE Da:______________ A:_________________
COD. NAZIONE Da ______________ A:_________________

Il listato comprenderà solo i fornitori il cui codice risulta compreso tra gli eventuali limiti indicati ed appartenenti alle nazioni il cui codice è compreso entro gli estremi indicati.

Un REPORT si compone dei seguenti elementi fondamentali:

  1. TESTO SORGENTE: che contiene le istruzioni in linguaggio ABAP/4 che descrivono la logica del programma;
  2. ATTRIBUTI: che descrivono alcune caratteristiche generali del REPORT come: il tipo di programma; una sua descrizione; l’applicazione cui il programma appartiene; l’eventuale data base logico sul quale è basato il REPORT stesso; …
  3. ELEMENTI DI TESTO: utilizzati per inserire dei testi fissi utilizzati dal programma (intestazioni, titoli, testi per la videata di selezione);
  4. VARIANTI: utilizzate per definire differenti inizializzazioni per i campi previsti sulla videata di selezione.

Il compito più impegnativo del programmatore ABAP/4 è senza dubbio la stesura del testo sorgente perché richiede (come ogni altro linguaggio) l’utilizzo corretto sia della logica di programmazione, sia della sintassi del linguaggio.

Un programma scritto ABAP/4 normalmente si compone di alcune parti fondamentali:

Al momento dell’esecuzione del programma saranno eseguite in sequenza tutte le istruzioni inserite nella parte operativa del programma nell’ambito dell’attivazione di ciascun evento. Questo significa che al verificarsi di un certo evento, saranno eseguite tutte le istruzioni che sono state previste per tale evento in sequenza tra di loro, indipendentemente dalla posizione dove il programmatore ha inserito nel sorgente tale blocco di istruzioni. Ad esempio, tutte le istruzioni inserite nella fase di INITIALIZATION, saranno eseguite prima di qualunque altra istruzione, anche se tale fase fosse stata posta in un altro punto del programma da parte del programmatore. Tuttavia è buona cosa inserire la gestione degli eventi ordinari di un programma SAP nella stessa sequenza con cui di solito si verificano tali eventi, rendendo così più leggibile il programma.

Dal punto di vista della sintassi il programmatore deve tenere presente le seguenti regole:

  1. Tutte le istruzioni SAP devono terminare con il punto (.);
  2. All’interno di una istruzione occorre separare le varie parole o i simboli logici o aritmetici da almeno uno spazio;
  3. I nomi dei campi non possono contenere degli spazi;
  4. L’editor trasforma tutto in maiuscolo ad esclusione dei caratteri posti tra apici;
  5. Un asterisco in prima posizione trasforma il seguito della riga in semplice commento che non è interpretato né eseguito;
  6. SAP opera con vari automatismi che facilitano la vita al programmatore, ma che a volte risultano difficili o impossibili da inibire;
  7. Prima di utilizzare una istruzione è buona norma leggere il relativo help.

Base della programmazione ABAP/4 è la conoscenza della struttura fisica e logica delle TABLES di SAP e delle relative strutture gerarchiche (Data Base Logici), questa conoscenza si acquisisce utilizzando la transazione SE36 che permette la visualizzazione dei data base logici. Sarà questa pertanto la prima transazione necessaria al programmatore.

Se al momento della definizione degli attributi del programma, specifichiamo che il programma è basato sul data base logico KDF otteniamo due risultati:

  1. Al momento dell’esecuzione del programma sarà presentata la videata di selezione in maniera automatica (il programmatore potrà solo aggiungere ulteriori criteri di selezione, ma non eliminarne);
  2. Il programma risulta abilitato all’utilizzo delle istruzioni GET di accesso sequenziale alle varie tabelle di un data base. Si possono utilizzare le GET solo in relazione a tabelle appartenenti al data base logico sul quale è basato il programma, per accessi ad altre tabelle di SAP occorre utilizzare altri strumenti di lettura come le SELECT.

Per illustrare la logica di funzionamento della istruzione GET, facciamo riferimento alla struttura del data base logico KDF (Fornitori).

L’istruzione GET ha la seguente logica di funzionamento:

L’istruzione GET LFA1 produce un ciclo automatico di letture sequenziali (cioè secondo il valore della chiave della tabella (campo LFA1-LIFNR)) che comprende tutte le istruzioni che seguono la GET e che pertanto sono eseguite per tutti i records della tabella LFA1. In pratica le istruzioni di cui sopra corrispondono alla seguente struttura di pseudocodifica:

produce un ciclo di lettura sequenziale della tabella LFA1; per ciascun record della tabella LFA1 è eseguito un ciclo di lettura relativo a tutti i record della tabella LFBK che sono “figli” del record di LFA1 appena letto.

In termini di pseudocodifica la sequenza di cui sopra è rappresentata dalla seguente struttura elaborativi:

Tramite l’istruzione GET è possibile anche accedere direttamente a tabelle che non si trovano al vertice di un DB logico ma a livelli sottostanti senza dover effettuare la GET delle tabelle poste ai livelli superiori. In tale caso il programma, dopo una lettura di una tabella al livello N, ha a disposizione anche tutti i record degli N-1 livelli che gerarchicamente si trovano ai livelli superiori.

Ad esempio, effettuando una GET LFC1 il programma ha a disposizione anche il record di LFB1 “padre” del record LFC1 appena letto, inoltre sono anche disponibili tutti i campi del record di LFA1 “padre” della tabella LFB1. Non è quindi necessaria una lettura delle tabelle gerarchicamente superiori a quella della quale è effettuata la GET. Si noti che una struttura come la seguente:

genera un ciclo di lettura che interessa tutti i record della tabella LFBK presenti sul data base in ordine di chiave senza interruzione di sorta al cambio di livello superiore. Ciò significa che il sistema non si accorge se nello scorrere i record di LFBK passa da un fornitore al successivo del data base. Per ovviare a tale inconveniente è possibile utilizzare la GET LATE nella forma seguente:

Le istruzioni: ISTRUZIONE6. e ISTRUZIONE7. sono eseguite solo dopo la lettura dell’ultimo record di LFBK tra tutti quelli che sono figli dello stesso record di LFA1, in pratica sono eseguite al cambio del codice fornitore.

GENERAZIONE CICLI

L’istruzione GET genera un ciclo automatico sul data base, tuttavia esistono anche altre possibilità fornite da ABAP/4 per la creazione di cicli. Brevemente:

LOOP

Istruzioni

ENDLOOP.

Le istruzioni comprese tra LOOP e ENDLOOP sono eseguite per ogni record presente nell’archivio estratto (LOOP semplice) oppure sulla tabella sulla quale è effettuato il ciclo (LOOP AT tabella).

DO…

Istruzioni

ENDDO.

Le istruzioni comprese tra DO e ENDDO sono eseguite fino a quando il programma incontra una istruzione che lo obbliga ad abbandonare il ciclo (EXIT) oppure fino al raggiungimento del numero di iterazioni previste.

WHILE…(condizione)

Istruzioni

ENDWHILE.

Le istruzioni comprese tra WHILE e ENDWHILE sono eseguite fino al momento in cui la condizione che segue WHILE diventa falsa.

SELECT FROM dbtab….

Istruzioni

ENDSELECT.

Le istruzioni comprese tra SELECT e ENDSELECT sono eseguite per tutti i record della tabella dbtab trovati sul data base.

 

Per ulteriori approfondimenti si rimanda all’uso dell’help in linea fornito da SAP.

L’ARCHIVIO “ESTRATTO”

Normalmente un REPORT si compone di varie fasi di elaborazione detti eventi, una di esse di solito è la fase in cui il programma provvede ad estrarre dagli archivi SAP tutte le informazioni necessarie all’ottenimento del listato richiesto. Tali informazioni possono essere strutturate come un archivio sequenziale di servizio del quale occorre stabilire il tracciato record. L’archivio sequenziale di servizio è chiamato “estratto” perché l’istruzione EXTRACT produce la scrittura di un singolo record sull’archivio stesso.

Nella prima fase (compresa tra la START-OF-SELECTION e END-OF-SELECTION) sarà creato l’estratto; nelle fasi successive si provvederà a rileggere l’estratto al fine di ottenere la stampa richiesta. L’estratto può essere letto più volte tramite un ciclo del tipo LOOP – ENDLOOP e può essere ordinato tramite l’istruzione SORT. Conviene inserire direttamente nell’estratto tutte le informazioni richieste in stampa.

Definizione dell’estratto

Per definire la presenza di un estratto ed il relativo tracciato record si utilizzano le seguenti istruzioni:

FIELD-GROUPS: HEADER, DATI

INSERT: LFA1-NAME1 LFA1-LIFNR INTO HEADER.

INSERT: LFA1-ORT01 LFA1-STRAS INTO DATI.

Con le istruzioni precedenti è definito un archivio “estratto” il cui tracciato record è composto da due parti fondamentali:

HEADER che rappresenta il primo “pezzo” di ciascun record
DATI che contiene la parte successiva di ciascun record

Normalmente conviene inserire nell’HEADER tutti i campi per i quali si intende effettuare il successivo ordinamento di stampa.

Con l’istruzione:

EXTRACT DATI.

Si ottiene la scrittura di un record di estratto che andrà ad accodarsi a quelli inseriti fino a quel momento.

Se ad esempio il programma prevedesse le seguenti istruzioni:

Otterremmo un archivio estratto contenente un record per ogni fornitore (cioè per ogni record) memorizzato nella tabella LFA1.

Una volta completato il riempimento dell’estratto, è possibile ordinarlo secondo i criteri richiesti, e rileggerlo sequenzialmente una o più volte secondo le esigenze del programma utilizzando le istruzioni:

SORT per effettuare l’ordinamento dell’estratto
LOOP – ENDLOOP per leggere sequenzialmente l’estratto.

Nell’esempio indicato, volendo effettuare una stampa in ordine alfabetico dei fornitori, dopo la fase di selezione dati, sarà necessario inserire le seguenti istruzioni:

SORT. Ordinamento estratto secondo campi dell’HEADER
LOOP.

WRITE:\ LFA1-NAME1, LAF1-LIFNR, LFA1-ORT01, LFA1-STRAS

ENDLOOP.

Le istruzioni comprese tra LOOP. e ENDLOOP. sono eseguite per ogni record dell’archivio estratto come se dopo l’istruzione LOOP fosse inserita una lettura sequenziale dell’estratto.

Si noti che dopo la fase di selezione, i campi LFA1-NAME1, LFA1-LIFNR, LFA1-ORT01, LFA1-STRAS sono interpretati come campi dell’estratto e non come quelli dell’ultimo record della tabella LFA1 letto durante la fase di selezione.

Per evitare confusione tra differenti campi aventi il medesimo nome, si consiglia talvolta di attribuire ai campi dell’estratto un nome diverso da quello presente nelle tabelle SAP da cui tali campi sono selezionati. Nel caso precedente si potrebbe ad esempio operare come segue:

Volendo successivamente anche una stampa ordinata per codice fornitore è sufficiente aggiungere anche le seguenti istruzioni:

Operazioni interne al LOOP sull’estratto

 

All’interno di un loop è possibile inserire delle istruzioni che devono essere eseguite:

  1. per ogni record di estratto;
  2. solo al verificarsi di particolari eventi.

Ad esempio:

Per ulteriori approfondimenti si rimanda all’uso dell’help in linea fornito da SAP.

DICHIARAZIONI

La fase iniziale del programma è adibita alla dichiarazione di tutte le variabili e gli archivi SAP (tabelle) che il programma utilizza. Tutte le variabili devono essere dichiarate. In realtà è possibile inserire istruzioni dichiarative in qualunque punto del programma, tuttavia si consiglia di inserirle tutte in testa al programma per renderlo più lineare e comprensibile.

Per dichiarare una tabella si utilizza l’istruzione TABLES; ad esempio:

TABLES LFA1.

Abilita il programma ad accedere alla tabella LFA1 (Fornitori) e fa in modo che il programma conosca tutte le variabili previste nel tracciato record della tabella LFA1.

Per definire un campo si utilizza l’istruzione DATA; ad esempio:

DATA PIPPO(5) TYPE C.

definisce la variabile PIPPO come un campo di tipo carattere lungo 5 posizioni.

L’istruzione:

definisce la variabile AREA che globalmente è lunga 24 caratteri di tipo alfanumerico e che è a sua volta composta da due variabili chiamate CODICE (lungo 4 caratteri e NOME (lungo 20 caratteri). I primi 4 caratteri di AREA coincidono con CODICE, mentre gli ultimi 20 con NOME. All’interno del programma, in caso di ambiguità di nomi (2 variabili che si chiamano CODICE), per far riferimento a CODICE appartenente ad AREA si scriverà:

CODICE-NOME.

La variabile AREA che si compone di altre variabili è chiamata struttura.

Altri tipi di istruzioni dichiarative sono quelle che definiscono i campi utilizzati come criteri di selezione (SELECT-OPTIONS) o parametri (PARAMETERS) nella videata di selezione iniziale che appare in fase di esecuzione del programma.

Per ulteriori approfondimenti si rimanda all’uso dell’help in linea fornito da SAP.

LE TABELLE INTERNE

Un programma ABAP/4 spesso ha la necessità di memorizzare informazioni strutturate in records uguali tra di loro e necessari esclusivamente durante l’esecuzione del programma. In pratica si tratta di veri e propri files che sono visti come archivi a indici (o sequenziali) interni al programma e che sono eliminati al termine dell’esecuzione dello stesso. A tale scopo ABAP/4 prevede le cosiddette tabelle interne (chiamate itab nell’help in linea). La definizione di una tabella interna è effettuata secondo l’esempio seguente che prevede una tabella che memorizzi il numero dei fornitori per ciascuna nazione presente nel sistema:

La clausola OCCURS 10 fa in modo che durante l’esecuzione del programma sia prevista in memoria la possibilità di memorizzare fino a 10 record aventi ciascuno il tracciato indicato. Gli eventuali record ulteriori (oltre al decimo e senza alcun limite superiore) saranno memorizzati e trattati come un file esterno anche se tutto ciò risulta completamente trasparente al programmatore. Conviene comunque fissare un numero di record adeguato al fine di ottimizzare le prestazioni del programma.

Per inserire un record nella tabella TAB occorre valorizzare i campi del tracciato record e successivamente eseguire una delle due seguenti istruzioni:

1. APPEND itab

Con questa istruzione è accodato un nuovo record alla tabella; il nuovo record è posto dopo quelli già presenti indipendentemente dal valore attribuito alla parte iniziale non numerica (NAZIONE); il nuovo inserimento è effettuato anche se esiste già in tabella un record avente lo stesso valore nella parte iniziale non numerica. Ad esempio le seguenti istruzioni:

2. COLLECT itab

L’istruzione COLLECT effettua una ricerca sulla tabella per verificare l’esistenza di un record avente il medesimo valore nella sua parte iniziale non numerica. Se tale record non esiste, allora viene accodato un nuovo record alla tabella (esattamente come con la APPEND) se invece il record esiste già, allora la COLLECT incrementa la parte numerica di tale record.

Se eseguiamo le seguenti istruzioni sulla tabella TAB precedentemente creata:

otteniamo l’inserimento di un nuovo record contenente FR 10 con la prima COLLECT e l’incremento della parte numerica di tale record (NUMERO = 10 + 11 = 21) con la seconda COLLECT. Al termine la tabella assumerà il seguente aspetto:

Successivamente una tabella interna può essere ordinata con il comando SORT e letta sequenzialmente con le istruzioni LOOP e ENDLOOP. In particolare tali istruzioni assumono una forma leggermente diversa rispetto a quella utilizzata durante l’elaborazione dell’estratto:

All’interno del LOOP su una tabella interna restano valide tutte le istruzioni del tipo AT (END OF…, FIRST, LAST, NEW…, ENDAT) viste durante l’elaborazione dell’archivio ESTRATTO. Inoltre, è possibile trattare una tabella interna anche come archivio a indici avente come chiave il numero del record tramite istruzioni del tipo:

READ itab INDEX num

Dove itab è una tabella interna e num è un campo numerico che contiene il numero progressivo del record da leggere.

DELETE itab INDEX num

Elimina il record num-esimo della tabella.

MODIFY itab INDEX num

Che varia il contenuto del record num-esimo della tabella interna. L’istruzione MODIFY può essere utilizzata anche durante una elaborazione sequenziale (LOOP AT itab… ENDLOOP), in tale caso è modificato il record corrente e non è necessario utilizzare la clausola INDEX. Nell’esempio seguente si ottiene ad esempio la modifica di tutti i record di una tabella interna impostando a 100 il campo NUMERO.

Per ulteriori approfondimenti si rimanda all’uso dell’help in linea fornito da SAP.

LA VIDEATA DI SELEZIONE

In sintesi la videata di selezione è conosciuta come una schermata emessa al momento di eseguire un report che permette all’utente di inserire criteri di selezione o parametri utili al programma. In particolare si prevedono due differenti tipologie di dati inseribili da parte dell’utente:

  1. PARAMETERS: utilizzati in fase di inizializzazione delle variabili;
  2. SELECT-OPTIONS: utilizzati per inserire uno o più ranger di valori che limitino il trattamento a particolari records.

Ad esempio: La videata di selezione per l’estrazione dei dati anagrafici dei fornitori può essere così composta:

La scelta se creare un listato o un archivio è un campo di tipo PARAMETERS in quanto è ammessa la digitazione di uno e un solo valore (L oppure A) da parte dell’utente, mentre la scelta dei ranges di valore di codice fornitore è un campo di tipo SELECT-OPTIONS perché è richiesto un valore iniziale e una valore finale ripetibili più volte (nell’esempio si prevedono fino a 3 coppie di valori).

Nell’esempio precedente le definizioni potrebbero essere effettuate nel seguente modo:

SELECT-OPTIONS CODFOR FOR LFA1-LIFNR.
PARAMETERS: TIPOOUT. 

ABAP/4 considera CODFOR come una tabella interna costituita da due campi: CODFOR-LOW (adibito a memorizzare il limite inferiore del range) e CODFOR-HIGH (utilizzato per registrare il limite superiore).

La clausola FOR LFA1-LIFNR specifica che il campo LFA1-LIFNR (Codice Fornitore) deve essere confrontato con i ranges di valori inseriti dall’utente. Se il valore di LFA1-LIFNR non risulta compreso in nessuno degli intervalli digitati dall’utente, allora il record deve essere bypassato.

GET LFA1.
CHECK CODFOR.
Istruzioni successive non eseguite in caso di valori esterni ai ranges.

L’istruzione CHECK effettua il confronto indicato ed eventualmente bypassa in modo automatico le successive istruzioni, ritornando alla GET del successivo record della tabella LFA1.

Il parametro TIPOOUT assumerà automaticamente il valore digitato (L/A) dall’utente nella videata di selezione. L’associazione tra i nomi dei campi PARAMETERS e SELECT-OPTIONS, e la descrizione relativa che deve comparire nella videata di selezione è stabilito dal programmatore quando inserisce i testi di selezione previsti dal programma (Pulsanti: elementi di testo e successivamente testi di selezione della videata corrispondente alla transazione SE38).

E’ possibile attribuire dei valori iniziali prefissati ai PARAMETERS e ai SELECT-OPTIONS tramite la clausola DEFAULT in modo che all’utente compaia una videata di selezione già impostata, sarà poi possibile da parte dell’utente una modifica manuale ai valori proposti.

INITIALIZATION

La fase di INITIALIZATION è eseguita appena prima dell’emissione della videata di selezione e può servire per attribuire dei valori iniziali ai campi di selezione (PARAMETERS e SELECT-OPTIONS) in alternativa alla clausola DEFAULT, oppure per qualunque altra operazione che si intende effettuare prima dell’elaborazione vera e propria. Questa non è una fase obbligatoria.

AT SELECTION SCREEN

Questa fase deve essere adibita ai controlli che si intendono effettuare relativamente ai valori attribuiti dall’utente ai campi di selezione (PARAMETERS e SELECT-OPTIONS). Riferendoci al precedente esempio, un controllo da eseguire in questa fase potrebbe essere la verifica che nel campo TIPOOUT sia inserito uno solo dei valori previsti L o A. Inoltre, si potrebbe verificare la validità e l’esistenza dei codici fornitori inseriti nei campi CODFOR-LOW e CODFOR-HIGH previsti come SELECT-OPTIONS.

Se uno dei campi digitati dall’utente risulta invalido (ad esempio l’utente digita X nel parametro TIPOOUT), sarebbe opportuno emettere una segnalazione di errore che può essere bloccante (l’utente deve correggere il dato per permettere al programma di procedere) oppure solo un avvertimento che pretende solo una conferma da parte dell’utente.

L’emissione del messaggio di errore è ottenuta tramite l’istruzione MESSAGE nella quale si può indicare il tipo di errore (bloccante, avvertimento,… ), il testo del messaggio che può essere selezionato tra quelli presenti nella tabella messaggi prevista dal sistema SAP (tabella T100, a sua volta suddivisa in aree applicative) oppure creato nuovo. Le istruzioni sono:

In questo modo è emesso il messaggio con codice 001 appartenente all’area applicativa DB aggiungendo anche il testo ‘Errore Parametro’. Il messaggio è di solo avvertimento perché il numero del messaggio è preceduto dalla lettera I. Le tipologie sono:

  1. I: Information;
  2. W: Warning;
  3. E: Error;
  4. A: Abend.

L’area applicativa dalla quale estrarre i testi dei messaggi può essere definita anche nell’istruzione REPORT che compare all’inizio del programma.

Per controllare i valori attribuiti dall’utente ad una variabile di tipo SELECT-OPTIONS occorre effettuare un LOOP di controllo perché questo tipo di variabili prevedono un numero imprecisato di ripetizioni. Ad esempio, le istruzioni per evitare che l’utente inserisca dei codici fornitore inferiore a 00000010 sono:

Per ulteriori approfondimenti si rimanda all’uso dell’help in linea fornito da SAP.

FASE ELABORATIVA VERA E PROPRIA

Terminate le fasi di INITIALIZATION e di AT SELECTION-SCREEN (che possono anche mancare) è eseguita la fase di elaborazione vera e propria che deve iniziare con un’istruzione di START-OF-SELECTION che serve essenzialmente ad indicare la fine della fase precedente e l’inizio della nuova. Termina con l’istruzione END-OF-SELECTION.

Si rimanda all’help in linea per approfondire tutte le istruzioni possibili in ABAP/4 e la relativa sintassi.

REPORT – ROUTINES (FORM)

Quando in un programma si incontrano delle istruzioni ripetute in più punti del sorgente, piuttosto che scrivere ripetutamente i medesimi comandi, risulta spesso utile creare dei sottoprogrammi. Se ad esempio, nell’ipotesi di dover più volte convertire una data da 6 caratteri (AAMMGG) alla forma a otto (SSAAMMGG) le possibili istruzioni sono:

DATANASCITA di 6 caratteri
DATAASSUNZIONE di 6 caratteri
DATANASCITA8 di 8 caratteri in cui vogliamo avere DATANASCITA corredata dal secolo nelle prime 2 posizioni.
DATAASSUNZIONE8 di 8 caratteri in cui vogliamo avere DATAASSUNZIONE corredata dal secolo nelle prime 2 posizioni.
DATA6 di 6 caratteri utilizzata per il richiamo della FORM
DATA8 di 8 caratteri calcolata dalla FORM.

DATA6 = DATANASCITA.
PERFORM CAMBIA_DATA.
DATANASCITA8 = DATA8.
DATA6 = DATAASSUNZIONE.
PERFORM CAMBIA_DATA.
DATAASSUNZIONE8 = DATA8.

Al termine del programma occorre inserire la FORM di nome CAMBIA_DATA.

In fase di esecuzione il controllo passerà alla FORM CAMBIA_DATA quando si incontra una istruzione: PERFORM CAMBIA_DATA. Saranno eseguite tutte le istruzioni comprese tra FORM ed ENDFORM per ritornare al programma principale all’istruzione successiva alla PERFORM CAMBIA_DATA.

Con l’utilizzo delle FORM si ottengono due fondamentali risultati:

  1. si evita la ripetizione delle medesime istruzioni in più punti, rendendo meno onerosa la manutenzione del programma perché in caso di modifica, è sufficiente operare in un solo punto del programma;
  2. si ottiene un programma principale più semplice e comprensibile demandando alle varie FORM le principali difficoltà di logica.

Una FORM a sua volta può richiamare altre FORM senza alcun limite. E’ possibile richiamare una FORM trasmettendo dei parametri, ad esempio:

PERFORM CAMBIA_DATA USING DATANASCITA DATANASCITA8.
PERFORM CAMBIA_DATA USING DATAASSUNZIONE DATAASSUNZIONE8.

La FORM assumerà il seguente aspetto:

Al momento del primo richiamo della FORM CAMBIA_DATA i campi DATANASCITA e DATANASCITA8 saranno visti dalla FORM CAMBIA_DATA con i nomi DATA6 e DATA8; analogamente al momento del secondo richiamo i campi DATAASSUNZIONE e DATAASSUNZIONE8 prenderanno il posto di DATA6 e DATA8.

Per ulteriori approfondimenti si rimanda all’uso dell’help in linea fornito da SAP.

TABULATI ITERATIVI

Il listato ottenuto da un report ABAP/4 può essere ulteriormente trattato anche dopo il suo ottenimento, tramite la pressione di un tasto funzionale o facendo clic in un particolare punto del tabulato stesso. Ad esempio, è possibile aprire un’altra finestra facendo semplicemente clic in un qualsiasi punto oppure richiamare un’altra transazione. In questi casi l’istruzione da inserire nel programma è:

AT LINE-SELECTION.

Facendola seguire da tutte le istruzioni che si vuole eseguire in caso di pressione del clic su una qualsiasi riga del listato che, in questo caso, è chiamato listato iterativo. Ad esempio:

Con tali istruzioni si ottiene una finestra avente come vertice superiore sinistro la colonna 02 e la riga 10 e come vertice inferiore destro la colonna 35 e la riga 15.

Si noti che le istruzioni dopo la AT LINE-SELECTION sono attivate ogni volta che l’utente fa clic in una riga ottenuta tramite una istruzione WRITE, quindi anche quando si preme clic in una delle righe interne alla finestra stessa e non solo in relazione al listato principale. E’ compito del programmatore operare le opportune differenziazioni a seconda che il clic sia operato sul listato principale o su una finestra. Per verificare in quale listato è stato effettuato il clic è sufficiente testare il valore del campo di sistema SY-LSIND che assume il valore 1 se ci troviamo nel listato principale, 2 se è attiva la prima finestra, 3 se è attiva una seconda finestra aperta sulla prima, … Nell’esempio precedente, se si volesse aprire una nuova finestra da attivare premendo clic nella prima finestra, si potrebbe operare come segue:

E’ possibile, inoltre, memorizzare il valore che un campo della riga di stampa aveva al momento dell’emissione della riga (nell’istruzione WRITE) per poi riprenderlo successivamente nell’evento AT LINE-SELECTION. Questo è realizzabile con l’istruzione HIDE seguita dal nome del campo che si intende memorizzare. Tale istruzione è efficace solo se è eseguita immediatamente dopo la WRITE. Ad esempio:

Nella fase di START OF SELECTION è effettuato uno scorrimento della tabella MARA che contiene tutti i materiali presenti nel sistema stampando per ognuno una riga che prevede il codice (MATNR) e l’unità di misura (MEINS) del materiale, memorizzando per ogni riga stampata il corrispondente valore MARA-MATNR (tramite l’istruzione HIDE), per poi riprenderlo in fase AT LINE-SELECTION aprendo una finestra che contiene una riga per ogni descrizione esistente per il materiale prescelto, corredata dall’indicazione della lingua in cui è espressa la descrizione del materiale.

Facendo clic in una riga del listato è possibile attivare una transazione SAP tramite l’istruzione: CALL TRANSACTION, oppure eseguire un altro programma utilizzando l’istruzione SUBMIT. Si rimanda all’help per la sintassi precisa.

Può essere, inoltre, necessario effettuare operazioni diverse a seconda del campo della riga sul quale è stato operato il clic. Nel caso precedente, ad esempio, si potrebbe emettere una lista di tutte le unità di misura presenti nel sistema, qualora venisse effettuato il clic sul campo MARA-MEINS, mentre, in caso si clic sul campo MARA-MATNR si può emettere la finestra delle descrizioni del materiale indicata precedentemente. Per conoscere su quale campo della riga è stato effettuato il clic si utilizza l’istruzione:

GET CURSOR FIELD nomecampo.

Al termine di questa istruzione il campo nomecampo (che ovviamente deve essere definito) contiene il nome del campo sul quale l’utente ha effettuato il clic.

Per ulteriori approfondimenti si rimanda all’uso dell’help in linea fornito da SAP.

TRATTAMENTO DI ARCHIVI SEQUENZIALI ESTERNI

Tutti i reports visti fino a questo momento trattano esclusivamente archivi SAP (TABLES), tuttavia risulta spesso necessario elaborare anche archivi tradizionali di tipo sequenziale, sia in lettura e sia in scrittura. Non è previsto invece il trattamento degli archivi a indice. L’esigenza di accedere ad archivi sequenziali è molto frequente perché un qualunque sistema informativo deve spesso comunicare con altri sistemi tramite supporti magnetici che normalmente contengono archivi di questo tipo. Esempi di utilizzo di archivi sequenziali esterni possono essere i seguenti:

  1. Trasmissione su supporto magnetico di elenchi di tipo fiscale per l’amministrazione finanziaria statale (Elenco Clienti/Fornitori, Modello 770,…);
  2. Trasmissione/Ricezione listini prezzi a clienti/d fornitori;
  3. Trasmissione documenti contabili a istituti di credito (ricevute bancarie,…);
  4. Colloquio tra SAP e altri settori del sistema informativo aziendale non ancora meccanizzato tramite SAP.

Le istruzioni messe a disposizione del linguaggio ABAP/4 per il trattamento di questi tipi di archivi sono poche e molto semplici, come risulta dal seguente elenco:

  1. OPEN DATASET nomearchivio FOR INUT

Che effettua l’apertura dell’archivio sequenziale il cui nome fisico è contenuto nella variabile nomearchivio. Prima di accedere ad un archivio è necessario effettuarne la OPEN definendo il tipo di accesso che si intende operare (in lettura oppure in scrittura). Nel caso indicato è aperto in lettura (FOR INPUT) pertanto il programma potrà esclusivamente leggere tale archivio. Ovviamente per effettuare l’apertura in scrittura occorrerà sostituire la clausola FOR INPUT con FOR OUTPUT; in questo caso il programma potrà esclusivamente scrivere dei record sul nostro archivio il cui nome è memorizzato nella variabile nomearchivio. L’istruzione OPEN DATASET restituisce nel campo di sistema SY-SUBRC il valore 0 se l’operazione è andata a buon fine e il valore 8 se invece l’istruzione ha avuto esito negativo (ad esempio l’apertura in input di un archivio inesistente, o in output di un archivio già utilizzato da un altro utente).

  1. CLOSE DATASET nomearchivio

Che chiude l’accesso all’archivio esterno il cui nome è memorizzato nella variabile nomearchivio. L’istruzione CLOSE DATASET deve essere eseguita al termine del trattamento dell’archivio. Dopo tale istruzione non è più possibile effettuare operazioni di I/O sull’archivio indicato.

  1. READ DATASET nomearchivio INTO nomearea

Questa istruzione produce la lettura sequenziale di un record dell’archivio il cui nome è memorizzato nella variabile nomearchivio, il contenuto del record è trasferito nella struttura (o variabile) avente nome nomearea e che, ovviamente, deve rispecchiare fedelmente il tracciato record dell’archivio di input. Anche questa istruzione imposta il campo di sistema SY-SUBRC al valore 0, se l’operazione è andata a buon fine e al valore 4 se la lettura non è andata a buon fine (l’archivio è terminato).

  1. TRANSFER nomearea TO nomearchivio

Questa istruzione effettua la scrittura di un record che sarà accodato a quelli già presenti nell’archivio il cui nome si trova nella variabile nomearchivio. Il record è riempito con il contenuto della struttura (o variabile) nomarea che deve essere definita rispecchiando il tracciato record dell’archivio.

Ad esempio:

Come si può osservare, dopo ogni operazione di lettura è testato il campo SY-SUBRC; il ciclo è interrotto non appena tale campo segnala la fine dell’archivio. Dimenticando tale test si otterrebbe un ciclo ripetitivo infinito.

Il trattamento di archivi esterni sequenziali è la base per lo sviluppo dei programmi di BATCH-INPUT cioè adibiti al caricamento in massa delle TABLES SAP da parte di sistemi informativi di altro tipo.

Per ulteriori approfondimenti si rimanda all’uso dell’help in linea fornito da SAP.

I CAMPI SIMBOLICI (FIELD SYMBOLS)

A volte un programma ABAP/4 necessita di essere referenziato in maniera indiretta. Ciò si ottiene utilizzando dei campi definiti simbolici che assumono dinamicamente le caratteristiche e il contenuto di altri campi. Praticamente un campo simbolico rappresenta un nuovo nome assegnato dinamicamente ad altri campi definiti in un programma ABAP/4. Ad esempio, un programma potrebbe creare un estratto ed effettuare il SORT relativamente ad un campo definito dall’utente come PARAMETERS:

In pratica si dovrebbe testare tutti i possibili valori di NOMESORT per stabilire quail campi effettuare la selezione.

Utilizzando i campi simbolici il problema si risolve in maniera molto più flessibile ed elegante come segue:

PARAMETERS NOMESORT(06).           
FIELD-SYMBOLS: <S>.

ASSIGN (NOMESORT) TO <S>.
SORT BY <S>.

Il campo simbolico <S> è definito come FIELD-SYMBOLS e tramite l’istruzione ASSIGN assume caratteristiche e contenuto del campo il cui nome è contenuto nel parametro NOMESORT, pertanto il campo di SORT risulta dinamicamente definito dal valore assegnato al campo simbolico <S> senza bisogno di effettuare l’istruzione di CASE seguita da tutte le possibili valorizzazioni che si prevedono per il parametro NOMESORT.

Effettuando l’istruzione:

ASSIGN NOMESORT TO <S>.
(Senza chiudere tra parentesi NOMESORT.)

il FIELD-SYMBOLS NOMESORT assume le caratteristiche e il contenuto del parametro NOMESORT e non del campo il cui nome è memorizzato in NOMESORT.

Combinando questi due differenti utilizzi dei campi simbolici è spesso possibile ridurre notevolmente il numero di istruzioni di un programma ottenendo programmi più razionali ed efficienti.

Per ulteriori approfondimenti si rimanda all’uso dell’help in linea fornito da SAP.