Net.Data: Guida alla gestione e alla programmazione per OS/400

Definizione delle funzioni definite dall'utente

Per definire le proprie funzioni sul file di macro utilizzare un blocco FUNCTION o un blocco MACRO_FUNCTION.

Blocco FUNCTION
Definisce una routine secondaria richiamata da una macro di Net.Data e che viene elaborata dall'ambiente di linguaggio o chiama un programma esterno.

Blocco MACRO_FUNCTION
Definisce una routine secondaria richiamata da una macro di Net.Data e deve essere da Net.Data e non da un altro ambiente di linguaggio. Le istruzioni contenute nel blocco devono essere istruzioni di origine di linguaggio della macro di Net.Data.

Il blocco MACRO_FUNCTION è un'alternativa al blocco FUNCTION che può migliorare le prestazioni. Il blocco MACRO_FUNCTION viene elaborato solo da Net.Data e non richiama un'ambiente di linguaggio. I dettagli su queste due strutture sono contenute in Riferimenti di Net.Data.

Sintassi: Utilizzare la seguente sintassi per definire le funzioni:

Blocco FUNCTION:

%FUNCTION(tipo) function-name(usage parametro, ...)
[RETURNS(return-var)] {
  executable-statements
  report-block
  ...
  report-block
 
  message-block
%}

Blocco MACRO_FUNCTION:

%MACRO_FUNCTION function-name(uso parametro, ...)  {
  executable-statements
  report-block
  ...
  report-block
   %}

In cui:

tipo
Identifica un ambiente di linguaggio configurato nel file di inizializzazione. L'ambiente di linguaggio richiama un processore di linguaggio specifico (che elabora le istruzioni eseguibili) e fornisce un'interfaccia standard tra Net.Data e il processore del linguaggio.

Con Net.Data vengono forniti diversi ambienti di linguaggio.

function-name
Specifica il nome del blocco FUNCTION o MACRO_FUNCTION. Eseguire il blocco FUNCTION o il blocco MACRO_FUNCTION con una chiamata di funzione contenuta altrove nel file di macro. La chiamata di funzione fa riferimento a function-name, preceduto da un segno at (@). Consultare Chiamata delle funzioni per informazioni dettagliate.

E' possibile definire più blocchi FUNCTION o MACRO_FUNCTION con lo stesso nome in modo da essere elaborati contemporaneamente. Ogni blocco deve contenere identici elenchi di parametri. Quando Net.Data chiama la funzione, tutti i blocchi FUNCTION con lo stesso nome o blocchi MACRO_FUNCTION con lo stesso nome vengono eseguiti nell'ordine in cui sono stati definiti nella macro di Net.Data.

uso
Specifica se un parametro è un parametro di immissione (IN), un parametro di emissione (OUT) o di entrambi i tipi (INOUT). Questa designazione indica se il parametro viene trasferito o ricevuto da un blocco FUNCTION, da un blocco MACRO_FUNCTION o da entrambi. Il tipo d'uso si applica a tutti i parametri successivi contenuti nell'elenco dei parametri finchè non viene modificato da un altro tipo. Il valore predefinito è IN.

parametro
E' il nome di una variabile con ambito locale che viene sostituita con il valore di un argomento corrispondente specificato su una chiamata di funzione. I riferimenti al parametro, ad esempio $(parm1), nelle istruzioni eseguibili o nel blocco REPORT vengono sostituiti con il valore reale del parametro. Inoltre, i parametri vengono trasferiti all'ambiente di linguaggio e sono accessibili alle istruzioni eseguibili utilizzando la normale sintassi di quel linguaggio o come variabili di ambiente. I riferimenti alla variabile di parametro non sono validi al di fuori del blocco FUNCTIONo del blocco MACRO_FUNCTION.

return-var
Specificare questo parametro dopo la parola chiave RETURNS per identificare un parametro speciale OUT. Il valore della variabile return viene assegnato alla chiamata di funzione e sostituisce la chiamata di funzione nell'elaborazione della macro di Net.Data. Se non viene specificata la clausola RETURNS, il valore della chiamata di funzione è:

executable-statements
La serie di istruzioni di linguaggio trasferita all'ambiente di linguaggio specificato per essere elaborato dopo che le variabili sono state sostituite e le funzioni sono state elaborate. executable-statements può contenere i riferimenti alle variabili e le chiamate di funzione di Net.Data. Prima di trasferire le istruzioni eseguibili all'ambiente di linguaggio, Net.Data sostituisce questi riferimenti di variabili o le chiamate di funzione con il valore reale.

Per i blocchi FUNCTION, Net.Data sostituisce tutti i riferimenti delle variabili con i valori della variabile, esegue tutte le chiamate di funzione e sostituisce le chiamate di funzione con i valori risultanti prima che le istruzioni eseguibili vengano trasferite all'ambiente di linguaggio. Ogni ambiente di linguaggio elabora le istruzioni in modo diverso. Per ulteriori informazioni sulla specifica delle istruzioni eseguibili o sulla chiamata dei programmi eseguibili, consultare Variabili eseguibili.

Per i blocchi MACRO_FUNCTION, le istruzioni eseguibili sono una combinazione di istruzioni HTML e di strutture di linguaggio della macro di Net.Data. In questo caso, non sono interessati ambienti di linguaggio poichè Net.Data agisce come processore di linguaggio e valuta ed esegue le istruzioni eseguibili.

report-block
Definisce uno o più blocchi REPORT per la gestione dell'emissione del blocco FUNCTION. Consultare Blocchi Report.

message-block
Definisce il blocco MESSAGE, che gestisce i messaggi restituiti dal blocco FUNCTION. Consultare Blocchi Message.

Definire le funzioni sul livello di macro di Net.Data più esterno e prima che possano chiamare una macro di Net.Data.

Uso di caratteri speciali nelle funzioni

Quando i caratteri che corrispondono alla sintassi delle strutture di linguaggio di Net.Data vengono utilizzati nella sezione delle istruzioni di linguaggio di un blocco funzione come parte di un codice di programma integrato sintatticamente valido (come REXX o Perl), essi possono essere interpretati erroneamente come strutture di linguaggio di Net.Data, causando in una macro errori o risultati non previsti.

