Sei sulla pagina 1di 122

Fondamenti di


Matera 16- Programmazione
Definizione ABAP

Advanced
Business
Application
Programming
Definizione ABAP

Advanced
Business
Application
Programming
Caratteristiche del linguaggio
• Linguaggio proprietario sviluppato da SAP AG per l’implementazione di applicativi sul
sistema SAP
• Consente:
o Creare software ex novo in base alle esigenze di un’azienda
o Personalizzare software esistente ottimizzandolo e adattandolo in modo da modificare moduli
esistenti
• Linguaggio strutturato di semplice apprendimento (versione 4GL)
• Garantisce che il software risultante possa essere eseguito su tutti i sistemi di
Database e operativi supportati da SAP
• Rende trasparente la complessità delle reti Client/Server
• Principali finalità dei programmi ABAP:
o Reporting
o Programmi di dialogo interattivi
o Personalizzazione del sistema SAP

4
Linee guida
• Garantire la consistenza dei dati mantenendo i Master Data in un unico ‘luogo’
• Garantire la manutenibilità del software attraverso la modularizzazione dei
programmi
• Garantire i principi di riusabilità e scalabilità del software

5
Parametri per la definizione di un programma
• La creazione di un programma prevede in primo luogo di specificare alcuni attributi
fondamentali, quali, ad esempio, il nome, il tipo, la classe.
• Generalmente, i nomi dei programmi devono seguire uno standard particolare:
• Il nome deve essere lungo 8 caratteri, comprensivo di lettere e numeri, con esclusione
di tutti i caratteri speciali
• I caratteri “% “ e “_” sono ammessi, ma se ne sconsiglia l’uso
• Il nome dei nuovi applicativi deve sempre iniziare per Y o Z (tutti gli altri caratteri
alfanumerici sono una prerogativa dello standard SAP)

• Es. Tipo  1 = report, M = module pool, I = file tipo Include


• Stato  ‘ ’ o T
• Applicazione  genericamente a *
• Classe di sviluppo  $TMP

• 6
• Gli attributi obbligatori nella definizione di un nuovo programma sono tipo, descrizione
e classe.

• Nel caso di programmi che non devono essere trasportati in altri ambienti, la classe
(o pacchetto di sviluppo) da utilizzare è la $TMP (dedicata agli oggetti locali),
altrimenti dovrà essere utilizzata una classe custom già esistente o definita una
nuova classe (del tipo Z<classe>).

7
Sintassi del linguaggio ABAP
• Il linguaggio consiste di:
• Istruzioni
• Parole chiave
• Commenti

• Ogni singola istruzione inizia con una parola chiave e termina con un punto.
• La prima parola di un’istruzione è nota come parola chiave, come tale determina
l’intero significato dell’istruzione. Posizionandosi con il cursore su una parola chiave e
premendo il tasto F1, è possibile consultare l’Help online relativo a quella particolare
istruzione, il che permette di conoscerne tutti gli ambiti di utilizzo.
• Un’istruzione può estendersi anche su più righe e può presentare, in questo caso,
delle indentature. Possono anche inserirsi più istruzioni sulla stessa linea, purché
separate dalla punteggiatura.

8
Tipi di dato predefiniti e loro attributi

9
• NB. Una variabile non definita specificatamente dall’utente assume una tipologia pari
a C e una lunghezza pari a 1.

• Esistono tre tipi di variabili numeriche e cinque tipi di variabili di altro genere:
• P (packed): è una tipologia di dato numerico, utilizzata per questioni commerciali,
quindi numeri di una certa imponenza (fino a 31 cifre) e numeri con la virgola.
Possono essere presenti fino a 14 cifre dopo la virgola, quindi conviene definire
quante se ne desidera visualizzare con l’opzione DECIMALS n . E’ un dato che si
presta a calcoli di grande precisione. Nella visualizzazione del contenuto della
variabile gli zeri non significativi vengono convertiti in spazi e viene posto il punto
come separatore delle migliaia. La variabile è giustificata a destra. Con i numeri
packed si hanno due cifre per byte; il segno è in fondo a destra. Per convertire una
variabile packed in una variabile di tipo C si moltiplica per 2 la lunghezza della
variabile packed e si aggiunge una cifra per il segno.

10
• I (integer): è una tipologia di dato numerico che normalmente viene utilizzata per i
contatori, etc. Non si presta a imponenti calcoli perché vale solo per numeri interi e
neanche tanto grandi . Viene creato un numero binario che permette di essere
garantiti per un range che va da -2.147.483.648 a +2.147.483.648 . Nella
visualizzazione del contenuto della variabile gli zeri non significativi vengono convertiti
in spazi e viene posto il punto come separatore delle migliaia. La variabile è
giustificata a destra.
• F (floating) : è una tipologia di dato numerico utilizzata per risolvere calcoli
matematici, dato che permette di spaziare in una vasta area numerica e di avere una
buona precisione anche dopo la virgola. Nella visualizzazione del contenuto della
variabile questo appare giustificato a destra. Se si desidera una precisione elevata
dopo la virgola, è meglio scegliere la tipologia di dato P.
• N (numeric text) : sembra un numero ma non lo è; è una variabile alfanumerica, che
contiene solo numeri ma che non può essere utilizzata per calcoli aritmetici. E’
utilizzata per codici postali, codici di banca, etc. Va definita la sua lunghezza, come
accade per le variabili di tipo carattere.

11
• D (date) : è una variabile data, lunghezza fissa ad 8 caratteri
• T (time) : è una variabile tempo, lunghezza fissa a 6 caratteri
• C (char) : è una variabile di tipo carattere, lunghezza da dichiarare, di default pari a 1
• X (exadecimal) : è una variabile di tipo esadecimale; all’interno solo valori
esadecimali, quindi da 0 a 9 e da A a F.

12
Nomenclatura Standard degli oggetti di un
programma
• Constants: c_
• Internal Tables: t_
• Parameters: p_
• Select-options: s_
• Ranges: r_
• Radiobuttons: rb_
• Checkbox: cb_
• Pushbutton: pb_
• Global Variables: v_
• Local Variables: l_
• Statics (in Subroutines): st_
• Work Areas: wa_

13
Dichiarazione Dati – DATA Statement
DATA: <field>(length).

Additions: L’istruzione:
CLEAR <field>.
Imposta il campo al valore iniziale
... TYPE <data type>
appropriato per il suo tipo di dato
... LIKE <field>
... VALUE <literal>
... DECIMALS <n>

14
Dichiarare campi dello stesso tipo:
LIKE
• DATA: V_NAME1(25) TYPE C,
• V_NAME2 LIKE V_NAME1,
• V_NAME3 LIKE V_NAME1.

• In questo esempio, per cambiare le proprietà di tutti i campi V_NAMEN, è


necessario solo cambiare le proprietà del campo V_NAME1.

15
• Constants Statement • Assignment Value
DATA: V_NAME1(25),
V_SORT_NAME(10),
CONSTANTS: C_FLAG1 TYPE V_FIRST_LINE(4) TYPE N,
C VALUE ‘X’. V_NEXT_LINE TYPE I.
.
CONSTANTS: C_MAX_COUNT TYPE I .
.
VALUE 99.
MOVE 'SAP' TO V_NAME1.
MOVE 5 TO V_FIRST_LINE.
COMPUTE V_NEXT_LINE =
V_FIRST_LINE + 1.
V_SORT_NAME = V_NAME1.
ADD 1 TO V_NEXT_LINE.

16
I campi di sistema
• Esistono alcune variabili, relative ad alcuni campi di sistema, che non vanno
dichiarate, ma che possono essere utilizzate e lette nei programmi.
• La lista di tali variabili è memorizzata nella struttura SYST del Dictionary.
• Alcune, le più usate, sono elencate in figura, come:
• il campo SY-SUBRC viene utilizzata per controllare se una operazione è andata a
buon fine. In questo caso assumerà valore 0.
• Il campo SY_DATUM indica la data di sistema, in formato SAP: AAAAMMGG.
• Ecc..

17
I campi di sistema
Nome Tipo Lungh. Significato

SY-DATUM DATE 8 Data di sistema

SY-UZEIT TIME 6 Ora di sistema

SY-UNAME CHAR 12 Nome dell’utente

SY-SUBRC INT 4 Codice di ritorno

SY-REPID CHAR 8 Nome del programma

SY-LANGU CHAR 1 Linguaggio di sessione

... ... ... .....

