O exemplo aqui gera um arquivo TXT com 200 calendários (de 1900 até 2100).
Exemplo de Layout:
FUNCTION MAIN
REQUEST HB_LANG_PT
HB_LANGSELECT( 'PT' )
set date french
set century on
set printer on
set printer to calendario.txt
set console off
set device to printer
// Chamada dafunção (basta digitar o ano)
for ct:= 1900 to 2100
geraCalendario(ct)
next
set printer off
set printer to
set console on
set device to screen
return NIL
// =============================================================================================================================
// Função para gerar calendário de qualquer ano
function geraCalendario(ano)
local bissexto := .F., verdata:= "29/02/"+ alltrim(str(ano)), data_inicial:= "01/01/"+ alltrim(str(ano)), dia_inicial:= 1, calendario
// verifica se o ano é bissexto:
if len(alltrim(dtos(ctod(verdata)))) == 0
bissexto = .F.
else
bissexto = .T.
endif
// Verificando o dia inicial do ano:
dia_inicial = dow(ctod(data_inicial))
? replicate("-",91)
? "| " + alltrim(str(ano)) + space(84) + "|"
? replicate("-",91)
calendario = calendario(dia_inicial,bissexto)
MOSTRA_CALENDARIO(calendario)
return nil
// =============================================================================================================================
/*
GERA UM CALENDÁRIO ANUAL
dia_inicial = nº do dia da semana que o ano começa
bissexto = variável para indicar se o ano é bissexto (.T. OU .F.)
*/
FUNCTION CALENDARIO(dia_inicial,bissexto)
local ano, numero_de_dias:=0, dia_mes, mes, dias:={"DOM","SEG","TER","QUA","QUI","SEX","SAB"},DIAMES:={31,28,31,30,31,30,31,31,30,31,30,31}, contador := 1
if bissexto == .T.
ano:= array(366,2)
DIAMES:={31,29,31,30,31,30,31,31,30,31,30,31}
else
ano:= array(365,2)
DIAMES:={31,28,31,30,31,30,31,31,30,31,30,31}
endif
numero_de_dias = len(ano)
// Montando o calendario:
for mes:= 1 to 12
for dia_mes:= 1 to DIAMES[mes]
ano[contador,1] = strzero(dia_mes,3)
ano[contador,2] = dias[dia_inicial]
++ dia_inicial
if dia_inicial > 7
dia_inicial = 1
endif
++contador
next
next
return ano
// =============================================================================================================================
FUNCTION MOSTRA_CALENDARIO(dados_anuais)
local dias:={"DOM","SEG","TER","QUA","QUI","SEX","SAB"},meses:={"JAN","FEV","MAR","ABR","MAI","JUN","JUL","AGO","SET","OUT","NOV","DEZ"},DIAMES:={31,28,31,30,31,30,31,31,30,31,30,31}, mapa1, mapa2, mapa3, mapa4,;
mapa := ;
"| 001 | 002 | 003 |" +;
"| DOM SEG TER QUA QUI SEX SAB | DOM SEG TER QUA QUI SEX SAB | DOM SEG TER QUA QUI SEX SAB |" +;
"| A01 A02 A03 A04 A05 A06 A07 | B01 B02 B03 B04 B05 B06 B07 | C01 C02 C03 C04 C05 C06 C07 |" +;
"| A08 A09 A10 A11 A12 A13 A14 | B08 B09 B10 B11 B12 B13 B14 | C08 C09 C10 C11 C12 C13 C14 |" +;
"| A15 A16 A17 A18 A19 A20 A21 | B15 B16 B17 B18 B19 B20 B21 | C15 C16 C17 C18 C19 C20 C21 |" +;
"| A22 A23 A24 A25 A26 A27 A28 | B22 B23 B24 B25 B26 B27 B28 | C22 C23 C24 C25 C26 C27 C28 |" +;
"| A29 A30 A31 A32 A33 A34 A35 | B29 B30 B31 B32 B33 B34 B35 | C29 C30 C31 C32 C33 C34 C35 |" +;
"| A36 A37 A38 A39 A40 A41 A42 | B36 B37 B38 B39 B40 B41 B42 | C36 C37 C38 C39 C40 C41 C42 |"
LOCAL ct, dia_inicial:=1, mes,semanas:={"S01","S02","S03","S04","S05","S06","S07","S08","S09","S10","S11","S12","S13","S14","S15","S16","S17","S18","S19","S20","S21"}
if len(dados_anuais) == 366
DIAMES:={31,29,31,30,31,30,31,31,30,31,30,31}
endif
mapa1 = mapa
mapa2 = mapa
mapa3 = mapa
mapa4 = mapa
// MONTANDO O PRIMEIRO TRIMESTRE
dia_inicial = 1
total_dias = 0
DO CASE
case dados_anuais[1,2] = "DOM"
dia_inicial = 1
case dados_anuais[1,2] = "SEG"
dia_inicial = 2
case dados_anuais[1,2] = "TER"
dia_inicial = 3
case dados_anuais[1,2] = "QUA"
dia_inicial = 4
case dados_anuais[1,2] = "QUI"
dia_inicial = 5
case dados_anuais[1,2] = "SEX"
dia_inicial = 6
case dados_anuais[1,2] = "SAB"
dia_inicial = 7
ENDCASE
total_dias = diames[1] + diames[2] + diames[3] // total de dias do trimestre
mes = 1
marca_mes = DIAMES[mes]
marcador = 1
do while marcador < dia_inicial
mapa1 = strtran(mapa1,("A"+strzero(marcador,2))," ")
++marcador
enddo
prefixo := {"A","B","C"}
contador = 1
for ct:= 1 to total_dias
mapa1 = strtran(mapa1,(prefixo[mes]+strzero(marcador,2)),str(contador,3))
++dia_inicial
if dia_inicial > 7
dia_inicial = 1
endif
++marcador
++contador
if (ct == diames[1]) .or. (ct == diames[1] + diames[2]) .or. (ct == diames[1] + diames[2] + diames[3])
for ct2:= 1 to 49
mapa1 = strtran(mapa1,(prefixo[mes]+strzero(ct2,2))," ")
++marcador
next
marcador = 1
do while marcador < dia_inicial
mapa1 = strtran(mapa1,(prefixo[mes]+strzero(marcador,2))," ")
++marcador
enddo
++mes
marca_mes = diaMES[mes]
contador = 1
endif
next
mapa1 = strtran(mapa1,"001",meses[1])
mapa1 = strtran(mapa1,"002",meses[2])
mapa1 = strtran(mapa1,"003",meses[3])
// MONTANDO O SEGUNDO TRIMESTRE
total_dias = diames[1] + diames[2] + diames[3] // total de dias do trimestre
DO CASE
case dados_anuais[TOTAL_DIAS+1,2] = "DOM"
dia_inicial = 1
case dados_anuais[TOTAL_DIAS+1,2] = "SEG"
dia_inicial = 2
case dados_anuais[TOTAL_DIAS+1,2] = "TER"
dia_inicial = 3
case dados_anuais[TOTAL_DIAS+1,2] = "QUA"
dia_inicial = 4
case dados_anuais[TOTAL_DIAS+1,2] = "QUI"
dia_inicial = 5
case dados_anuais[TOTAL_DIAS+1,2] = "SEX"
dia_inicial = 6
case dados_anuais[TOTAL_DIAS+1,2] = "SAB"
dia_inicial = 7
ENDCASE
total_dias = diames[4] + diames[5] + diames[6] // total de dias do trimestre
mes = 4
marca_mes = DIAMES[mes]
marcador = 1
do while marcador < dia_inicial
mapa2 = strtran(mapa2,("A"+strzero(marcador,2))," ")
++marcador
enddo
prefixo := {"A","B","C"}
contador = 1
for ct:= 1 to total_dias
mapa2 = strtran(mapa2,(prefixo[mes-3]+strzero(marcador,2)),str(contador,3))
++dia_inicial
if dia_inicial > 7
dia_inicial = 1
endif
++marcador
++contador
if (ct == diames[4]) .or. (ct == diames[4] + diames[5]) .or. (ct == diames[4] + diames[5] + diames[6])
for ct2:= 1 to 49
mapa2 = strtran(mapa2,(prefixo[mes-3]+strzero(ct2,2))," ")
++marcador
next
marcador = 1
do while marcador < dia_inicial
mapa2 = strtran(mapa2,(prefixo[mes-3]+strzero(marcador,2))," ")
++marcador
enddo
++mes
marca_mes = diaMES[mes]
contador = 1
endif
next
mapa2 = strtran(mapa2,"001",meses[4])
mapa2 = strtran(mapa2,"002",meses[5])
mapa2 = strtran(mapa2,"003",meses[6])
// MONTANDO O TERCEIRO TRIMESTRE
total_dias = diames[1] + diames[2] + diames[3] + diames[4] + diames[5] + diames[6] // total de dias do trimestre
DO CASE
case dados_anuais[TOTAL_DIAS+1,2] = "DOM"
dia_inicial = 1
case dados_anuais[TOTAL_DIAS+1,2] = "SEG"
dia_inicial = 2
case dados_anuais[TOTAL_DIAS+1,2] = "TER"
dia_inicial = 3
case dados_anuais[TOTAL_DIAS+1,2] = "QUA"
dia_inicial = 4
case dados_anuais[TOTAL_DIAS+1,2] = "QUI"
dia_inicial = 5
case dados_anuais[TOTAL_DIAS+1,2] = "SEX"
dia_inicial = 6
case dados_anuais[TOTAL_DIAS+1,2] = "SAB"
dia_inicial = 7
ENDCASE
total_dias = diames[7] + diames[8] + diames[9] // total de dias do trimestre
mes = 7
marca_mes = DIAMES[mes]
marcador = 1
do while marcador < dia_inicial
mapa3 = strtran(mapa3,("A"+strzero(marcador,2))," ")
++marcador
enddo
prefixo := {"A","B","C"}
contador = 1
for ct:= 1 to total_dias
mapa3 = strtran(mapa3,(prefixo[mes-6]+strzero(marcador,2)),str(contador,3))
++dia_inicial
if dia_inicial > 7
dia_inicial = 1
endif
++marcador
++contador
if (ct == diames[7]) .or. (ct == diames[7] + diames[8]) .or. (ct == diames[7] + diames[8] + diames[9])
for ct2:= 1 to 49
mapa3 = strtran(mapa3,(prefixo[mes-6]+strzero(ct2,2))," ")
++marcador
next
marcador = 1
do while marcador < dia_inicial
mapa3 = strtran(mapa3,(prefixo[mes-6]+strzero(marcador,2))," ")
++marcador
enddo
++mes
marca_mes = diaMES[mes]
contador = 1
endif
next
mapa3 = strtran(mapa3,"001",meses[7])
mapa3 = strtran(mapa3,"002",meses[8])
mapa3 = strtran(mapa3,"003",meses[9])
// MONTANDO O QUARTO TRIMESTRE
total_dias = diames[1] + diames[2] + diames[3] + diames[4] + diames[5] + diames[6] + diames[7] + diames[8] + diames[9] // total de dias do quarto
DO CASE
case dados_anuais[TOTAL_DIAS+1,2] = "DOM"
dia_inicial = 1
case dados_anuais[TOTAL_DIAS+1,2] = "SEG"
dia_inicial = 2
case dados_anuais[TOTAL_DIAS+1,2] = "TER"
dia_inicial = 3
case dados_anuais[TOTAL_DIAS+1,2] = "QUA"
dia_inicial = 4
case dados_anuais[TOTAL_DIAS+1,2] = "QUI"
dia_inicial = 5
case dados_anuais[TOTAL_DIAS+1,2] = "SEX"
dia_inicial = 6
case dados_anuais[TOTAL_DIAS+1,2] = "SAB"
dia_inicial = 7
ENDCASE
total_dias = diames[10] + diames[11] + diames[12] // total de dias do trimestre
mes = 10
marca_mes = DIAMES[mes]
marcador = 1
do while marcador < dia_inicial
mapa4 = strtran(mapa4,("A"+strzero(marcador,2))," ")
++marcador
enddo
prefixo := {"A","B","C"}
contador = 1
for ct:= 1 to total_dias
mapa4 = strtran(mapa4,(prefixo[mes-9]+strzero(marcador,2)),str(contador,3))
++dia_inicial
if dia_inicial > 7
dia_inicial = 1
endif
++marcador
++contador
if (ct == diames[10]) .or. (ct == diames[10] + diames[11]) .or. (ct == diames[10] + diames[11] + diames[12])
for ct2:= 1 to 49
mapa4 = strtran(mapa4,(prefixo[mes-9]+strzero(ct2,2))," ")
++marcador
next
marcador = 1
do while marcador < dia_inicial
mapa4 = strtran(mapa4,(prefixo[mes-9]+strzero(marcador,2))," ")
++marcador
enddo
++mes
if mes > 12
exit
endif
marca_mes = diaMES[mes]
contador = 1
endif
next
mapa4 = strtran(mapa4,"001",meses[10])
mapa4 = strtran(mapa4,"002",meses[11])
mapa4 = strtran(mapa4,"003",meses[12])
mapa = mapa1 + mapa2 + mapa3 + mapa4
nome_mes1 = {"JAN ","FEV ","MAR ","ABR ","MAI ","JUN ","JUL ","AGO ","SET ","OUT ","NOV ","DEZ "}
nome_mes2 = {"JANEIRO","FEVEREIRO","MARCO","ABRIL","MAIO","JUNHO","JULHO","AGOSTO","SETEMBRO","OUTUBRO","NOVEMBRO","DEZEMBRO"}
for ct:= 1 to 12
mapa = strtran(mapa,nome_mes1[ct],nome_mes2[ct])
next
? replicate("-",91)
inicio = 1
fim = 91
for ct:= 1 to 32
? substr(mapa,inicio,fim)
inicio = inicio + 91
if ct % 8 == 0
? replicate("-",91)
endif
next
RETURN NIL