COBOL - DATA DIVISION - DDE - SYNCHRONIZED clause - Slack bytes within records



Desenvolvido por DORNELLES Carlos Alberto - Analista de Sistemas - Brasília DF. - cad_cobol@hotmail.com

COBOL - DATA DIVISION - data description entry - SYNCHRONIZED clause - Slack bytes within records
Enterprise COBOL for z/OS, V4.2, Language Reference

Para qualquer descrição de dados que possua itens binários que não estejam em seus limites naturais, o compilador insere bytes livres em um registro para garantir que todos os itens SINCRONIZADOS estejam em seus limites adequados.

Como é importante que você saiba o comprimento dos registros em um arquivo, é necessário determinar se são necessários bytes livres e, se houver, quantos bytes o compilador adicionará.
O algoritmo que o compilador usa é o seguinte:

  • O número total de bytes ocupados por todos os itens de dados elementares que precedem o item binário são adicionados, incluindo quaisquer bytes livres adicionados anteriormente.
  • Essa soma é dividida por m, onde:
    • m = 2 para itens binários com comprimento de quatro dígitos ou menos
    • m = 4 para itens binários de comprimento de cinco dígitos ou mais e para itens de dados COMPUTACIONAL-1
    • m = 4 4 para itens de dados descritos com USAGE INDEX, USAGE POINTER, USAGE PROCEDURE-POINTER, USAGE OBJECT REFERENCE ou USAGE FUNCTION-POINTER
    • m = 8 para itens de dados COMPUTACIONAL-2
  • Se o restante (r) dessa divisão for igual a zero, não serão necessários bytes livres.
    Se o restante não for igual a zero, o número de bytes livres que devem ser adicionados é igual a m - r.

Esses bytes de folga (slack bytes) são adicionados a cada registro imediatamente após o item de dados elementar que precede o item binário.
Eles são definidos como se constituíssem um item com um número de nível igual ao item elementar que precede imediatamente o item binário SINCRONIZADO e são incluídos no tamanho do grupo que os contém.

Por exemplo:


           05  FIELD-B                     PICTURE X(5).
           05  FIELD-C.
               10  FIELD-D                 PICTURE XX.
              [10  SLACK-BYTES             PICTURE X.  INSERTED BY COMPILER]
               10  FIELD-E  COMPUTATIONAL  PICTURE S9(6) SYNC.
       01  FIELD-L.
           05  FIELD-M                     PICTURE X(5).
           05  FIELD-N                     PICTURE XX.
          [05  SLACK-BYTES                 PICTURE X.  INSERTED BY COMPILER]
           05  FIELD-O.
               10  FIELD-P COMPUTATIONAL   PICTURE S9(6) SYNC.

Os Slack bytes também podem ser adicionados pelo compilador quando um item de grupo é definido com uma cláusula OCCURS e contém um item de dados binários SYNCHRONIZED dentro dele.
Para determinar se os slack bytes (bytes livres) devem ser adicionados, a seguinte ação é executada:

  • O compilador calcula o tamanho do grupo, incluindo todos os bytes de folga necessários em um registro.
  • Essa soma é dividida pelo maior m exigido por qualquer item elementar do grupo.
  • Se r for igual a zero, não serão necessários bytes livres.
    Se r não for igual a zero, m - r bytes livres devem ser adicionados.

Os bytes de folga são inseridos no final de cada ocorrência do item de grupo que contém a cláusula OCCURS.
Por exemplo, um registro definido da seguinte maneira aparecerá no armazenamento, conforme mostrado, na figura após o registro:


           05  WORK-CODE                 PICTURE X.
           05  COMP-TABLE OCCURS 10 TIMES.
               10  COMP-TYPE             PICTURE X.
              [10  SLACK-BYTES           PIC XX.  INSERTED BY COMPILER]
               10  COMP-PAY              PICTURE S9(4)V99 COMP SYNC.
               10  COMP-HOURS            PICTURE S9(3) COMP SYNC.
               10  COMP-NAME             PICTURE X(5).

Para alinhar COMP-PAY e COMP-HOURS em seus limites adequados, o compilador adicionou 2 bytes de folga no registro.

No exemplo anterior, sem ajustes adicionais, a segunda ocorrência de COMP-TABLE começaria 1 byte antes de um limite de duas palavras e o alinhamento de COMP-PAY e COMP-HOURS não seria válido para nenhuma ocorrência da tabela após o primeiro.
Portanto, o compilador deve adicionar bytes livres no final do grupo, como se o registro tivesse sido gravado da seguinte maneira:


           05  WORK-CODE                  PICTURE X.
           05  COMP-TABLE OCCURS 10 TIMES.
               10  COMP-TYPE              PICTURE X.
              [10  SLACK-BYTES            PIC XX.  INSERTED BY COMPILER]
               10  COMP-PAY               PICTURE S9(4)V99 COMP SYNC.
               10  COMP-HOURS             PICTURE S9(3)  COMP SYNC.
               10  COMP-NAME              PICTURE X(5).
              [10  SLACK-BYTES            PIC XX.  INSERTED BY COMPILER]

Neste exemplo, a segunda e cada ocorrência subsequente de COMP-TABLE começa 1 byte além de um limite de duas palavras.
O layout de armazenamento para a primeira ocorrência de COMP-TABLE agora aparecerá como mostrado na figura a seguir:


Cada ocorrência subsequente na tabela começará agora na mesma posição relativa que a primeira.



© Copyright IBM Corp.