18
Dichiarazione Dati – TYPES Statement
TYPES: MYTYPE TYPE I, TYPES: NTYPE1 LIKE SCUSTOM-NAME,
NAME1 (25), NTYPE2(25).
DATE1 LIKE SY-DATUM,
SUM_FIELD TYPE P DATA: NAME1 TYPE NTYPE1,
DECIMALS 2. NAME2 TYPE NTYPE2,
NAME3 LIKE NAME1,
NAME4 TYPE I.

CLEAR <FIELD>

19
Dichiarazione Dati – TYPES Statement
• Per definire una tipologia si utilizza la parola chiave TYPES: a questa segue il nome
della nuova tipologia non elementare seguita dalla tipologia elementare cui fa
riferimento, ed eventualmente anche la lunghezza del dato.
• Il parametro LIKE può essere utilizzato anche nella definizione delle tipologie e
permette di definire ed associare attributi di variabili già dichiarate ( o relativi a campi
di una tabella del database) alle nuove. Il vantaggio del suo utilizzo sta nel fatto che,
se si modifica un campo, tutti quelli ad esso collegati sono variati automaticamente,
riducendo le modifiche ad un unico intervento.
• il nome della tipologia può consistere al massimo di 30 caratteri, ma mai meno di 2;
• sono ammessi caratteri speciali a parte le parentesi, il “+”, “<“ , “>“ e tutti i segni di
punteggiatura;
• iniziare il nome con un carattere alfabetico ed utilizzare l’undescore per unire due o
più parole.

20
Transazioni di Workbench

• Repository Browser (SE80)


• ABAP Dictionary (SE11)
• ABAP Editor (SE38)
• Function Builder (SE37)
• Screen Painter (SE51)
• Menu Painter (SE41)

21
Definizione dei parametri di input
• E’ possibile generare uno schermo interattivo in cui l’utente può impostare alcuni
criteri di selezione per l’esecuzione di un report.

• La lista di output del report conterrà dati congruenti con la selezione effettuata.

• L’ABAP offre due tipi principali di campi di input sullo schermo standard di selezione:

• Parameters: consentono una selezione unica sul campo definito

• Select-Options: si costituisce una tabella interna per riportare i criteri di selezione,


talora anche piuttosto complessi (da utilizzare per specificare in modo dinamico le
clausole di WHERE nell’istruzione SELECT).

22
Parameters
• La definizione dei parameters è piuttosto simile alla definizione di qualsiasi altro
campo nella parte di programma dedicata alla dichiarazione delle variabili.
• Al contrario delle variabili dichiarate normalmente, i parametri definiti con la parola
chiave PARAMETERS danno l’accesso ad uno schermo standard di selezione in cui
l’utente può effettuare una sua scelta. La dichiarazione dei Parameters comporta più
o meno gli stessi parametri già incontrati per la dichiarazione delle variabili, con la
differenza che, al posto dell’opzione VALUES per impostare i valori di default, si
utilizza la formula DEFAULT. Inoltre, solo variabili elementari possono essere
associate ai Parameters, e quando sono di tipo C e di lunghezza 1 possono essere
rappresentate, nel Selection Screen, come una check box, mediante l’opzione AS
CHECKBOX da aggiungere alla definizione del Parameter, o come radiobutton
mediante l’opzione RADIOBUTTON GROUP <group> da aggiungere alla definizione.

23
Parameters
• PARAMETERS: par AS CHECKBOX.
• PARAMETERS: par2 RADIOBUTTON GROUP <group> DEFAULT ‘X’,
• Par3 RADIOBUTTON GROUP <group>.

• I radiobutton sono campi cliccabili, non contemporaneamente. Per renderli


mutuamente esclusivi, devono appartenere a un gruppo da indicare nella definizione
(<group>).
• Per definizione ci devono essere almeno 2 radiobuttun e UNO SOLO deve avere
l’addition DEFAULT ‘X’.
• L’eventuale click dell’utente sul campo Parameter di input viene interpretato a
programma come una ‘X’, altrimenti sarà impostato a spazio.
• Ogni Parameter definisce un campo che può essere usato nel report proprio come
una normale variabile definita con DATA <nome della variabile>.

24
Parameters
• Ogni Parameter ha anche associata un’etichetta dipendente dalla lingua, che è
impostata automaticamente sullo schermo di selezione.
• Se invece non esistono le opportune etichette, viene visualizzato accanto al campo
Parameter il nome tecnico dello stesso.
• L’etichetta può essere cambiata o semplicemente tradotta utilizzando i Text Elements,
richiamando l’argomento mediante il percorso Editor -> Goto -> Text Elements e
cliccando sulla voce Testi di Selezione.

25
Select-Options
• I criteri di selezione sono definiti con l’istruzione SELECT-OPTIONS.
• Il nome del criterio di ricerca impostato non può essere maggiore di 8 caratteri.
• La corretta sintassi è la seguente:

• SELECT-OPTIONS <nome della selezione> FOR <nome del campo>.

• Dopo il FOR va specificato il nome del campo di tabella per cui è valida
l’impostazione dei criteri di ricerca. Per ciascuna selezione, l’ABAP/4 costruisce una
tabella interna con una connotazione standard.
• Questa struttura viene poi riempita con i parametri che derivano dalla selezione
impostata con la SELECT-OPTIONS.

26
Select-Options
Segno Opzione Significato opzione Valore Valore
minimo massimo

I EQ Uguale --
E NE Diverso --
I LT Minore --
I GT Maggiore --
I LE Minore o Uguale --
I GE Maggiore o Uguale --
I BT Compreso fra -- --
I NB Non compreso fra -- --
I CP Contiene il pattern definito --
I NP Non contiene il pattern definito --

27
Select-Options
• Colonna SIGN: unici valori ammessi sono ‘I’ o ‘E’ (case sensitive), e stanno ad
identificare l’inclusione o l’esclusione dei records che corrispondono ai criteri di
seguito impostati dalla lista di output del report.

• Colonna OPTIONS: corrispondono agli operatori di relazione da utilizzare nella select.

• Colonna LOW: indica il valore minimo di un intervallo (se di un intervallo si tratta) o


l’unico termine da abbinare all’operatore di relazione selezionato per la costruzione
della select dinamica.

• Colonna HIGH: indica il valore massimo di un intervallo da abbinare all’operatore di


relazione selezionato per la costruzione della select dinamica (necessariamente BT o
NB). E’ presente solo se esiste in contemporanea sulla stessa riga il valore nella
colonna LOW.

28
Addition
• Alla definizione standard di parameters e select-option possiamo aggiungere delle
addition per modificarne le caratteristiche:

• NO INTERVALS: valido solo per le select-options, non fa visualizzare il secondo


valore dell’intervallo

• NO-EXTENSION: valido solo per le select-options, non fa visualizzare il bottone con


la freccia che permette di aggiungere altre selezioni

• OBLIGATORY: rende il campo obbligatorio

• DEFAULT <d>: imposta <d> come valore iniziale

29
Ulteriori selezioni
• Possiamo perfezionare la videata di selezione con altre semplici istruzioni:

• SELECTION-SCREEN SKIP : Disegna 1 linea vuota sullo screen.

• SELECTION-SCREEN BEGIN OF BLOCK <b> WITH FRAME [TITLE <text>]:


• SELECTION-SCREEN END OF BLOCK <b>.
• Disegna una cornice sullo screen. L’addition TITLE seguito da un text-symbol (vedi
paragrafi precedenti), permette di inserire un titolo.
• Tra il BEGIN OF BLOCK e l’END OF BLOCK possiamo includere le definizioni di
parameters e select-options che verranno disegnati sullo screen all’interno della
cornice.

30
Ulteriori selezioni
• SELECTION-SCREEN BEGIN OF LINE.
• SELECTION-SCREEN END OF LINE.
• I parameters o le select-options definiti tra BEGIN OF LINE e END OF LINE verranno
disegnati sulla stessa riga.

• SELECTION-SCREEN COMMENT <pos>(<len>) <text> FOR FIELD <c>.


• Sostituisce il testo <text> (text-symbol) al nome del parametro <c> o alla sua
descrizione sullo screen, partendo dalla posizione <pos> e occupando <len>
caratteri.

