Página 1 de 1
Fução CToD() retorna vazio se dia maior que 12
Enviado: 07 Jan 2015 15:45
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
Fução CToD() retorna vazio se dia maior que 12
Enviado: 07 Jan 2015 16:52
por oxent_jabah
Jairo,
Coloque o comando "SET DATE BRIT" depois dos "SET CENTURY ON" que deverá dar certo.
Fução CToD() retorna vazio se dia maior que 12
Enviado: 07 Jan 2015 16:59
por Jairo Maia
Olá oxent_jabah,
Bingo!!! Valeu. Já arrumei a função também.
Confesso que nunca imaginaria isso. Muito obrigado.
Fução CToD() retorna vazio se dia maior que 12
Enviado: 07 Jan 2015 17:04
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
Fução CToD() retorna vazio se dia maior que 12
Enviado: 07 Jan 2015 23:22
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.
Fução CToD() retorna vazio se dia maior que 12
Enviado: 07 Jan 2015 23:36
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.
Fução CToD() retorna vazio se dia maior que 12
Enviado: 08 Jan 2015 09:14
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.
Fução CToD() retorna vazio se dia maior que 12
Enviado: 08 Jan 2015 13:27
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...
Fução CToD() retorna vazio se dia maior que 12
Enviado: 08 Jan 2015 14:10
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).
Fução CToD() retorna vazio se dia maior que 12
Enviado: 08 Jan 2015 14:44
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")