O PROGDATA é um módulo COBOL responsável por obter e processar informações relacionadas à data do sistema, disponibilizando os dados em um registro compartilhado para utilização por outros programas.

Além de obter a data atual no formato AAAAMMDD, o programa complementa essa informação com dados úteis para o processamento das aplicações. Entre suas funções estão a identificação do dia da semana, a conversão do número do mês para sua descrição correspondente, como 01 → JANEIRO, e a conversão do dia da semana para texto, como 1 → SEGUNDA-FEIRA.

O módulo também determina quantos dias já transcorreram no ano corrente e calcula a data do dia anterior, tratando corretamente mudanças de mês e de ano. Para garantir o cálculo correto das datas, o programa considera ainda os anos bissextos, especialmente na determinação do último dia de fevereiro.

O processamento principal é organizado nas seguintes etapas:

0001-OBTER-DATA
0002-OBTER-DESC-MES
0003-OBTER-DESC-SEM
0004-OBTER-DIAS-ANO
0005-OBTER-DIA-ANT
9999-FINALIZAR

Dessa forma, o PROGDATA funciona como um módulo utilitário de processamento de datas, centralizando operações recorrentes e permitindo que outros programas do sistema utilizem essas informações sem precisar implementar novamente as mesmas regras.

CODIGO FONTE:

      ******************************************************************
      * PROGRAMADOR: JOSE ROBERTO - COBOLDICAS
      * DATA: 30/01/2025
      * OBJETIVO: OBTER DATA DO SISTEMA
      ******************************************************************
       IDENTIFICATION DIVISION.
       PROGRAM-ID. PROGDATA.
      *================================================================*
       DATA DIVISION.
       FILE SECTION.
       WORKING-STORAGE SECTION.
 
        01  WRK-DIAS-ANO-YYYYDDD. 
         05 WRK-DIAS-ANO-AAAA          PIC 9(004) VALUE zeros.
         05 WRK-DIAS-ANO-DDD           PIC 9(003) VALUE ZEROS.
        01 WRK-DIA-ANT                 PIC 9(002) VALUE ZEROS.
        01 WRK-MES-ANT                 PIC 9(002) VALUE ZEROS.
        01 WRK-ANO-ANT                 PIC 9(004) VALUE ZEROS.
        01 WRK-ULTIMO-DIA-MES          PIC 9(002) VALUE ZEROS.
        01 WRK-RESTO                   PIC 9(002) VALUE ZEROS.
        01 WRK-QUOCIENTE               PIC 9(003) VALUE ZEROS.

       LINKAGE SECTION.
        COPY COD001A.

      *================================================================*
       PROCEDURE DIVISION USING COD001A-REGISTRO.
      *================================================================*

      *----------------------------------------------------------------*
      *    PROCESSAMENTO PRINCIPAL
      *----------------------------------------------------------------*
      *> cobol-lint CL002 0000-processar
       0000-PROCESSAR                  SECTION.
      *----------------------------------------------------------------*

            PERFORM 0001-OBTER-DATA
            PERFORM 0002-OBTER-DESC-MES
            PERFORM 0003-OBTER-DESC-SEM
            PERFORM 0004-OBTER-DIAS-ANO
            PERFORM 0005-OBTER-DIA-ANT
            PERFORM 9999-FINALIZAR
            .
      *----------------------------------------------------------------*
      *> cobol-lint CL002 0000-end
       0000-END.                       EXIT.
      *----------------------------------------------------------------*
      
      *----------------------------------------------------------------*
      *    OBTER DATA DO SISTEMA
      *----------------------------------------------------------------*
       0001-OBTER-DATA                 SECTION.
      *----------------------------------------------------------------*

            ACCEPT COD001A-DATA        FROM DATE YYYYMMDD

            ACCEPT COD001A-DIA-SEMANA  FROM DAY-OF-WEEK
            .
      *----------------------------------------------------------------*
      *> cobol-lint CL002 0001-end
       0001-END.                       EXIT.
      *----------------------------------------------------------------*

      *----------------------------------------------------------------*
      *    OBTER DESCRICAO DO MES
      *----------------------------------------------------------------*
       0002-OBTER-DESC-MES             SECTION.
      *----------------------------------------------------------------*
        
            EVALUATE  COD001A-DATA-MES
            WHEN 01
                MOVE 'JANEIRO'         TO COD001A-DESC-MES
            WHEN 02
                MOVE 'FEVEREIRO'       TO COD001A-DESC-MES
            WHEN 03      
                MOVE 'MARCO'           TO COD001A-DESC-MES
            WHEN 04      
                MOVE 'ABRIL'           TO COD001A-DESC-MES
            WHEN 05      
                MOVE 'MAIO'            TO COD001A-DESC-MES
            WHEN 06      
                MOVE 'JUNHO'           TO COD001A-DESC-MES
            WHEN 07      
                MOVE 'JULHO'           TO COD001A-DESC-MES
            WHEN 08      
                MOVE 'AGOSTO'          TO COD001A-DESC-MES
            WHEN 09      
                MOVE 'SETEMBRO'        TO COD001A-DESC-MES
            WHEN 10      
                MOVE 'OUTUBRO'         TO COD001A-DESC-MES
            WHEN 11      
                MOVE 'NOVEMBRO'        TO COD001A-DESC-MES
            WHEN 12      
                MOVE 'DEZEMBRO'        TO COD001A-DESC-MES
            WHEN OTHER      
                MOVE 'INVALIDO'        TO COD001A-DESC-MES
            END-EVALUATE      
           .
      *----------------------------------------------------------------*
      *> cobol-lint CL002 0002-end
       0002-END.                       EXIT.
      *----------------------------------------------------------------*

      *----------------------------------------------------------------*
      *    OBTER DESCRICAO DA SEMANA
      *----------------------------------------------------------------*
       0003-OBTER-DESC-SEM             SECTION.
      *----------------------------------------------------------------*
      
            EVALUATE  COD001A-DIA-SEMANA
            WHEN 01
                MOVE 'SEGUNDA-FEIRA'   TO COD001A-DESC-SEMANA
            WHEN 02
                MOVE 'TERCA-FEIRA'     TO COD001A-DESC-SEMANA
            WHEN 03
                MOVE 'QUARTA-FEIRA'    TO COD001A-DESC-SEMANA
            WHEN 04
                MOVE 'QUINTA-FEIRA'    TO COD001A-DESC-SEMANA
            WHEN 05
                MOVE 'SEXTA-FEIRA'     TO COD001A-DESC-SEMANA
            WHEN 06
                MOVE 'SABADO'          TO COD001A-DESC-SEMANA
            WHEN 07
                MOVE 'DOMINGO'         TO COD001A-DESC-SEMANA
            WHEN OTHER
                MOVE 'INVALIDO'        TO COD001A-DESC-SEMANA
            END-EVALUATE
           .
      *----------------------------------------------------------------*
      *> cobol-lint CL002 0003-end
       0003-END.                       EXIT.
      *----------------------------------------------------------------*

      *----------------------------------------------------------------*
      *    OBTER DIAS DO ANO
      *----------------------------------------------------------------*
       0004-OBTER-DIAS-ANO             SECTION.
      *----------------------------------------------------------------*

            ACCEPT WRK-DIAS-ANO-YYYYDDD 
                                       FROM DAY YYYYDDD

            MOVE WRK-DIAS-ANO-DDD      TO COD001A-DIAS-ANO 
            .
      *----------------------------------------------------------------*
      *> cobol-lint CL002 0004-end
       0004-END.                       EXIT.
      *----------------------------------------------------------------*

      *----------------------------------------------------------------*
      *    OBTER DATA DO DIA ANTERIOR
      *----------------------------------------------------------------*
      *> cobol-lint CL002 0005-obter-dia-ant
       0005-OBTER-DIA-ANT              SECTION.
      *----------------------------------------------------------------*

            MOVE COD001A-DATA-DIA      TO WRK-DIA-ANT
            MOVE COD001A-DATA-MES      TO WRK-MES-ANT  
            MOVE COD001A-DATA-ANO      TO WRK-ANO-ANT

            IF COD001A-DATA-DIA > 1
               SUBTRACT 1            FROM WRK-DIA-ANT
               MOVE WRK-DIA-ANT        TO COD001A-DATA-DIA-ANT
               MOVE WRK-MES-ANT        TO COD001A-DATA-MES-ANT
               MOVE WRK-ANO-ANT        TO COD001A-DATA-ANO-ANT
            ELSE
               SUBTRACT 1            FROM WRK-MES-ANT
               IF WRK-MES-ANT       EQUAL ZEROS
                  MOVE 12              TO WRK-MES-ANT
                  SUBTRACT 1         FROM WRK-ANO-ANT
                  MOVE WRK-ANO-ANT     TO COD001A-DATA-ANO-ANT
               END-IF 
               PERFORM 0006-OBTER-ULTIMO-DIA
               MOVE WRK-ANO-ANT        TO COD001A-DATA-ANO-ANT
               MOVE WRK-MES-ANT        TO COD001A-DATA-MES-ANT               
               MOVE WRK-ULTIMO-DIA-MES TO COD001A-DATA-DIA-ANT
            END-IF
            .
      *----------------------------------------------------------------*
      *> cobol-lint CL002 0005-end
       0005-END.                       EXIT.
      *----------------------------------------------------------------*

      *----------------------------------------------------------------*
      *    OBTER ULTIMO DIA DO MES
      *----------------------------------------------------------------*
       0006-OBTER-ULTIMO-DIA           SECTION.
      *----------------------------------------------------------------*

            EVALUATE WRK-MES-ANT
              WHEN 1
              WHEN 3
              WHEN 5
              WHEN 7
              WHEN 8
              WHEN 10
              WHEN 12
                MOVE 31                TO WRK-ULTIMO-DIA-MES
              WHEN 4 
              WHEN 6 
              WHEN 9 
              WHEN 11
                MOVE 30                TO WRK-ULTIMO-DIA-MES
              WHEN 2
                DIVIDE WRK-ANO-ANT BY 4 GIVING WRK-QUOCIENTE
                REMAINDER WRK-RESTO 
                IF WRK-RESTO     NOT EQUAL ZEROS 
                   MOVE 28           TO WRK-ULTIMO-DIA-MES
                ELSE
                   DIVIDE WRK-ANO-ANT BY 400 
                                        GIVING  WRK-QUOCIENTE
                   REMAINDER WRK-RESTO 
                   IF WRK-RESTO   EQUAL ZEROS 
                      MOVE 29        TO WRK-ULTIMO-DIA-MES
                   ELSE 
                     DIVIDE WRK-ANO-ANT BY 100 
                                        GIVING  WRK-QUOCIENTE
                     REMAINDER WRK-RESTO 
                     IF WRK-RESTO    EQUAL ZEROS 
                        MOVE 28         TO WRK-ULTIMO-DIA-MES
                     ELSE 
                        MOVE 29         TO WRK-ULTIMO-DIA-MES
                     END-IF 
                   END-IF
                END-IF     
            END-EVALUATE 
            .
      *----------------------------------------------------------------*
      *> cobol-lint CL002 0006-end
       0006-END.                       EXIT.
      *----------------------------------------------------------------*

      *----------------------------------------------------------------*
      *    FINALIZAR PROGRAMA
      *----------------------------------------------------------------*
       9999-FINALIZAR                  SECTION.
      *----------------------------------------------------------------*

            GOBACK 
            .
      *----------------------------------------------------------------*
      *> cobol-lint CL002 9999-end
       9999-END.                       EXIT.
      *----------------------------------------------------------------*