Calendário Permanente

Aqui você poderá oferecer suas Contribuições, Dicas e Tutoriais (Texto ou Vídeo) que sejam de interesse de todos.

Moderador: Moderadores

yugi386
Usuário Nível 2
Usuário Nível 2
Mensagens: 82
Registrado em: 24 Jul 2008 10:36
Localização: Minas Gerais

Calendário Permanente

Mensagem por yugi386 »

Eis uma rotina para criar calendários permanentes.
O exemplo aqui gera um arquivo TXT com 200 calendários (de 1900 até 2100).

Exemplo de Layout:

Imagem

Código: Selecionar todos

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
Avatar do usuário
Nascimento
Usuário Nível 4
Usuário Nível 4
Mensagens: 763
Registrado em: 19 Jul 2008 12:11
Localização: OLINDA-PE

Calendário Permanente

Mensagem por Nascimento »

parabéns amigo, ficou muito bom
A arte de programar é simplesmente fazer seus pensamentos serem interpretados por uma maquina :) clipper 5.3 /harbour/minigui
Avatar do usuário
mustafa
Usuário Nível 1
Usuário Nível 1
Mensagens: 4
Registrado em: 02 Jun 2018 09:24
Localização: Alicante/España

Calendário Permanente

Mensagem por mustafa »

Hola yugi386

Me gusto mucho el ejemplo de generar Calendarios
He modificando un poco para poder generar también si se quiere PDF

Eu realmente gostei do exemplo de gerar calendários
Eu modifiquei um pouco para poder gerar também se você quiser PDF

Saludos/ Saudações
Mustafa
Anexos
Calendario.zip
(364.96 KiB) Baixado 79 vezes
Responder