Ecrire une sous-routine

Dans cette section :

Vous pouvez écrire une sous-routines dans n'importe quelle langue qui prend en charge les sous-routines. Si vous avez l'intention de rendre vos sous-routines disponibles à d'autres utilisateurs, assurez-vous de documenter ce que fait votre sous-routine, ce que sont les arguments, sous quels formats elles sont, et dans quel ordre elles doivent apparaître dans l'appel de la sous-routine.

Lorsque vous écrivez une sous-routine, vous devez prendre en compte les conditions requises et les limites qui l'affecte. Les voici :

Si vous écrivez un programme nommé INTCOMP qui calcule le montant d'argent dans un compte portant un intérêt simple, le programme lit un enregistrement, teste si les données sont acceptables, puis appelle un sous-programme nommé SIMPLE qui calcule le montant d'argent. Le programme et la sous-routine sont stockés ensemble dans le même fichier.

Le programme et la sous-routine présentés ici sont écrits en pseudo-code (une méthode de représentation de code informatique d'une manière générale) :

Begin program INTCOMP.
Execute this loop until end-of-file.
   Read next record, fields: PRINCPAL, DATE_PUT, YRRATE.
   If PRINCPAL is negative or greater than 100,000,
      reject record.
   If DATE_PUT is before January 1, 1975, reject record.
   If YRRATE is negative or greater than 20%, reject record.
   Call subroutine SIMPLE (PRINCPAL, DATE_PUT, YRRATE, TOTAL).
   Print PRINCPAL, YEARRATE, TOTAL.
End of loop.
End of program.
Subroutine SIMPLE (AMOUNT, DATE, RATE, RESULT).
Retrieve today's date from the system.
Let NO_DAYS = Days from DATE until today's date.
Let DAY_RATE = RATE / 365 days in a year.
Let RESULT = AMOUNT * (NO_DAYS * DAY_RATE + 1).
End of subroutine.

Si vous déplacez la sous-routine SIMPLE dans un fichier distinct du programme principal et le compilez, vous pouvez appeler la sous-routine. La requête de rapport suivante montre combien d'argent les employés accumuleraient s'ils investissaient dans des comptes payant 12% :

TABLE FILE EMPLOYEE
PRINT LAST_NAME DAT_INC SALARY AND COMPUTE
   INVESTED/D10.2 = SIMPLE(SALARY, DAT_INC, 0.12, INVESTED);
BY EMP_ID
END

Remarque : la sous-routine est conçue pour retourner uniquement le montant de l'investissement, pas la date du jour, car une sous-routine ne peut retourner qu'une seule valeur chaque fois qu'elle est appelée.


Haut de page

x
Nommer une sous-routine

Un nom de sous-routine peut contenir jusqu'à huit caractères à moins que la langue que vous utilisez pour écrire la sous-routine nécessite un nom plus court. Un nom doit commencer par une lettre et peut être constitué de n'importe quelle combinaison de lettres et / ou de nombres. Les symboles spéciaux ne sont pas autorisés.


Haut de page

x
Créer des arguments

Lorsque vous créez des arguments pour une sous-routine, vous devez considérer les points suivants :

Les longueurs des arguments d'appel définis dans WebFOCUS doivent correspondre à la longueur des arguments correspondants définis dans la sous-routine.

Toute dérogation à ces règles peut entraîner des problèmes dans l'utilisation de la sous-routine. Information Builders vous recommande de modifier la sous-routine pour être conforme aux règles établies, puis de la lier au-dessus de la ligne. Pour charger des sous-routine au-dessus de la ligne, voici les options de liaison et de modifiation requises pour la compilation et le stockage de la sous-routine :


Haut de page

x
Considérations de langage

Lorsque vous écrivez une sous-routine, vous devez considérer les questions linguistiques suivantes :

Langue et mémoire. Si vous écrivez une sous-routine dans un langage qui apporte des bibliothèques dans la mémoire (par exemple, FORTRAN et COBOL), les bibliothèques réduisent la quantité de mémoire disponible pour la sous-routine.

FORTRAN. TSO prend un charge les opérations d'entrée / de sortie FORTRAN.

COBOL. Lors de l'écriture d'une sous-routine dans COBOL :

PL/I. Lors de l'criture d'une sous-routine dans PL/I :

Langage C. Lors de l'écriture d'une sous-routine dans C :



x
Programmer une sous-routine

Dans cette section :

Tenez en compte les éléments suivants lorsque vous projetez vos conditions requises de programmation :

Vous pouvez ajouter de la flexibilité à votre sous-routine en utilisant une technique de programmation. Une technique de programmation peut être :



x
Exécuter une sous-routine à un point d'entrée

Une sous-routine est généralement exécutée à partir de la première instruction. Toutefois, une sous-routine peut être exécutée à partir de n'importe quelle endroit dans le code comme point d'entrée. Ceci permet à la sous-routine d'utiliser un algorithme de base pour produire des résultats différents. Par exemple, la sous-routine DOWK calcule le jour de la semaine sur lequel une date tombe. En spécifiant le nom de la sous-routine DOWK, vous obtenez une abréviation à 3 lettres du jour. Si vous spécifiez le nom d'entrée DOWKL, vous obtenez le nom complet. Le calcul toutefois reste le même.

Chaque point d'entrée a un nom. Pour exécuter une sous-routine à un point d'entrée, spécifiez le nom du point d'entrée dans l'appel de la sous-routine plutôt que le nom de la sous-routine. La façon dont vous désignez le point d'entrée dépend de la langue que vous utilisez.



x
Syntaxe : Exécuter une sous-routine à un point d'entrée
{subroutine|entrypoint}  (input1, input2,...outfield)

où :

sous-routine

est le nom de la sous-routine.

entrypoint

est le nom du point d'entrée auquel exécuter la sous-routine.

input1, input2,...

sont les arguments de sous-routine.

outfield

est le champ qui contient le résultat, ou le format de la valeur de sortie entre guillemets simples.

Dans le gestionnaire de dialogue, vous devez obligatoirement spécifier le format. Dans Maintain, vous devez spécifier le nom du champ.



Exemple : Exécuter une sous-routine à un point d'entrée

La sous-routine FTOC, écrite en pseudocode ci-dessous, convertit la température Fahrenheit en Centigrade. Le point d'entrée FTOK (désigné par la commande Entrée) définit un indicateur qui entraîne la soustraction de 273 de la température Centrigrade pour trouver la température Kelvin. La sous-routine est :

Subroutine FTOC (FAREN, CENTI).
Let FLAG = 0.
Go to label X.
Entry FTOK (FAREN, CENTI).
Let FLAG = 1.
Label X.
Let CENTI = (5/9) * (FAREN - 32).
If FLAG = 1 then CENTI = CENTI - 273.
Return.
End of subroutine.

Ce qui suit est une manière plus rapide d'écrire la sous-routine. Notez que l'argument de sortie kelv listé pour le point d'entrée est différent de l'argument de sortie centi listé au début de la sous-routine :

Subroutine FTOC (FAREN, CENTI).
Entry FTOK (FAREN, KELV).
Let CENTI = (5/9) * (FAREN - 32).
KELV = CENTI - 273.
Return.
End of Subroutine.

Pour obtenir la température centigrade, spécifiez le nom de la sous-routine FTOC dans l'appel de la sous-routine. La sous-routine est la suivante :

CENTIGRADE/D6.2 = FTOC (TEMPERATURE, CENTIGRADE);

Pour obtenir la température Kelvin, spécifiez le nom de l'entrée FTOK dans l'appel de la sous-routine. La sous-routine est la suivante :

KELVIN/D6.2 = FTOK (TEMPERATURE, KELVIN);


x
Intégrer plus de 200 arguments dans un appel de sous-routine

Une sous routine peuvent spécifier jusqu'à un maximum de 200 arguments, ce qui inclut l'argument de sortie. Pour traiter plus de 200 arguments, la sous-routine doit spécifier deux instructions d'appels ou plus pour passer les arguments vers la sous-routine.

Utilisez la technique suivante pour écrire une sous-routine avec plusieurs appels :

  1. Divisez la sous-routine en segments. Chaque segment reçoit les arguments passés par un appel de sous-routine correspondant.

    La liste d'arguments au début de votre sous-routine doit représenter le même nombre d'arguments dans l'appel de la sous-routine, y compris un argument de numéro d'appel et un argument de sortie.

    Chaque appel contient le même nombre d'arguments. La raison est que la liste d'arguments dans chaque appel doit correspondre à la liste d'arguments au début de la sous-routine. Vous pouvez traiter certains des arguments comme arguments factices si votre nombre d'arguments est inégal. Par exemple, si vous divisez 32 arguments en 6 arguments, chaque segment traite six arguments ; le sixième argument traite deux arguments et quatres arguments factices.

    Les sous-routines peuvent nécessiter des arguments supplémentaires comme le détermine par le programmeur qui crée la sous-routine.

  2. Elles comprennent une instruction au début de la sous-routine qui lit le numéro d'appel (premier argument) et crée une branche à un segment correspondant. Chaque segment traite les arguments d'un appel. Par exemple, le numéro un crée une branche au premier segment, le numéro deux au second, et ainsi de suite.
  3. Visez à ce que chaque segment stocke l'argument qu'il reçoit dans d'autres variables (qui peuvent être traitées par le premier segment) ou accumulez-les dans un total cumulé.

    Terminez chaque segment avec une commande qui renvoie le contrôle à la requête (commande RETURN).

  4. Le dernier segment renvoie la valeur finale de sortie à la requête.

Vous pouvez aussi utiliser la technique du point d'entrée pour écrire des sous-routines qui traitent plus de 200 arguments. Pour plus de détails, consultez Exécuter une sous-routine à un point d'entrée.



x
Syntaxe : Créer un sous-routine avec plusieurs instructions d'appel
field = subroutine (1, group1, field)
;field = subroutine (2, group2, field);
   .
   .
   .outfield = subroutine (n, groupn, outfield);

où :

field

est le champ qui contient le résultat, ou le format de la valeur de sortie entre guillemets simples. Ce champ doit être au même format que outfield.

Ne spécifiez pas field pour la dernière instruction d'appel, utilisez outfield.

subroutine

est le nom du sous-programme, il peut contenir jusqu'à huit caractères au maximum.

n

est un nunméro qui identifie chaque appel de sous-routine. Il doit être le premier argument dans chaque appel de sous-routine. La sous-routine utilise ce numéro pour créer des branches vers des segments de code.

group1, group2,...

sont des listes d'arguments d'entrée passées par chaque appel de sous-routine. Chaque groupe contient le même nomdre d'arguments, et pas plus de 26 arguments chaque.

Le groupe final peut contenir des arguments factices.

outfield

est le champ qui contient le résultat, ou le format de la valeur de sortie entre guillemets simples.

Dans le gestionnaire de dialogue, vous devez obligatoirement spécifier le format. Dans Maintain, vous devez spécifier le nom du champ.



Exemple : Créer une sous-routine divisée en arguments

La sous-routine ADD32, écrite en pseudo-code cumule 32 chiffres. Elle est divisée en six segments, dont chacun d'entre eux ajoutent six chiffres à partir d'un appel de sous-routine. (Le nombre total d'arguments d'entrée est 36 mais les quatre derniers sont des arguments factices.) Le sixième segment ajoute deux arguments à la variable SUM et renvoie le résultat. Le sixième segment ne traite pas les valeurs fournies pour les quatre arguments factices.

La sous-routine est :

Subroutine ADD32 (NUM, A, B, C, D, E, F, TOTAL).
If NUM is 1 then goto label ONE
else if NUM is 2 then goto label TWO
else if NUM is 3 then goto label THREE
else if NUM is 4 then goto label FOUR
else if NUM is 5 then goto label FIVE
else goto label SIX.
 
Label ONE.
Let SUM = A + B + C + D + E + F.
Return.
 
Label TWO
Let SUM = SUM + A + B + C + D + E + F
Return
 
Label THREE
Let SUM = SUM + A + B + C + D + E + F
Return
 
Label FOUR
Let SUM = SUM + A + B + C + D + E + F
Return
 
Label FIVE
Let SUM = SUM + A + B + C + D + E + F
Return
 
Label SIX
LET TOTAL = SUM + A + B
Return
End of subroutine

Pour utiliser la sous-routine ADD32, listez les six instructions d'appel, chaque appel qui spécifie six chiffres. Les quatre derniers chiffres, représentés par des zéros sont des arguments factices. La commande DEFINE stocke le total des 32 chiffres dans le champ SUM32.

DEFINE FILE EMPLOYEE
DUMMY/D10 = ADD32 (1, 5, 7, 13, 9, 4, 2, DUMMY);
DUMMY/D10 = ADD32 (2, 5, 16, 2, 9, 28, 3, DUMMY);
DUMMY/D10 = ADD32 (3, 17, 12, 8, 4, 29, 6, DUMMY);
DUMMY/D10 = ADD32 (4, 28, 3, 22, 7, 18, 1, DUMMY);
DUMMY/D10 = ADD32 (5, 8, 19, 7, 25, 15, 4, DUMMY);
SUM32/D10 = ADD32 (6, 3, 27, 0, 0, 0, 0, SUM32);
END

Information Builders