COBOL - A Cláusula OCCURS com DEPENDING ON
Se você não souber antes do tempo de execução quantas vezes um elemento de tabela ocorre, defina uma tabela de comprimento variável. Para isso, use a cláusula OCCURS DEPENDING ON (ODO).
X OCCURS 1 TO 10 TIMES DEPENDING ON Y |
No exemplo acima, X é chamado de assunto ODO e Y é chamado de objeto ODO.
Dois fatores afetam a manipulação bem-sucedida de registros de comprimento variável:
- Cálculo correto de comprimentos de registro - O comprimento das partes variáveis de um item de grupo é o produto do objeto da frase DEPENDING ON e o comprimento do assunto da cláusula OCCURS.
- Conformidade dos dados no objeto da cláusula OCCURS DEPENDING ON com sua cláusula PICTURE -Se o conteúdo do objeto ODO não corresponder à sua cláusula PICTURE, o programa pode terminar de forma anormal. Você deve garantir que o objeto ODO especifique corretamente o número atual de ocorrências dos elementos da tabela.
Exemplo 1:
05 LINE-ITEM-COUNT PIC 99.
05 LINE-ITEMS OCCURS 0 TO 25 TIMES DEPENDING ON LINE-ITEM-COUNT.
10 QUANTITY PIC 9999.
10 DESCRIPTION PIC X(30).
10 UNIT-PRICE PIC S9(5)V99.
|
A tabela LINE-ITEMS contém três campos (QUANTITY, DESCRIPTION, UNIT-PRICE) que formam uma linha em uma fatura. Cada fatura pode ter de 0 a 25 itens de linha. O número real de itens de linha em uma determinada fatura e, portanto, no registro, é fornecido pelo campo LINE-ITEM-COUNT.
Uma instância da tabela ocupa 41 bytes, e a tabela pode ocorrer de 0 a 25 vezes, portanto o espaço total ocupado pela tabela LINE-ITEMS no registro varia de 0 bytes a 1025 bytes. Se houver algum campo após esta tabela, sua posição no registro mudará, dependendo do número de ocorrências da tabela.
Exemplo 2:
01 REC-1.
05 FIELD-1 OCCURS 1 TO 100 TIMES DEPENDING ON WS-COUNT.
10 WS-A PIC X(05).
10 WS-B PIC X(05).
|
No exemplo acima, FIELD-1 é uma tabela de comprimento variável. FIELD-1 pode ter de 1 a 100 registros. O número real de registros depende do valor WS-COUNT.
O tamanho da tabela depende do número de ocorrências da tabela, ou seja, WS-COUNT. O tamanho mínimo é ocupado 10 bytes e o máximo é 1000 bytes.