Jump to content
Fivewin Brasil

VERIFICANDO FERIADOS/SABADOS/DOMINGOS


carlos

Recommended Posts

Olá,

Preciso de ajuda para resolver o seguinte: A rotina abaixo calcula o número de dias entre duas datas

(DT_ENTRADA-DATA_ABRE).

- Caso as duas sejam iguais o resultado

em número de dias = 0, beleza.

- Agora, se a diferença for de 01 dia ou maior,

deverei verificar se existiu um FERIADO neste dia ou

SÃBADO/DOMINGO.

Ex: DATA_ABRE = 06/09/2005 = TERÇA FEIRA

DT_ENTREGA = 08/09/2005 = QUINTA FEIRA

Neste caso o dia 07(feriado) será

subtraído em 01 dia de M->mdias.

- Agora, se for maior ou igual 02 dias,

deverei verificar se existiu um SÃBADO,DOMINGO ou FERIADO.

Ex: DATA_ABRE = 03/06/2005 = SEXTA FEIRA

DT_ENTREGA = 06/06/2005 = SEGUNDA FEIRA

Neste caso os dias 04(sábado),05(domingo) serão

subtraídos em 02 dias de M->mdias.

Abaixo um pedaço da rotina onde deverei incluir tal processo.

Qualquer ajuda será muito bem vinda.

Carlos

***** PROCESSANDO OS REGISTROS DENTRO DO RELATÓRIO DE MÉDIA MENSAL

M->mdias = XDBF->DT_ENTREGA-XDBF->DATA_ABRE // recebe o número de dias

M->mtotal = M->mtotal+1 // sem importância no momento

IF M->mdias = 0 // caso = 0 classifica na categoria de até 08 horas

mtot08=mtot08+1

ENDIF

IF M->mdias = 1 // caso = 1 classifica na categoria de até 24 horas

mtot24=mtot24+1

ENDIF

IF M->mdias = 2 // caso = 2 classifica na categoria de até 48 horas

*Funcao para verificar se aconteceram feriados

mtot48=mtot48+1

***************

ENDIF

IF M->mdias >= 3 // caso >= 3 classifica na categoria de maior que 48 horas

*Funcao para verificar se aconteceram feriados/sábados/domingos

mtot49=mtot49+1

***************

ENDIF

ENDIF

XDBF->( DbSkip() )

Link to comment
Share on other sites

Carlos, Boa Tarde

Eu tenho uma função que me retorna o número de dias uteis,

sendo que, para os feriados eu criei uma variavel alimentada por um Dbf para tal fim, chamada:

wFeriados:="01/01/2005;01/05/2005 .......;31/12/2005"

No seu caso:

nDias:=(DT_ENTRADA - DATA_ABRE)

if nDias>0

nFeriados:= nDias - PESQDIAUTIL( DT_ENTRADA , DATA_ABRE )

else

nFeriados:= 0

endif

FUNC PESQDIAUTIL

PARA _DATAINICIO,_DATAFIM

_CONTAUTIL:=0

DO WHIL _DATAINICIO < _DATAFIM

_DATAINICIO+=1

