RENOMEAR ITENS DE UM COMBOBOX COM ATRIBUTOS DE UMA TABELA

Delphi

27/04/2014

Pessoal estou com um probleminha 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;
QUEM PUDER ME AJUDAR EU AGRADEÇO
ABRAÇO
Fabio

Fabio

Curtidas 0

Respostas

Felippe Tadeu

Felippe Tadeu

27/04/2014

Sobre o nome, você poderá estar alterando a propriedade Display Name de cada field do componente que representa o DataSet.
GOSTEI 0
Fabio

Fabio

27/04/2014

Cara isso eu ja resolvi mudando o display label dele, e mandando pega-lo em vez do fieldName
agora estou com outro problema :
se o Produto Cadastrado ja Teve Algum movimento (entrada, Saida, Venda) e o sistema tem que proibir a exclusão só que nao qual metodo usar para fazer isso, porque eu tenho a tabela MOVIMENTOS dae queria saber a formula que eu poderia fazer essa validacao se puder me ajudar eu agradeço;
GOSTEI 0
Felippe Tadeu

Felippe Tadeu

27/04/2014

Quais componentes de conexão você usa ?
TADOQuery, TClienteDataSet ?
GOSTEI 0
Fabio

Fabio

27/04/2014

eu uso ClientDataSet ligado a um provider que é ligado a um SQLdataset que é ligado a um SqlConection
entendeu como funciona?
GOSTEI 0
Felippe Tadeu

Felippe Tadeu

27/04/2014

Boa noite.

Bem cara, existem várias maneiras de se fazer isso.

Uma delas seria vc salvar o código do produto e fazer um filtro no ClientDataSet de movimentação ou a que contenha o código do produto, como por exemplo no evento de clicar no botão de excluir:
procedure Form1.btnExcluiOnClick(Sender: TObject);
begin
  DataSource.DataSet.Filtered := False;
  DataSource.DataSet.Filter := 'ID_PRODUTO = '+IntToStr(CodigoProduto);
  DataSource.DataSet.Filtered := True;
  if (DataSource.DataSet.RecordCount > 0) then
  begin
    ShowMessage('Existe movimentação para esse produto, por isso não poderá ser excluído');
    Abort;
  end;
end;


Obs: Vc pode ao invés de colocar DataSource vc pode colocar o name do DataModule concatenado com "." e concatenado com o name do ClientDataSet
GOSTEI 0
Fabio

Fabio

27/04/2014

ola amigo o que seria o códigodoProduto?
nessa funcao aqui
+IntToStr(CodigoProduto);??
GOSTEI 0
Fabio

Fabio

27/04/2014

para facilitar minha tela de cadastro é assim ...[img]http://arquivo.devmedia.com.br/forum/imagem/368071-20140513-002314.jpg[/img]
nao possui nem um dbedit ou edit que armazene o codigo do produto pois estao todos com generator...
GOSTEI 0
Felippe Tadeu

Felippe Tadeu

27/04/2014

Bom dia.

Amigo, quando acontece do usuário clicar 1 ou 2 vezes num registro da TDBGrid, o TDataSet referente a TDBGrid também será setado ou seja, vc terá a sua disposição o código do produto que o usuário escolheu.

Então existe algumas formas de vc fazer isso.

No ClientDataSet da Grid, veja qual é a posição do campo do código do produto. (comece a contar do 0).
Depois que vc achar a posição vá no evento OnClick do botão excluir ou no evento que será programado para excluir o produto e siga a seguinte lógica:

procedure Form1.excluiProdutos;
begin
  dm.ClientDataSetMovimentacao.Filtered := False;
  dm.ClientDataSetMovimentacao.Filter := 'CODIGOPRODUTO = '+ClientDataSetDaGrid.Fields[posicao].AsString;
  dm.ClientDataSetMovimentacao.Filtered := True;
  if (dm.ClientDataSetMovimentacao.RecordCount > 0) then
  begin
     ShowMessage('Produto com movimentação');
     Abort;
  end
  else
  begin
    // Aqui vc implementa a exclusão do produto conforme desejar
  end;
end;


Observações:
1 A variável posição é do Tipo Inteiro e é referente a posição do código do Produto que está no ClientDataSet ligado a Grid.
2 ClientDataSetMovimentacao deverá ser ter o código do produto para que o filtro funcione.
GOSTEI 0
Wilton Júnior

Wilton Júnior

27/04/2014

