.P.R.O.B.L.E.M.A.Ç.O. com retorno na função Year()

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

.P.R.O.B.L.E.M.A.Ç.O. com retorno na função Year()

Mensagem por rochinha »

Amiguinhos

Gostaria que voces me retornassem o valor obtido no codigo abaixo usando as versões de Harbour e xHarbour que possuem.

Tive um p. problema por causa deste resultado erroneo.

Segue o pequeno codigo:

Código: Selecionar todos


function main()
   @ 20,20 say LEN( STR( YEAR( DATE() ) ) )
   return .t.

Compilem e me digam qual o valor retornado e qual versão do seu Build.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Mensagem por sygecom »

Testei no xharbour 1.0.0 e o xharbour da CVS 1.1.0 e ambos deu o Resultado de "5"
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
rodrmigu
Usuário Nível 3
Usuário Nível 3
Mensagens: 150
Registrado em: 27 Nov 2007 15:13
Localização: Indaiatuba SP

Mensagem por rodrmigu »

Olá,

$ sh comp.sh.xhb year
xHarbour Compiler build 1.1.0 (SimpLex)
Copyright 1999-2008, http://www.xharbour.org http://www.harbour-project.org/
Compiling 'year.prg'...
Lines 6, Functions/Procedures 1
Generating C source output to 'year.c'...
Done.

5
[]'s
Rodrigo
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Mensagem por rochinha »

Amiguinhos

Obrigado,

Vejo que pelo visto eu não estava fazendo nada errado ou que minha versão, 45, possuisse um bug.

Se bem que pra mim isto é bug e não previsão, pois o ano 10000 esta muito longe de meus calculos financeiros, talvez quando eu chegar la, precise fazer alguma alteração no codigo gerado.

A questão é que meu sistema, faz uso macico da função substr() para o trabalho com datas, extensos e este espaço gerado no resultado esta me ferrando a vida.

Perda de tempo muito grande com uma adapatação sem nexo como esta de retornar uma cadea conhecido desde o descobrimento como 4 digitos.

Agora terei de me adequar usando PADR() e alterar muitos e muitos lugares.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar do usuário
gvc
Colaborador
Colaborador
Mensagens: 1270
Registrado em: 23 Ago 2005 10:57

Mensagem por gvc »

HbMake v1.17
xHarbour build 0.99.70 Intl. (SimpLex)
Borland C++ 5.5.1

Retornou o número 5.

Tente:

Código: Selecionar todos

  @ 20,20 say LEN(STR(YEAR(DATE()), 4))
"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}
Dércio_Luiz_Zanatta
Usuário Nível 3
Usuário Nível 3
Mensagens: 153
Registrado em: 11 Jan 2006 15:37
Localização: Ibirubá - RS

Mensagem por Dércio_Luiz_Zanatta »

Mais um BUG do Xharbour !!!
Tentem executar a função SetMode(25,40) em tela cheia para ver o que acontece !!!...
O Xharbour tem muitas vantagens..., mas nem sempre é domingo !! ehehe
Tomara que alguém corriga esses bugs !!
marcosgambeta
Usuário Nível 3
Usuário Nível 3
Mensagens: 332
Registrado em: 16 Jun 2005 22:53

Mensagem por marcosgambeta »

Seria um bug se não retornasse 5.

Neste caso, estão sendo seguidas as regras do Clipper:

Código: Selecionar todos

STR() returns <nNumber> formatted as a character string.  If the
optional length and decimal arguments are not specified, STR() returns
the character string according to the following rules:

Results of STR() with No Optional Arguments
     
   Expression               Return Value Length
     
   Field Variable           Field length plus decimals
   Expressions/constants    Minimum of 10 digits plus decimals
   VAL()                    Minimum of 3 digits

   MONTH()/DAY()            3 digits
   YEAR()                   5 digits
   RECNO()                  7 digits
Atenciosamente,
Marcos Antonio Gambeta
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Mensagem por sygecom »

Para retorma 4 pode usar tmb:

Código: Selecionar todos

@ 20,20 say LEN( ALLTRIM(STR(YEAR( DATE() ) ) ) )
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
marcosgambeta
Usuário Nível 3
Usuário Nível 3
Mensagens: 332
Registrado em: 16 Jun 2005 22:53

Mensagem por marcosgambeta »

Esqueci de mencionar a fonte da informação sobre a função str: trata-se de um texto extraído do help do CA-Clipper 5.3.

Harbour e xHarbour precisam seguir estas regras para compatibilidade com o Clipper. Basta imaginarmos um sistema complexo, com milhares de linhas de programação, fazendo uso intensivo destas regras. Ao ser compilado com Harbour ou xHarbour, continuaria apresentado os mesmos resultados apresentados no Clipper. Mas se as regras fossem modificadas no Harbour/xHarbour, surgiriam erros inesperados, resultados incorretos, relatórios distorcidos e outros problemas.
Atenciosamente,
Marcos Antonio Gambeta
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Mensagem por rochinha »

Amiguinho

Que assim seja, a regra é clara, sigamo-nas.

O incrivel é que este problema só me ocorreu quando passei a usar Harbour.

Só fica a pergunta?

Onde vou precisar calcular o 13º mes ou o 100º se uso o calendario Juliano que define desde antes de Cristo que só podemos usar de 1 a 12 meses e que dificilmente irei calcular em xBase o ano 10000, pois não viverei tanto(só se o arrebatamento acontecer e eu não for escolhido).

Isto não é um erro, mas é algo fora do comum, mesmo porque uso a anos as funçoes INIMES() e FIMMES() coletadas do livro de exemplos em Clipper para calculos de datas do Antonio Ramalho e a mesma não faz tratamento do ano via STR(...,4) e não me devolve erro.

No entanto neste outro exemplo não cabe a existencia dos 5 digitos para ano, retornando erro de data. Então o 5 elemento(digito) deveria ser posicionado a direita ou esquerda, pois não posso inserir 16/08/01965 ou 16/08/19650 e obter um resultado valido.

Código: Selecionar todos

function main()
   dia := "16"
   mes := "08"
   ano := " 1965"
   @ 20,20 say LEN( STR( YEAR( DATE() ) ) )
   @ 22,20 say CTOD(dia+"/"+mes+"/"+ano)
   @ 24,20 say CTOD(dia+"/"+mes+"/0"+alltrim(ano))
   @ 26,20 say CTOD(dia+"/"+mes+"/"+alltrim(ano)+"0")
   return .t.
Não questiono que exista um erro, questiono o porque.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar do usuário
vagucs
Membro Master
Membro Master
Mensagens: 1480
Registrado em: 10 Jul 2004 10:45
Localização: Ipanema - MG
Contato:

Mensagem por vagucs »

Rochinha, do arrebatamento foi boa, em nome de JESUS eu vou subir pra glória. kkk.
Sem mais
Wagner Nunes
www.vagucs.com.br
Responder