Ir para conteúdo
Fórum Script Brasil
  • 0

Inserir campo em branco


Gabriel Cabral

Pergunta

3 respostass a esta questão

Posts Recomendados

  • 0
como faço pra inserir no banco um campo vazio???

pois no formulario aqui, tenho DBEdit's que não precisam ser preenchidas obrigatoriamente...

mas quando vou gravar, dá erro falando que ' ' não é um valor válido...

Esta mensagem não informa qual o campo em questão está "inválido"?

Observe que este tipo de mensagem indica que há a tentativa de gravar um valor inadequado num determinado campo. Isto não tem relação o fato de você tentar gravar um campo vazio.

Seria melhor você colocar a mensagem original.

Link para o comentário
Compartilhar em outros sites

  • 0

Então...eu acho que o erro se dá quando um campo fica vazio, porque fiz um teste prenchendo todos os campos e inseriu tudo sem erro...

Aí fiz um outro teste, preenchendo todos com os mesmos valores anteriores, exceto um que deixei vazio...então deu o erro:

Project winsuperm.exe raised exception class EConvertError with message ''' is not a valid floating point value.'

Quando deixo vazio um campo do tipo data, dá o erro:

Project winsuperm.exe raised exception class EConvertError with message '' / / ' is not a valid date.'

A inserção eu faço com instrução SQL.....

dm.Query1.Close;
dm.Query1.SQL.Clear;

dm.Query1.SQL.Add('INSERT INTO ESTAPRO(ESTAPRO.PROCOD,ESTAPRO.PROTIP,');
dm.Query1.SQL.Add('ESTAPRO.PROCAD,ESTAPRO.PRODES,ESTAPRO.PROQTD,');
dm.Query1.SQL.Add('ESTAPRO.PROUND,ESTAPRO.PROICM,ESTAPRO.PROMIN,');
dm.Query1.SQL.Add('ESTAPRO.PROMAX,ESTAPRO.PROCUS,ESTAPRO.PROLUC,ESTAPRO.PROPRE,');
dm.Query1.SQL.Add('ESTAPRO.PROFOR,ESTAPRO.PROFO2,ESTAPRO.PROFO3,ESTAPRO.PROFO4,');
dm.Query1.SQL.Add('ESTAPRO.PROFRA,ESTAPRO.PROUNC,ESTAPRO.PROLOC,ESTAPRO.PROORI,');
dm.Query1.SQL.Add('ESTAPRO.PRODVL,ESTAPRO.PROPOF,ESTAPRO.PROIOF,ESTAPRO.PRODOF,');
dm.Query1.SQL.Add('ESTAPRO.PROEPR,ESTAPRO.PROPRT,ESTAPRO.PROCOM,ESTAPRO.PROVEN,');
dm.Query1.SQL.Add('ESTAPRO.PRODTC,ESTAPRO.PROFOC,ESTAPRO.PROQDC,ESTAPRO.PROPRC,');
dm.Query1.SQL.Add('ESTAPRO.PROENT,ESTAPRO.PROQTE,ESTAPRO.PROSAI,ESTAPRO.PROQTS)');

dm.Query1.SQL.Add('VALUES (:codpro,:secao,:datacad,:desc,:estoque,:undvenda,');
dm.Query1.SQL.Add(':icms,:estmin,:estmax,:precus,:vml,:preven,');
dm.Query1.SQL.Add(':codforn1,:codforn2,:codforn3,:codforn4,');
dm.Query1.SQL.Add(':fracao,:undcompra,:local,:codorigem,:diasval,:preofe,');
dm.Query1.SQL.Add(':datainiofe,:datafinofe,:estoqprat,:qtdeminprat,:totalcomp,:totalvend,');
dm.Query1.SQL.Add(':datault,:fornult,:qtdeult,:preult,:dataent,:qtdeent,:datasai,:qtdesai)');

dm.Query1.ParamByName('codpro')       .value := txtCadPro_CodPro.Text;
dm.Query1.ParamByName('secao')        .value := txtCadPro_Secao.Text;
dm.Query1.ParamByName('datacad')      .value := StrToDate(txtCadPro_DataCad.Text);
dm.Query1.ParamByName('desc')         .value := txtCadPro_Desc.Text;
dm.Query1.ParamByName('estoque')      .value := StrToFloat(txtCadPro_Estoque.Text);
dm.Query1.ParamByName('undvenda')     .value := txtCadPro_UndVen.Text;
dm.Query1.ParamByName('icms')         .value := StrToFloat(txtCadPro_Icms.Text);
dm.Query1.ParamByName('estmin')       .value := StrToFloat(txtCadPro_EstMin.Text);
dm.Query1.ParamByName('estmax')       .value := StrToFloat(txtCadPro_EstMax.Text);
dm.Query1.ParamByName('precus')       .value := StrToFloat(txtCadPro_PreCus.Text);
dm.Query1.ParamByName('vml')          .value := StrToFloat(txtCadPro_Vml.Text);
dm.Query1.ParamByName('preven')       .value := StrToFloat(txtCadPro_PreVen.Text);
dm.Query1.ParamByName('codforn1')     .value := txtCadPro_CodForn1.Text;
dm.Query1.ParamByName('codforn2')     .value := txtCadPro_CodForn2.Text;
dm.Query1.ParamByName('codforn3')     .value := txtCadPro_CodForn3.Text;
dm.Query1.ParamByName('codforn4')     .value := txtCadPro_CodForn4.Text;
dm.Query1.ParamByName('fracao')       .value := StrToFloat(txtCadPro_Fracao.Text);
dm.Query1.ParamByName('undcompra')    .value := txtCadPro_UndCompra.Text;
dm.Query1.ParamByName('local')        .value := txtCadPro_Local.Text;
dm.Query1.ParamByName('codorigem')    .value := txtCadPro_CodOrigem.Text;
dm.Query1.ParamByName('diasval')      .value := StrToFloat(txtCadPro_DiasVal.Text);
dm.Query1.ParamByName('preofe')       .value := StrToFloat(txtCadPro_PreOfe.Text);
dm.Query1.ParamByName('datainiofe')   .value := StrToDate(txtCadPro_DataIniOfe.Text);
dm.Query1.ParamByName('datafinofe')   .value := StrToDate(txtCadPro_DataFinOfe.Text);
dm.Query1.ParamByName('estoqprat')    .value := StrToFloat(txtCadPro_EstoqPrat.Text);
dm.Query1.ParamByName('qtdeminprat')  .value := StrToFloat(txtCadPro_QtdeMinPrat.Text);
dm.Query1.ParamByName('totalcomp')    .value := StrToFloat(txtCadPro_TotalComp.Text);
dm.Query1.ParamByName('totalvend')    .value := StrToFloat(txtCadPro_TotalVend.Text);
dm.Query1.ParamByName('datault')      .value := StrToDate(txtCadPro_DataUlt.Text);
dm.Query1.ParamByName('fornult')      .value := txtCadPro_FornUlt.Text;
dm.Query1.ParamByName('qtdeult')      .value := StrToFloat(txtCadPro_QtdeUlt.Text);
dm.Query1.ParamByName('preult')       .value := StrToFloat(txtCadPro_PreUlt.Text);
dm.Query1.ParamByName('dataent')      .value := StrToDate(txtCadPro_DataEnt.Text);
dm.Query1.ParamByName('qtdeent')      .value := StrToFloat(txtCadPro_QtdeEnt.Text);
dm.Query1.ParamByName('datasai')      .value := StrToDate(txtCadPro_DataSai.Text);
dm.Query1.ParamByName('qtdesai')      .value := StrToFloat(txtCadPro_QtdeSai.Text);

dm.Query1.ExecSQL;

dm.tblCadPro.Close;

Isso estaria ajudando no erro???

Link para o comentário
Compartilhar em outros sites

  • 0
Isso estaria ajudando no erro???

Gabriel Cabral, muitíssimo!!!

Já estava mais ou menos imaginando que você estivesse movendo os campos na mão, mas vendo como você está implementando, e com a mensagem de erro original, fica mais fácil - dá para sair do campo da suposição. ;)

Este método que você está utilizando é pedreira mesmo - tem que estar bastante atento para as características das atribuições e também aos valores passados às funções. No caso citado, os erros estão ocorrendo nas funções de conversão de tipos - nem chegou à execução da query.

Quando você usa um TMaskEdit (com alguma máscara setada), ao deixá-lo em brando você estárá lendo em Text a própria máscara como neste caso você deve ter usado a máscara similar a '99/99/99;1;_', a string retornada por Text será mesmo ' / / ' e que não poderá ser convertida pela função StrToDate sem gerar erro.

Do mesmo modo, tentar converter uma string nula, retornada pela propriedade Text de um TEdit, utilizando a função StrToFloat irá gerar erro. Uma string inválida, como 2.540,50 também irá gerar erro, porque para executar a função com sucesso, o número deveria ter apenas o ponto decimal como separador de dezenas: 2540.50.

Você deverá de algum modo se preocupar com a validação dos campos antes de tentar passar eles para a função. Dê uma olhada em alguns posts relacionados a estes assuntos:

Erro de conversão em função, EConvertError with message (veja a função ENumero que o colega robinhocne implementou - pode lhe servir)

Como faço para testar se um campo string é decimal?

Problema Com Formato De Número, ajuda!!!

Verificando conteúdo, Verificando data digitada no maskedit

Duvida Em Máscara Para R$ E Tel:

tem muitos outros...

Dica: Poupe os dedos ao criar suas instruções SQL. Use o recurso de Alias (apelido) ou, quando não for necessário, não informe o nome da tabela junto ao campo. Por ex., neste trecho:

dm.Query1.SQL.Add('INSERT INTO ESTAPRO(ESTAPRO.PROCOD,ESTAPRO.PROTIP,');

dm.Query1.SQL.Add('ESTAPRO.PROCAD,ESTAPRO.PRODES,ESTAPRO.PROQTD,');

dm.Query1.SQL.Add('ESTAPRO.PROUND,ESTAPRO.PROICM,ESTAPRO.PROMIN,');

você pode omitir o nome da tabela junto ao campo, porque seu SQL trata exclusivamente de uma única tabela

dm.Query1.SQL.Add('INSERT INTO ESTAPRO(PROCOD, PROTIP,');

dm.Query1.SQL.Add('PROCAD, PRODES, PROQTD,');

dm.Query1.SQL.Add('PROUND, PROICM, PROMIN,');

e quando houvessem mais tabelas envolvidas, poderia usar o alias como em:

dm.Query1.SQL.Add('INSERT INTO ESTAPRO E (E.PROCOD, E.PROTIP,');

dm.Query1.SQL.Add('E .PROCAD, E.PRODES, E.PROQTD,');

dm.Query1.SQL.Add('E.PROUND, E.PROICM, E.PROMIN,');

Abraços

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...