Problema com data em formulário - Exibição fora do formato padrão

Olá pessoal,

Estou com um problema e só reparei agora, depois que um cliente ligou reclamando.

O problema está na exibição de data no formulário. Ele está trazendo uma data totalmente inválida e quando manda atualizar dá erro devido a este problema.

Tenho uma Grid (Consulta) que mostra os registros de uma tabela e em cada registro é possível editar, clicando no ícone do lápis. Totalmente padrão.

Na grid mostra o campo da data correto (10/10/2014), no banco de dados (MySQL) está correto (2014-10-10) mas no formulário, quando clica em editar, a data é mostrada desta forma: 14/20/1010

Ou seja, em um formato que não tem nada a ver.

A configuração do campo está normal, dd/mm/aaa, no padrão mesmo.

É um formulário simples.

O que será que está acontecendo?

Será algum problema da última atualização?

Espero contar com o auxílio dos colegas, pois não encontrei nada com relação a isto no fórum.

Obrigado a todos antecipadamente.

[]'s

Pessoal,

Ainda tentando descobrir o que ocorreu, criei outro formulário com a mesma tabela e os mesmos campos e no novo está funcionando normalmente, com a data aparecendo da forma que deveria.

Netmake, minha preocupação é se isto começar a acontecer em outras aplicações.

Imagina ter que recriar várias aplicações para resolver um problema que apareceu de uma hora para outra se sem nenhum motivo aparente.

Vocês poderiam dar uma posição com relação a isto?

Obrigado.

Oi pessoal,

Consegui descobrir o problema.

No formulário eu coloquei um campo para fazer o upload de vários arquivos (Documento Banco de Dados).

Foi só colocar este campo que o formato da data ficou errado.

Removi o campo do upload e volta ao normal.

E agora, preciso de um campo para fazer upload de vários arquivos. Como fazer???

Eis a questão???

[]'s

É pessoal,

Não tem jeito mesmo.

Já tentei de tudo e não encontro uma solução para resolver isto.

Fiz um teste usando o Projeto SAMPLE e a aplicação form_employee_upload padrão, da forma que ela é gerada.

Nesta aplicação existe um campo de data também (birthdate).

O problema ocorre exatamente da mesma forma, ou seja é um BUG do Scriptcase

Pessoal da Netmake que acompanha o fórum, por favor, verifiquem este BUG, pois se aconteceu comigo vai acontecer com outros usuários também e isto não é legal.

Se alguém da NM puder dar uma olhada no que está acontecendo e me der alguma luz para resolver o problema seria muito bom.

Aguardo um retorno aqui no fórum.

Antecipadamente agradeço.

[]'s

Também estou com o mesmo problema, para não atrasar o meu projeto, alterei o campo do tipo DATA para TEXTO, e fiz o controle das datas na “UNHA”, convertendo para Data novamente antes de atualizar e incluir no Banco, fora os outros controles que voceis ja devem estar imaginando, tipo ano bisexto, enfim, trabalheira danada, até agora não me conformo, lembrei do tempo que programava em COBOL
onde tínhamos que controlar essa questão da Data na ‘UNHA’, absurdo mesmo.

Olá,

Ontem o Yuri, da NM, respondeu minha postagem do BUG e disse que isto já está na fila para ser corrigido.

Pediu para ficar de olho no Changelog que deve ser corrigido nas próximas atualizações do SC.

Espero que não demore muito e que seja esta semana.

[]'s

estava com o mesmo problema, como resolvi, deixei no banco tipo varchar e no formulario tipo date, ele grava como date e retorna o valor varchar.
dái se precisar consultar no proprio banco com o formato date criar uma view configurando para converter para tipo date a view de exibição, este é um grande problema do scriptcase mas dar pra adaptar.

O BUG foi resolvido na atualização .22 de hoje.

Fiz os testes e realmente voltou a apresentar a data no formato correto.

Obrigado ao pessoal do desenvolvimento que resolveu o problema.

[]'s

Parece que esse problema voltou a ocorrer na versão 9.