procedure Form1.excluiProdutos;
begin
dm.ClientDataSetMovimentacao.Filtered := False;
dm.ClientDataSetMovimentacao.Filter := 'CODIGOPRODUTO = '+ClientDataSetDaGrid.Fields[posicao].AsString;
dm.ClientDataSetMovimentacao.Filtered := True;
if (dm.ClientDataSetMovimentacao.RecordCount > 0) then
begin
ShowMessage('Produto com movimentação');
Abort;
end
else
begin
// Aqui vc implementa a exclusão do produto conforme desejar
end;
end;

Tenta assim vê o que da:


procedure Form1.excluiProdutos;
begin
if dm.ClientDataSetMovimentacao.locate('CODIGOPRODUTO';ClientDataSetDaGrid.Fields[posicao].AsString;[]) then
begin
ShowMessage('Produto com movimentação');
Abort;
exit;
end;
end;
GOSTEI 0
Fabio

Fabio

27/04/2014

para facilitar minha tela de cadastro é assim ...[img]http://arquivo.devmedia.com.br/forum/imagem/368071-20140513-002314.jpg[/img]
nao possui nem um dbedit ou edit que armazene o codigo do produto pois estao todos com generator...


NO POSICAO COLOQUEI 0 QUE E ONDE ESTA MEU ID_PRODUTO POREM QUANDO CLICQUEI NO BOTAO NADA ACONTECEU SO EXECUTO O COMANDO DEBAIXO QUE EU IMPLANTEI

procedure TF_Produto.btnExcluirClick(Sender: TObject);
begin
inherited;
dm.cds_movi.Open;
dm.cds_movi.Filtered := False;
dm.cds_movi.Filter := 'ID_PRODUTO = '+DMPesq.cds_PesqProduto.Fields[0].AsString;
dm.cds_movi.Filtered := True;
if (dm.Cds_movi.RecordCount > 0) then
begin
ShowMessage('Produto com movimentação');
Abort;
end
else
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;
Leitura('L');
end;
end;
GOSTEI 0
Fabio

Fabio

27/04/2014

Bom dia.

Amigo, quando acontece do usuário clicar 1 ou 2 vezes num registro da TDBGrid, o TDataSet referente a TDBGrid também será setado ou seja, vc terá a sua disposição o código do produto que o usuário escolheu.

Então existe algumas formas de vc fazer isso.

No ClientDataSet da Grid, veja qual é a posição do campo do código do produto. (comece a contar do 0).
Depois que vc achar a posição vá no evento OnClick do botão excluir ou no evento que será programado para excluir o produto e siga a seguinte lógica:

procedure Form1.excluiProdutos;
begin
  dm.ClientDataSetMovimentacao.Filtered := False;
  dm.ClientDataSetMovimentacao.Filter := 'CODIGOPRODUTO = '+ClientDataSetDaGrid.Fields[posicao].AsString;
  dm.ClientDataSetMovimentacao.Filtered := True;
  if (dm.ClientDataSetMovimentacao.RecordCount > 0) then
  begin
     ShowMessage('Produto com movimentação');
     Abort;
  end
  else
  begin
    // Aqui vc implementa a exclusão do produto conforme desejar
  end;
end;


Observações:
1 A variável posição é do Tipo Inteiro e é referente a posição do código do Produto que está no ClientDataSet ligado a Grid.
2 ClientDataSetMovimentacao deverá ser ter o código do produto para que o filtro funcione.


NO POSICAO COLOQUEI 0 QUE E ONDE ESTA MEU ID_PRODUTO POREM QUANDO CLICQUEI NO BOTAO NADA ACONTECEU SO EXECUTO O COMANDO DEBAIXO QUE EU IMPLANTEI

procedure TF_Produto.btnExcluirClick(Sender: TObject);
begin
inherited;
dm.cds_movi.Open;
dm.cds_movi.Filtered := False;
dm.cds_movi.Filter := 'ID_PRODUTO = '+DMPesq.cds_PesqProduto.Fields[0].AsString;
dm.cds_movi.Filtered := True;
if (dm.Cds_movi.RecordCount > 0) then
begin
ShowMessage('Produto com movimentação');
Abort;
end
else
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;
Leitura('L');
end;
end;
GOSTEI 0
Wilton Júnior

Wilton Júnior

27/04/2014

Por acaso esse seu clientdataset esta ligado a um datasetprovider e ligado numa query que ser for a forma que vc tah fazendo é só par ater dor de cabeça.
GOSTEI 0
Fabio

Fabio

27/04/2014

