Tivoli Service Desk 6.0 Developer's Toolkit - Guia de Programação do Script
Este capítulo abrange as construções condicionais e de controle que manuseiam teste e a resposta às condições do teste. Estas construções fornecem também os meios para alterar o fluxo do programa ou para repetir ações, conforme necessário.
O Developer's Toolkit fornece duas construções condicionais:
O Developer's Toolkit fornece várias construções para a alteração do fluxo do programa:
A forma geral da instrução IF do Developer's Toolkit é:
IF <condition> THEN <statement-list> ELSIF <2nd condition> THEN <statement-list> ELSE <statement-list> END;
As instruções ELSIF e ELSE não serão necessárias se apenas uma condição estiver sendo testada.
As utilizações de exemplo desta construção são:
IF (age < 18) OR (age > 90) THEN WRITELN('Improper age, please re-enter'); END;
IF display = 'CGA' THEN LoadCGADriver; ELSIF display = 'MCGA' THEN LoadMCGADriver; ELSIF display = 'EGA' THEN LoadEGADriver; ELSE LoadVGADriver; END;
IF processor = '8086' THEN maxMem := 640000; operatingSystem := 'DOS'; ELSE maxMem := 16000000; operatingSystem := 'OS/2'; (* operatingSystem é uma cadeia *) END;
IF e ELSIF são sempre seguidas por uma condição Booleana. Se a condição for avaliada em TRUE, as instruções que seguem IF ou ELSIF serão executadas.
Se a condição for avaliada em FALSE, ocorrerá um dos seguintes:
O Developer's Toolkit utiliza a avaliação Booleana em curto circuito. Isso significa que se você avaliar duas cláusulas:
As instruções WHEN são uma forma especial de instruções IF que permitem executar uma ação com base no valor de uma variável ou de uma expressão.
Considere a seguinte instrução IF:
IF i*j = 1 THEN WriteOne; ELSIF i*j = 2 THEN WriteTwo; ELSIF i*j = 3 THEN WriteThree; ELSE WriteOther; END;
No exemplo anterior, a verificação do valor retornado da expressão i*j envolve o recalculo da expressão para cada valor de entrada. Se i*j for maior que 3, a expressão i*j será avaliada três vezes.
Este método possui dois efeitos colaterais negativos:
Um método alternativo deveria ser atribuído ao valor i*j para uma variável local e, em seguida, utilizar esta variável na instrução IF.
Uma solução melhor para a manutenção e o desempenho é utilizar uma instrução WHEN no lugar da instrução IF.
A instrução WHEN do Developer's Toolkit fornece um modo melhor para se avaliar uma condição, como mostrado abaixo.
WHEN i*j IS 1 THEN WriteOne; ELSWHEN 2 THEN WriteTwo; ELSWHEN 3 THEN WriteThree; ELSE WriteOther; END;
A instrução WHEN avalia uma expressão uma vez e, em seguida, a compara com cada um dos valores de teste. A expressão deve ser constituída de inteiro ou cadeia de tipo de dados simples.
Nota: Quando utilizado com cadeias, WHEN não faz distinção de maiúsculas/minúsculas.
Você também pode especificar vários valores de teste utilizando formato delimitado por vírgula para este exemplo:
WHEN i*j IS 1,2,3 DO WriteOne; ELSWHEN 4,5,6 DO WriteTwo; ELSWHEN 7,8,9 DO WriteThree; ELSE WriteOther; END;
O elemento de loop FOR é utilizado para executar uma ou mais instruções em um número predeterminado de vezes. A construção FOR tem a seguinte forma:
FOR <loop-parameter>:=<lo-bound> TO <hi-bound> DO <statement-list> END;
Os constituintes desta forma estão mostrados na tabela.
Constituinte | Descrição |
<loop-parameter> | Uma variável de inteiro que é atribuída aos valores entre <lo-bound> e <hi-bound> (inclusive) |
<lo-bound> | Uma expressão de inteiro que é avaliada uma vez no início do loop e é atribuída ao <loop-parameter> |
<hi-bound> | Uma expressão de inteiro que é avaliada uma vez no início do loop e comparada ao valor <loop-parameter> cada vez que passa pelo loop |
<statement-list> | Uma ou mais instruções do Developer's Toolkit que são executadas para cada valor <loop-parameter> entre <lo-bound> e <hi-bound> (inclusive) |
O exemplo a seguir ilustra o uso mais simples da instrução FOR. Neste exemplo, uma cadeia é escrita no vídeo 10 vezes. O valor da variável i não é utilizado dentro da lista de instruções.
FOR i:=1 TO 10 DO WinWriteLN(myWindow,'Hello'); END;
O exemplo a seguir é um pouco mais complicado.
FOR i:=j TO k*3 DO WinWriteLN(myWindow,'i = ' & i); END;
Nota: Se o limite inferior for igual ao superior, a lista de instruções será executada uma vez. Se o limite inferior for maior que o superior, a lista de instruções não será executada de modo algum.
A palavra-chave DOWNTO pode ser utilizada no lugar de TO a fim de fazer um loop de um valor alto para um valor inferior, conforme mostrado no exemplo a seguir:
FOR i:=10 DOWNTO 1 DO WinWriteLN(myWindow,i); END;
A instrução FOR tem uma segunda forma para ser utilizado com variáveis do tipo LIST:
FOR <list-parameter> DO <statement-list> END;
Aqui, a lista de instruções é executada uma vez para cada membro no parâmetro da lista. O ponteiro do elemento atual do parâmetro da lista, $Current, é incializado para apontar o primeiro elemento na lista. Ao final da execução da lista de instruções, o ponteiro do elemento é avançado. Isto permite que uma ou mais instruções sejam executadas para cada elemento em uma lista.
Considere o seguinte exemplo:
ListInsert(myList,'One'); ListInsert(myList,'Two'); ListInsert(myList,'Three'); FOR myList DO WinWriteLN(myWindow,myList[$Current]); END;
O elemento de loop REPEAT executa um conjunto de instruções uma vez, e, em seguida,
continua a executá-lo até que uma determinada condição se torne verdadeira.
O elemento de loop REPEAT possui o seguinte formato:
REPEAT <statement-list> UNTIL <condition>;
O seguinte código escreve a cadeia 'Hello' na tela 10 vezes:
i:=1; REPEAT WinWriteLN(myWindow,'Hello'); i:=i + 1; UNTIL i > 10;
No exemplo anterior, <condição> é uma expressão booleana que é avaliada
sempre através do loop. Se ele avaliar FALSE, as instruções em
<lista de instruções> serão novamente executadas.
As expressões booleanas podem consistir em cláusulas conectadas por:
Uma cláusula consiste em duas expressões de tipos de dados compatíveis separados por um operador relacional (=, >, <, e assim por diante).
O elemento de loop WHILE é semelhante ao elemento de loop REPEAT, exceto que a condição de saída é testada no início do loop em vez de no final. Garante-se que as instruções em um elemento de loop REPEAT são executadas, pelo menos uma vez, mas as instruções em um elemento de loop WHILE de modo algum serão executadas se a condição de loop for inicialmente False.
Os elementos de loop WHILE possuem o seguinte formato:
WHILE <condition> DO <statement-list> END;
No programa a seguir a cadeia 'Hello' é escrita na tela 10 vezes
i:=1; WHILE i <= 10 DO WinWriteLN('Hello'); i:=i + 1; END;
A instrução Exit pode ser utilizada para sair de uma chamada para uma função ou um procedimento. Quando emitida, ela faz com que a rotina atual cesse completamente, mesmo se estiver colocada dentro de um loop FOR, REPEAT ou WHILE.
Como o próprio nome implica, a instrução ExitLoop pode ser utilizada para sair de um loop antes que a condição de finalização se torne verdadeira.
No exemplo a seguir, um loop é configurado para ler e imprimir cada linha da tabela de banco de dados EMPLOYEES. Se a instrução SQLFetch falhar retornando um valor menor que 1 (indicando um erro ou o fim do conjunto de resultados), a instrução ExitLoop fará com que o loop cesse a execução. A instrução que segue imediatamente o loop é a próxima a ser executada.
O exemplo a seguir ilustra o uso de ExitLoop.
VARIABLES i: Integer; cursor: SQLCursor; employee: EmployeeRecord; ACTIONS i:=SQLSelect(cursor,'SELECT * FROM EMPLOYEES'); WHILE i > 0 DO i:=SQLFetch(cursor,employee); IF i < 1 THEN ExitLoop; END; PrintEmployee(employee); END; SQLCloseCursor(cursor);
Tivoli Service Desk 6.0 Developer's Toolkit - Guia de Programação do Script