                C O N V D A T E  and  C A L L D A T E



      CONVDATE serve per fare delle conversioni di date o per trarre delle
informazioni da una data. E' disponibile in tutti gli ambienti sia
come programma singolo che come routine linkabile (o richiamabile) come
subroutine (di nome CALLDATE).


      L'input puo' essere:

- una data nella forma GG/MM/AA o GG/MM/AAAA
- una data nella forma AAAA/DDD   (dove DDD e' il giorno espresso come
  numero progressivo dall'inizio dell'anno)
- un numero intero preceduto dal segno '+':
  in questo caso la data in input e' la data corrente piu' il numero di
  giorni specificato
- un numero intero maggiore di 2305448, che esprime il Giorno Giuliano
  assoluto della data in input (vedi oltre).


      L'output che viene fornito e' il seguente, indipendentemente dal
formato della data in input:

- Data in formato GG/MM/AAAA (10 bytes)
- Giorno progressivo da inizio anno (3 bytes)
- Flag se l'anno e' bisestile (1 byte); se lo e' il flag e' "B",
  altrimenti e' un blank
- Nome del mese (in italiano e in maiuscolo) (9 bytes)
- Numero del giorno della settimana (1 byte) = 1 LUNEDI',2 MARTEDI' ecc.
- Nome   del giorno della settimana (in italiano) (10 bytes)
- Flag di giorno festivo o lavorativo (1 byte); puo' essere "F" o "L"
- Numero di settimana dall'inizio dell'anno (2 bytes)
- Giorno giuliano assoluto     (8 bytes)
- Lettera domenicale espressa come numero da 0 a 7 (1 byte) 0=A, 1=B, ecc.
- Lettera domenicale del mese  (1 byte) 0=A, 1=B, ecc.
- Pasqua espressa come GG/MM              (5 bytes)
- Pasqua espressa come giorno progressivo DDD (3 bytes)
- Giorni passati dalla data corrente (6 bytes) (negativo per una data futura)

  Tutte queste informazioni sono riportate in forma discorsiva a video
su quattro o cinque righe se il programma e' stand-alone; sono restituite
al programma chiamante secondo il seguente tracciato record, se la routine
e' richiamata con una CALL.

  Per un programma COBOL:

       01  DATA-OUTPUT.
           05  DATA-ERROR                PIC  X(1).
           05  FILLER                    PIC  X(1).
           05  DATA-DATA.
               10  DATA-DATA-GG          PIC  9(2).
               10  FILLER                PIC  X(1).
               10  DATA-DATA-MM          PIC  9(2).
               10  FILLER                PIC  X(1).
               10  DATA-DATA-AAA         PIC  9(4).
           05  FILLER                    PIC  X(1).
           05  DATA-PROGRESSIVO          PIC  9(3).
           05  FILLER                    PIC  X(1).
           05  DATA-BISESTILE            PIC  X(1).
           05  FILLER                    PIC  X(1).
           05  DATA-NOME-MESE            PIC  X(10).
           05  FILLER                    PIC  X(1).
           05  DATA-NUMERO-GIORNO        PIC  9(1).
           05  FILLER                    PIC  X(1).
           05  DATA-NOME-GIORNO          PIC  X(10).
           05  FILLER                    PIC  X(1).
           05  DATA-FESTIVO              PIC  X(1).
           05  FILLER                    PIC  X(1).
           05  DATA-SETTIMANA            PIC  9(2).
           05  FILLER                    PIC  X(1).
           05  DATA-GIORNO-GIULIANO      PIC  9(8).
           05  FILLER                    PIC  X(1).
           05  DATA-LETTERA-DOM          PIC  9(1).
           05  FILLER                    PIC  X(1).
           05  DATA-LETTERA-MESE         PIC  9(1).
           05  FILLER                    PIC  X(1).
           05  DATA-PASQUA.
               10  DATA-PASQUA-GG        PIC  9(2).
               10  FILLER                PIC  X(1).
               10  DATA-PASQUA-MM        PIC  9(2).
           05  FILLER                    PIC  X(1).
           05  DATA-PASQUA-PROG          PIC  9(3).
           05  FILLER                    PIC  X(1).
           05  DATA-GIORNI-PASSATI       PIC S9(6).

      Si noti che ogni dato restituito e' separato dal successivo da un
