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.
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.
Lorsque vous créez des arguments pour une sous-routine, vous devez considérer les points suivants :
Ne supposez pas que les paramètres d'entrée soient forcément stockés dans une mémoire continue.
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 :
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 :
WebFOCUS |
Image |
---|---|
An |
Xn |
I |
S9(9) COMP |
P |
S9(n)[V9(m)] où : (1+n+m)/2 = 8 pour nombres en petits paquets. (1+n+m)/2 = 16 pour nombres condensés de grande taille. |
D |
COMP-2 |
F |
COMP-1 |
PL/I. Lors de l'criture d'une sous-routine dans PL/I :
OPTIONS (COBOL)
CHARACTER (n)
où :
est la longueur du champ comme le définit la requête. N'utilisez pas l'attribut VARYING.
DECIMAL FLOAT (16)
ou
BINARY FLOAT (53)
WebFOCUS |
Délaration PL/I pour Sortie |
---|---|
An |
CHARACTER (n) |
I |
BINARY FIXED (31) |
F |
DECIMAL FLOAT (6) or BINARY FLOAT (21) |
D |
DECIMAL FLOAT (16) or BINARY FLOAT (53) |
P |
DECIMAL FIXED (15) (pour les petits nombres condensés, 8 octets) DECIMAL FIXED (31) (pour les larges nombres condensés, 16 octets) |
Langage C. Lors de l'écriture d'une sous-routine dans C :
WebFOCUS |
Déclaration C pour Sortie |
---|---|
An |
char *xxx n Les champs alphanumériques ne sont pas terminés par un octet nul et ne peuvent pas être traité par de nombreuses sous-routines de manipulation de chaînes dans la bibliothèque d' exécution. |
I |
long *xxx |
F |
float *xxx |
D |
double *xxx |
P |
Pas d'équivalent en C. |
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 :
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.
{subroutine|entrypoint} (input1, input2,...outfield)
où :
est le nom de la sous-routine.
est le nom du point d'entrée auquel exécuter la sous-routine.
sont les arguments de sous-routine.
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.
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);
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 :
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.
Terminez chaque segment avec une commande qui renvoie le contrôle à la requête (commande RETURN).
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.
field = subroutine (1, group1, field) ;field = subroutine (2, group2, field); . . .outfield = subroutine (n, groupn, outfield);
où :
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.
est le nom du sous-programme, il peut contenir jusqu'à huit caractères au maximum.
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.
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.
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.
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 |