31
Messaggi
• Def. Un messaggio è identificato da un tipo, una classe messaggi, un numero
messaggio, e da un testo.
• MESSAGE <tipo><numero>(<classe>).
• Classe dei messaggi (/SE91): La classe definita in testa al programma di dialogo o
al report dopo la dicitura MESSAGE-ID mette a disposizione di quel codice ABAP/4
tutti i messaggi di quella determinata classe per tutta la durata dell’esecuzione del
programma in oggetto, sempre in relazione al linguaggio richiesto.
• E’ possibile anche modificare contestualmente la classe dei messaggi all’interno di un
programma, quando si richiama un certo messaggio con la sintassi MESSAGE
Ynnn(XX) dove è la tipologia del messaggio e XX è la classe in cui questo si trova;
tale classe risulta disponibile solo per quel determinato messaggio.
• REPORT <nome_report> [NO HEADING STANDARD PAGE]
• [LINE-SIZE <n>] [LINE-COUNT <m>[(<s>)]]
• MESSAGE-ID <nome_classe>.

32
Messaggi
• NO HEADING STANDARD PAGE: non fa visualizzare in output il nome del report con
la sua descrizione;
• LINE-SIZE <n>: imposta la larghezza dello schermo (numero di colonne sull’output)
• LINE-COUNT <m>[(<s>)]: imposta il numero max di righe per pagina, sullo screen..
<m> è il numero delle righe; se specificato, <s> indica il numero di righe dedicate al
piè di pagina.

33
Messaggi
• Codice del messaggio (nnn) : è un codice numerico di tre caratteri che corrisponde
al testo di un messaggio scritto o tradotto nella lingua di Logon.
• E’ il numero che nel programma viene richiamato, preceduto da un prefisso di una
lettera (A, E, W, I, S, X) che ne sta ad indicare la tipologia
• Testo del messaggio: questo può anche non essere del tutto codificato, scritto per
esteso, ma può essere costruito, del tutto o in parte, dinamicamente a programma. In
tal caso si utilizza il carattere speciale & (max 4).
• La sostituzione dei simboli con le componenti dinamiche del messaggio avviene
quando il messaggio è richiamato con l’opzione WITH <nome parametro>.
• Nel caso in cui il testo contenga più parti variabili, la sostituzione dei simboli
rispecchia l’ordine delle variabili che seguono il WITH (la sostituzione è posizionale).

34
Messaggi
Tipo messaggio Significato

A abend

X abend con un dump MESSAGE_TYPE_X

E errore bloccante

W avviso, errore non bloccante

I informazione

S successo

35
Istruzioni elementari
• VALUES per inizializzare una variabile o definire una costante

• MOVE per attribuire un valore ad una variabile durante il runtime

• ADD, SUBTRACT, MULTIPLY e DIVIDE per effettuare operazioni aritmetiche
(sostituibili con operatori aritmetici “+”, “-” , “*”, “/”)

• COMPUTE per attribuzioni a variabili numeriche

36
Istruzioni elementari

37
Istruzioni Condizionali
Operatore Simbolo Significato

EQ = EQual

NE <> >< Not Equal

GT > Greater Than

GE >= => Greater than or Equal

LT < Less Than

LE <= =< Less than or Equal

BETWEEN f1 and f2 Range

IS INITIAL Initial value

38
Istruzioni Condizionali
L’istruzione ‘IF’ L’istruzione ‘IF’ L’istruzione ‘IF’

• IF <espressione • IF <espressione • IF <espressione


logica >. logica>. logica>.
• ISTRUZIONE. • ISTRUZIONE. • ISTRUZIONE.
• ENDIF. • ELSE. • ELSEIF
• ISTRUZIONE. <espressione logica>.
• ENDIF. • ISTRUZIONE.
• ELSEIF
<espressione logica>.
• ISTRUZIONE.
• ENDIF.

39
Istruzioni Condizionali
L’istruzione ‘CASE’

CASE <field>.

WHEN <value1>.

ISTRUZIONE.

WHEN <value2>.

ISTRUZIONE.

WHEN OTHERS.

ISTRUZIONE.

ENDCASE.
40
Istruzioni Iterative (o Cicliche)
L’istruzione ‘DO’ L’istruzione ‘WHILE’

DO [<n> TIMES]. WHILE <espressione logica>.


ISTRUZIONE. ISTRUZIONE.
ENDDO. ENDWHILE.

41
Istruzioni Iterative (o Cicliche)
• Nel caso del DO, l’istruzione contenuta all’interno del ciclo va eseguita un numero
<n> di volte, numero definito a programma, attribuendo ad <n> il valore di una
costante. Non c’è la possibilità di mettere una condizione di uscita dal ciclo con il DO.
La condizione va creata inserendo, all’interno del loop, un IF cui segue l’istruzione
EXIT, per bloccare eventuali errori.
• Nel caso del WHILE, invece, l’istruzione contenuta all’interno di un loop va eseguita
un numero <n> di volte che non è determinato a priori, ma dal verificarsi di una certa
espressione logica scritta successivamente al WHILE.
• Anche in questo caso è possibile intervenire e modificare il numero di passaggi
effettuati all’interno del loop variando il contatore di sistema (SY-INDEX), ovvero
inserendo una variabile dichiarata nel programma che funziona da contatore.
• Il loop, sia gestito dal DO che dal WHILE, ammette la nidificazione.

42
Istruzioni Iterative (o Cicliche)
L’istruzione CHECK

CHECK <logical expression>.

L’istruzione EXIT

L’istruzione EXIT non è seguita da alcuna espressione né condizione. Possiamo


distinguere fra varie possibilità:
• l’istruzione EXIT è contenuta all’interno di un loop: si esce dal loop;
• l’istruzione EXIT è contenuta all’interno di una subroutine: si esce direttamente dalla
subroutine;
• l’istruzione EXIT è all’esterno di un loop o di una subroutine: si esce dal report.

43
Istruzioni Iterative (o Cicliche)
L’istruzione CONTINUE

CONTINUE.
L’istruzione CONTINUE determina il salto di una istruzione all’interno di un ciclo.

44
Gruppi Di Dati e Tabelle Interne

45
Gruppi Di Dati e Tabelle Interne
• Record
• É un gruppo di dati, un insieme di campi logicamente collegati tra loro.
• Per identificare il singolo campo all’interno della struttura, basta scrivere il nome della
struttura come prefisso, seguito da trattino e nome del campo.

• Tabelle interne
• Quando si definisce una tabella interna si identifica una struttura che esiste realmente
soltanto durante l’esecuzione del programma. Le tabelle interne sono particolarmente
utili per lavorare con copie temporanee del database, o con parti di esse.
• Le tabelle interne sono caratterizzate dalla presenza, in fase di definizione, di un
parametro di occurs. Esistono due tipi di tabelle interne, quelle che utilizzano una
linea di testata e quelle che non la utilizzano.

46
Gruppi Di Dati e Tabelle Interne
• Tabella interna con header line
• Specificando nella definizione della tabella, dopo il parametro di occurs, WITH
HEADER LINE, l’ABAP/4 costituisce una struttura che ha le stesse caratteristiche di
un record.
• L’header line è la work area della tabella interna.
• Quando si riempie una tabella interna, in realtà è l’header line ad essere riempita e
poi scaricata sulle linee di tabella, utilizzando le apposite istruzioni. Allo stesso modo,
quando si legge il contenuto di una tabella interna, i dati da leggere sono posti
nell’header line che funziona da buffer di lettura.
• Tabella interna senza header line
• Nel caso di una tabella interna senza header line, invece, si tratta sempre di una
struttura che ha vita soltanto durante il runtime, ma non possiede una struttura
intrinseca da utilizzare per tutte le operazioni sui singoli elementi della tabella,
dall’inserimento alla lettura. Tale funzione è comunque assolta da una variabile che,
avendo la stessa struttura degli elementi della tabella, è a tutti gli effetti un’header line
distaccata dalla tabella.
• 47
Lavorare con tabelle interne
• L’istruzione APPEND

•APPEND <nome tabella>.


•APPEND <wa> TO <nome tabella>.

•I dati sono posti nella header line o nella struttura work area e poi, con l’istruzione
APPEND, il contenuto viene inserito in fondo alla tabella, a seguire l’ultima linea
precedentemente inserita.

48
Lavorare con tabelle interne
• L’istruzione SORT

• SORT <nome tabella> BY <nome campo1> <nome campo2> ...

• L’istruzione SORT consente l’ordinamento di una tabella in base a campi specificati.


• Se non sono specificati criteri l’ordinamento avviene per tutti i campi della tabella
secondo criterio ascendente.