Ad esempio, una funzione Perl potrebbe utilizzare i caratteri di delimitazione del blocco COMMENT, %{. Quando la macro viene eseguita, i caratteri %{ vengono interpretati come l'inizio di un blocco COMMENT. Net.Data ricerca poi la fine del blocco COMMENT, che pensa di trovare quando legge la fine del blocco di funzione. Net.Data prosegue la ricerca della fine del blocco di funzione e quando non riesce a trovarla, emette un messaggio di errore.

Utilizzare uno dei seguenti metodi per usare i caratteri di delimitazione del blocco COMMENT o altri caratteri speciali di Net.Data come parte del codice di programma inglobato, senza lasciarli interpretare a Net.Data come caratteri speciali:

Ad esempio, la funzione Perl che segue contiene i caratteri che rappresentano un delimitatore di blocco COMMENT, %{, come parte delle istruzioni di linguaggio Perl:

%function(DTW_PERL) func() {
  ...           
  for $num_words (sort bynumber keys %{ $Rtitles{$num} }) {
  &make_links($Rtitles{$num}{$num_words});          
  }            
  ...         
 %}   

Per assicurare che Net.Data interpreti i caratteri %{ come codice origine Perl piuttosto che come delimitatore di blocco COMMENT di Net.Data, riscrivere la funzione in uno dei seguenti modi:

Blocchi Message

Il blocco MESSAGE consente di stabilire come procedere dopo che una chiamata di funzione basata sull'esito positivo o negativo della chiamata di funzione e consente di visualizzare le informazioni all'utente che ha eseguito la chiamata della funzione. Net.Data utilizza il seguente processo di blocco message:

  1. Net.Data imposta RETURN_CODE, una variabile di ambiente di linguaggio, per ogni chiamata di funzione a un blocco FUNCTION. RETURN_CODE non viene impostato su una chiamata di funzione per un blocco MACRO_FUNCTION.

  2. Quando un ambiente di linguaggio trasferisce un valore di codice di ritorno a Net.Data, Net.Data imposta il valore di RETURN_CODE sul valore di codice di ritorno.

  3. Quando la chiamata di funzione viene completata, il blocco MESSAGE utilizza il valore di RETURN_CODE per stabilire come procedere.

Un blocco MESSAGE consiste di una serie di istruzioni di messaggio, ognuna delle quali specifica un valore di codice di ritorno, un testo di messaggi ed un'azione da intraprendere. La sintassi di un blocco MESSAGE viene visualizzata nel capitolo sulle strutture del linguaggio in Riferimenti di Net.Data.

Un blocco MESSAGE può avere un ambito globale o locale. Se il blocco MESSAGE viene definito in un blocco FUNCTION, il suo ambito è locale per quel blocco FUNCTION. Se viene specificato il livello di macro più esterno, il blocco MESSAGE ha un ambito globale ed è attivo per tutte le chiamate di funzione eseguite nella macro di Net.Data. Se viene definito più di un blocco globale MESSAGE, è attivo quello definito per ultimo.

Net.Data utilizza queste regole per elaborare il valore di una variabile di RETURN_CODE da una chiamata di funzione:

  1. Verificare il blocco MESSAGE locale per una corrispondenza esatta; uscire o continuare come specificato.

  2. Se RETURN_CODE non è 0, verificare il blocco globale MESSAGE per +default o -default; a seconda del segno di RETURN_CODE, uscire o continuare come stabilito.

  3. Se RETURN_CODE non è 0, verificare il blocco locale MESSAGE per default; uscire o continuare come stabilito.

  4. Verificare il blocco MESSAGE locale per una corrispondenza esatta; uscire o continuare come specificato.

  5. Se RETURN_CODE non è 0, verificare il blocco globale MESSAGE per +default o -default;' a seconda del segno di RETURN_CODE, uscire o continuare come stabilito.

  6. Se RETURN_CODE non è 0, verificare il blocco globale MESSAGE per default; uscire o continuare come stabilito.

  7. Se RETURN_CODE non è 0, emettere il messaggio predefinito interno di Net.Data e uscire.

L'esempio che segue visualizza una parte di una macro di Net.Data con un blocco MESSAGE globale ed un blocco MESSAGE per una funzione.

%{ global message block %}
%MESSAGE {
     -100     : "Return code -100 message"   : exit
      100     : "Return code 100 message"    : continue
   +default : {
Si tratta di un messaggio esteso
che occupa più di una riga. E' possibile
utilizzare tag HTML,
compreso collegamenti e moduli,
in questo messaggio. %}   : continuare
%}
 
%{ local message block inside a FUNCTION block %}
%FUNCTION(DTW_REXX) my_function() {
  %EXEC { my_command.mbr %}
%MESSAGE {
     -100     : "Return code -100 message"   : exit
      100     : "Return code 100 message"    : continue
     -default : {
Si tratta di un messaggio esteso
che occupa più di una riga. E' possibile
utilizzare tag HTML,
compreso collegamenti e moduli,
in questo messaggio. %}   : uscire
  %}

Se my_function() restituisce un valore RETURN_CODE di 50, Net.Data elabora l'errore in questo ordine:

  1. Verifica una corrispondenza esatta nel blocco MESSAGE locale.

  2. Verifica +default nel blocco MESSAGE locale.

  3. Verifica default nel blocco MESSAGE locale.

  4. Verifica una corrispondenza esatta nel blocco MESSAGE globale.

  5. Verifica +default nel blocco MESSAGE globale.

Quando Net.Data rileva una corrispondenza, il testo del messaggio viene inviato al browser Web e verifica l'azione richiesta.

Quando viene specificato continue, Net.Data continua ad elaborare la macro di Net.Data dopo aver stampato il testo del messaggio. Ad esempio, se una macro chiama my_functions() cinque volte e viene rilevato un errore 100 durante l'elaborazione con il blocco MESSAGE nell'esempio, l'emissione da un programma può apparire in questo modo:

.
.
.
11 May 1997                  $245.45
13 May 1997                  $623.23
19 May 1997                  $ 83.02
return code 100 message
22 May 1997                  $ 42.67
 
Total:                       $994.37


[ Inizio pagina | Pagina precedente | Pagina successiva | Indice | Indice analitico ]