Função em Clipper Summer 87
Moderador: Moderadores
-
JulioNSP
- 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
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.
Acredito que eu tenha que desenvolver uma função de usuário, alguem pode me dar alguma dica de como fazer?
Grato.
-
alxsts
- Colaborador

- Mensagens: 3092
- Registrado em: 12 Ago 2008 15:50
- Localização: São Paulo-SP-Brasil
Re: Função em Clipper Summer 87
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:
Sugiro que você migre o teu aplicativo para Clipper 5.2e, pelo menos, ou Harbour.
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
//------------------------------------------------------------------------------[]´s
Alexandre Santos (AlxSts)
Alexandre Santos (AlxSts)
-
JulioNSP
- 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
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.
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
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.
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}
{POG - Programação Orientada a Gambiarra}
-
JulioNSP
- 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
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.
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.
- Toledo
- Administrador

- Mensagens: 3133
- Registrado em: 22 Jul 2003 18:39
- Localização: Araçatuba - SP
- Contato:
Re: Função em Clipper Summer 87
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
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

- Mensagens: 3092
- Registrado em: 12 Ago 2008 15:50
- Localização: São Paulo-SP-Brasil
Re: Função em Clipper Summer 87
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.
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)
Alexandre Santos (AlxSts)
Re: Função em Clipper Summer 87
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}
{POG - Programação Orientada a Gambiarra}
- alaminojunior
- Colaborador

- Mensagens: 1717
- Registrado em: 16 Dez 2005 21:26
- Localização: Ubatuba - SP
Re: Função em Clipper Summer 87
Exato. A função Week() da CaTools dá exatamente o que o colega quer. Existe no xHarbour também.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.
Compilador xHarbour 1.2.3 + Embarcadero C++ 7.30
MySQL c/ SQLRDD
HwGui + GTWVG
MySQL c/ SQLRDD
HwGui + GTWVG
-
alxsts
- Colaborador

- Mensagens: 3092
- Registrado em: 12 Ago 2008 15:50
- Localização: São Paulo-SP-Brasil
Re: Função em Clipper Summer 87
Olá!
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
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.alxsts escreveu:mais lógica e enxuta
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)
Alexandre Santos (AlxSts)
Re: Função em Clipper Summer 87
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.
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}
{POG - Programação Orientada a Gambiarra}
-
alxsts
- Colaborador

- Mensagens: 3092
- Registrado em: 12 Ago 2008 15:50
- Localização: São Paulo-SP-Brasil
Re: Função em Clipper Summer 87
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ó:
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)
Alexandre Santos (AlxSts)
-
JulioNSP
- 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
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.
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

- Mensagens: 3092
- Registrado em: 12 Ago 2008 15:50
- Localização: São Paulo-SP-Brasil
Re: Função em Clipper Summer 87
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.
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)
Alexandre Santos (AlxSts)
Re: Função em Clipper Summer 87
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}
{POG - Programação Orientada a Gambiarra}