Fórum Estou recebendo key vioation na segunda tentativa de fazer um edit em um cientdataset. #504213

12/12/2014

0

Tenho dois clientdatasets alimentados por tabelas, um chama cdsCodBarras e o outro cdsRetOrcamento. A definição é a seguinte:

cdsRetOrcamento: TClientDataSet;
cdsCodBarras: TClientDataSet;
cdsRetOrcamentoSEPARADO: TFloatField;
cdsRetOrcamentoSALDO: TFloatField;
cdsRetOrcamentoQUANTITEMSEPARADO: TFloatField;
cdsRetOrcamentoSALDOITEMORCA: TFloatField;
cdsRetOrcamentoPRODUTOID: TIntegerField;
cdsRetOrcamentoREFROD: TStringField;
cdsRetOrcamentoNOMEPROD: TStringField;
cdsRetOrcamentoESTOQUEPED: TFloatField;
cdsRetOrcamentoQUANTITEMORCA: TFloatField;
cdsRetOrcamentoITEMORCAMENTOID: TIntegerField;
cdsRetOrcamentoSTATUSORCA: TIntegerField;
cdsCodBarrasCODBARRAS: TStringField;
cdsCodBarrasPRODUTOID: TIntegerField;
cdsCodBarrasITEMORCAMENTOID: TIntegerField;


O meu programa deveria, quando clicado um botão, ler um código de barras na caixa de edit, achar o registro no cdsCodBarras a partir desse código, encontrar um registro no cdsRetOrcamento através do item "PRODUTOID" desse registro encontrado, incrementar dois campos do registro do cdsRetOrcamento e deixar um dos campos do registro do cdsCodBarras igual ao mesmo campo do registro do cdsRetOrcamento encontrado. Eis o cógido:

Procedure InsereItemSeparacao(intCodBarras: String);
begin
   FPrinc.BindSourceDB1.ResetNeeded;
   dmBanco.cdsRetOrcamento.First; dmBanco.cdsCodBarras.First;
      with dmBanco do
      begin
         cdsCodBarras.Locate('CODBARRAS', FPrinc.eCodBarras.Text, []);
         cdsRetOrcamento.Locate('PRODUTOID', cdsCodBarrasPRODUTOID.AsInteger, []);
         if (cdsRetOrcamentoQUANTITEMSEPARADO.Value < cdsRetOrcamentoSALDOITEMORCA.Value) and
         (cdsCodBarrasITEMORCAMENTOID.Value = 0) then
         begin
            //Edição da tabela de código de barras
            cdsCodBarras.Edit;
               cdsCodBarrasITEMORCAMENTOID.Value := cdsRetOrcamentoITEMORCAMENTOID.value;
            cdsCodBarras.Post;
            //Edição da tabela de orçamento.
            cdsRetOrcamento.Edit;
               cdsRetOrcamentoQUANTITEMSEPARADO.Value := cdsRetOrcamentoQUANTITEMSEPARADO.Value + 1;
               cdsRetOrcamentoSEPARADO.Value := cdsRetOrcamentoSEPARADO.Value + 1;
            cdsRetOrcamento.Post;
            FPrinc.eCodBarras.Text := '';
         end else if (cdsRetOrcamentoITEMORCAMENTOID.AsInteger <> 0) then
         begin
            ShowMessage('Esse item já foi separado!');
         end else
         begin
            ShowMessage('Todos os itens deste produto já foram separados.');
         end;
      end;
   FPrinc.BindSourceDB1.ResetNeeded;
end;


Acontece que sempre que eu tento fazer esse processo, se já existir um registro no cdsCodBarras com o mesmo valor no campo "ITEMORCAMENTOID" que eu estiver tentando inserir, ele me retorna o seguinte erro:

[img]http://arquivo.devmedia.com.br/forum/imagem/200336-20141212-164529.png[/img]

Após alguns testes, descobri que o erro ocorre no seguinte bloco de código, e apenas na situação descrita:

cdsCodBarras.Edit;
   cdsCodBarrasITEMORCAMENTOID.Value := cdsRetOrcamentoITEMORCAMENTOID.value;
cdsCodBarras.Post;


