Per definire le proprie funzioni sul file di macro utilizzare un blocco FUNCTION o un blocco MACRO_FUNCTION.
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:
Con Net.Data vengono forniti diversi ambienti di linguaggio.
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.
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.
Definire le funzioni sul livello di macro di Net.Data più esterno e prima che possano chiamare una macro di Net.Data.
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:
%function(DTW_PERL) func() {
%EXEC{ func.prl %}
%}
%define percent_openbrace = "%{"
%function(DTW_PERL) func() {
...
for $num_words (sort bynumber keys $(percent_openbrace) $Rtitles{$num} }) {
&make_links($Rtitles{$num}{$num_words});
}
...
%}
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:
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:
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:
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