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
Use a pesquisa do fórum.... veja:
https://pctoledo.org/forum/viewto ... f=1&t=4280

Abraços

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)