nao ta ligado a um provider que é ligado a um sqldataset
GOSTEI 0
Felippe Tadeu

Felippe Tadeu

27/04/2014

Quando vc debuga, passa por onde ?

Ele não entra no if do RecordCount ?
GOSTEI 0
Wilton Júnior

Wilton Júnior

27/04/2014

O problema é esse Colega vc ta fazendo o client filtrar informação sendo que não a necessidade, chega em um tabela virtual se existe movimento de estoque ou não se existe vc executa outras operações.
GOSTEI 0
Fabio

Fabio

27/04/2014

sim ele percorre normal como se o produto nao tivesse movimento e dae
pula pra parte debaixo e executa a exclusao
GOSTEI 0
Fabio

Fabio

27/04/2014

O problema é esse Colega vc ta fazendo o client filtrar informação sendo que não a necessidade, chega em um tabela virtual se existe movimento de estoque ou não se existe vc executa outras operações.


ja ouvi falar em tabela virtual,
no caso coloca um clientdataset no form adiciona os campos manualmente lá e configura suas propiedades vc quer dizer?
GOSTEI 0
Felippe Tadeu

Felippe Tadeu

27/04/2014

Mas qual seria o problema com o filtrar pela client ?
GOSTEI 0
Fabio

Fabio

27/04/2014

olha tambem nao vejo problema em filtrar pelo CDS porem tem que achar alguma maneira que verifique se o produto selecionado ta na tabela movimento e impedi-lo de excluir, ou
melhor dar a mensagem porque nao exclui por ser foreng key da tabela movimento ...
GOSTEI 0
Felippe Tadeu

Felippe Tadeu

27/04/2014

Quando vc debuga aparece algum valor para DMPesq.cds_PesqProduto.Fields[0].AsString ?
GOSTEI 0
Fabio

Fabio

27/04/2014

Quando vc debuga aparece algum valor para DMPesq.cds_PesqProduto.Fields[0].AsString ?


cara aparece assim quando eu passo o mous sobre as Asstring:
DMPesq.cds_PesqProduto.Fields[0].Asstring '39'

39 seria o codigo do produto que é o codigo do produto

dae quando eu por cima do zero 0 : 0
GOSTEI 0
Felippe Tadeu

Felippe Tadeu

27/04/2014

Existe movimentação para esse produto mesmo ?kkk
GOSTEI 0
Fabio

Fabio

27/04/2014

sim certeza absoluta kkk
fiz o teste vi na tabela e exclui so pra ver ao atualizar ele volta ali nao exclui
GOSTEI 0
Fabio

Fabio

27/04/2014

Existe movimentação para esse produto mesmo ?kkk


cara qual outro metodo sera que da pra usar ?
GOSTEI 0
Felippe Tadeu

Felippe Tadeu

27/04/2014

Cara, vc pode fazer algo parecido com que eu falei, a única diferença é que ao invés de vc filtrar vc teria que estar usando uma nova query e fazendo um select por essa nova query(pode ser criada em tempo de execução) e fazendo um select com ela e fazer a cláusula where com o código do produto.
Daí vc iria verificar se existe registros ou não.
Assim também funcionaria.
GOSTEI 0
Fabio

Fabio

27/04/2014

Cara, vc pode fazer algo parecido com que eu falei, a única diferença é que ao invés de vc filtrar vc teria que estar usando uma nova query e fazendo um select por essa nova query(pode ser criada em tempo de execução) e fazendo um select com ela e fazer a cláusula where com o código do produto.
Daí vc iria verificar se existe registros ou não.
Assim também funcionaria.


sim eu tambem pensei em uma query porem é meu primeiro programa to formando em ADS esse é meu tcc, dai precisa que se possivel coloca-se um exemplo de código pra
mim seguir e adaptar no meu
GOSTEI 0
Fabio

Fabio

27/04/2014

Pessoal fiz o Seguinte código funcionou troquei recordcount por isempty ele bloqueia a exclusao porem o produto que nao possui movimentacao ele tambem bloqueia
segue o codigo:
begin
dm.cds_movi.Open;
dm.cds_movi.Filtered := False;
dm.cds_movi.Filter := 'ID_PRODUTO = '+DMPesq.cds_PesqProduto.Fields[0].AsString;
dm.cds_movi.Filtered := True;
if (dm.Cds_movi.IsEmpty) then
begin
MessageDlg('Produto já possui movimentos!',mterror, [mbok],0);
Abort;
end
else
begin
inherited;

end;
end;

o que sera que tem que fazer para ajustar isso?