•SORT <nome tabella> BY <nome campo1> ASCENDING <nome campo2>


DESCENDING .

•E’ possibile altrimenti specificare il tipo di ordinamento (ascendente, discendente).

49
Lavorare con tabelle interne
• L’istruzione LOOP

• Per effettuare delle elaborazioni sulle singole linee della tabella si utilizza l’istruzione:

• LOOP AT <nome tabella> INTO <wa> WHERE <espressione log>. ...... ENDLOOP.

• Ad ogni passaggio all’interno del ciclo si tratta una nuova linea della tabella.

• Quando si effettua la lettura di una tabella interna, il numero della riga che si sta
leggendo è riportato nel campo di sistema SY-TABIX.

50
Lavorare con tabelle interne
• L’istruzione READ TABLE

• Per effettuare delle letture sulle singole linee della tabella si utilizza l’istruzione:

• READ TABLE <nome tabella> INTO <wa> WITH KEY ......



• La lettura si ferma quando trova la prima linea della tabella interna che soddisfa la
chiave impostata. Si usa per una lettura puntuale.

• READ TABLE <nome tabella> INTO <wa> INDEX <n> ..... .


• Legge l’<n>-simo record della tabella.

51
Lavorare con tabelle interne
• L’istruzione MODIFY

• MODIFY <nome tabella> FROM <wa> INDEX <n>

• Per effettuare delle modifiche su una delle righe della tabella, si utilizza l’istruzione
MODIFY, che utilizza l’header line o la wa, per generare una nuova linea che
sovrascriverà la linea <n esima> (che deve esistere, se non si vuol incorrere in un
errore di runtime)

52
Lavorare con tabelle interne
• L’istruzione INSERT

• INSERT <nome tabella> FROM <wa> INDEX <n>

• Per effettuare degli inserimenti in tabella, si utilizza l’istruzione MODIFY, che utilizza
l’header line o la wa, per generare una nuova linea che verrà inserita nella posizione
<n esima> (non deve esistere una riga con la stessa chiave, se non si vuol incorrere
in un errore di runtime).

53
Lavorare con tabelle interne
• L’istruzione DELETE

• Per effettuare la cancellazione di un elemento della tabella si utilizza l’istruzione


riportata di seguito, che elimina la linea <n esima>:

• DELETE <nome tabella> FROM <WA> INDEX <n> ......

• E’ possibile utilizzare anche delle condizioni di WHERE per identificare la linea da


cancellare, come è possibile cancellare un gruppo di linee utilizzando l’opzione
FROM <n1> TO <n2> per delimitare il range della cancellazione (si cancellano anche
i limiti del range). E’ possibile anche effettuare delle cancellazioni in ciclo, all’interno
di un loop. In tal caso, nell’istruzione di cancellazione mancherà l’indicazione INDEX
<n>, in tal caso la riga cancellata sarà quella corrente.

54
Lavorare con tabelle interne
• Istruzioni CLEAR e REFRESH

• CLEAR <nome tabella>.


• CLEAR <wa>.

• Si uitlizza per effettuare una corretta inizializzazione dell’header line o della wa.

• REFRESH <nome tabella>.

• Si utilizza per cancellare l’intero contenuto di una tabella interna.


• NB. Questa istruzione non comporta il rilascio dell’area di memoria dedicata alla
tabella, né va a pulire l’header line

55
Lavorare con tabelle interne
• L’istruzione DESCRIBE

• DESCRIBE TABLE <nome tabella> LINES <var1> OCCURS <var2>.

• Consente di ottenere informazioni sulla tabella interna.

• I parametri LINES e OCCURS sono opzionali e le variabili sono dei contatori, quindi
di tipo I. Il significato di LINES e OCCURS sono, rispettivamente, il numero di
elementi presenti in tabella e il numero di occurs definiti nella dichiarazione della
tabella interna.

56
OPEN SQL
• Per leggere i dati dalle tabelle nel momento della scrittura di un report si utilizzano le
istruzioni di SELECT. L’Open SQL, in realtà, è un sottoinsieme delle istruzioni SQL già
note, con alcune differenze proprie dell’ambiente SAP.

• Non tutti i comandi SQL possono essere utilizzati in SAP e viceversa.

• E’ consigliabile sempre controllare il codice di ritorno delle operazioni per verificarne la


corretta esecuzione: il successo dell’azione sul database è legata ad un codice di
ritorno pari a 0, mentre i casi di errore sono legati a valori specifici del SY-SUBRC,
che differiscono in base al tipo di operazione e di errore, ma che sono comunque
sempre diversi da 0.

• Ogni volta che si accede ad una tabella trasparente o a una struttura del dictionary,
bisogna specificarne il nome dopo la parola chiave TABLES, nell’include dei dati

57
OPEN SQL
• Per leggere i dati dalle tabelle nel momento della scrittura di un report si utilizzano le
istruzioni di SELECT. L’Open SQL, in realtà, è un sottoinsieme delle istruzioni SQL già
note, con alcune differenze proprie dell’ambiente SAP.

• Non tutti i comandi SQL possono essere utilizzati in SAP e viceversa.

• E’ consigliabile sempre controllare il codice di ritorno delle operazioni per verificarne la


corretta esecuzione: il successo dell’azione sul database è legata ad un codice di
ritorno pari a 0, mentre i casi di errore sono legati a valori specifici del SY-SUBRC,
che differiscono in base al tipo di operazione e di errore, ma che sono comunque
sempre diversi da 0.

• Ogni volta che si accede ad una tabella trasparente o a una struttura del dictionary,
bisogna specificarne il nome dopo la parola chiave TABLES, nell’include dei dati

58
OPEN SQL
• Accesso puntuale
• REPORT RSAAA08A.
• TABLES: SPFLI.

• SELECT SINGLE * FROM SPFLI
• WHERE CARRID EQ ‘LH’
• AND CONNID EQ ‘0400’.
• IF SY-SUBRC = 0.
• WRITE: /SPFLI-CARRID, SPFLI-CONNID,
• SPFLI-CITYFROM, SPFLI-CITYTO.
• ELSE.
• WRITE: / TEXT-001.
• ENDIF.

59
OPEN SQL
• Accesso puntuale

• Utilizzando la SELECT con l’aggiunta dell’opzione SINGLE si consente la


visualizzazione di un unico record. Per individuare in modo univoco il record che si
sta cercando è necessario specificare la chiave completa. Nel caso in cui l’utilizzo di
una chiave non completa non consentisse l’individuazione del record in modo
univoco, viene visualizzato comunque un unico record, che è il primo selezionato.

• I codici di ritorno sono:


• SY-SUBRC = 0 lettura avvenuta correttamente
• SY-SUBRC = 4 non esiste il record cercato

60
OPEN SQL
• Select Senza Condizioni

• REPORT RSAAA08B.
• TABLES: SPFLI.

• SELECT * FROM SPFLI.


• WRITE: /SPFLI-CARRID, SPFLI-CONNID,
• SPFLI-CITYFROM, SPFLI-CITYTO.
• ENDSELECT.
• IF SY-SUBRC NE 0.
• WRITE: / TEXT-001.
• ENDIF.

61
OPEN SQL
• Select Senza Condizioni

• REPORT RSAAA08B.
• TABLES: SPFLI.

• SELECT * FROM SPFLI.


• WRITE: /SPFLI-CARRID, SPFLI-CONNID,
• SPFLI-CITYFROM, SPFLI-CITYTO.
• ENDSELECT.
• IF SY-SUBRC NE 0.
• WRITE: / TEXT-001.
• ENDIF.

62
OPEN SQL
• Select Senza Condizioni

• Utilizzando la SELECT senza alcuna condizioni di WHERE, la lettura che si effettua è


una lettura sequenziale.
• Se la tabella ha molti record, questa select incide sulle prestazioni del sistema,
rallentandone i tempi di risposta.

• N.B.: ENDSELECT chiude il ciclo.

63
OPEN SQL
• Select Con Condizioni
• REPORT RSAAA08C.
• TABLES: SPFLI.

• SELECT * FROM SPFLI


• WHERE CARRID EQ ‘LH’.
• WRITE: /SPFLI-CARRID, SPFLI-CONNID,
• SPFLI-CITYFROM, SPFLI-CITYTO.
• ENDSELECT.
• IF SY-SUBRC NE 0.
• WRITE: / TEXT-001.
• ENDIF.

64
OPEN SQL
• Select Con Condizioni

