Página 1 de 2
Função em Clipper Summer 87
Enviado: 07 Jan 2010 08:54
por JulioNSP
Olá pessoal, preciso de uma função que retorne um numero com a semana do ano.
Acredito que eu tenha que desenvolver uma função de usuário, alguem pode me dar alguma dica de como fazer?
Grato.
Re: Função em Clipper Summer 87
Enviado: 07 Jan 2010 12:57
por alxsts
Olá!
Provavelmente exista função para isto na CT.Lib ou Nanfor.Lib.
Na SuperLib existe a WOYEAR() (Week of Year). Como a SuperLib vem com os fontes, adaptei a função deles para meu uso. Segue um programa teste com estas funções:
Código: Selecionar todos
#include "Set.Ch"
#include "Inkey.Ch"
Local GetList := {}, dDate := Date(), nWeek
CLS
Set( _SET_DATEFORMAT, "DD/MM/YYYY" )
Set( _SET_EPOCH, 1930 )
WHILE .T.
@ 10,10 Say "Informe a data" Get dDate
READ
IF LastKey() == K_ESC
EXIT
ENDIF
nWeek := WOYear( dDate )
@ 12,10 Say "Esta data cai na semana nr: " + Str( nWeek, 2 )
ENDDO
RETURN
//------------------------------------------------------------------------------
// Retorna o numero de semanas decorridas desde
// primeiro de janeiro de um ano qualquer
#include "Set.Ch"
FUNCTION woyear(dDate)
LOCAL nDayOfYear := DOYEAR(dDate)
RETURN INT( nDayOfYear / 7 ) + IIF( nDayOfYear % 7 > 0, 1, 0 )
//------------------------------------------------------------------------------
// Retorna o numero de dias decorridos desde
// primeiro de janeiro de um ano qualquer
FUNCTION doyear(dInDate)
LOCAL nOldDate, nReturn
nOldDate := Set( _SET_DATEFORMAT, "DD/MM/YYYY" )
nReturn := dInDate - CTOD("01/01/" + StrZero( Year( dInDate),4 ) ) + 1
Set( _SET_DATEFORMAT, nOldDate )
RETURN nReturn
//------------------------------------------------------------------------------
Sugiro que você migre o teu aplicativo para Clipper 5.2e, pelo menos, ou Harbour.
Re: Função em Clipper Summer 87
Enviado: 07 Jan 2010 16:00
por JulioNSP
Olá, meu compilador ainda é o Summer 87.
To pensando em migrar, preciso ainda avaliar como faría isso para o 5.2.
Quanto ao Harbour eu não conheço, é um compilador mais novo? na sua opinião o Harbour é melhor?
Grato.
Re: Função em Clipper Summer 87
Enviado: 07 Jan 2010 16:13
por gvc
A migração para [x]Harbour já tem um poste explicando o caminho das pedras.
Vc terá que mudar algumas coisas na forma de programar. Já esta elencado no post.
O retorno vale o investimento. Tem um monte de recurso que te facilitará a vida.
Aqui no trabalho eu ainda tenho um sistema usando o Summer´87, pois o 5.x não abre mais de 15 arquivos NTX para cada DBF.
Esse foi o único motivo para manter o mesmo funcionando. (Mas eu juro que esse sistema "morre" este ano!!!)
Eu postei uma solução para isso que vc quer a algum tempo (2 anos eu acho).
Vc determina o primeiro dia do ano informado.
Essa é a semana 01.
Determine o sábado dessa semana.
Incremente essa data em 7 dias até conseguir uma data igual ou maior que vc informou inicialmente.
Pela contagem do incremento, vc já tem a semana solicitada.
Re: Função em Clipper Summer 87
Enviado: 07 Jan 2010 17:41
por JulioNSP
Entendi, vou procurar esse post pra ter uma idéia de como fazer a migração.
O aplicativo aqui está muito deficiente, vou ter que fazer um novo por isso vou analizar o Harbour.
Quanto à lógica da função para determinar o numero da semana, valeu pela dica eu na verdade tinha pensado nisso mas achando o primeiro domingo. Vou implementar por aqui e lhe aviso.
Muito obrigado pelas dicas.
Re: Função em Clipper Summer 87
Enviado: 07 Jan 2010 19:14
por Toledo
Re: Função em Clipper Summer 87
Enviado: 08 Jan 2010 00:14
por alxsts
Olá!
Parece que não viram as funções que postei. Sem querer puxar a brasa para a minha sardinha, parece uma solução mais lógica e enxuta do que a outra postada.
Re: Função em Clipper Summer 87
Enviado: 08 Jan 2010 00:35
por gvc
Mais simples e enxuta??? (eh. eh. eh.)
Código: Selecionar todos
cls
set date british
set century on
? qual_semana(ctod('07/01/2010'))
? qual_semana(ctod('08/01/2010'))
? qual_semana(ctod('02/01/2010'))
? qual_semana(ctod('31/01/2010'))
? qual_semana(ctod('28/02/2010'))
return
function qual_semana(q_data)
local q_ano, inicio, semana
// Inicio do ano
q_ano := strzero(year(q_data), 4)
inicio := ctod('01/01/' + q_ano)
// Primeiro domingo = Semana 1
while dow(inicio) > 1
inicio--
end
semana := 0
while inicio < q_data
semana++
inicio += 7
end
return(semana)
Re: Função em Clipper Summer 87
Enviado: 08 Jan 2010 00:37
por alaminojunior
alxsts escreveu:Olá!
Parece que não viram as funções que postei. Sem querer puxar a brasa para a minha sardinha, parece uma solução mais lógica e enxuta do que a outra postada.
Exato. A função Week() da CaTools dá exatamente o que o colega quer. Existe no xHarbour também.
Re: Função em Clipper Summer 87
Enviado: 08 Jan 2010 00:55
por alxsts
Olá!
alxsts escreveu:mais lógica e enxuta
Sim, GVC, mantenho minha opinião. Sem contar a questão da lógica, cálculos aritméticos são mais rápidos do que
loops.
Todas as funções postadas teriam que ser adaptadas para Summer'87, onde não existe variável LOCAL nem AAdd(). Mas isto é fácil.
Creio que a função Week(), sugerida pelo Alamino seja uma boa alternativa. Não me lembro bem mas tenho quase certeza de que é possível link-editar a CA-Tools com Summer'87
Re: Função em Clipper Summer 87
Enviado: 08 Jan 2010 15:45
por gvc
Teria que ser a versão CA-Tools para summer. E eu tb não lembro se tem versão.
Com as máquinas atuais, a diferença da operação aritmetica e o loop para determinar o dia da semana não atrapalha em nada o desempenho do sistema.
Mas não vamos transformar isto em uma disputa para determinar qual o melhor método, por favor.
Acho melhor tentar-mos fazer o JulioNSP migrar para o [x]Harbour e usar os novos recursos.
Re: Função em Clipper Summer 87
Enviado: 08 Jan 2010 23:23
por alxsts
Olá!
Claro GVC, você tem razão. Nem pensei em termos de disputa e sim em atender o Julio da melhor forma possível. Há tempos abadonei qualquer sentimento beligerante.
Tenho certeza que se o colega optar pela migração para Harbour, você e os demais colegas que entendem do assunto o ajudarão. Enquanto isto, alterei a rotina que postei para Summer. Compila sem erros mas não consegui
linkeditar (e, claro, não testei).
Parece muito código mas, o que conta é só:
Código: Selecionar todos
* Retorna o numero de semanas decorridas desde primeiro de janeiro da data fornecida
FUNCTION woyear && Week of Year
PARAMETER dDate
PRIVATE nDayOfYear
nDayOfYear = DOYEAR( dDate )
RETURN ( INT( nDayOfYear / 7 ) + IIF( nDayOfYear % 7 > 0, 1, 0 ) )
* ------------------------------------------------------------------------------
* Retorna o numero de dias decorridos desde primeiro de janeiro da data fornecida
FUNCTION doyear && day of Year
PARAMETER dInDate
RETURN dInDate - CTOD("01/01/" + Left( DtoS( Year( dInDate ) ),4 ) ) + 1
* ------------------------------------------------------------------------------
Re: Função em Clipper Summer 87
Enviado: 11 Jan 2010 09:31
por JulioNSP
Olá colegas, primeiro o meu muito obrigado pela ajuda. Eu olhei e entendi o material postado, acontece que ainda uso o Summer 87 e como vocês já comentaram anteriormente é incompatível com esses compiladores mais novos.
Eu conhecia o 5.0 e 5.2 mas o Harbour confesso tomei conhecimento dele aqui no forum e vou estudar pra ver a forma de migrar.
Muito obrigado mesmo.
Re: Função em Clipper Summer 87
Enviado: 11 Jan 2010 11:10
por alxsts
Olá!
Julio:
A rotina que postei por último é compatível com Summer 87. Você testou? Compilei mas não consegui linkeditar e por esta razão não testei.
Re: Função em Clipper Summer 87
Enviado: 11 Jan 2010 13:41
por gvc
Essa eu teste. Mudei para ver o primeiro sábado do ano.
Eche ieu agarantchu!
Código: Selecionar todos
clear
set date british
set century on
? qual_semana(ctod('07/01/2010'))
? qual_semana(ctod('08/01/2010'))
? qual_semana(ctod('02/01/2010'))
? qual_semana(ctod('31/01/2010'))
? qual_semana(ctod('28/02/2010'))
return
function qual_semana
parameter q_data
* Inicio do ano
q_ano = strzero(year(q_data), 4)
inicio = ctod('01/01/' + q_ano)
* Primeiro Sabado = Semana 1
do while dow(inicio) < 7
inicio = inicio + 1
enddo
semana = 1
do while inicio < q_data
semana = semana + 1
inicio = inicio + 7
?? ' - ', inicio
enddo
?
return(semana)