IF AT(DTOC(_DATAINICIO,WFERIADOS)=0 .AND. ;

DOW(_DATAINICIO)>1 .AND. ;

DOW(_DATAINICIO)<7

_CONTAUTIL+=1

ENDIF

ENDDO

RETU(_CONTAUTIL)

Eu só não sei como voce trata Feriados no seu programa.

Espero ter ajudado

Paulo/CONTATO SISTEMAS

Clipper53b / FW26 / Blinker70

Ajudar é um prazer, agradecer é uma obrigação

Editado por - pauloaraujo on 17/06/2005 17:43:16

Link to comment
Share on other sites

Olá Paulo Araujo,

Agradeço sua ajuda, meu problema é justamente este tratar os feriados, provavelmente terei que criar um arq. para

armazenar os feriados.Peço a você que de mais uma olhada no que tenho de fazer(CASO POSSA) para ver se tem uma ideia melhor.

Valeu !

Carlos

Link to comment
Share on other sites

Grande amigo Carlos, faça o seguinte...

Quanto a Sábado e Domingo é simples...

if dow(suadata)=1 //-Domindo

if dow(suadata)=7 //-Sábado

Quanto a feriados, tenho uma função que detecta automaticamente os feriados nacionais, inclusive os variaveis como dia das mães, natal, etc...

FUNCTION feriados( dData ) //--> SE for feriado retorn (.t.)

Local cAno := Right( DToC( dData ), 4 )

Local aFeriados := {}

Local c, d, n, k, i, j, l, m, dCarnaval, dCorpus, dPascoa, dSexta

aAdd( aFeriados, CToD( "01/01/" + cAno ) ) // Confraternizacao Mundial

aAdd( aFeriados, CToD( "21/04/" + cAno ) ) // Tiradentes

aAdd( aFeriados, CToD( "01/05/" + cAno ) ) // Trabalho

aAdd( aFeriados, CToD( "07/09/" + cAno ) ) // Independencia

aAdd( aFeriados, CToD( "12/10/" + cAno ) ) // Nra. Sra. Aparecida

aAdd( aFeriados, CToD( "02/11/" + cAno ) ) // Finados

aAdd( aFeriados, CToD( "15/11/" + cAno ) ) // Proclamação da Republica

aAdd( aFeriados, CToD( "25/12/" + cAno ) ) // Natal

c := Int( Val( cAno ) / 100 )

n := Int( Val( cAno ) - ( 19 * Int( Val( cAno ) / 19 ) ) )

k := Int( ( c - 17 ) / 25 )

i := Int( c - Int( c / 4 ) - Int( ( c - k ) / 3 ) + ( 19 * n ) + 15 )

i := Int( i - ( 30 * Int( i / 30 ) ) )

i := Int( i - ( Int( i / 28 ) * ( 1 - Int( i / 28 ) ) * Int( 29 / ( i + 1 ) ) * Int( ( 21 - n ) / 11 ) ) )

j := Int( Val( cAno ) + Int( Val( cAno ) / 4 ) + i + 2 - c + Int( c / 4 ) )

j := Int( j - ( 7 * Int( j / 7 ) ) )

l := Int( i - j )

m := Int( 3 + Int( ( l + 40 ) / 44 ) )

d := Int( l + 28 - ( 31 * Int( m / 4 ) ) )

dPascoa := CtoD( StrZero( d, 2 ) + "/" + StrZero( m, 2 ) + "/" + Strzero( val(cAno), 4 ) )

dCarnaval := ( dPascoa - 47 )

dCorpus := ( dPascoa + 60 )

dSexta := ( dPascoa - 2 )

aAdd( aFeriados, dCarnaval )

aAdd( aFeriados, dCorpus )

aAdd( aFeriados, dPascoa )

aAdd( aFeriados, dSexta )

If aScan( aFeriados, dData ) # 0

Return(.T.)

EndIf

Return(.F.)

Espero ter ajudado........Um abraço amigo...

A&F Soft

WorkShop, Pelles, FWH 2.5 (fevereiro), xHarbor Comercial (fevereiro)

Link to comment
Share on other sites

Amigos,

Como é maravilhoso participar desse Fórum, em que se pode aprender diversos modos de se fazer a mesma coisa.

Vou colocar um pouco mais de pimenta no assunto: FERIADOS REGIONAIS.

Temos um sistema voltado para empresas de cestas básicas instalado nos estados de SP, MG, RJ e ES. Para tratar os feriados tive que criar um pequeno módulo em que peço a informação ao usuário, pois cada estado tem os seus próprios.

E tem mais, existem clientes que, para estatísticas de produtividade, não querem considerar 31/12 como dia útil.

E aí?? É de fundir a cebeça não é mesmo??

Abraços

Paulo/CONTATO SISTEMAS

Clipper53b / FW26 / Blinker70

Ajudar é um prazer, agradecer é uma obrigação

Link to comment
Share on other sites

Olá Paulo,

Nesse caso para feriados regionais, não têm jeito, vc têm que criar um dbf com eles mas fica fácil de se tratar icon_smile_big.gif, basta pegar a função que o aspq21 postou que por sinal é identica a que o Elias me mandou, e montar seu próprio calendário, se der uma olhada na TVGet, verá que têm um calendário, e como acessar determinado dia aí é só tratar para imbutir os seus feriados regionais icon_smile_wink.gif e no caso do dia 31/12 basta coloca-lo como um regional icon_smile_wink.gif

Vagner Wirts

Clipper 5.2 Lib 5.3 - Blinker 5.0 FW 2.0, Harbour 43.0 (Flex), xHarbour 99.1 99.2 99.3 (Simplex) FW 2.5 icon_smile_big.gif

Link to comment
Share on other sites

Ola pessoal a função que o vagner de refere (verificar os feriados não fixos), foi baixada no Dbwide, e alterei a classe para o meu uso.

E quanto ao feriado regional minha função não utiliza banco de dados especifico e sim um campo string no dbf de empresa onde posso definir os feriados da cidade, e atraves de for vou adicionando no array de feriados.

Onde você vê um obstáculo alguém vê o término da viagem e o outro vê uma chance de crescer.

Elias Abrão Júnior

Fone : (0**11) 5181-6909 São Paulo - SP

eajunior.fw@terra.com.br

xHarbour 0.99.0 - Fivewin 2.5 e xMate

Link to comment
Share on other sites

Caros Amigos

No Dicas postei uma funcao que retorna todos os feriados Nacionais inclusive os moveis.

Para tratar os regionais seria interessante adicionar um dbf ou campo texto como achar melhor.

Abaixo dei um exemplo de uma funcao para tratar feriados e so incluir nela os regionais:

Function feriados( dData, lTpRetorno )

Local cAno := Right( DToC( dData ), 4 )

Local aFeriados := {}

Local c, d, n, k, i, j, l, m, dCarnaval, dCorpus, dPascoa, dSexta

Local cRetorno := .F.

Padrao lTpRetorno To .F.

aAdd( aFeriados, { CToD( "01/01/" + cAno ), "Confraternização Mundial" } )

aAdd( aFeriados, { CToD( "21/04/" + cAno ), "Descobrimento do Brasil e Tiradentes" } )

aAdd( aFeriados, { CToD( "01/05/" + cAno ), "Dia do Trabalhador" } )

aAdd( aFeriados, { CToD( "07/09/" + cAno ), "Independência do Brasil" } )

aAdd( aFeriados, { CToD( "12/10/" + cAno ), "Nra. Senhora Aparecida" } )

aAdd( aFeriados, { CToD( "02/11/" + cAno ), "Finados" } )

aAdd( aFeriados, { CToD( "15/11/" + cAno ), "Proclamação da Republica" } )

aAdd( aFeriados, { CToD( "25/12/" + cAno ), "Natal" } )

//--------- Feriados Moveis -----------------------------\\

c := Int( Val( cAno ) / 100 )

n := Int( Val( cAno ) - ( 19 * Int( Val( cAno ) / 19 ) ) )

k := Int( ( c - 17 ) / 25 )

i := Int( c - Int( c / 4 ) - Int( ( c - k ) / 3 ) + ( 19 * n ) + 15 )

i := Int( i - ( 30 * Int( i / 30 ) ) )

i := Int( i - ( Int( i / 28 ) * ( 1 - Int( i / 28 ) ) * Int( 29 / ( i + 1 ) ) * Int( ( 21 - n ) / 11 ) ) )

j := Int( Val( cAno ) + Int( Val( cAno ) / 4 ) + i + 2 - c + Int( c / 4 ) )

j := Int( j - ( 7 * Int( j / 7 ) ) )

l := Int( i - j )

m := Int( 3 + Int( ( l + 40 ) / 44 ) )

d := Int( l + 28 - ( 31 * Int( m / 4 ) ) )

dCarnaval := ( CtoD( ( StrZero( d, 2 ) + "/" + StrZero( m, 2 ) + "/" + cAno ) ) - 47 )

dCorpus := ( CtoD( ( StrZero( d, 2 ) + "/" + StrZero( m, 2 ) + "/" + cAno ) ) + 60 )

dPascoa := CtoD( StrZero( d, 2 ) + "/" + StrZero( m, 2 ) + "/" + cAno )

dSexta := ( CtoD( StrZero( d, 2 ) + "/" + StrZero( m, 2 ) + "/" + cAno ) - 2 )

aAdd( aFeriados, { dCarnaval, "Carnaval" } )

aAdd( aFeriados, { dCorpus , "Corpus Christi" } )

aAdd( aFeriados, { dPascoa , "Páscoa" } )

aAdd( aFeriados, { dSexta , "Sexta-Feira Santa" } )

If aScan( aFeriados, { |aVal| aVal[1] == dData } ) # 0

If lTpRetorno

cRetorno := aFeriados[aScan( aFeriados, { |aVal| aVal[1] == dData } )][2]

Else

cRetorno := .T.

EndIf

EndIf

Return(cRetorno)

Marcelo Gomes

elitenet@terra.com.br

FW 2.3C/CLIPPER 5.2E/BLINKER 7.0

Link to comment
Share on other sites

Ola

No exemplo postado pelo Asp21 de uma rotina que se encontra em dicas enviada por Marcelo Gomes, para os feriados regionais faça o seguinte:

aAdd( aFeriados, CToD( "25/12/" + cAno ) ) // Natal

Acrescente:

aAdd( aFeriados, CToD( "13/06/" + cAno ) ) // Sto Antonio Padroeiro de Osasco, etc,etc.

Yrece Osasco/SP

Link to comment
Share on other sites

Marcelo,

Se o sistema for específico e sabendo-se onde será instalado, concordo plenamente com você.

Mas se for um sistema genérico, instalado em várias cidades e estados, acredito que se deva ter um módulo a parte, com digitação por parte do usuário dos feriados de sua região, além da função dos feriados nacionais.

Citei, neste mesmo tópico, que um cliente nosso não quer considerar dia 31/12 como dia útil para efeito de estatística de produtividade diária (produção mensal/dias úteis), totalmente solucionado por essa abertura no programa.

Outros, no mesmo sistema, querem que o sábado seja considerado dia útil. Vai se fazer o que??? Coloca-se um parâmetro perguntando se é para considerar ou não e um IF DA VIDA na função de feriados nacionais.

Um abraço

Paulo/CONTATO SISTEMAS

Clipper53b / FW26 / Blinker70

Ajudar é um prazer, agradecer é uma obrigação

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...