COBOL - Arithmetic with date fields



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

COBOL - Arithmetic with date fields
Enterprise COBOL for z/OS, V4.2, Language Reference

As operações aritméticas que incluem um campo de data são restritas a:

  • Incluindo um Não-Data em um Campo de Data
  • Subtraindo um não-datado de um campo de data
  • Subtraindo um campo de data de um campo de data compatível

Os operandos do campo de data são compatíveis se tiverem o mesmo formato de data, exceto a parte do ano, que pode ser windowed (exibida) ou expandida.

As seguintes operações não são permitidas:

  • Qualquer operação entre datas incompatíveis
  • Adicionando dois campos de data
  • Subtraindo um campo de data de uma não-data
  • Unário menos aplicado a um campo de data
  • Divisão, exponenciação ou multiplicação de ou por um campo de data
  • Expressões aritméticas que especificam um campo de data do último ano
  • Instruções aritméticas que especificam um campo de data do último ano, exceto como um item de dados de recebimento quando o campo de envio é um não-datado

As seções abaixo descrevem o resultado do uso de campos de data nas operações de adição e subtração suportadas.

Para obter mais informações sobre o uso de campos de data em operações aritméticas, consulte:

Notas de uso

  • As operações aritméticas tratam os campos de data como itens numéricos; eles não reconhecem nenhuma estrutura interna específica da data.
    Por exemplo, adicionar 1 a um campo de data em janela que contém o valor 991231 (que pode ser usado em um aplicativo para representar 31 de dezembro de 1999) resulta no valor 991232, e não em 000101.

  • Quando usados como operandos em expressões aritméticas ou declarações aritméticas, os campos de data em janela são expandidos automaticamente de acordo com a janela do século especificada pela opção do compilador YEARWINDOW.
    Quando a opção do compilador DATEPROC (TRIG) está em vigor, essa expansão é sensível a disparar valores no campo de data em janela. Para obter detalhes da expansão em janela regular e sensível ao acionador, consulte Semântica dos campos de data em janela - Semantics of windowed date fields.

Adição que envolve campos de data

A tabela a seguir mostra o resultado do uso de um campo de data com um operando compatível em uma adição.

Tabela 1. Resultados do uso de campos de data em adições

Segundo operando não datado Campo de data segundo operando
Primeiro operando não datado Nondate Date field
Primeiro operando do campo Data Date field Not allowed

Para obter detalhes sobre como um resultado é armazenado em um campo de recebimento, consulte Storing arithmetic results that involve date fields - Armazenando resultados aritméticos que envolvem campos de data.

Subtração que envolve campos de data

A tabela a seguir mostra o resultado do uso de um campo de data com um operando compatível na subtração:

primeiro operando - segundo operando

Em uma instrução SUBTRACT, esses operandos aparecem na ordem inversa:

SUBTRACT segundo operando FROM primeiro operando

Tabela 2. Resultados do uso de campos de data na subtração

Segundo operando não datado Campo de data segundo operando
Primeiro operando não datado Nondate Not allowed
Primeiro operando do campo Data Date field Nondate

Armazenando resultados aritméticos que envolvem campos de data

As instruções a seguir executam aritmética e armazenam o resultado ou o campo de envio em um ou mais campos de recebimento:

  • ADD
  • COMPUTE
  • DIVIDE
  • MULTIPLY
  • SUBTRACT

Em uma instrução MULTIPLY, apenas os identificadores GIVING podem ser campos de data. Em uma instrução DIVIDE, apenas os identificadores GIVING ou REMAINDER podem ser campos de data.

Quaisquer campos de data em janela que são operandos da expressão ou instrução aritmética são tratados como se tivessem sido expandidos antes do uso, conforme descrito em Semantics of windowed date fields - Semântica dos campos de data em janela.

Se o campo de envio for um campo de data, o campo de recebimento deverá ser um campo de data compatível.
Ou seja, os dois campos devem ter o mesmo formato de data, exceto a parte do ano, que pode ser exibida em janela ou expandida.

Se a cláusula ON SIZE ERROR não for especificada na instrução, a operação de armazenamento seguirá as regras COBOL existentes para a instrução e continuará como se os campos de recebimento e envio (após qualquer expansão automática de operandos ou resultado de campo de data em janela) fossem dois sem datas.

Tabela 3 mostra como essas instruções armazenam o valor de um campo de envio em um campo de recebimento, onde qualquer um dos campos pode ser um campo de data.
A seção usa os seguintes termos para descrever como a loja é realizada:

Nonwindowed
A instrução executa o armazenamento sem processamento especial de erro de tamanho sensível à data, conforme descrito em SIZE ERROR phrases.

Windowed with nondate sending field
O campo de envio não datado é tratado como um campo de data em janela compatível com o campo de recebimento de data em janela, mas com a parte do ano representando o número de anos desde 1900.
(Essa representação é semelhante a um campo de data em janela com um ano base de 1900, exceto que a parte do ano não se limita a um número positivo de no máximo dois dígitos.)
A loja continua como se essa parte do ano assumida do campo de envio fosse expandida adicionando 1900 a ele.

Windowed with date sending field
A loja (store) continua como se todos os operandos do campo de data em janela tivessem sido expandidos conforme necessário, para que o campo de envio seja um campo de data expandida compatível.

Size error processing:
Para os dois tipos de campo de envio, se a parte do ano assumida ou real do campo de envio estiver dentro da janela do século, o campo de envio será armazenado no campo de recebimento após a remoção do componente do século da parte do ano.
Ou seja, os dois dígitos de ordem baixa ou mais à direita da parte do ano expandido são mantidos e os dois dígitos de ordem mais alta ou à esquerda são descartados.

Se a parte do ano não se encaixar na janela do século, o campo de recebimento não é modificado e a instrução imperativa de erro de tamanho é executada quando todas as operações aritméticas restantes são concluídas.

Por exemplo:

    77  DUE-DATE PICTURE 9(5) DATE FORMAT YYXXX.
    77  IN-DATE  PICTURE 9(8) DATE FORMAT YYYYXXX VALUE 1995001.
    .........
        COMPUTE DUE-DATE = IN-DATE + 10000
                ON SIZE ERROR imperative-statement
        END-COMPUTE

O campo de envio é um campo de data expandida que representa 1 de janeiro de 2005. Supondo que 2005 caia na janela do século, o valor armazenado em DUE-DATE é 05001; isto é, o valor de envio de 2005001 sem o componente do século 20.

Size error processing and trigger values:
Se a opção do compilador DATEPROC (TRIG) estiver em vigor e o campo de envio contiver um valor de acionador (zero ou todos os noves), a instrução imperativa de erro de tamanho será executada e o resultado não será armazenado no receptor campo.

Considera-se que um não-datado possui um valor de acionador de todos os noves se tiver nove em cada dígito na posição do formato de data assumido.
Portanto, para um formato de data de recebimento de YYXXX, o valor sem data 99.999 é um gatilho, mas os valores 9.999 e 999.999 não são, embora o valor maior de 999.999 cause um erro de tamanho.

Tabela 3. Armazenando resultados aritméticos que envolvem campos de data quando ON SIZE ERROR é especificado

Campo de envio não datado Campo de data campo de envio
Campo receptor não datado Nonwindowed Not allowed
Campo de data de janela de recebimento campo Windowed Windowed
Campo de data expandida campo de recebimento Nonwindowed Nonwindowed


© Copyright IBM Corp.