• Come nel caso precedente, si tratta di un ciclo, con la differenza che, utilizzando la
SELECT con l’aggiunta dell’opzione WHERE, si consente la visualizzazione di una
parte soltanto dei records presenti nel database. I campi della tabella utilizzati nella
clausola WHERE devono essere scritti senza il prefisso della tabella.

• Sono ammessi i concatenamenti delle clausole di WHERE all’interno di una select,


mediante l’utilizzo di AND e OR.

65
OPEN SQL
• Select Su Colonne Specifiche
• REPORT RSAAA08D.
• TABLES: SPFLI.
• DATA: NCITYTO LIKE SPFLI-CITYTO,
• NCITYFM LIKE SPFLI-CITYFROM.

• SELECT CITYTO CITYFROM INTO (NCITYTO, NCITYFM)


• FROM SPFLI WHERE CARRID EQ ‘LH’.
• WRITE: / NCITYTO, NCITYFM.
• ENDSELECT.
• IF SY-SUBRC NE 0.
• WRITE: / TEXT-001.
• ENDIF.

66
OPEN SQL
• Select Su Colonne Specifiche

• Utilizzando la SELECT con l’aggiunta del nome dei campi, si consente la


visualizzazione, all’interno del loop, per ogni occorrenza trovata sul database, di una
parte soltanto del record individuato con la clausola WHERE. I campi della tabella
utilizzati nella clausola WHERE devono essere scritti senza il prefisso della tabella.
Sono ammessi i concatenamenti delle clausole di WHERE all’interno di una select,
mediante l’utilizzo di AND e OR. I campi in cui vanno lette le colonne da visualizzare
devono essere delle variabili da dichiarare in testa al programma. Le colonne della
tabella che devono essere visualizzate devono essere dello stesso numero e nello
stesso ordine delle variabili utilizzate a seguito della INTO (...).
• N.B.: Nel caso di tabelle molto grandi è da preferire alla select * per ottimizzare le
prestazioni.

67
OPEN SQL
• SELECT… INTO… CORRESPONDING…
• REPORT RSAAA08F.
• TABLES: SPFLI.
• DATA: BEGIN OF ITAB OCCURS 10,
• CITYTO LIKE SPFLI-CITYTO,
• CITYFROM LIKE SPFLI-CITYFROM,
• END OF ITAB.

• SELECT * FROM SPFLI INTO
• CORREPONDING FIELDS OF TABLE ITAB
• WHERE CARRID EQ ‘LH’.

• LOOP AT ITAB. WRITE: /ITAB-CITYFROM, ITAB-CITYTO. ENDLOOP.

68
OPEN SQL
• SELECT… INTO… CORRESPONDING…

• SELECT ... INTO CORRESPONDING FIELD OF TABLE <nome di una tabella


interna>

• permette di riempire in un’unica soluzione una tabella interna, ma soltanto i campi


che hanno lo stesso nome dei campi origine del database.

• Le seguenti istruzioni, invece, permettono di riempire la header line di tabelle interne,


ma anche singoli campi di una working area, purché abbiano lo stesso nome dei
campi di origine del database:

69
OPEN SQL
• SELECT… INTO… CORRESPONDING…

• SELECT ... INTO CORRESPONDING FIELD OF <nome di una working area>

• SELECT ... INTO CORRESPONDING FIELD OF table <nome di una tabella interna
con HL>

• SELECT ... APPENDING CORRESPONDING FIELD OF table <nome di una tabella


interna con HL>

• L’istruzione di appending permette di aggiungere righe alla tabella interna senza


sovrascrivere quelle già presenti.
• Utilizzando l’addition TABLE, con o senza APPENDING, non va mai specificato
ENDSELECT, anche se non si tratta di una select puntuale.

70
OPEN SQL
• SELECT… INTO TABLE…
• REPORT RSAAA08L.

• TABLES: SFLIGHT.
• DATA: ITAB LIKE SFLIGHT OCCURS 100
• WITH HEADER LINE.

• SELECT * FROM SFLIGHT INTO TABLE ITAB
• WHERE CARRID = ‘AA’.

• LOOP AT ITAB.
• WRITE: /ITAB-CARRID, ITAB-CONNID.
• ENDLOOP.

71
OPEN SQL
• SELECT… INTO TABLE…
• La lettura dei record del DB avviene in una sola volta, scaricando il contenuto
dell’archivio sulla tabella interna, eliminando la lettura in ciclo, con ovvia esclusione
della ENDSELECT.
• Questo sistema di lettura è più rapido di una lettura in ciclo e favorisce una migliore
prestazione del sistema.
• Tale formulazione comporta che la tabella venga sovrascritta ad ogni select.
• Per evitare di perdere dati già presenti sulla tabella interna, può essere utilizzata
l’istruzione APPENDING al posto di INTO.
• NB. Sostituisce la meno performante soluzione:

• SELECT * FROM SFLIGHT INTO ITAB WHERE CARRID = ‘AA’.
• APPEND ITAB.
• ENDSELECT.

72
OPEN SQL
SELECT… FOR ALL ENTRIES… SELECT * FROM SPFLI FOR ALL
ENTRIES IN ITAB
TABLES: SPFLI.
WHERE CITYFROM = ITAB-CITYFROM
DATA: BEGIN OF ITAB OCCURS 10
AND
CITYFROM LIKE SPFLI-CITYFROM,
CITYTO = ITAB-CITYTO.
CITYTO LIKE SPFLI-CITYTO,
WRITE: / SPFLI-CITYFROM, SPFLI-
END OF ITAB. CITYTO.
ITAB-CITYFROM = ‘FRANCOFORTE’. ENDSELECT.
ITAB-CITYTO = ‘BERLINO’.
APPEND ITAB.
ITAB-CITYFROM = ‘SAN FRANCISCO’.
ITAB-CITYTO = ‘NEW YORK’.
APPEND ITAB.

73
OPEN SQL
SELECT… FOR ALL ENTRIES…
Con questa select vengono letti dal database tutti quei records che corrispondono
ai parametri impostati nella tabella interna. I campi della tabella e quelli del
database devono avere la stessa tipologia e lunghezza. Se la tabella interna non
ha dati inseriti, la select si effettua regolarmente, senza dare errori, ma scarica tutti
i records del database come se non vi fosse alcuna condizione di WHERE.
Sostituisce la meno performante:
LOOP AT ITAB.
SELECT * FROM SPFLI
WHERE CITYFROM = ITAB-CITYFROM AND
CITYTO = ITAB-CITYTO.
WRITE: / SPFLI-CITYFROM, SPFLI-CITYTO.
ENDSELECT.
ENDLOOP.

74
OPEN SQL
SELECT… ORDER BY…
REPORT RSAAA08O.
TABLES: SPFLI.
SELECT * FROM SPFLI
ORDER BY CITYFROM.
WRITE: / SPFLI-CITYFROM, SPFLI-CITYTO.
ENDSELECT.
ORDER BY PRIMARY KEY ordina i record trovati secondo la chiave primaria in ordine
crescente.
ORDER BY f1..fn ordina i record trovati secondo un ordine crescente dei parametri
impostati.
Si può richiedere in modo esplicito l’ordine con cui si vuol visualizzare la lista di output,
tramite l’opzione ASCENDING e DESCENDING. L’ordine crescente è quello di default.

75
OPEN SQL
UPDATE, INSERT, MODIFY, DELETE
• UPDATE <nome tabella>…
Permette di modificare un record già esistente in tabella.
• INSERT <nome tabella>…
Permette di inserire un nuovo record in tabella.
• MODIFY <nome tabella>…
È una via di mezzo tra l’update e la insert.
Se in tabella esiste già un record con le stesse chiavi di quello che abbiamo
valorizzato, la modify funziona come l’update, altrimenti ne inserisce uno nuovo.
• DELETE <nome tabella> …
Per effettuare la cancellazione di un elemento della tabella si utilizza l’istruzione r
iportata di seguito, che elimina un record dal DB

76
Modularizzazione
• Vantaggi:

• Eliminazione o, quanto meno, riduzione della ridondanza


• Manutenibilità e leggibilità
• Riutilizzabilità dei componenti
• Sicurezza
• performance

77
Modularizzazione
• Esistono tre modi per mettere in pratica la modularizzazione:

• richiamare subroutines all’interno dello stesso programma;

• richiamare subroutines (o veri e propri programmi) esterne al programma chiamante;