GOSTEI 0
Fabio

Fabio

27/04/2014

Cara, vc pode fazer algo parecido com que eu falei, a única diferença é que ao invés de vc filtrar vc teria que estar usando uma nova query e fazendo um select por essa nova query(pode ser criada em tempo de execução) e fazendo um select com ela e fazer a cláusula where com o código do produto.
Daí vc iria verificar se existe registros ou não.
Assim também funcionaria.


Pessoal fiz o Seguinte código funcionou troquei recordcount por isempty ele bloqueia a exclusao porem o produto que nao possui movimentacao ele tambem bloqueia
segue o codigo:
begin
dm.cds_movi.Open;
dm.cds_movi.Filtered := False;
dm.cds_movi.Filter := 'ID_PRODUTO = '+DMPesq.cds_PesqProduto.Fields[0].AsString;
dm.cds_movi.Filtered := True;
if (dm.Cds_movi.IsEmpty) then
begin
MessageDlg('Produto já possui movimentos!',mterror, [mbok],0);
Abort;
end
else
begin
inherited;

end;
end;

o que sera que tem que fazer para ajustar isso?
GOSTEI 0
Fabio

Fabio

27/04/2014

procedure Form1.excluiProdutos;
begin
dm.ClientDataSetMovimentacao.Filtered := False;
dm.ClientDataSetMovimentacao.Filter := 'CODIGOPRODUTO = '+ClientDataSetDaGrid.Fields[posicao].AsString;
dm.ClientDataSetMovimentacao.Filtered := True;
if (dm.ClientDataSetMovimentacao.RecordCount > 0) then
begin
ShowMessage('Produto com movimentação');
Abort;
end
else
begin
// Aqui vc implementa a exclusão do produto conforme desejar
end;
end;

Tenta assim vê o que da:


procedure Form1.excluiProdutos;
begin
if dm.ClientDataSetMovimentacao.locate('CODIGOPRODUTO';ClientDataSetDaGrid.Fields[posicao].AsString;[]) then
begin
ShowMessage('Produto com movimentação');
Abort;
exit;
end;
end;


Pessoal fiz o Seguinte código funcionou troquei recordcount por isempty ele bloqueia a exclusao porem o produto que nao possui movimentacao ele tambem bloqueia
segue o codigo:
begin
dm.cds_movi.Open;
dm.cds_movi.Filtered := False;
dm.cds_movi.Filter := 'ID_PRODUTO = '+DMPesq.cds_PesqProduto.Fields[0].AsString;
dm.cds_movi.Filtered := True;
if (dm.Cds_movi.IsEmpty) then
begin
MessageDlg('Produto já possui movimentos!',mterror, [mbok],0);
Abort;
end
else
begin
inherited;

end;
end;

o que sera que tem que fazer para ajustar isso?
GOSTEI 0
Felippe Tadeu

Felippe Tadeu

27/04/2014

begin
dm.cds_movi.Open;
 dm.cds_movi.Filtered := False;
 dm.cds_movi.Filter := 'ID_PRODUTO = '+DMPesq.cds_PesqProduto.Fields[0].AsString;
 dm.cds_movi.Filtered := True;
 if (dm.Cds_movi.IsEmpty) then
 begin
 MessageDlg('Produto já possui movimentos!',mterror, [mbok],0);
 Abort;
 end
 else
 begin
 inherited;

 end;
 end;


Bom dia.
No caso amigo o if (dm.Cds_movi.IsEmpty) then está querendo dizer: se o cds estiver vazio faça: MessageDlg('Produto já possui movimentos!',mterror, [mbok],0);
Existe um erro na lógica.


GOSTEI 0
Fabio

Fabio

27/04/2014

poise e com recordcount nao pega :(
sei la o que vou fazer tem que bolar outro jeito com um select
GOSTEI 0
Fabio

Fabio

27/04/2014

pessoal a principio consegui resolver o Problema da seguiinte maneira coloquei esse código no evento ReconcileError do meu clientdataset
begin
if Pos('VIOLATION OF FOREIGN KEY',UpperCase(E.Message))>0 then begin
Action := raCancel;
MessageDlg('Registro não pode ser excluido'+#13+
'Produto já Possui Movimentos',mterror,[mbOK],0);

Abort;
Exit;
end
GOSTEI 0
Nelson Santos

Nelson Santos

27/04/2014

ganhe dinheiro com softwares 3D em Delphi 7
http://www.3dsistemas.com.br
GOSTEI 0
POSTAR