Problema com CASCATA (CASCADE)
Olá Pessoal,
Eu estou tentando deletar uma TABELA PAI e uma TABELA FILHO ao mesmo tempo no qual minhas tabelas são:
PAI
TABELA - KIT
PK - ID_KIT
FILHO
TABELA - DETALLE_KIT (ESTA EM ESPANHOL)
FK - ID_KIT
Então dei uma boa pesquisada e eu vi que pelo IBExpert tem como ser criado a chave estrangeira com o DELETE RULE: CASCADE. Então eu recriei a minha chave estrangeira e fiz isso.
Após isso criei o seguinte código no Edit do IBExpert e dei um commit ele funcionou perfeitamente deletou a tabela pai e filho do codigo 26 ao mesmo tempo:
E então fui testar no delphi eu criei um TSQLDataSet, Provider, e um ClientDataset com o seguinte commandText, no qual cria um parametro do 0 -ID do tipo ftInteger:
E então OnClick do botão excluir eu fiz o seguinte código:
E ele não consegue excluir pois ele da o seguinte error:
Alguem saberia o porque deste erro se no IBExpert funciona normalmente e no delphi não? To precisando muito resolver esse erro!
-Eu já chequei os parametros do TSQLDataSet com o ClientDataSet estão os mesmos.
-Eu já testei pra ver se o está pegando o ID e está pegando corretamente.
Eu sinceramente não sei o que está errado.
Desde já agradecido!
Eu estou tentando deletar uma TABELA PAI e uma TABELA FILHO ao mesmo tempo no qual minhas tabelas são:
PAI
TABELA - KIT
PK - ID_KIT
FILHO
TABELA - DETALLE_KIT (ESTA EM ESPANHOL)
FK - ID_KIT
Então dei uma boa pesquisada e eu vi que pelo IBExpert tem como ser criado a chave estrangeira com o DELETE RULE: CASCADE. Então eu recriei a minha chave estrangeira e fiz isso.
Após isso criei o seguinte código no Edit do IBExpert e dei um commit ele funcionou perfeitamente deletou a tabela pai e filho do codigo 26 ao mesmo tempo:
delete from kit B where B.id_kit = 26
E então fui testar no delphi eu criei um TSQLDataSet, Provider, e um ClientDataset com o seguinte commandText, no qual cria um parametro do 0 -ID do tipo ftInteger:
delete from kit B where B.id_kit = :ID
E então OnClick do botão excluir eu fiz o seguinte código:
procedure TF_FormKit.btnExcluirClick(Sender: TObject);
begin
if MessageDlg('Tem certeza que deseja excluir o registro?', mtInformation, [mbYes, mbNo],0) = mrYes then
begin
if not dtsConsultarKit.DataSet.IsEmpty then
begin
dtsConsultarKit.DataSet.Delete;
if dtsConsultarKit.DataSet is TClientDataSet then
begin
with TClientDataSet(dtsExcluirKit.DataSet) do
begin
Close;
Params[0].AsInteger := TClientDataSet(dtsConsultarKit.DataSet).Fields[0].AsInteger;
Open;
end;
ShowMessage('Registro excluido com sucesso!');
end;
end;
end;
dtsConsultarKit.DataSet.Close;
dtsConsultarKit.DataSet.Open;
dtsConsultarDetalheKit.DataSet.Close;
dtsConsultarDetalheKit.DataSet.Open;
limpar;
edtProcurar.SetFocus;
end;
E ele não consegue excluir pois ele da o seguinte error:
Project CMS.exe raised exception class EDBClient with message 'Cannot delete master record with details.'.
Alguem saberia o porque deste erro se no IBExpert funciona normalmente e no delphi não? To precisando muito resolver esse erro!
-Eu já chequei os parametros do TSQLDataSet com o ClientDataSet estão os mesmos.
-Eu já testei pra ver se o
TClientDataSet(dtsConsultarKit.DataSet).Fields[0].AsInteger
Eu sinceramente não sei o que está errado.
Desde já agradecido!
Edson Vilhalba
Curtidas 0
Respostas
Marcio Reis
27/02/2014
Olá,
Não sei como é sua estrutura de programação, mas quando se utiliza clientdataset, imaginio que vc esteja utilizando o trio fantastico( clientdataset, provider, query ou dataset),
Quando utilizamos este processo e vamos realizer um master/detail, realizamos a configuração do objeto query do filho realizamos a ligação do provider master utilizando propriedade datasource na query, OK.
No clientedataset realizamos a ligação do detail com o master utilizando a propriedade datasetfield , Ok,
Se isto estiver OK, basta vc ativar a propriedade no cascadedelete no provider
Marcio
Não sei como é sua estrutura de programação, mas quando se utiliza clientdataset, imaginio que vc esteja utilizando o trio fantastico( clientdataset, provider, query ou dataset),
Quando utilizamos este processo e vamos realizer um master/detail, realizamos a configuração do objeto query do filho realizamos a ligação do provider master utilizando propriedade datasource na query, OK.
No clientedataset realizamos a ligação do detail com o master utilizando a propriedade datasetfield , Ok,
Se isto estiver OK, basta vc ativar a propriedade no cascadedelete no provider
Marcio
GOSTEI 0
Edson Vilhalba
27/02/2014
Olá,
Não sei como é sua estrutura de programação, mas quando se utiliza clientdataset, imaginio que vc esteja utilizando o trio fantastico( clientdataset, provider, query ou dataset),
Quando utilizamos este processo e vamos realizer um master/detail, realizamos a configuração do objeto query do filho realizamos a ligação do provider master utilizando propriedade datasource na query, OK.
No clientedataset realizamos a ligação do detail com o master utilizando a propriedade datasetfield , Ok,
Se isto estiver OK, basta vc ativar a propriedade no cascadedelete no provider
Marcio
Não sei como é sua estrutura de programação, mas quando se utiliza clientdataset, imaginio que vc esteja utilizando o trio fantastico( clientdataset, provider, query ou dataset),
Quando utilizamos este processo e vamos realizer um master/detail, realizamos a configuração do objeto query do filho realizamos a ligação do provider master utilizando propriedade datasource na query, OK.
No clientedataset realizamos a ligação do detail com o master utilizando a propriedade datasetfield , Ok,
Se isto estiver OK, basta vc ativar a propriedade no cascadedelete no provider
Marcio
Marcio era exatamente isso! Muito Obrigado!
GOSTEI 0