• richiamare moduli funzione che appartengono a gruppi di funzioni che sono raccolte in
modo centralizzato nella ABAP/4 Function Library.

78
Modularizzazione
• SUBROUTINES

•Dichiarazione:

• PERFORM <nome_subrout> TABLES…


• USING…
• CHANGING…

• FORM <nome_subrout> TABLES…
• USING…
• CHANGING…
• ENDFORM

79
Modularizzazione
• SUBROUTINES

• Il nome della subroutine non può superare i 30 caratteri.


•I richiami a subroutines possono essere anche nidificati: all’interno di una subroutine vi
possono essere richiami ad altre subroutines, anche ripetuti. Per motivi di chiarezza e di
manutenibilità si consiglia di scrivere tutte le subroutines (FORM.. ENDFORM.) in coda al
programma o nell’include dedicato.

•I dati che possono essere utilizzati all’interno di una subroutine sono:


• dati globali
• parametri di passaggio (formal parameters): i parametri nel chiamante si
definiscono actual parameters, nella subroutine si definiscono formal parameters
• dati locali

80
Modularizzazione
• SUBROUTINES

• I parametri formali (della subroutine) e quelli attuali (del chiamante) devono essere
dello stesso numero.

• Eventuali discrepanze tra la tipologia dei parametri del chiamante e del chiamato
vengono intercettate solo a runtime.

• I programmi chiamati condividono le aree di working delle tabelle del Dictionary: nella
memoria occupata risiede non solo il programma chiamante ma anche il chiamato,
con tutte le tabelle e le variabili locali che si porta dietro.

81
Modularizzazione
• SUBROUTINES

• I parametri da passare possono essere uno o più, separati tra loro, in fase di richiamo
dal programma e di apertura del modulo chiamato, solo da spazi e non da virgole.

• i parametri sono posizionali: pur avendo nomi diversi, la coincidenza dei parametri
tra chiamante e chiamato si determina in base all’ordine di chiamata delle variabili. si
consiglia pertanto di mantenere una nomenclatura che ricordi la relazione tra i
parametri corrispondenti, per evitare errori nell’ordine di richiamo

• L’ordine di chiamata per i moduli funzione, al contrario, non è un elemento


importante e determinante, ma del tutto opzionale, dato che, in questo caso,
l’elemento fondamentale è che i parametri siano identici, sia da un punto di vista
formale (tipo e lunghezza della variabile) che nominale.

82
Modularizzazione
• SUBROUTINES

•Ci sono vari tipi di controlli che il sistema effettua durante il check sintattico sulla
subroutine, dipendenti dalla tipologia elementare del parametro formale:
• type any: il sistema accetta tutte le tipologie dei parametri attuali corrispondenti e
tutti gli attributi di questi ultimi passano ai parametri formali;
• type table : il sistema controlla se il parametro è in realtà una tabella interna; tutti gli
attributi della tabella attuale sono ereditati dal parametro formale;
• type C, X, N, P : il sistema controlla se ciascuno di questi parametri ha attributi
aggiuntivi (lunghezza, cifre dopo la virgola) prima che tutti gli attributi dei parametri
attuali passino ai parametri formali;
• type D, I, F, T : il parametro è interamente determinato; il sistema controlla se i
parametri attuali e formali coincidono completamente;
• type <t>, like <f> : il parametro è interamente determinato; il sistema controlla se i
parametri attuali e formali coincidono completamente.

83
Modularizzazione
• FUNCTION MODULE

•Sintassi:

•CALL FUNCTION <Nome Funzione>


IMPORTIG

……

EXPORTING

……

TABLES

……

EXCEPTIONS
84
Modularizzazione
• FUNCTION MODULE

•La prima parola chiave seguita dal nome della funzione è utilizzata dal programma
chiamante.

•Tutte le funzioni della ABAP/4 Function Library sono disponibili per l’utilizzo.

•Schermata principale del Development Workbench Tool  transazione SE37.

•Ogni Function Module (FM) appartiene ad uno e un solo Function Group.

85
Modularizzazione
• FUNCTION MODULE

•Un Function Group, identificato da un nome di 4 caratteri (riferito a FG standard), è un


raggruppamento logico (e fisico) di moduli funzione che condividono dati, aree
applicative, tipo di elaborazione.

•Vi sono raggruppate funzioni di simile argomento (funzioni relative alla stampa di
documenti, funzioni per la lettura di alcune particolari informazioni su complessi
documenti finanziari, etc.), ma anche moduli che utilizzano le stesse tabelle del database
(per una tabella, si ha un modulo funzione di inserimento, uno di aggiornamento, etc.).

•In un modulo funzione non possono essere utilizzati i dati globali del programma
chiamante, ma solo i dati globali del Function Group o i dati locali del modulo funzione
stesso.

86
Modularizzazione
• FUNCTION MODULE

• Un Function Group, genera automaticamente a sistema un programma strutturato,


che coincide concettualmente con il Function Group e che è costituito da una serie di
includes e subroutines.

• Un Function Group è un unico programma che ha, al suo interno, diversi file di
include, di cui alcuni sono funzioni, altri sono subroutines e uno è il file dei dati
globali.

87
Modularizzazione
• FUNCTION MODULE

• La struttura di un Function Group e relativi moduli funzione è:

• Programma SAPLxxxx: nomenclatura (xxxx = 4 caratteri del Function Group)

• Include LxxxxTOP: Include dei dati globali (visibili e utilizzabili in tutto il programma)

• Include LxxxxUXX: Include del programma in cui sono contenuti tutti i moduli
funzione appartenenti al Function Group

• Include LxxxxFXX: include del programma in cui si trovano tutte le subroutines


esterne richiamate dai moduli funzione dell’intero Function Group

88
Modularizzazione
• FUNCTION MODULE

• Per creare un nuovo modulo funzione o un nuovo Function Group, le regole di


nomenclatura per un modulo funzione prevedono che il nome non superi i 30 caratteri
(esclusi i caratteri speciali, tranne l’underscore) e che inizi per “Z_”, mentre il nome di
un nuovo Function Group deve iniziare per “Z” e non superare i 4 caratteri.

89
Modularizzazione
• FUNCTION MODULE

• Per definizione dell’interfaccia di un FM si intende la determinazione dei parametri di


colloquio tra modulo funzione e programma chiamante:
• parametri di input per il modulo funzione (Import), corrispondono ai parametri di
Export per il chiamante;
• parametri di output per il modulo funzione (Export), corrispondono ai parametri di
Import per il chiamante;
• tabelle interne, catalogate o meno sul Dictionary (Tables), per le quali si passano solo
i puntamenti;
• parametri per intercettare situazioni di errore (Exceptions).
• Le exceptions sono parametri per intercettare condizioni di errore (es.: not_found,
others, etc.),il cui nome è al massimo di 30 caratteri.
• L’esito dell’esecuzione corretta o meno di un FM può essere controllato tramite SY-
SUBRC

90
Modularizzazione
• Utilizzo degli INCLUDE
•INCLUDE <Nome Include>
• Gli INCLUDE consentono di godere dei vantaggi della modularizzazione.
• Si tratta di programmi di tipo ‘I’, non eseguibili, dichiarati all’interno di programmi
eseguibili.
• In generale vengono utilizzati come ‘contenitori’ per:

• Dichiarazione dati
• Videata di selezione
• Subroutine

• Uno stesso include può essere dichiarato in più programmi per utilizzare ad es. una
subroutine già creata o una stessa videata di selezione o, semplicemente, per
rendere il programma più leggibile.

91
EVENTI
Gli eventi sono processi eseguiti dall’ABAP runtime system.

Il runtime system controlla anche la sequenza in cui vengono elaborati.

C’è un evento di defalult: START-OF-SELECTION.

• In un programma ABAP, un evento comincia con una parola chiave, termina quando
inizia un nuovo evento. Non c’è un’istruzione ABAP per far terminare esplicitamente
un evento.

• L’ordine in cui gli eventi vengono definiti nel report è irrilevante.

92
EVENTI
• INITIALIZATION è un evento utilizzato per inizializzare le variabili con valori di
default. Per esempio, può servire per riempire un campo di una selection-screen con
la data odierna o col nome dell’utente di logon. Questo evento è intercettato prima
che sia visualizzato lo screen di selezione, ma solo all’inizio del report.

• AT SELECTION-SCREEN OUTPUT: questo evento viene intercettato sempre prima


