Valor nulo em campo data (Delphi)

Delphi

08/08/2014

Olé pessoal!

Estou precisando de uma ajuda.

Eu quero atribuir valor nulo ao campo do tipo data pelo Delphi.

Estou usando Firebird como banco de dados e o componente IBDataSet e já tentei o comando Database.TableDATA.clear; e não deu certo.

Agradeço quem puder me ajudar!
Marcos Roberto

Marcos Roberto

Curtidas 0

Melhor post

Renato Rubinho

Renato Rubinho

13/08/2014

A data zero é 30/12/1899.
Tenta na trigger:

create trigger zerar_data for soc_socios
before insert or update
as
begin
  if (new.DATA_FILIACAO = '30.12.1899') then
  new.DATA_FILIACAO = null;
end
GOSTEI 2

Mais Respostas

Alessandro Folk

Alessandro Folk

08/08/2014

Coloca seu código aqui pra gente analisar melhor!
GOSTEI 0
Marcos Roberto

Marcos Roberto

08/08/2014

Quero apertar um botão e limpar o valor da data.


procedure TFormCadSocios.Button1Click(Sender: TObject);
begin
Database.TableSoc_SociosDATA_FILIACAO.Clear;
end;
GOSTEI 0
Alessandro Folk

Alessandro Folk

08/08/2014

Não sei bem como está montado sua tela...
Mas tente fazer o seguinte teste:

1 - Colocar o seu DataSet em Edição antes de limpar? e depois gravar...
procedure TFormCadSocios.Button1Click(Sender: TObject);
begin
   if TableSoc_Socios.State = DsBrowse then
      TableSoc_Socios.Edit;
   TableSoc_SociosDATA_FILIACAO.Clear;
   TableSoc_Socios.Post;
end;
GOSTEI 0
Marcos Roberto

Marcos Roberto

08/08/2014

sim , ele já está em modo de edição antes. (O botão de limpar faz parte de uma aba que só aparece se estiver em modo de edição.)

Outro detalhe eu tentei usar o comando que vc sugeriu a cima, o if TableSoc_Socios.State = DsBrowse then e deu o seguinte erro:

[DCC Error] UCadSocios.pas(497): E2010 Incompatible types: 'TIBDataSet' and 'TDataSetState'


Alguma dica??
GOSTEI 0
Renato Rubinho

Renato Rubinho

08/08/2014

Buenos,

O "Clear" deveria funcionar. Veja se a propriedade "Required" do campo TableSoc_SociosDATA_FILIACAO na TableSoc_Socios está como True. Para aceitar null, tem que estar como False.

Tenta também da seguinte forma para passar null.

procedure TFormCadSocios.Button1Click(Sender: TObject);
begin
  Database.TableSoc_SociosDATA_FILIACAO.Value := null;
end;


Abraççç,
Renato
GOSTEI 0
Marcos Roberto

Marcos Roberto

08/08/2014

Olá Renato!

a propriedade "Required" do campo TableSoc_SociosDATA_FILIACAO está false sim já tentei true e tbm não vai.

Também tentei do seu jeito: Database.TableSoc_SociosDATA_FILIACAO.Value := null; e me retorna o seguinte erro. Could not convert variant of type (Null) into type (Double).


Sabe me dizer o que pode ser??

Grato.
GOSTEI 0
Marcos Roberto

Marcos Roberto

08/08/2014

Olá Renato!

a propriedade "Required" do campo TableSoc_SociosDATA_FILIACAO está false sim já tentei true e tbm não vai.

Também tentei do seu jeito: Database.TableSoc_SociosDATA_FILIACAO.Value := null; e me retorna o seguinte erro. Could not convert variant of type (Null) into type (Double).


Sabe me dizer o que pode ser??

Grato.
GOSTEI 0
Renato Rubinho

Renato Rubinho

08/08/2014

