Como Gravar uma Subrotina

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.


Topo da página

x
Como Nomear uma Subrotina

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.


Topo da página

x
Como Criar Argumentos

Quando você cria argumentos para uma subrotina, é necessário considerar os seguintes pontos:

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:


Topo da página

x
Considerações sobre Linguagens

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:

PL/I. Quando uma subrotina é gravada em PL/I:

Linguagem C. Quando uma subrotina é gravada em C:



x
Como Programar uma Subrotina

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:



x
Como Executar uma Subrotina em um Ponto de Entrada

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.



x
Sintaxe: Como Executar uma Subrotina em um Ponto de Entrada
{subroutine|entrypoint}  (input1, input2,...outfield)

onde:

subrotina

É o nome da subrotina.

entrypoint

É o nome do ponto de entrada no qual a subrotina será executada.

input1, input2,...

São os argumentos de subrotinas.

outfield

É 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.



Exemplo: Como Executar uma Subrotina em um Ponto de Entrada

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);


x
Como Incluir Mais de 200 Argumentos em uma Chamada de Subrotina

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:

  1. Divida a subrotina em segmentos. Cada segmento recebe os argumentos passados por uma chamada de subrotina correspondente.

    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.

  2. Inclua uma declaração no início da subrotina que lê o número da chamada (primeiro argumento) e ramifica para um segmento correspondente. Cada segmento processa os argumentos de uma chamada. Por exemplo, o primeiro ramifica para o primeiro segmento, o segundo, para o segundo argumento, e assim por diante.
  3. Determine que cada segmento armazene os argumentos que recebe em outras variáveis (que podem ser proceddas pelo último segmento) ou acumule-os em um total.

    Finalize cada segmento com um comando retornando o controle de volta para a solicitação (comando RETURN).

  4. O último segmento retorna o valor da saída final para a solicitação.

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.



x
Sintaxe: Como Criar uma Subrotina com Diversas Declarações de Chamada
								field = subroutine (1, group1, field)
;field = subroutine (2, group2, field);
   .
   .
   .outfield = subroutine (n, groupn, outfield);

onde:

Campo

É 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.

subrotina

É o nome da subrotina com até oito caracteres.

n

É 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.

group1, group2,...

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.

outfield

É 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.



Exemplo: Como Criar uma Subrotina Divida em Segmentos

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