che appaia lo screen di selezione.

• AT SELECTION-SCREEN ON VALUE REQUEST FOR <f>: viene elaborato quando

• viene aperto un match-code(F4) sul campo <f>

• START-OF-SELECTION è il primo evento per elaborare i dati e generare delle liste.


É intercettato dall’ABAP runtime system dopo aver terminato gli eventi di selection
screen.

93
EVENTI
• AT SELECTION-SCREEN ON <f>: viene intercettato in seguito a un comando
dell’utente, dopo aver visualizzato la videata di selezione

• AT SELECTION SCREEN: viene intercettato in seguito a un comando dell’utente,


dopo aver visualizzato la videata di selezione

• TOP-OF-PAGE: permette di inserire un’intestazione nelle liste


• END-OF-PAGE: permette di inserire il piè di pagina nelle liste

• AT LINE-SELECTION serve per gestire le liste interattive

• AT USER-COMMAND: serve per gestire un comando dell’utente nelle liste


• interattive

94
EVENTI
• START-OF-SELECTION è il primo evento per elaborare i dati e generare delle liste.
É intercettato dall’ABAP runtime system dopo aver terminato gli eventi di selection
screen.

• END-OF-SELECTION: viene eseguito dopo le selezioni di un DB logico

95
INITIALIZATION e

START-OF-SELECTION
REPORT ZEXAMPLE.

• PARAMETERS: P_NAME LIKE SY-UNNAME,


• P_DATE LIKE SY-DATUM.

• INITIALIZATION.
• P_NAME = SY-UNAME.
• P_DATE = SY-DATUM - 1.

• START-OF-SELECTION.
• WRITE: / ‘Start of Program’.
• WRITE: / P_NAME.
• WRITE: / P_DATE.

96
AT SELECTION-SCREEN ON
• REPORT ZABAPEXAMPLE.

• TABLES: VBAK.

• PARAMETER: P_DOCUMENTO LIKE VBAK-VBELN.

• AT SELECTION-SCREEN ON P_DOCUMENTO.
• IF P_DOCUMENTO = SPACE.
• MESSAGE I999 WITH ‘Inserire valore!!’.
• ENDIF.

• START-OF-SELECTION.
• WRITE: ‘Il documento selezionato è:’, P_DOCUMENTO.

97
AT SELECTION-SCREEN ON (2)
• REPORT ZABAPEXAMPLE.

• TABLES: VBAK.

• SELECT-OPTIONS: SO_DATA FOR VBAK-ERDAT.

• AT SELECTION-SCREEN ON SO_DATA.
• IF SO_DATA-LOW > SO_DATA-HIGH.
• MESSAGE E999 WITH ‘Attenzione: date inconsistenti!!’.
• ENDIF.

98
AT SELECTION-SCREEN ON VALUE-REQUEST
• REPORT ZABAPEXAMPLE2.

• TABLES: VBAK.
• PARAMETER: P_PATH TYPE IBIPPARMS-PATH.

• AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_PATH.


• CALL FUNCTION 'F4_FILENAME'
• EXPORTING
• PROGRAM_NAME = SYST-CPROG
• DYNPRO_NUMBER = SYST-DYNNR
• IMPORTING
• FILE_NAME = P_PATH.

99
AT SELECTION-SCREEN OUTPUT
REPORT ZABAPEXAMPLE3.
PARAMETER P_CK AS CHECKBOX.
PARAMETER P_DATA LIKE SY-DATUM.
AT SELECTION-SCREEN OUTPUT.
LOOP AT SCREEN.
IF SCREEN-NAME = 'P_DATA'.
IF P_CK = ' '.
SCREEN-INPUT = 0.
ELSE.
SCREEN-INPUT = 1.
ENDIF.
ENDIF. MODIFY SCREEN.
ENDLOOP.

100
Output di un report
• L’istruzione WRITE

• Sintassi:
• WRITE AT [/] [<pos>] <f>[(<len>)]. oppure WRITE / [<pos>] [(<len>)]<f>

• Dove:
• “/” manda a capo la scrittura del campo che segue
• <f> è la variabile da stampare
• <pos> è un numero o una variabile lunga al max 3 cifre che denota la posizione sullo
screen,
• <len> è un numero o una variabile lunga al max 3 cifre che denota la lunghezza
dell’output
• Se la specifica del formato (pos, len) contiene solo valori diretti (non variabili), si può
omettere AT.

101
Output di un report
• L’istruzione WRITE

• Si utilizza lo SKIP seguito da un numero (per default è 1) per indicare quante righe
vuote debbono essere lasciate prima della scrittura della riga successiva.
• Si può tracciare una linea orizzontale sullo screen di output usando la seguente
sintassi:

• WRITE AT [/] [<pos>] sy-uline[(<len>)]. oppure WRITE / [<pos>] [(<len>)]sy-uline.


• Questo è equivalente a:
• ULINE [AT [/] [<pos>] [(<len>)]].

• Si può tracciare una linea verticale sullo screen di output usando la seguente
sintassi:
• WRITE / [<pos>] sy-vline.

102
Output di un report
• L’istruzione WRITE – Opzioni di formattazione
• Sintassi:
• WRITE … <f> <option>.
Option Funzione

LEFT-JUSTIFIED Output giustificato a sinistra

CENTERED Output centrato

RIGHT-JUSTIFIED Output giustificato a destra

UNDER <g> Output visualizzato sotto il campo <g>

NO-GAP Il blank dopo <f> è omesso

USING EDIT MASK <m> Specifica un template <m>.ES: <m> = ‘__/__/____’ per le variabili di tipo data

NO-ZERO Se un campo contiene degli zeri sono sostituiti da blank

HOTSPOT ON Rende cliccabile il testo

103
Output di un report
• L’istruzione WRITE – Opzioni di formattazione

• Per stampare a video un checkbox basta aggiungere alla write AS CHECKBOX:


• WRITE <f> AS CHECKBOX INPUT ON : il checkbox potrà essere flaggatto
dall’utente;
• WRITE <f> AS CHECKBOX INPUT OFF: il checkbox sarà solo di output.
• Per inserire, invece, delle icone o dei simboli:
• WRITE <nome_icona> AS ICON.
• WRITE <nome_simbolo> AS SYMBOL.
• I nomi delle icone o dei simboli vanno presi, rispettivamente, dagli include standard
<icon>, <symbol> da inserire nel report in questo modo:
• INCLUDE <icon> per le icone
• INCLUDE <symbol> per i simboli
• INCLUDE <list> per entrambi

104
Output di un report
L’istruzione WRITE – esempi
Abap Code Screen Output
DATA: g(5) TYPE c VALUE ‘Hello’,
f(5) TYPE c VALUE ‘Dolly’.
Hello Dolly
WRITE: g, f. Hello
WRITE: /10 g, Dolly
/ f UNDER g. HelloDolly
WRITE: / g NO-GAP, f.

DATA: time t VALUE ‘154633’. 154633


WRITE: time, 15:46:33
/(8) time USING EDIT MASK ‘__:__:__’.
000123
WRITE: ‘000123’ 123
/ ‘000123’ NO-GAP
DATA pack TYPE p VALUE ‘123.456’
DECIMALS 3.
WRITE pack DECIMALS 2. 123,46
WRITE: / pack ROUND –2, 12.345,600
/ pack ROUND –1, 1.234,560
/ pack ROUND 1, 12,346
/ pack ROUND 2. 1,235

105
Output di un report
• L’istruzione WRITE – Colori nelle Liste

• FORMAT COLOR <n> [ON] INTENSIFIED [ON|OFF] INVERSE [ON|OFF].

• Dove:
• COLOR: imposta il colore per lo sfondo. Se si aggiunge INVERSE ON, il colore è
associato al carattere. <n> può essere sia il numero di un colore sia il nome.
• INTENSIFIED: determina le sfumature dello sfondo. Non ha effetto con l’addition
COLOR OFF. Invece INTENSIFIED OFF non ha effetto con l’addition INVERSE ON.
• INVERSE: influenza il colore del carattere.

106
Module Pool
• Definizione:

• Programmi di dialogo per operare sul database (read/insert/modify/delete) in maniera


interattiva attraverso una successione di schermate, in cui inserire campi, table
control, pulsanti, ecc.

• Caratteristiche:
• L’interfaccia di dialogo deve essere il più possibile vicina alle esigenze dell’utente.

• La parte di controllo dell’input deve essere caratterizzata da meccanismi di controllo