Qual sua versão de Delphi e qual banco de dados está usando ?
Pela mensagem de erro que você postou, o tipo de campo não está como Date ou Timestamp. Está acusando do tipo Double.
Confirma qual o DataType no campo TableSoc_SociosDATA_FILIACAO.
Se o tipo de campo estiver correto, deveria funcionar tanto o clear quanto o value=null.
Tenta:

TableSoc_SociosDATA_FILIACAO.AsSQLTimeStamp := null;
ou
TableSoc_SociosDATA_FILIACAO.AsDateTime := null;
ou
TableSoc_SociosDATA_FILIACAO.AsVariant := null;
GOSTEI 0
Marcos Roberto

Marcos Roberto

08/08/2014

Estou usando Delphi 2010 e o Firebird 2.5 como banco de dados e o componente IBDataSet.

E o tipo do meu campo e do tipo DATE mesmo.

Renato eu testei no Delphi XE6 e o camando clear e o value=null funcionou. Acredito que este problema deve ser com o Delphi 2010!!


Porque será este problema??
GOSTEI 0
Renato Rubinho

Renato Rubinho

08/08/2014

Também acho que é bug... Não tenho o 2010 para validar.

Você tentou colocando AsSQLTimeStamp, AsDateTime ou AsVariant atribuir null?
Se não funcionar também, tenta também "AsString = null". Por que? Aí já é POG... rsrs

Abraççç,
Renato
GOSTEI 0
Marcos Roberto

Marcos Roberto

08/08/2014

Coloquei sim Renato, mas ou não retorna nenhum erro mas tbm não limpa a data ou da aquele erro de como se o campo não fosse do tipo data.


Cara estou vendo se consigo instalar meus companentes no Delphi XE5, mas já tive outro problema: depois que instalo o Delphi ele mudou a posição dos menus de todo Windows.

Se liga só!
ele fica pra esquerda

[img]http://arquivo.devmedia.com.br/forum/imagem/362394-20140811-201357.jpg[/img]

Enquanto que o normal é ficar para a direita.
[img]http://arquivo.devmedia.com.br/forum/imagem/362394-20140811-201620.jpg[/img]

Pode me ajudar?? :)
GOSTEI 0
Gabriel Silva

Gabriel Silva

08/08/2014

procedure TFormCadSocios.Button1Click(Sender: TObject);
begin
Database.TableSoc_SociosDATA_FILIACAO.datatype:= ftDate;
Database.TableSoc_SociosDATA_FILIACAO.Value := null;
end;
GOSTEI 0
Steve Narancic

Steve Narancic

08/08/2014

Tenta da maneira que o gabriel falou que da certo!
GOSTEI 0
Marcos Roberto

Marcos Roberto

08/08/2014

Tentei do seu jeito Gabriel mas retorna o seguinte erro: [DCC Error] UCadSocios.pas(594): E2129 Cannot assign to a read-only property.

O componente é o IBDATASET.
GOSTEI 0
Renato Rubinho

Renato Rubinho

08/08/2014

Que novela... rsrs

E debugando ? Tentou limpar o valor ?

Mais dois testes:

TField(Database.TableSoc_SociosDATA_FILIACAO).Value := null;

ou

TField(Database.TableSoc_SociosDATA_FILIACAO).Clear;

Abraççç,
Renato
GOSTEI 0
Marcos Roberto

Marcos Roberto

08/08/2014

Então eu testei os dois comandos mas tbm não da nada nem retorna erro.

E como Debugo??


Abraço.
GOSTEI 0
Renato Rubinho

Renato Rubinho

08/08/2014

Ponha um ponto de parada (F5) na linha:

Database.TableSoc_SociosDATA_FILIACAO.Clear;

Quando estiver em execução, ao parar nessa linha, pressione F7 para ver se entra nas funções da classe.

Última chance, rsrs:

Database.TableSoc_SociosDATA_FILIACAO.SetData(nil);

Se não funcionar, seta como zero quando for nulo e, nos comandos enviados ao banco, grava como nulo quando o valor for zero.