Estou usando a macro para verificar se houve alteração nos campos de data e como o formato no banco mysql é aaaa-mm-dd e o formato interno configurado no sc está aaaammdd dá errro, mesmo mudando o formato interno no sc para aaaa-mm-dd não soluciona o problema, pois aí ele tenta mandar a string sql como aaaa-mm-dd ao inves de aaaammdd.

Esse é meu primeiro post, como podemos solicitar para a NM arrumar isso urgente?

É inconcebível eu guardar um campo timpo data como char no banco para solucionar esse problema.

O que pode ser feito?

Veja se seu projeto esta configurado assim:

E cole aqui a sua rotina que esta usando para validar a data, e em que evento colocou ela, é um formulário ou Grid.

Tanto o projeto quanto o banco estão configurados como UTF-8.

Estou usando um form para validar se houveram alterações de alguns campos para salvar essa “evolução” e alguns campos são datas e inclusive elas podem ser vazias em determinados momentos (quando o usuário ainda não tem conhecimento das datas da obra).

Estou tentando executar a rotina no evento onBeforeUpdate e é essa aqui:

if(sc_changed({etapa}) or sc_changed({data_inicio_obra}) or sc_changed({data_fim_obra}) or sc_changed({data_retorno}) or sc_changed({valor})){
if({data_inicio_obra}==’’)
{$data_1 = ‘null’;}
else
{$data_1 = {data_inicio_obra};};

if({data_fim_obra}=='null')
	{$data_2 = '';}
else
	{$data_2 = {data_fim_obra};};

if({valor}=='')
	{$valor_1 = 'null';}
else
	{$valor_1 = {valor};};

$insert_table  = 'historicos';
$insert_fields = array(
	'oportunidade' => "{id_oportunidade}",
	'data_historico' => "now()",
	'etapa' => "{etapa}",
	'data_inicio_obra' => "$data_1",
	'data_fim_obra' => "$data_2",
	'data_retorno' => "{data_retorno}",
	'valor' => "$valor_1",
 );

$insert_sql = 'INSERT INTO ' . $insert_table
	. ' ('   . implode(', ', array_keys($insert_fields))   . ')'
	. ' VALUES ('    . implode(', ', array_values($insert_fields)) . ')';

sc_exec_sql($insert_sql);
};

if(sc_changed({nota})){
$insert_table = ‘notas’;
$insert_fields = array(
‘oportunidade’ => “{id_oportunidade}”,
‘data_nota’ => “now()”,
‘nota’ => “’{nota}’”,
);

$insert_sql = 'INSERT INTO ' . $insert_table
	. ' ('   . implode(', ', array_keys($insert_fields))   . ')'
	. ' VALUES ('    . implode(', ', array_values($insert_fields)) . ')';

sc_exec_sql($insert_sql);
};

O problema é que no form ele entende que houve mudanças, alterando a data do formato dd/mm/aaaa para o formato do banco aaaa-mm-dd, mas na query sql tem que ir em aaaammdd…

Tentei outras soluções e ainda não consegui resolver. Pois preciso colocar na query a posibilidade de null e sem ser ‘null’, senão o banco não insere vazio.

Preciso que você me passe as Metatags destes campos, é o Código Create da Tabela ‘historicos’ no MySQL, exemplo:

CREATE TABLE IF NOT EXISTS tasks (
task_id INT(11) NOT NULL AUTO_INCREMENT,
subject VARCHAR(45) DEFAULT NULL,
start_date DATE DEFAULT NULL,
end_date DATE DEFAULT NULL,
description VARCHAR(200) DEFAULT NULL,
PRIMARY KEY (task_id)
) ENGINE=InnoDB

Conforme solicitado:

– Table structure for table historicos