Alguém sabe como posso resolver isso ?
Obs: O erro não retorna nenhuma exceção.
Interativa Sistemas

Interativa Sistemas

Responder

Post mais votado

16/12/2014

Este erro acontece quando se tenta fazer uma segunda operação seguida em um mesmo registro e perde-se a referência a chave primária. Provavelmente o clientdataset está sendo fechado após a primeira operação e depois sendo aberto sem ser criado, ou seja, sem o createdataset.

Ricardo

Ricardo
Responder

Gostei + 1

Mais Posts

12/12/2014

Marisiana Battistella

O erro deve estar ocorrendo porque vc está tentando incluir o cdsRetOrcamento duas vezes e está dando violação de Primary Key...
Não entendi muito bem... poderia mostrar como é a estrutura da tabela que vc está tentando inserir essas informações?
Responder

Gostei + 0

12/12/2014

Interativa Sistemas

A tabela de Códigos de Barras tem a chave estrangeira ITEMORCAMENTOID, que é chave primária da tabela de Itens de orçamento. Eu achei estranho justamente por não haver nenhuma chave primária sendo repetida, apenas chave estrangeira, que no caso é a ITEMORCAMENTOID.

[img]http://arquivo.devmedia.com.br/forum/imagem/200336-20141212-173835.png[/img]
Responder

Gostei + 0

12/12/2014

Marisiana Battistella

Acho q entendi...
Quando vc vai realizar a alteração na tabela Código de Barras, vc deve informar qual é código de barras de barras que será alterado

cdsCodBarras.Edit;
   cdsCodBarrasITEMORCAMENTOID.Value := cdsRetOrcamentoITEMORCAMENTOID.value;
cdsCodBarras.Post;

Nesse código vc está mandando apenas o valor do campo que é FK e esse pode estar vinculado a mais de um código de barras.
E com isso, ele não está sabendo em qual registro ele tem que fazer a alteração....
Responder

Gostei + 0

12/12/2014

Marisiana Battistella

Não sei se é isso, mas é uma possibilidade...
Responder

Gostei + 0

15/12/2014

Interativa Sistemas

Bom dia Marisiana, essa possibilidade passou pela minha cabeça, mas fiz vários testes e cheguei a conclusão de que não pode ser. O registro é mudado sim, no seguinte bloco de código:
         cdsCodBarras.Locate('CODBARRAS', FPrinc.eCodBarras.Text, []);
         cdsRetOrcamento.Locate('PRODUTOID', cdsCodBarrasPRODUTOID.AsInteger, []);
Responder

Gostei + 0

15/12/2014

Marisiana Battistella

E o teu UPDATE está correto?
Tentou executar ele direto no Firebird para ver se funciona?
Responder

Gostei + 0

15/12/2014

Interativa Sistemas

O programa ainda não faz update, por enquanto só armazena as informações em memória, e na hora de mudar o ClientDataset que dá o erro.
Resolvi criar outro parâmetro no banco de dados para armazenar a informação e agora funcionou, não sei bem o que estava acontecendo.
Eu li em algum lugar que o erro se dava porque a constraint da chave estrangeira não estava definida no banco de dados, fui ver e realmente não estava. Mas a partir da hora que eu arrumei isso não foi mais possível dar valores ao campo que não fossem correspondentes na outra tabela, então tive que criar outro campo de qualquer maneira.
Obrigado pela ajuda.
Responder

Gostei + 0

17/12/2014

Marisiana Battistella

O programa ainda não faz update, por enquanto só armazena as informações em memória, e na hora de mudar o ClientDataset que dá o erro.
Resolvi criar outro parâmetro no banco de dados para armazenar a informação e agora funcionou, não sei bem o que estava acontecendo.
Eu li em algum lugar que o erro se dava porque a constraint da chave estrangeira não estava definida no banco de dados, fui ver e realmente não estava. Mas a partir da hora que eu arrumei isso não foi mais possível dar valores ao campo que não fossem correspondentes na outra tabela, então tive que criar outro campo de qualquer maneira.
Obrigado pela ajuda.


Por nada!
Mas, então vc tinha um relacionamento entre os dados das duas tabelas e não existia a Foreign Key criada?
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar