Nesta seção: |
É possível gravar uma subrotina em qualquer linguagem que suporte subrotinas. Se você pretende disponibilizar sua subrotina para outros usuários, certifique-se de documentar o que sua subrotina faz, quais são seus argumentos, quais formatos possuem e em qual ordem devem aparecer na chamada de subrotina.
Quando você grava uma subrotina, é necessário considerar os requerimentos e limites que a afetam. São as seguintes:
Se você gravar um programa com o nome INTCOMP que calcula a quantia de dinheiro em uma conta lucrando juros simples, o programa lerá um registro, testará os dados e, em seguida, chamará uma subrotina chamada SIMPLE que calcula a quantia de dinheiro. O programa e a subrotina são armazenados no mesmo arquivo.
O programa e a subrotina exibidos aqui são gravados em um pseudocódigo (um método de representação de código de computadores em uma forma geral):
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.
Se você mover a subrotina SIMPLE para um arquivo separado do programa principal e o compilar, é possível chamar a subrotina. A solicitação do relatório a seguir mostra quanto os funcionários acumulariam se investissem seus salários em contas pagando 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
Observação: A subrotina foi projetada para retornar apenas a quantia do investimento, não a data atual, pois uma subrotina pode retornar apenas um valor único cada vez que é chamada.
Um nome de subrotina pode possuir até oito caracteres, a não ser que a linguagem que você estiver utilizando para gravar a subrotina exija um nome mais curto. Um nome deve começar com uma letra e pode ser formado de uma combinação de letras e/ou números. Símbolos especiais não são permitidos.
Quando você cria argumentos para uma subrotina, é necessário considerar os seguintes pontos:
Não deve-se presumir que os parâmetros de entrada estão armazenados na memória contígua.
Os comprimentos dos argumentos sendo chamados como definidos no WebFOCUS devem corresponder aos comprimentos dos argumentos correspondentes definidos na subrotina.
Qualquer desvio destas regras pode resultar em problemas no uso da subrotina. A Information Builders recomenda que você modifique a subrotina para que fique em conformidade com as regras mencionadas e, em seguida, vincule-a acima da linha. Para carregar subrotinas acima da linha, as opções obrigatórias de vínculo e edição para a compilação e o armazenamento da subrotina são:
Ao gravar uma subrotina, você deve considerar os seguintes problemas de linguagem:
Linguagem e memória. Se você gravar uma subrotina em uma linguagem que traz as bibliotecas para a memória (por exemplo, FORTRAN e COBOL), as bibliotecas reduzirão a quantidade de memória disponível para a subrotina.
FORTRAN. TSO suporta operações de entrada/saída FORTRAN.
COBOL. Quando uma subrotina é gravada em COBOL:
Formato FOCUS |
Foto |
---|---|
An
|
Xn
|
I |
S9(9) COMP |
P |
S9(n)[V9(m)] onde: (1+n+m)/2 = 8 para número compactados baixos. (1+n+m)/2 = 16 para número compactados altos. |
D |
COMP-2 |
F |
COMP-1 |
PL/I. Quando uma subrotina é gravada em PL/I:
OPTIONS (COBOL)
CHARACTER (n)
onde:
É o comprimento do campo como definido pela solicitação. Não utilize o atributo VARYING.
DECIMAL FLOAT (16)
ou
BINARY FLOAT (53)
Formato FOCUS |
Declaração PL/I para a Saída |
---|---|
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) (para números compactados baixos, 8 bytes) DECIMAL FIXED (31) (para números compactados altos, 16 bytes) |
Linguagem C. Quando uma subrotina é gravada em C:
Formato FOCUS |
Declaração C para a Saída |
---|---|
An
|
char *xxx n
Campos alfanuméricos não terminam com um byte nulo e não podem ser processados por muitas das subrotinas de manipulação de strings da biblioteca da hora de execução. |
I |
long *xxx
|
F |
float *xxx
|
D |
double *xxx
|
P |
Não há equivalente na linguagem C. |
Nesta seção: |
Considere os pontos abaixo ao planejar seus requerimentos de programação:
É possível adicionar flexibilidade à sua subrotina utilizando uma técnica de programação. Esta técnica pode ser uma das seguintes:
Uma subrotina é normalmente executada começando pela primeira declaração. No entanto, uma subrotina pode ser executada começando por qualquer lugar no código designado como um ponto de entrada. Isto permite que uma subrotina utilize um algoritmo básico para produzir diferentes resultados. Por exemplo, a subrotina DOWK calcula o dia da semana no qual a data cai. Especificando o nome DOWK da subrotina, você obterá uma abreviação do dia com três letras. Se você especificar o nome de entrada DOWKL, você obterá o nome completo. O cálculo, no entanto, é o mesmo.
Cada ponto de entrada possui um nome. Para executar uma subrotina em um ponto de entrada, especifique o nome do ponto de entrada na chamada da subrotina em vez do nome da mesma. A forma como você designa um ponto de entrada depende da linguagem que você está utilizando.
{subroutine|entrypoint} (input1, input2,...outfield)
onde:
É o nome da subrotina.
É o nome do ponto de entrada no qual a subrotina será executada.
São os argumentos de subrotinas.
É o campo que contém o resultado ou o formato do valor de saída posto entre aspas simples.
No Dialogue Manager, você deve especificar o formato. No Maintain, deve-se especificar o nome do campo.
A subrotina FTOC, gravada no pseudocódigo abaixo, converte temperaturas em Fahreinheit em Celsius. O ponto de entrada FTOK (designado pelo comando Entrada) define uma bandeira que faz com que 273 seja subtraído da temperatura em Centígrados para encontrar a temperatura em Kelvin. A subrotina é:
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.
A seguir, você encontra uma forma mais curta de se escrever a subrotina. Observe que o argumento de saída kelv listado para o ponto de entrada é diferente do argumento de saída centi, listado no início da subrotina:
Subroutine FTOC (FAREN, CENTI). Entry FTOK (FAREN, KELV). Let CENTI = (5/9) * (FAREN - 32). KELV = CENTI - 273. Return. End of Subroutine.
Para obter a temperatura em Centígrados, especifique o nome da subrotina FTOC na chamada da subrotina. A subrotina é processada como:
CENTIGRADE/D6.2 = FTOC (TEMPERATURE, CENTIGRADE);
Para obter a temperatura em Kelvin, especifique o nome da entrada FTOK na chamada da subrotina. A subrotina é processada como:
KELVIN/D6.2 = FTOK (TEMPERATURE, KELVIN);
Uma subrotina pode especificar um máximo de 200 argumentos, incluindo o argumento de saída. Para processar mais de 200 argumentos, a subrotina deve especificar duas ou mais declarações de chamada para passar os argumentos para a subrotina.
Utiliza a técnica a seguir para gravar uma subrotina com diversas chamadas:
A lista de argumentos no início da sua subrotina deve representar o mesmo número de argumentos da chamada da subrotina, incluindo o argumento do número de chamada e um argumento de saída.
Cada chamada contém o mesmo número de argumentos. Isto acontece porque a lista de argumentos em cada chamada deve corresponder à lista de argumentos do início da subrotina. É possível processar alguns dos argumentos como simulados caso você possua um número desigual de argumentos. Por exemplo, se você dividir 32 argumentos em seis segmentos, cada segmentos processará seis argumentos. O sexto argumento processará dois argumentos e quatro simulados.
Subrotinas podem exigir argumentos adicionais, como determinado pelo programador que criou a subrotina.
Finalize cada segmento com um comando retornando o controle de volta para a solicitação (comando RETURN).
Também é possível utilizar a técnica do ponto de entrada para gravar subrotinas que processam mais de 200 argumentos. Para obter detalhes, consulte Como Executar uma Subrotina em um Ponto de Entrada.
field = subroutine (1, group1, field) ;field = subroutine (2, group2, field); . . .outfield = subroutine (n, groupn, outfield);
onde:
É o nome do campo que contém o resultado do segmento ou o formato do campo posto entre aspas simples. Este campo deve possuir o mesmo formato que outfield.
Não especifique field para a última declaração; utilize outfield.
É o nome da subrotina com até oito caracteres.
É o número que identifica cada chamada da subrotina. Este deve ser o primeiro argumento em cada chamada de subrotina. A subrotina utiliza este número de chamada para ramificar para os segmentos do código.
São as listas de argumentos de entrada passadas por cada chamada de subrotina. Cada grupo contém o mesmo número de argumentos e não mais do que 26 argumentos cada.
O grupo final pode conter argumentos simulados.
É o campo que contém o resultado ou o formato do valor de saída posto entre aspas simples.
No Dialogue Manager, você deve especificar o formato. No Maintain, deve-se especificar o nome do campo.
A subrotina ADD32, gravada no pseudocódigo, soma 32 números. Ela é divida em seis argumentos e cada um adiciona seis números a partir de uma chamada da subrotina. (O número total de argumentos de entrada é 36, mas os últimos quatro são argumentos simulados). O sexto argumento adiciona dois argumentos à variável SUM e retorna o resultado. O sexto argumento não processa qualquer valor fornecido para os quatro argumentos simulados.
A subrotina é:
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
Para utilizar a subrotina ADD32, liste todas as seis declarações de chamada, cada chamada especificando seis números. Os últimos quatro números, representados por zeros, são argumentos simulados. O comando DEFINE armazena o total de 32 números no campo 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 |