DROP TABLE IF EXISTS historicos;
/*!40101 SET @saved_cs_client = @@character_set_client /;
/
!40101 SET character_set_client = utf8 /;
CREATE TABLE historicos (
ID_HISTORICO int(10) unsigned NOT NULL AUTO_INCREMENT,
OPORTUNIDADE int(10) unsigned NOT NULL,
DATA_HISTORICO datetime NOT NULL,
ETAPA int(10) unsigned NOT NULL,
DATA_INICIO_OBRA date DEFAULT NULL,
DATA_FIM_OBRA date DEFAULT NULL,
DATA_RETORNO date NOT NULL,
VALOR decimal(9,2) unsigned DEFAULT NULL,
USUARIO varchar(100) DEFAULT NULL,
PRIMARY KEY (ID_HISTORICO),
KEY OPORTUNIDADE (OPORTUNIDADE),
KEY ETAPA (ETAPA),
CONSTRAINT historicos_ibfk_1 FOREIGN KEY (OPORTUNIDADE) REFERENCES oportunidades (ID_OPORTUNIDADE),
CONSTRAINT historicos_ibfk_2 FOREIGN KEY (ETAPA) REFERENCES etapas (ID_ETAPA)
) ENGINE=InnoDB AUTO_INCREMENT=88 DEFAULT CHARSET=utf8;
/
!40101 SET character_set_client = @saved_cs_client */;

Ok, remove seu código antigo e testa com este:

