Função em Clipper Summer 87

Fórum sobre ferramentas de apoio à programação (Clipper/[x]Harbour)

Moderador: Moderadores

JulioNSP
Usuário Nível 3
Usuário Nível 3
Mensagens: 244
Registrado em: 22 Dez 2009 09:25
Localização: São Paulo - SP

Função em Clipper Summer 87

Mensagem 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.
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Re: Função em Clipper Summer 87

Mensagem 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.
[]´s
Alexandre Santos (AlxSts)
JulioNSP
Usuário Nível 3
Usuário Nível 3
Mensagens: 244
Registrado em: 22 Dez 2009 09:25
Localização: São Paulo - SP

Re: Função em Clipper Summer 87

Mensagem 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.
Avatar do usuário
gvc
Colaborador
Colaborador
Mensagens: 1270
Registrado em: 23 Ago 2005 10:57

Re: Função em Clipper Summer 87

Mensagem 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.
"TRS-80/Sincler/Apple/PC - Clipper Winter 85, tlink 1.0 [pc 10 MHz - 640K] {NEZ 8000 2Kb RAM}"
{POG - Programação Orientada a Gambiarra}
JulioNSP
Usuário Nível 3
Usuário Nível 3
Mensagens: 244
Registrado em: 22 Dez 2009 09:25
Localização: São Paulo - SP

Re: Função em Clipper Summer 87

Mensagem 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.
Avatar do usuário
Toledo
Administrador
Administrador
Mensagens: 3133
Registrado em: 22 Jul 2003 18:39
Localização: Araçatuba - SP
Contato:

Re: Função em Clipper Summer 87

Mensagem por Toledo »

Use a pesquisa do fórum.... veja:
https://pctoledo.org/forum/viewto ... f=1&t=4280

Abraços
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Re: Função em Clipper Summer 87

Mensagem 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.
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
gvc
Colaborador
Colaborador
Mensagens: 1270
Registrado em: 23 Ago 2005 10:57

Re: Função em Clipper Summer 87

Mensagem 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)
"TRS-80/Sincler/Apple/PC - Clipper Winter 85, tlink 1.0 [pc 10 MHz - 640K] {NEZ 8000 2Kb RAM}"
{POG - Programação Orientada a Gambiarra}
Avatar do usuário
alaminojunior
Colaborador
Colaborador
Mensagens: 1717
Registrado em: 16 Dez 2005 21:26
Localização: Ubatuba - SP

Re: Função em Clipper Summer 87

Mensagem 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.
Compilador xHarbour 1.2.3 + Embarcadero C++ 7.30
MySQL c/ SQLRDD
HwGui + GTWVG
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Re: Função em Clipper Summer 87

Mensagem 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
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
gvc
Colaborador
Colaborador
Mensagens: 1270
Registrado em: 23 Ago 2005 10:57

Re: Função em Clipper Summer 87

Mensagem 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.
"TRS-80/Sincler/Apple/PC - Clipper Winter 85, tlink 1.0 [pc 10 MHz - 640K] {NEZ 8000 2Kb RAM}"
{POG - Programação Orientada a Gambiarra}
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Re: Função em Clipper Summer 87

Mensagem 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
* ------------------------------------------------------------------------------
[]´s
Alexandre Santos (AlxSts)
JulioNSP
Usuário Nível 3
Usuário Nível 3
Mensagens: 244
Registrado em: 22 Dez 2009 09:25
Localização: São Paulo - SP

Re: Função em Clipper Summer 87

Mensagem 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.
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Re: Função em Clipper Summer 87

Mensagem 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.
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
gvc
Colaborador
Colaborador
Mensagens: 1270
Registrado em: 23 Ago 2005 10:57

Re: Função em Clipper Summer 87

Mensagem 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)
"TRS-80/Sincler/Apple/PC - Clipper Winter 85, tlink 1.0 [pc 10 MHz - 640K] {NEZ 8000 2Kb RAM}"
{POG - Programação Orientada a Gambiarra}
Responder