Fução CToD() retorna vazio se dia maior que 12

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

Moderador: Moderadores

Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Fução CToD() retorna vazio se dia maior que 12

Mensagem por Jairo Maia »

Olá Pessoal,

Será que alguém poderia compilar este exemplo, e informar se o resultado é diferente do que estou tendo?

Tenho o mesmo resultado com as versões 3.0, 3.2 e 3.4. Gostaria de saber se é problema da minha máquina, pois nunca tinha notado isso antes:

Código: Selecionar todos

Function Main()

 Clear Screen

 SET CENTURY ON

 cConteudo1 := "31/12/2014" // retorna vazio

 cConteudo2 := "01/01/2015" // retorna OK
 cConteudo3 := "12/01/2015" // retorna OK
 cConteudo4 := "13/01/2015" // retorna vazio

 cConteudo5 := "01/02/2015" // retorna OK
 cConteudo6 := "12/02/2015" // retorna OK
 cConteudo7 := "13/02/2015" // retorna vazio
 
 ?
 ? CToD( cConteudo1 )
 ?
 ? CToD( cConteudo2 )
 ? CToD( cConteudo3 )
 ? CToD( cConteudo4 )
 ?
 ? CToD( cConteudo5 )
 ? CToD( cConteudo6 )
 ? CToD( cConteudo7 )
 ?
 
Return Nil
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Avatar do usuário
oxent_jabah
Usuário Nível 1
Usuário Nível 1
Mensagens: 30
Registrado em: 26 Dez 2008 11:29
Localização: Juazeiro do Norte-Ce-Brasil

Fução CToD() retorna vazio se dia maior que 12

Mensagem por oxent_jabah »

Jairo,

Coloque o comando "SET DATE BRIT" depois dos "SET CENTURY ON" que deverá dar certo.
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Fução CToD() retorna vazio se dia maior que 12

Mensagem por Jairo Maia »

Olá oxent_jabah,

Bingo!!! Valeu. Já arrumei a função também.

Confesso que nunca imaginaria isso. Muito obrigado.
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Fução CToD() retorna vazio se dia maior que 12

Mensagem por alxsts »

Olá!

Você está usando o formato de data default (mm-dd-yyyy). Assim, o valor 13 nas 2 primeiras posições invalida a data e ela aparece em branco.

Basta ajustar o formato de data para o nosso padrão:

Código: Selecionar todos

#include "set.ch"

Function Main()

 Clear Screen

 //SET CENTURY ON

 Set( _SET_DATEFORMAT, 'dd/mm/yyyy' )

 cConteudo1 := "31/12/2014" // retorna vazio

 cConteudo2 := "01/01/2015" // retorna OK
 cConteudo3 := "12/01/2015" // retorna OK
 cConteudo4 := "13/01/2015" // retorna vazio

 cConteudo5 := "01/02/2015" // retorna OK
 cConteudo6 := "12/02/2015" // retorna OK
 cConteudo7 := "13/02/2015" // retorna vazio
 
 ?
 ? CToD( cConteudo1 )
 ?
 ? CToD( cConteudo2 )
 ? CToD( cConteudo3 )
 ? CToD( cConteudo4 )
 ?
 ? CToD( cConteudo5 )
 ? CToD( cConteudo6 )
 ? CToD( cConteudo7 )
 ?
 
Return Nil
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Fução CToD() retorna vazio se dia maior que 12

Mensagem por Jairo Maia »

Olá Alexandre,

Obrigado por sua intervenção. Da forma que você fez também funciona.

Mas somente me toquei do que estava ocorrendo depois da dica do colega oxent_jabah. Uma coisa tão simples, mas eu não conseguia enxergar. Obrigado a todos.
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Fução CToD() retorna vazio se dia maior que 12

Mensagem por alxsts »

Olá!

Por nada Jairo. Enquanto escrevia minha resposta o colega foi mais rápido e postou. O que importa é que a solução foi encontrada.
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Fução CToD() retorna vazio se dia maior que 12

Mensagem por Pablo César »

Jairo Maia escreveu: Uma coisa tão simples, mas eu não conseguia enxergar.
Realmente Jairo, tem vezes que somos surpreendidos em ver que as vezes não enxergamos o m,ais óbvio. A manipulação de strings é algo que me fascina tanto. Mas como o colega falou, o importante é que aqui temos muitos de boa vontade e sempre temos que buscar não desmerecer alguém mesmo que pareça tão ridículo uma pergunta. Deve haver respeito, este tipo de incidentes não deve pesar no conceito sobre quem pergunta. Todos cometemos erros, o importante é aprender deles. Tenho muita consideração por você amigo Jairo.

O pior que este tópico fica para referência pra quem está passando pelo mesmo... kkkkk mas é isso o bom do fórum.
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Fução CToD() retorna vazio se dia maior que 12

Mensagem por Eolo »

Jairo, comentar uma coisa pra ajudar a entender o tal SET DATE.

Datas, no DBF, são SEMPRE GUARDADAS no formato americano (SET DATE AMERICAN), que é o default, com 8 dígitos (AAAAMMDD), o ano sempre com 4 dígitos. Aliás, isso é desde o tempo do Summer 87... Abra um DBF em baixo nível e você vai confirmar.

Então, se vc não disser nada, o Clipper ou o xHarbour (que são "americanos como o DBF") vão entender datas no padrão AAAAMMDD. E mesmo que vc sete o DATE como BRITISH ou FRENCH ou GERMAN ou ITALIAN (iguais ao padrão brasileiro), lá no DBF vai sempre ser salvado como AAAAMMDD.

E se vc usa 2 dígitos pro ano e o DBF tem datas novas e antigas, talvez precise do SET EPOCH... Bem, eu desisti dele. Sempre usei 4 dígitos pro ano, porque (confesso) nunca consegui entender nem fazer funcionar esse tal EPOCH. Num espectro de datas muito amplo, se acerta de um lado, ferra do outro. Tipo "15" pode ser 1915 ou 2015. Mas "25" seria 1925...
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Fução CToD() retorna vazio se dia maior que 12

Mensagem por Eolo »

Jairo, outra coisa sobre padrões americanos e brasileiros.

Aqui, escrevemos "$1.234,56" e, lá, escreve-se "$1,234.56".
O separador de milhares e centavos é trocado. E o Clipper e o [x]Harbour usam, óbvio, o padrão americano.

No DBF, esse valor é sempre guardado como "1234.56", sem o separador de milhares.

Se vc setar uma variável numérica como 1.234.567,89, ela vai ser entendida como 1.23 (ou 1,23 em brazuca), porque depois do PONTO é a fração.

Pra exemplificar, a função TRANSFORM:

a:=1234.56
tran(a,"@ 9,999.99") -> "1,234.56"
tran(a,"@E 999,999.99") -> "1.234,56"

O "E" faz trocar o padrão AMERICAN pelo BRITISH, mas só pra exibição. Lá dentro, continua valendo o padrão AMERICAN.

Ah, óbvio: se vc trocar a:=1234.56 por a=1.234,56, o valor considerado será 1,23 (ou 1.23).
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Fução CToD() retorna vazio se dia maior que 12

Mensagem por asimoes »

Olá Jairo,

Outra opção é usar a função HB_CTOD que permite usar a máscara "dd/mm/yyyy"
cConteudo1 := "31/12/2014"

? HB_CTOD(cConteudo1,"DD/MM/YYYY")
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Responder