Abraççç
GOSTEI 0
Marcos Saffran

Marcos Saffran

08/08/2014

Tentei do seu jeito Gabriel mas retorna o seguinte erro: [DCC Error] UCadSocios.pas(594): E2129 Cannot assign to a read-only property.

O componente é o IBDATASET.


Bom dia Marcos,

verifique a propriedade "Read Only" da tabela e do campo, que deve estar como false.
GOSTEI 0
Marcos Roberto

Marcos Roberto

08/08/2014

To osso aqui viu Renato! rsrsrs

você sugeriu em fazer uma trigger né??
Então eu atribuo zero para o campo data, o que faz com que ele fique com a data de 30/12/1899, até ai blza... mas quando vou salvar ele me retorna esse erro:

conversion error from string "0" At trigger 'ZERAR_DATA' line:6, col:3


Criei minha trigger assim. (Será que fiz káka:??)

create trigger zerar_data for soc_socios
before insert or update
as
begin
if (new.DATA_FILIACAO = 0) then
new.DATA_FILIACAO = null;
end


Abraço!
GOSTEI 0
Marcos Roberto

Marcos Roberto

08/08/2014

Marcos Alfredo,
não existe a propriedade "Read Only" do componente IBDataSet , essa propriedade só aparece quando clico no campo, ai sim esta lá, e ela esta como False.



Teria que ter a propriedade "Read Only" no componente IBDataSet???

Abraço.
GOSTEI 0
Marcos Roberto

Marcos Roberto

08/08/2014

E ae Renato!

cara deu certo com a trigger... ueepaaa :)

Te agradeço de verdade, você tentou me ajudar mesmo... muito agradecido.


Cara se você me permitir tenho algumas duvidas que surgiram recorrente a este problema do tópico, e como você foi um cara prestativo e a pessoa que mais me deu alternativas , então sua opinião para mim é muito importante!! (se vc puder responder eu agradeço.)

Só vou terminar esse projeto que estou fazendo e pretendo mudar para outra versão do Delphi, você me sugeriria qual?

Você usa qual versão?

Fiz alguns testes com algumas versões e depois de instalar o Delphi mudou o posicionamento dos menus das janelas do Windows para a esquerda, tipo assim:

[img]http://arquivo.devmedia.com.br/forum/imagem/362394-20140814-160248.jpg[/img]

Isso ocorreu com você?


Renato te agradeço mais uma vez!
um grande Abraço.
GOSTEI 0
Renato Rubinho

Renato Rubinho

08/08/2014

Faz pouquíssimo tempo que passei a participar do fórum. Já aprendi muito caçando soluções na net e acho justo compartilhar também.

Sua instalação deve ter mudado algum registro do windows. Olha esse link que achei: DevMedia

Tenta gerar um projetinho com isso e veja se consegue inverter.

Pesquise por MFT_RIGHTJUSTIFY e MFT_LEFTJUSTIFY na net e ve se descobre como corrigir no windows.

Eu uso atualmente o Delphi 7. Já usei muito o 5 e tenho um projetinho no XE.

Sinceramente não sei quais os recursos e evolução das novas versões. Veja se já não existe algum tópico sobre isso que alguém que conheça as novas versões poderá te sugerir algo melhor que eu.

Abraççç,
Renato
GOSTEI 0
Marcos Roberto

Marcos Roberto

08/08/2014

Olá Renato!

Cara desculpa pela demora em responder pois estava viajando.

Deu certo sua dica para arrumar a direção do menu...

Simplesmente muito obrigado!

um grande abraço.
GOSTEI 0
Rogerio Bras

Rogerio Bras

08/08/2014

A data zero é 30/12/1899.
Tenta na trigger:

create trigger zerar_data for soc_socios
before insert or update
as
begin
  if (new.DATA_FILIACAO = '30.12.1899') then
  new.DATA_FILIACAO = null;
end


Nota 10. Funcionou 100% aqui comigo.
GOSTEI 0
POSTAR