Fórum <Unable to find record. No key specified> SOCORROOOO.... #477343

27/04/2014

0

procedure TF_ModeloEntrada.SpeedButton1Click(Sender: TObject);
begin
if MessageDlg(''''Deseja mesmo excluir este registro?'''',mtInformation, [mbYes, mbNo],0) = mrYes then
begin

if not DtsConsulta.DataSet.IsEmpty then //Verifica se nao esta vazio
begin
DtsConsulta.DataSet.Delete;
if dtsConsulta.DataSet is TClientDataSet then //compara se dtsconsulta e da classe Tclientdataset
TClientDataSet (dtsconsulta.DataSet).ApplyUpdates(0);// se for da o applyupdt
ShowMessage(''''Exclusão realizada com Exito'''');
end;

end;
Fabio

Fabio

Responder

Posts

28/04/2014

Cauê Nishijima

Fábio como é a consulta SQL que você faz pra pegar os dados pra esse ClientDataSet? Nas colunas que vc fez consulta esta presente algum campo de chave primária?
Responder

Gostei + 0

28/04/2014

Fabio

no cds_pesqEntrada = Select e.*,p.produto from Entrada e, produto p where e.id_produto=p.id_produto and data_entrada between :data1 and :data2 order by data_entrada
no cds_pesqSaida = Select * from Saida where data_Saida between :data1 and :data2 order by data_Saida

e no sds_CadEntrada = Insert into ENTRADA (DATA_ENTRADA, ID_PRODUTO, MOTIVO_ENTRADA, QTDADE_ENTRADA)
values(:DATA_ENTRADA, :ID_PRODUTO, :MOTIVO_ENTRADA, :QTDADE_ENTRADA)

no cds_cadSaida Insert into SAIDA (DATA_SAIDA, ID_PRODUTO, MOTIVO_SAIDA, QTDADE_SAIDA)
values(:DATA_SAIDA, :ID_PRODUTO, :MOTIVO_SAIDA, :QTDADE_SAIDA)
Lembrando que a exclusao de saidas funciona e a de entrada vem esse erro e ja mexi nos provider flags e tudo
flw
Responder

Gostei + 0

28/04/2014

Cauê Nishijima

Fabio vc tem que desmarcar as flags pfInUpdate e pfInWhere da coluna p.produto...Tanto no TClientDataSet quanto da TSQLQuery...
Responder

Gostei + 0

28/04/2014

Fabio

Entao cara eu nao tem componente Query somente Sds cds e Dsp entao sera que eu tiriar esse p.produto e fazer esse lokup adicionando os campos la pelo new field sera que deve funcionar ?
lembrando que uso dois cds
cds_cadEntrada e outro
cds_pesqentrada
Responder

Gostei + 0

28/04/2014

Cauê Nishijima

Vou fazer um teste com SimpleDataSet e te retorno!
Responder

Gostei + 0

28/04/2014

Cauê Nishijima

Cara aparentemente é igual, no SimpleDataSet, vc da um duplo clique depois um 'Add all Fields' e no campo produto vc desmarca as flags que disse, depois faz o mesmo procedimento no ClientDataSet.
Mas provavelmente fazendo um Lookup como você disse também resolva o problema.
Responder

Gostei + 0

28/04/2014

Cauê Nishijima

Cara aparentemente é igual, no SimpleDataSet, vc da um duplo clique depois um 'Add all Fields' e no campo produto vc desmarca as flags que disse, depois faz o mesmo procedimento no ClientDataSet.
Mas provavelmente fazendo um Lookup como você disse também resolva o problema.
Responder

Gostei + 0

28/04/2014

Fabio

valeu cara vou testar quando sair do serviço e chegar em casa e te retorno
flw
abraço
Responder

Gostei + 0

28/04/2014

Fabio

Cara aparentemente é igual, no SimpleDataSet, vc da um duplo clique depois um 'Add all Fields' e no campo produto vc desmarca as flags que disse, depois faz o mesmo procedimento no ClientDataSet.
Mas provavelmente fazendo um Lookup como você disse também resolva o problema.


Cara Fiz usando newfield com lokup e funcionou agora aparentamente ta funcionando certinho excluindo do banco e do grid
muito obrigado
queria saber se vc pode me ajudar com um combobox que preciso renomea os itens inclusive ja abri topico aqui meu problema e esse:
fiz uma pesquisa baseado nos atributos das minhas tabelas de modo que meu combobox fique assim por exemmplo se a tabela for a de cliente
os itens do combobox vao ficar assim
ID_CLIENTE
NOME
ENDERECO
CIDADE
de acordo com os atributos que tem na minha tabela porem eu quero renomea-los para que fique mais bonito e elegante desse jeito
Cód. Cliente
Nome
Endereço
Cidade
a funcao para levar os atributos ao combobox foram essas
no evento formshow: (lembrando que esse é meu form modelo pois fiz os outros com herança dele)
procedure TF_Modelo.FormShow(Sender: TObject);
var I: integer;
begin

for I := 0 to DtsConsulta.DataSet.FieldCount - 1 do
begin
if DtsConsulta.DataSet.Fields[I].DataType in [ftString, ftWideString, ftInteger, ftFixedChar] then
cbCampo.Items.Add(DtsConsulta.DataSet.Fields[I].FieldName);

e no onclick do botao foi essa (lembrando que esse é meu form modelo pois fiz os outros com herança dele)
if rbcontem.Checked then
_pesquisa := cbCampo.Text + ' Like ' + QuotedStr('%' + edtPesquisar.Text + '%' )
else if rbComeca.Checked then
_pesquisa := cbCampo.Text + ' Like ' + QuotedStr( edtPesquisar.Text + '%' );

with TClientDataSet (dtsconsulta.DataSet) do
begin
close;
CommandText:= _txt + _pesquisa;
open;
end;
Responder

Gostei + 0

28/04/2014

Cauê Nishijima

Fábio usa a propriedade DiplayLabel dos Fields, põe o nome que você quer que apareça na propriedade DisplayLabel de cada Field.
Ai no OnShow você faz

procedure TF_Modelo.FormShow(Sender: TObject); 
var 
   I: integer; 
   sb: TStringBuilder;
begin 

for I := 0 to DtsConsulta.DataSet.FieldCount - 1 do 
begin 
   if DtsConsulta.DataSet.Fields[I].DataType in [ftString, ftWideString, ftInteger, ftFixedChar] then 
   begin
      sb := TStringBuilder.Create(DtsConsulta.DataSet.Fields[I].FieldName);
      cbCampo.Items.AddObject(DtsConsulta.DataSet.Fields[I].DisplayLabel, sb); 
   end;


e no OnClick do Button vc faz:

if rbcontem.Checked then 
   _pesquisa := TStringBuilder(cbb1.Items.Objects[cbb1.ItemIndex]).ToString + ' Like ' + QuotedStr('%' + edtPesquisar.Text + '%' ) 
else if rbComeca.Checked then 
   _pesquisa :=TStringBuilder(cbb1.Items.Objects[cbb1.ItemIndex]).ToString + ' Like ' + QuotedStr( edtPesquisar.Text + '%' ); 

with TClientDataSet (dtsconsulta.DataSet) do 
begin 
   close; 
   CommandText:= _txt + _pesquisa; 
   open; 
end; 

Responder

Gostei + 0

28/04/2014

Fabio

Mais uma vez obrigado pela atenção caue, esse metodo que voce me passou pode ser usado no formularioModelo para que os outros herdem ou preciso colocar esse código em um por um nos form de herenca (ex:formProduto, Cliente)
assim que chegar em casa vou testar
Responder

Gostei + 0

28/04/2014

Fabio

Fábio usa a propriedade DiplayLabel dos Fields, põe o nome que você quer que apareça na propriedade DisplayLabel de cada Field.
Ai no OnShow você faz

procedure TF_Modelo.FormShow(Sender: TObject); 
var 
   I: integer; 
   sb: TStringBuilder;
begin 

for I := 0 to DtsConsulta.DataSet.FieldCount - 1 do 
begin 
   if DtsConsulta.DataSet.Fields[I].DataType in [ftString, ftWideString, ftInteger, ftFixedChar] then 
   begin
      sb := TStringBuilder.Create(DtsConsulta.DataSet.Fields[I].FieldName);


      cbCampo.Items.AddObject(DtsConsulta.DataSet.Fields[I].DisplayLabel, sb); 
   end;


e no OnClick do Button vc faz:

if rbcontem.Checked then 
   _pesquisa := TStringBuilder(cbb1.Items.Objects[cbb1.ItemIndex]).ToString + ' Like ' + QuotedStr('%' + edtPesquisar.Text + '%' ) 
else if rbComeca.Checked then 
   _pesquisa :=TStringBuilder(cbb1.Items.Objects[cbb1.ItemIndex]).ToString + ' Like ' + QuotedStr( edtPesquisar.Text + '%' ); 

with TClientDataSet (dtsconsulta.DataSet) do 
begin 
   close; 
   CommandText:= _txt + _pesquisa; 
   open; 
end; 



Caue ele nao pego a variavel sb retorna o seguinte errro
[DCC Error] U_Modelo.pas(311): E2034 Too many actual parameters
[DCC Fatal Error] ControleEstoque.dpr(33): F2063 Could not compile used unit 'U_Modelo.pas'

experimentei tirar pra ver compila porem quando vou fazer uma busca ele retorna
acess violation in data module

quanto aos itens listo certinho só deu esses probleminhas mesmo
se souber a solucao me comunique
flw
Responder

Gostei + 0

28/04/2014

Cauê Nishijima

Se tiver como postar o codigo completo do onshow e do onclick eu dou uma olhada
Responder

Gostei + 0

28/04/2014

Cauê Nishijima

Se tiver como postar o codigo completo do onshow e do onclick eu dou uma olhada
Responder

Gostei + 0

28/04/2014

Fabio

cara o erro era burrice minha mesmo só burrice de programador novato como eu eu esqueci de muda o .Add para .AddObeject
dae funcionou perfeito foi GENIAL sua dica e o codigo que vc me passo me resolveu o problema
outra coisa as vezes quando eu abro meu projeto as vezes aparece uma mensagem de erro SQLconection porem nao é toda vez as vezes acontece
outro erro que acontece erro insufficient memory for this operation alias quando estou compilando dae fecho o delphi e reincio o pc e funciona por um certo tempo
em fim se vc souber
flw

Responder

Gostei + 0

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

Aceitar