carlos Posted June 17, 2005 Report Share Posted June 17, 2005 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() ) Quote Link to comment Share on other sites More sharing options...
pauloaraujo Posted June 17, 2005 Report Share Posted June 17, 2005 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 Quote Link to comment Share on other sites More sharing options...
carlos Posted June 17, 2005 Author Report Share Posted June 17, 2005 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 Quote Link to comment Share on other sites More sharing options...
Adelson (ADS e TI) Posted June 17, 2005 Report Share Posted June 17, 2005 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) Quote Link to comment Share on other sites More sharing options...
Kleyton Posted June 18, 2005 Report Share Posted June 18, 2005 Procura em dicas, que tem algo postado por sobre feriados. Kleyton Clipper5.2E+Clipper5.3b+Blink7+FW2.0d cleitonbala@bol.com.br Quote Link to comment Share on other sites More sharing options...
pauloaraujo Posted June 18, 2005 Report Share Posted June 18, 2005 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 Quote Link to comment Share on other sites More sharing options...
vagner Posted June 18, 2005 Report Share Posted June 18, 2005 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 , 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 e no caso do dia 31/12 basta coloca-lo como um regional 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 Quote Link to comment Share on other sites More sharing options...
eajunior Posted June 19, 2005 Report Share Posted June 19, 2005 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 Quote Link to comment Share on other sites More sharing options...
elitenet Posted June 20, 2005 Report Share Posted June 20, 2005 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 Quote Link to comment Share on other sites More sharing options...
marcelo Posted June 20, 2005 Report Share Posted June 20, 2005 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 Quote Link to comment Share on other sites More sharing options...
pauloaraujo Posted June 20, 2005 Report Share Posted June 20, 2005 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 Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.