if (sc_changed({etapa}) or sc_changed({data_inicio_obra}) or sc_changed({data_fim_obra}) or sc_changed({data_retorno}) or sc_changed({valor})) {

if (empty({data_inicio_obra})) {
$_data_inicio_obra = null;
} else {
$_data_inicio_obra = “’{data_inicio_obra}’”;
}

if (empty({data_fim_obra})) {
$_data_fim_obra = null;
} else {
$_data_fim_obra = “’{data_fim_obra}’”;
}

if (empty({valor})) {
$_valor = 0;
} else {
$_valor = {valor};
}

$insert_table = ‘historicos’;
$insert_fields = array(
‘oportunidade’ => “{id_oportunidade}”,
‘data_historico’ => “NOW()”,
‘etapa’ => “{etapa}”,
‘data_inicio_obra’ => “$_data_inicio_obra”,
‘data_fim_obra’ => “$_data_fim_obra”,
‘data_retorno’ => “’{data_retorno}’”,
‘valor’ => “$_valor”
);

$insert_sql = ‘INSERT INTO ’ . $insert_table
. ’ (’ . implode(’, ‘, array_keys($insert_fields)) . ‘)’
. ’ VALUES (’ . implode(’, ', array_values($insert_fields)) . ‘)’;

sc_exec_sql($insert_sql);

} // if (sc_changed({etapa}) or sc_changed({data_inicio_obra}) or sc_changed({data_fim_obra}) or sc_changed({data_retorno}) or sc_changed({valor}))

if (sc_changed({nota})) {

$insert_table = ‘notas’;
$insert_fields = array(
‘oportunidade’ => “{id_oportunidade}”,
‘data_nota’ => “NOW()”,
‘nota’ => “’{nota}’”
);

$insert_sql = ‘INSERT INTO ’ . $insert_table
. ’ (’ . implode(’, ‘, array_keys($insert_fields)) . ‘)’
. ’ VALUES (’ . implode(’, ', array_values($insert_fields)) . ‘)’;

sc_exec_sql($insert_sql);

} // if (sc_changed({nota}))

if (sc_changed({etapa}) or sc_changed({data_inicio_obra}) or sc_changed({data_fim_obra}) or sc_changed({data_retorno}) or sc_changed({valor})) {

   if (empty({data_inicio_obra})) {
       $_data_inicio_obra = null;
   } else {
       $_data_inicio_obra = "'{data_inicio_obra}'";
   }

   if (empty({data_fim_obra})) {
       $_data_fim_obra = null;
   } else {
       $_data_fim_obra = "'{data_fim_obra}'";
   }

   if (empty({valor})) {
       $_valor = 0;
   } else {
       $_valor = {valor};
   }

   $insert_table  = 'historicos';
   $insert_fields = array(
      'oportunidade'        => "{id_oportunidade}",
      'data_historico'      => "NOW()",
      'etapa'               => "{etapa}",
      'data_inicio_obra'    => "$_data_inicio_obra",
      'data_fim_obra'       => "$_data_fim_obra",
      'data_retorno'        => "'{data_retorno}'",
      'valor'               => "$_valor"
   );

   $insert_sql = 'INSERT INTO ' . $insert_table
      . ' ('   . implode(', ', array_keys($insert_fields))   . ')'
      . ' VALUES ('    . implode(', ', array_values($insert_fields)) . ')';

   sc_exec_sql($insert_sql);
 
} // if (sc_changed({etapa}) or sc_changed({data_inicio_obra}) or sc_changed({data_fim_obra}) or sc_changed({data_retorno}) or sc_changed({valor}))


if (sc_changed({nota})) {

   $insert_table  = 'notas';
   $insert_fields = array(
      'oportunidade'     => "{id_oportunidade}",
      'data_nota'        => "NOW()",
      'nota'             => "'{nota}'"
   );

   $insert_sql = 'INSERT INTO ' . $insert_table
      . ' ('   . implode(', ', array_keys($insert_fields))   . ')'
      . ' VALUES ('    . implode(', ', array_values($insert_fields)) . ')';

   sc_exec_sql($insert_sql);

} // if (sc_changed({nota}))

Muito obrigado pela ajuda. Como pode perceber pelo meu perfil, acabei de começar no SC.

Fiz umas pequenas alterações no seu código e configurei a opção “Formato Interno” do campo data para “AAAA-MM-DD” (antes estava AAAAMMDD) e agora está funcionando perfeitamente, pois percebi que configurando assim a sc_changed funciona corretamente (percebi que após a atualização a data aparece no form no mesmo formato do mysql 2017-05-08, por exemplo).

O que alterei em seu código que dava erro era a construção do SQL faltando a instrução null.
DE: INSERT INTO historicos (oportunidade, data_historico, etapa, data_inicio_obra, data_fim_obra, data_retorno, valor) VALUES (8 , NOW(), 4 , , ‘20170518’, ‘20170526’, 0)

PARA: INSERT INTO historicos (oportunidade, data_historico, etapa, data_inicio_obra, data_fim_obra, data_retorno, valor) VALUES (8 , NOW(), 4 , null, ‘2017-05-18’, ‘2017-05-26’, null)

Porém percebi que você vez uma diferenciação nas definições das variáveis no if e utilização de aspas duplas e simples. Como não programava em php, acho que ainda estou um pouco confuso da diferença entre as aspas.

Poderia me explicar o que estava errado no meu código? E sempre que tiver situação parecida eu preciso alterar a configuração do campo para “AAAA-MM-DD”? Se sim, consigo deixar isso como padrão no SC?

  1. Porém percebi que você vez uma diferenciação nas definições das variáveis no if e utilização de aspas duplas e simples. Como não programava em php, acho que ainda estou um pouco confuso da diferença entre as aspas.
    Do jeito que coloquei ele já vai colocar a null lá sozinho, dentro da variável no array.

  2. Sempre observar no campo Data tem que ficar com formado interno = AAAA-MM-DD.

  3. Aqui era só fazer isso, colocar o null dentro de aspas, simples, porque quando o php pegou o null direto ele anulou a variável por isso que deu erro.
    if (empty({data_inicio_obra})) {
    $_data_inicio_obra = ‘null’;
    } else {
    $_data_inicio_obra = “’{data_inicio_obra}’”;
    }

    if (empty({data_fim_obra})) {
    $_data_fim_obra = ‘null’;
    } else {
    $_data_fim_obra = “’{data_fim_obra}’”;
    }

Legal Jailton, muito obrigado pela ajuda mesmo!

quanto ao ponto 2) Sempre observar no campo Data tem que ficar com formado interno = AAAA-MM-DD.
Tem como configurar isso para já ficar padrão em todas as novas aplicações criadas?

Não infelizmente mesmo configurando os padrões no Projeto e Valores Padrão, não tem esta opção lá por enquanto, ai você tem que ficar olhando mesmo.