Página 1 de 1

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

Enviado: 31 Mar 2008 13:43
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.

Enviado: 31 Mar 2008 14:03
por sygecom
Testei no xharbour 1.0.0 e o xharbour da CVS 1.1.0 e ambos deu o Resultado de "5"

Enviado: 31 Mar 2008 14:04
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

Enviado: 31 Mar 2008 14:38
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.

Enviado: 31 Mar 2008 14:44
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))

Enviado: 31 Mar 2008 14:50
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 !!

Enviado: 31 Mar 2008 14:58
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

Enviado: 31 Mar 2008 15:02
por sygecom
Para retorma 4 pode usar tmb:

Código: Selecionar todos

@ 20,20 say LEN( ALLTRIM(STR(YEAR( DATE() ) ) ) )

Enviado: 31 Mar 2008 22:21
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.

Enviado: 01 Abr 2008 00:20
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.

Enviado: 02 Abr 2008 01:57
por vagucs
Rochinha, do arrebatamento foi boa, em nome de JESUS eu vou subir pra glória. kkk.