e validazione dei dati immessi, e prevedere un’opportuna messaggistica.

107
Module Pool
• Principali componenti

• Un programma di dialogo si compone di dynpro, barra di menù, barra di titolo della


videata e toolbar.
• Nelle dynpro (finestre o Dialog Box) è possibile definire elementi grafici (pulsanti,
radio button, check box, elementi di testo, cornici, ecc.), che saranno gestiti tramite
logica di controllo del programma.
• Una schermata (dynpro) consta di:
• un layout, costituito dai campi di input, elementi di grafica, controllo tabelle, etc.;
• un flow logic, alias la strutturazione degli eventi che rispondono alle sollecitazioni
dell’utente. Ad ogni evento i dati sono trattati come richiesto dai moduli di cui il
programma di dialogo si compone. La sequenza stessa degli schermi è determinata
dall’interazione con l’utente, sempre in relazione agli eventi specificati nel programma
di dialogo.

108
Module Pool
• Principali componenti

• Principali componenti dell’ambiente di sviluppo:

• ABAP/4 Dictionary: consente di


o richiamare e collegare campi di tabelle agli schermi come elementi di input o di output.
o mantenere allineati gli schermi ad ogni eventuale modifica dei domini
• Screen Painter: consente di:
o definire le caratteristiche principali degli schermi (attributi dello Screen)
o definire il layout dello schermo (l’aspetto grafico) mediante il Fullscreen Editor
o descrivere gli attributi dei campi dello schermo (mediante collegamento con il Dictionary)
o definire il flow logic dello schermo

109
Module Pool
• Principali componenti

– ABAP/4: consente di:


o gestire in questo linguaggio, mediante linee di codice, il flow logic degli schermi;
o gestire i dati in una parte opportuna del programma di dialogo (TOP);
o gestire il modulo di elaborazione principale (Module Pool);
o gestire il modulo PAI (Process After Input);
o gestire il modulo PBO (Process Before Output).

– Menu Painter: consente di:


o definire le caratteristiche principali del menu;
o definire le icone e i tasti funzionali;
o definire la barra di titolo.


110
Module Pool
• PASSI PER LA CREAZIONE DI UN PROGRAMMA DIALOGO

ü Creazione del Module Pool


ü Creazione del Top Include
ü Creazione degli Schermi
ü Definizione degli attributi
ü Disegno del layout grafico
ü Completamento della Field List
ü Codifica dei moduli nel Flow Logic
ü Creazione del PBO e del PAI
ü Creazione della Gui Status
ü Creazione della Gui Title
ü Creazione della Transazione

111
Creazione di un Module Pool
• Si opera allo stesso modo della creazione di un report, utilizzando l’Object Browser.

• Regole:
• deve iniziare per SAPM<Ztrx>;
• deve essere di tipo ‘M’
• Dovrà prevedere almeno i seguenti include:
• TOP INCLUDE: comprende tutta la parte dichiarativa dei dati, i dati globali che sono
visibili a tutti i moduli che compongono il programma di dialogo, ivi inclusi le tabelle, il
controllo tabelle, le tabelle interne, le strutture, catalogate o meno sul Dictionary, le
variabili

• INCLUDE PBO: rappresenta tutta quella serie di moduli legati ai PBO (processi
prima della visualizzazione dell’output dello schermo; per maggiori dettagli si veda il
paragrafo dedicato al Flow Logic); questi moduli iniziano con MODULE <nome
modulo> OUTPUT e terminano con ENDMODULE.

112
Creazione di un Module Pool
• INCLUDE PAI: rappresenta tutta quella serie di moduli legati ai PAI (processi dopo
l’Enter da parte dell’utente; per maggiori dettagli si veda il paragrafo dedicato al Flow
Logic); questi moduli iniziano con MODULE <nome modulo> INPUT e terminano con
ENDMODULE.

• INCLUDE SUBROUTINE: racchiude il corpo delle subroutine

113
Screen Painter

• Consente la definizione di elementi grafici e icone e di collegare alcuni di essi


direttamente al DB.

• Il collegamento diretto con il dictionary consente di ereditare le proprietà di data


element e dominio e di ereditarne in maniera trasparente tutti i controlli formali e di
congruità.

• Le istruzioni che possono essere scritte in questa parte di programma sono limitate,
ma permettono una gestione dei controlli dell’input più che efficace.

114
Flow Logic
• Il Flow Logic di uno schermata guida la sequenza dei processi per quello schermata.
• Process before output (PBO): sono elaborazioni che vengono effettuate prima che
una schermta appaia; generalmente sono processi legati all’inizializzazione dei
campi;
• Process after input (PAI): sono elaborazioni che intervengono a fronte di specifiche
interazioni fra il sistema e l’utente, ad esempio quando quest’ultimo seleziona un
certo menu, un tasto funzione, un bottone o un semplice Enter;
• Process on value request (POV): sono processi che intervengono quando si
richiede una vista di Help, ossia la visualizzazione di un set di possibili valori; ciò si
ottiene selezionando il tasto funzione F4;
• Process on help request (POH): sono elaborazioni che intervengono quando
l’utente richiede l’Help online, selezionando il tasto funzionale F1.
• I valori di uno stesso campo possono essere letti in diverse subroutines richiamate
da diversi eventi (PAI, POH, POV).
• Queste particolari subroutines del Flow Logic sono chiamate modules.

115
Flow Logic
• il sistema risponde in modo interattivo alle digitazioni dell’utente.

• A seconda del tasto funzione selezionato dall’utente, il sistema risponde in maniera


opportuna: ciò accade perché viene associato ad ogni tasto funzione un certo valore,
interpretato e gestito nel PAI.

• Il campo utilizzato per il passaggio di questo valore è sempre uno, l’OKCODE, di


formato e lunghezza standard (4 caratteri alfanumerici), che si ritrova sia tra i campi
di schermo che tra i campi da dichiarare nel module pool.

116
Flow Logic
• ISTRUZIONI AMMESSE NELLO SCREEN PAINTER:
• MODULE <nome modulo>
• LOOP AT <condizione> ...ENDLOOP
• FIELD <nome campo> MODULE <nome modulo>
• CHAIN...ENDCHAIN
• FIELD <nome campo> MODULE <nome modulo> ON INPUT
• FIELD <nome campo> MODULE <nome modulo> ON CHAIN-INPUT
• FIELD <nome campo> MODULE <nome modulo> ON REQUEST
• FIELD <nome campo> MODULE <nome modulo> ON CHAIN-REQUEST
• MODULE <nome modulo> AT EXIT-COMMAND
• FIELD <...> VALUES (<VALUE LIST>) [solo per type C o N]
• MODIFY SCREEN
• Se il modulo è richiamato nel PBO, il nome del modulo deve essere seguito dalla
dicitura OUTPUT. Se il modulo è richiamato nel PAI, il nome del modulo deve essere
seguito dalla dicitura INPUT

117
DEBUGGING

ü Tool usato per identificare ed eliminare gli errori nei programmi ABAP

ü Permette la verifica della logica del programma passo dopo passo esaminando il
risultato di istruzioni singole

ü fa parte del Tool di Workbench

118
DEBUGGING
• Consente di:

• Esaminare il valore delle variabili

• Modificare il valore delle variabili

• Settare i breakpoint

• Settare I watchpoint

• Visualizzare e modificare il contenuto dellle tabelle interne

119
DEBUGGING

• Modi per passare alla modalità di test interattivo:

• Mandare in esecuzione un programma richiedendo espressamente la modalità di test


interattivo, digitando nella linea di comando “ /h “

• Mettere dei breakpoints (segnali su di una linea di codice del sorgente che
comunicano al processore del runtime di ABAP/4 di bloccare a quella linea
l’esecuzione del programma) utilizzando il path Utilities ->Breakpoints -> Set prima di
avviare l’esecuzione del programma

120
DEBUGGING
• Comandi possibili durante il modo debug:
Step singolo(F5) Esegue la successiva linea di programma

Continuare (F8) esegue fino al prossimo breakpoint o fino alla fine del codice

Eseguire(F6) Esegue una subroutine

Return(F7) Esce da una subroutine


Table Visualizza il contenuto di una tabella interna

Breakpoint Visualizza un menu per l’utilizzo dei breakpoint

Editor Passa all’Editor di ABAP/4 per le modifiche del sorgente

Replace Permette di variare i dati durante il test

121
wwww.exprivia.it Thank you!