Erro ao Salvar dados no banco
Comecei a pouco tempo a trabalhar com delphi e estou com um pouco de dificuldade a trabalhar com banco de dados.
O erro é esse:
Estou usando um ZConnection e uma ZTable, estou gravando os dados manualmente dessa forma:
Como corrigir esse erro?
[]s
O erro é esse:
Field ID_CLIENTE is required, but not supplied
Estou usando um ZConnection e uma ZTable, estou gravando os dados manualmente dessa forma:
try DM.TB_Cliente.Open; DM.TB_Cliente.Insert; DM.TB_ClienteNOME.Value:= edt_nome.Text; DM.TB_ClienteCPF.Value:= edt_CPF.Text; DM.TB_ClienteRG.Value:= edt_RG.Text; DM.TB_Cliente.Post; DM.TB_Cliente.CommitUpdates; ShowMessage(Salvo com Sucesso!); DM.TB_Cliente.Close; DM.TB_Cliente.Open; except On E: Exception do Application.MessageBox(Erro ao Cadastrar Cliente,Atenção,mb_TaskModal + mb_IconWarning); end; end;
Como corrigir esse erro?
[]s
Vander Carlos
Curtidas 0
Respostas
William
05/07/2012
Colega o seu campo ID_CLIENTE está configurado no FieldsEditor como required=true, nesse caso vc tem q informar esse valor antes de gravar.
Caso esse campo seja auto-increment então mude a opção required=false, assim os registros poderam ser gravados sem o campo ID_CLIENTE estar preenchido.
Caso esse campo seja auto-increment então mude a opção required=false, assim os registros poderam ser gravados sem o campo ID_CLIENTE estar preenchido.
GOSTEI 0
Vander Carlos
05/07/2012
Mudei a opção required para false mas está aparecendo esse erro:
SQL Error: validation error for column ID_CLIENTE, value ***null***. Error code: -625. The insert failed because a column definition includes validation constraints. the sql: insert into Cliente...
GOSTEI 0
Alvaro Vieira
05/07/2012
Boa tarde Vander.
O que pode estar acontecendo seja o seguinte:
O cds (ClientDataSet) ao ter sido populado, ou seja, quando você adicionou os campos ao objeto, ele procurou as validações de cada campo da sua tabela no banco de dados e provavelmente o campo ID_CLIENTE tenha sido configurado no seu banco de dados como not null, ou seja, não aceita nulo ao ser gravado.
Se tudo isso que presumo estiver correto, não adianta você alterar a propriedade do campo no cds para required=false, pois ao tentar gravar o registro o cds fará uma nova solicitação ao banco de dados gerando o erro; isso (required=false) só funcionaria se você alterasse a propriedade do campo do seu banco de dados (o que provavelmente você não fará, visto que esse campo parece ser de um ID).
Tente colocar a intrução abaixo no evento OnNewRecord do cds. A função GetTickCount (unit Windows) vai sugerir um valor inteiro e randômico, ou seja, um valor inteiro qualquer, apenas para satisfazer a necessidade do campo, mas o tratamento de um número sequencial deverá estar no seu banco no evento Before Insert (se for Firebird).
Volte a propriedade required=true, para ficar coerente com o banco e se não for isso, poste o que rolou. Abraço.
DM.TB_ClienteID_CLIENTE.AsInteger := GetTickCount;
O que pode estar acontecendo seja o seguinte:
O cds (ClientDataSet) ao ter sido populado, ou seja, quando você adicionou os campos ao objeto, ele procurou as validações de cada campo da sua tabela no banco de dados e provavelmente o campo ID_CLIENTE tenha sido configurado no seu banco de dados como not null, ou seja, não aceita nulo ao ser gravado.
Se tudo isso que presumo estiver correto, não adianta você alterar a propriedade do campo no cds para required=false, pois ao tentar gravar o registro o cds fará uma nova solicitação ao banco de dados gerando o erro; isso (required=false) só funcionaria se você alterasse a propriedade do campo do seu banco de dados (o que provavelmente você não fará, visto que esse campo parece ser de um ID).
Tente colocar a intrução abaixo no evento OnNewRecord do cds. A função GetTickCount (unit Windows) vai sugerir um valor inteiro e randômico, ou seja, um valor inteiro qualquer, apenas para satisfazer a necessidade do campo, mas o tratamento de um número sequencial deverá estar no seu banco no evento Before Insert (se for Firebird).
Volte a propriedade required=true, para ficar coerente com o banco e se não for isso, poste o que rolou. Abraço.
DM.TB_ClienteID_CLIENTE.AsInteger := GetTickCount;
GOSTEI 0
Vander Carlos
05/07/2012
Boa noite alvaro.
Eu refiz algumas coisas nele e deu certo, acabei passando os valores assim:
DMConexao.QCliente.FieldByName(NOME).Value:= edt_nome.Text;
Valeu pela ajuda.
[]s
Eu refiz algumas coisas nele e deu certo, acabei passando os valores assim:
DMConexao.QCliente.FieldByName(NOME).Value:= edt_nome.Text;
Valeu pela ajuda.
[]s
GOSTEI 0
Alvaro Vieira
05/07/2012
Que bom que você resolveu o problema Vander, só não entendi uma coisa: o problema não era no campo ID_CLIENTE ?
GOSTEI 0
Vander Carlos
05/07/2012
Sim, era isso também :)
[]s
[]s
GOSTEI 0