FILLER di un blank.


  Per un programma ASSEMBLER:

         DATOUT    DS   0CL80
         DATERROR  DS    CL1
                   DS    CL1
         DATDATA   DS   0CL10
         DATDATGG  DS    CL2
                   DS    CL1
         DATDATMM  DS    CL2
                   DS    CL1
         DATDATAA  DS    CL4
                   DS    CL1
         DATPROGR  DS    CL3
                   DS    CL1
         DATBISES  DS    CL1
                   DS    CL1
         DATMESE   DS    CL10
                   DS    CL1
         DATMESEN  DS    CL1
                   DS    CL1
         DATGIORN  DS    CL10
                   DS    CL1
         DATFEST   DS    CL1
                   DS    CL1
         DATSETT   DS    CL2
                   DS    CL1
         DATJD     DS    CL8
                   DS    CL1
         DATLETDO  DS    CL1
                   DS    CL1
         DATLETME  DS    CL1
                   DS    CL1
         DATPASQU  DS   0CL5
         DATPASGG  DS    CL2
                   DS    CL1
         DATPASMM  DS    CL2
                   DS    CL1
         DATPASPR  DS    CL3
                   DS    CL1
         DATGIPAS  DS    ZL6


Il primo byte del tracciato e' il codice di errore relativo a un valore
errato in input alla routine; puo' essere una delle seguenti lettere:

  L = Tracciato record in output lungo meno di 80 caratteri (questo errore
      e' rilevato solo nella versione CICS, in cui l'output e' restituito
      in Commarea)
  N = Data non numerica o incompleta
  G = Giorno errato (>31 o <1)
  M = Mese errato   (>12 o <1)
  A = Anno errato   (>2199 o <1600)
  I = Data incongruente (Es.: 31/11 o 29/2 in anno non bisestile); la
      elaborazione prosegue ugualmente
  J = Giorno giuliano in input fuori range



      Il programma e' disponibile in forma stand-alone negli ambienti
interattivi, ossia in VM/CMS, in MVS/TSO e in CICS; per richiamarlo
scrivere il nome programma con accanto la data in input: l'output verra'
visualizzato a video.
      Il programma e' a disposizione come routine linkabile in ambiente
DOS VSE/SP ed MVS BATCH; la data in input deve essere fornita nella
stessa area di memoria passata alla routine, area che conterra' anche
l'output; il resto del tracciato record deve essere riempito con blank.
Per richiamarla ad esempio da un programma COBOL conviene fare una
REDEFINE del tracciato DATA-OUTPUT come DATA-INPUT e poi fare:

           MOVE  mia-data TO DATA-INPUT.
           CALL 'CONVDATE' USING DATA-OUTPUT.

      Infine, in ambiente CICS, la versione stand-alone del programma
puo' essere richiamata anche da un altro programma con un EXEC CICS LINK
nel quale viene passata una Commarea di 80 caratteri in cui vi e' sia
l'input che l'output. Ad esempio:

           MOVE  mia-data TO DATA-INPUT.
           EXEC CICS LINK PROGRAM('CONVDATE') COMMAREA(DATA-INPUT)
                LENGTH(80)


Note:
- L'intervallo di validita' del calendario gestito e' da 1/1/1600 (che
  corrisponde al giorno giuliano assoluto 2305448) fino al 31/12/2199
  (corrispondente al giorno giuliano assoluto 2305448); in questo intervallo
  viene gestita correttamente la riforma gregoriana del calendario (ossia
  il fatto che gli anni 1700, 1800, 1900 e 2100 non sono bisestili); a
  questo proposito si ricorda che, benche' questa riforma sia stata
  promulgata l'anno 1582, e' entrata praticamente in vigore in date diverse
  da nazione a nazione (ad esempio, in URSS e' entrata in vigore nel nostro
  secolo, dopo la rivoluzione di ottobre). Non e' gestito il calendario
  precedente a quello gregoriano, ossia quello giuliano.

