Convertendo Data Gregoriana em Juliana

Apesar de não ter implementado, pensei: “para economizar um byte na transmissão de dados, poderia enviar o ano mais o dia em juliano (de 1 a 365)”. Era bobeira minha… 1 byte… mas para elguém isso pode ajudar.

A maneira mais fácil é a seguinte:

DEFINE DATA LOCAL
1 #DATA-DMAC (A8) INIT <'05051984'> /* nasci nesse dia :D
1 #DATE-D (D)
1 #DATE-J (A7)
END-DEFINE
*
*** VOCE PODE RECEBER ESSA DATA DA TELA OU PARM
*
IF #DATE-DMAC NE MASK (MMDDYYYY)
OR #DATE-DMAC NE MASK (....1930:2014)
WRITE 'O CAMPO #DMAC NAO ESTA NO FORMATO DDMMAAAA.' #DATE-DMAC
STOP
END-IF
*
MOVE EDITED #DATE-DMAC TO #DATE-D (EM=DDMMYYYY)
MOVE EDITED #DATE-D (EM=YYYYJJJ) TO #DATE-J
*
WRITE '=' #DATE-DMAC / '=' #DATE-D / '=' #DATE-J
*
END

DMAC significa Dia, Mês e Ano Completo.

  • A primeira máscara verifica se a data possui um formato válido de dia, mês e ano, e depois verifica o intervalo do ano (eu coloquei de 1930, primeira Copa do Mundo, e 2014, a segunda Copa no Brasil); Se não estiver dentro dessas máscaras, mostro uma mensagem de erro.
  • Movo para uma variável do tipo DATE, dizendo que a máscara do campo é DDMMAAAA, para ela saber os valores corretos.
  • Movo o conteúdo da variável no formato D para uma no formato A com o valor do ano e o dia do ano
  • Mostro uma data em cada linha (a barra no WRITE faz isso)

Esse exemplo foi baseado – copiado e levemente modificado para uso – do fórum da Software AG sobre Natural: http://tech.forums.softwareag.com/viewtopic.php?t=13788

3 Respostas para “Convertendo Data Gregoriana em Juliana”

  1. ailton borba garcia Disse:

    Alguma dica de como tratar identificar caracteres nao reconnhecidos pelo natural?

    • Daniel Disse:

      Olá Ailton,
      Fizemos recentemente um tratamento para dados que vêm de outra plataforma: criamos um array com os caracteres válidos e usamos o EXAMINE. Validamos se cada caractere da string de entrada corresponde à máscara escolhida (A,C,P etc) e se está no array de caracteres que aceito: (%$&#@…); quando não corresponde à condição, no caso da nossa rotina, substituímos por “?”.

  2. ailton borba garcia Disse:

    OK, justamente o que eu estava fazendo, mas acho que o natural trabalha também com caracteres asc ou hexadecimal, mas preciso dos codigos de cada tecla.

Deixe uma resposta