Fórum Codigo para campos Duplicados #331779

22/10/2006

0

Boa noite galera, resolvi mudar o jeito de fazer minha pergunta
O caso é o seguinte:
Tenho um form onde há varios campos duplicados. Gostaria de saber como fazer para:
Através de um edit, eu informar o preço de um produto e onde os campos forem igual a este produto receba este valor. Trabalho com delphi e interbase, IbExpert, e uso simpledataset , da aba dbExpress. Obrigado Vitor 5


Vitor5

Vitor5

Responder

Posts

23/10/2006

Nigro

Se o campo valor for exibido por um componente TDBEdit, é só direcionar o mesmo campo para os vários componentes, se for exibidor por TEdit, faça um update na sua tabela e depois rode, provavelmente, a procedure que carrega os valores nos TEdit´s, o que não ficou claro, foi o motivo para a duplicação do campo.


Responder

Gostei + 0

23/10/2006

Vitor5

Boa noite e obrigado por responder. Deixa eu tentar explicar melhor
Tenho um form onde é digitado várias vezes os mesmos produtos. Ex:

Sala moldura 1
Quarto moldura 1
WC moldura 2
Cozinha moldura 2 e assim por diante. O caso é que o preço do produto não está em uma tabela (os vendedores fazem o preço de venda), então os produtos podem variar de preço. O que eu gostaria é usar um Edit, e digitar o preço referente aquele produto e todos os campos no DBGrid com o mesmo código recebesse esse preço. Poderia usar select com distinct?????Como deve ficar o código????


Responder

Gostei + 0

24/10/2006

Raserafim

se vc quer que os registros do DBgrid sejam alterados mas quer que o usuário ainda decida se vai salvar as alterações ou não, então vc pode fazer isso pelo próprio delphi, ao invés de fazer via SQL.
digamos que o DBGrid está associada a um ClientDataSet, então o que devemos fazer é varrer este ClientDataSet e alterar os valores dos produtos com o mesmo código.

poderia ser algo mais ou mesnos assim:
  ClientDataSet1.First;
  while ClientDataSet1.Eof = false do
  begin
    if ClientDataSet1CODIGO.value = Edit1CODIGO.text then
    begin
      ClientDataSet1.Edit;
      ClientDataSet1VALOR.value = strtoint(Edit1VALOR.text);
      ClientDataSet1.Post;
    end;
    ClientDataSet1.Next;
  end;



Responder

Gostei + 0

24/10/2006

Rinez

Caro Vitor
Porque não usas StringGrid. Voce coloca o componete StringGrid em um form e configura todas as colunas que queres e no evento ontopleftchanged do StringGrid voce faz todos os calculos.
Se precisar de ajuda é so avisar.
Zenir Curitiba.


Responder

Gostei + 0

24/10/2006

Vitor5

se vc quer que os registros do DBgrid sejam alterados mas quer que o usuário ainda decida se vai salvar as alterações ou não, então vc pode fazer isso pelo próprio delphi, ao invés de fazer via SQL. digamos que o DBGrid está associada a um ClientDataSet, então o que devemos fazer é varrer este ClientDataSet e alterar os valores dos produtos com o mesmo código. poderia ser algo mais ou mesnos assim:
  ClientDataSet1.First;
  while ClientDataSet1.Eof = false do
  begin
    if ClientDataSet1CODIGO.value = Edit1CODIGO.text then
    begin
      ClientDataSet1.Edit;
      ClientDataSet1VALOR.value = strtoint(Edit1VALOR.text);
      ClientDataSet1.Post;
    end;
    ClientDataSet1.Next;
  end;

Obrigado por responder, parece que o caminho realmente é este que você está me passando, só que: Ele está atualizando todos os campos, incluisive os com códigos diferentes. Estou desenvolvendo em delphi 7 uso Interbase, IbExpert, no meu datamodule uso, simpledataset e datasource.
Os campos de minha tabela itens de pedidos não tenho uma chave primária por gerar conflito no codigo que criei.
O campo cod_prod está como integer, o campo preço está como decimal.
Coloquei um dbedit ligado a tabela itens e um edit onde informo o preço, um dbgrid ligado a tabela, só que quando coloco um preço ele atualiza todos os códigos. Gostaria que ele atualizasse somente aquele referente aquele que estou digitando...O que está de errado???Pderia me ajudar????Obrigado


Responder

Gostei + 0

26/10/2006

Vitor5

[quote:284e7c1ad1=´raserafim´]se vc quer que os registros do DBgrid sejam alterados mas quer que o usuário ainda decida se vai salvar as alterações ou não, então vc pode fazer isso pelo próprio delphi, ao invés de fazer via SQL. digamos que o DBGrid está associada a um ClientDataSet, então o que devemos fazer é varrer este ClientDataSet e alterar os valores dos produtos com o mesmo código. poderia ser algo mais ou mesnos assim:
  ClientDataSet1.First;
  while ClientDataSet1.Eof = false do
  begin
    if ClientDataSet1CODIGO.value = Edit1CODIGO.text then
    begin
      ClientDataSet1.Edit;
      ClientDataSet1VALOR.value = strtoint(Edit1VALOR.text);
      ClientDataSet1.Post;
    end;
    ClientDataSet1.Next;
  end;

Obrigado por responder, parece que o caminho realmente é este que você está me passando, só que: Ele está atualizando todos os campos, incluisive os com códigos diferentes. Estou desenvolvendo em delphi 7 uso Interbase, IbExpert, no meu datamodule uso, simpledataset e datasource.
Os campos de minha tabela itens de pedidos não tenho uma chave primária por gerar conflito no codigo que criei.
O campo cod_prod está como integer, o campo preço está como decimal.
Coloquei um dbedit ligado a tabela itens e um edit onde informo o preço, um dbgrid ligado a tabela, só que quando coloco um preço ele atualiza todos os códigos. Gostaria que ele atualizasse somente aquele referente aquele que estou digitando...O que está de errado???Pderia me ajudar????Obrigado[/quote:284e7c1ad1]

E aí amigo dá pra dar essa luz inspiradora??/Obrigado Vitor 5


Responder

Gostei + 0

27/10/2006

Raserafim

se vc fez nesta lógica, deveria funcionar.

posta aqui o seu código.


Responder

Gostei + 0

27/10/2006

Vitor5

se vc fez nesta lógica, deveria funcionar. posta aqui o seu código.




procedure TformRecebimentos.fldPrecoExit(Sender: TObject);
begin
dm.sdsItensPedido.First;
while dm.sdsItensPedido.Eof = false do
begin
if (Dbedit1.Text) = dm.sdsItensPedidoCOD_PROD.AsString then
begin
dm.sdsItensPedido.Edit;
dm.sdsItensPedidoPreco.AsString :=fldPreco.text;
dm.sdsItensPedido.Post;

end;

dm.sdsItensPedido.ApplyUpdates(-1);

dm.sdsItensPedido.Next;
Esté é o código, só que ele atualiza todos os campos de uma vez só, e não só o codigo que preciso, será que precisa de uma variável????


Responder

Gostei + 0

27/10/2006

Marco Salles

ja participei de um debate com o amigo em outros tópicos sobre o mesmo assunto.

Este codigo de While noe eof , do jeito que fora proposto , tende a ficar lento com o aumento da base de dados.. Além de alteras todos os produtos da tabela com o mesmo codigo , para o novo preço , pois em nenhum momento vi nenhuma restrição com o numero do pedido (Ou numero da venda)....

if ClientDataSet1CODIGO.value = Edit1CODIGO.text then
isto so não é suficiente....É necessário filtrar os registros para que o laço While percorra somente os registros relacionados a uma determinada venda <ou determinado pedido>

Por outro lado a condição do codigo
if (Dbedit1.Text) = dm.sdsItensPedidoCOD_PROD.AsString then

Pode ocorrer que sera sempre verdadeira...Pois se o DbEdit1.text estiver ligado a um Datasorce que aponte para a mesma tabela que
sdsItensPedido... Logo sdsItensPedido.Next ira deslocar o ponteiro também no Dbedit1.text o que faz com que todos os campos sejam atualizados de uma so vez

Outra coisa que parece estar errado é o amigo dar um ApllyUpdates(-1), dentro do loop...Isto tabém não esta correto

O correto , é usar fazer um Update


Responder

Gostei + 0

27/10/2006

Vitor5

[quote:b4402b9230=´Marco Salles´]ja participei de um debate com o amigo em outros tópicos sobre o mesmo assunto.

Este codigo de While noe eof , do jeito que fora proposto , tende a ficar lento com o aumento da base de dados.. Além de alteras todos os produtos da tabela com o mesmo codigo , para o novo preço , pois em nenhum momento vi nenhuma restrição com o numero do pedido (Ou numero da venda)....

if ClientDataSet1CODIGO.value = Edit1CODIGO.text then
isto so não é suficiente....É necessário filtrar os registros para que o laço While percorra somente os registros relacionados a uma determinada venda <ou determinado pedido>

Por outro lado a condição do codigo
if (Dbedit1.Text) = dm.sdsItensPedidoCOD_PROD.AsString then

Pode ocorrer que sera sempre verdadeira...Pois se o DbEdit1.text estiver ligado a um Datasorce que aponte para a mesma tabela que
sdsItensPedido... Logo sdsItensPedido.Next ira deslocar o ponteiro também no Dbedit1.text o que faz com que todos os campos sejam atualizados de uma so vez

Outra coisa que parece estar errado é o amigo dar um ApllyUpdates(-1), dentro do loop...Isto tabém não esta correto

O correto , é usar fazer um Update[/quote:b4402b9230]


Se isto não funciona então tem uma idéia de como fazer isto, se pudesse ser mais detalhado obrigado Vitor5


Responder

Gostei + 0

28/10/2006

Raserafim

achei o
if ClientDataSet1CODIGO.value = Edit1CODIGO.text then
suficiente e não achei necessário verificar a venda pois este código estará percorrendo o dataset da venda atual, então supus que os ítens que estão neste dataset são referente a venda atual, que é a que se quer mudar.

e em relação a outra verificação o que Marco Salles falou é verdade, verifique até mesmo se este não foi o caso de o seu código Vitor não ter funcionado. Mas coloquei desta forma pois pelo que entendi é realmente um edit no form que não tem ligação com nenhum dataset.

quanto ao ApllyUpdates(-1) além do que o Marco Salles falou (do problema de estar dentro do loop), acho que vc deveria usar o ApplyUpdates(0), para que não aceite nenhum erro).


Responder

Gostei + 0

28/10/2006

Raserafim

e no seu código está faltando também um end
além de mais algumas alterações:

procedure TformRecebimentos.fldPrecoExit(Sender: TObject); 
begin 
  dm.sdsItensPedido.First; 
  while dm.sdsItensPedido.Eof = false do 
  begin 
    if (Dbedit1.Text) = (dm.sdsItensPedidoCOD_PROD.AsString) then 
    begin 
      dm.sdsItensPedido.Edit; 
      dm.sdsItensPedidoPreco.AsString :=fldPreco.text; 
      dm.sdsItensPedido.Post; 
    end;

    dm.sdsItensPedido.Next;  
  end; 

  dm.sdsItensPedido.ApplyUpdates(-1); 

  

end;



Responder

Gostei + 0

28/10/2006

Marco Salles

achei o if ClientDataSet1CODIGO.value = Edit1CODIGO.text then suficiente e não achei necessário verificar a venda pois este código estará percorrendo o dataset da venda atual,


Mas qual a restrição que voce esta impondo ,para que o dataset , digamos assim , percorra apenas a venda atual ??? . Eu não consigo ver esta restrição...Sem esta restrição , alem da lentidão, produtos com o mesmo codigo de operações anteriores , terão os seus preços alterados...


Quanto a usar o Update , para fornecer o codigo correto e não deixar erros , vou convencionar que
o nome da sua tabela , --->>> Tabela o nome do campo codigo , -->>> Codigo.... [b:6679d56820]Supondpo String[/b:6679d56820] o nome do campo que identifica a venda , -->>> [b:6679d56820]Id Supondo Integer[/b:6679d56820] e o nome do campo valor do produto , --->>> Valor o nome do seu Clientdataset ---->>> Cds

assim poderia tentar :

cds.CommandText:=´´; cds.Close; cds.CommandText:=´update TABELA set VALOR = ´+ QuotedStr(Edit2.Text)+ ´ where (ID =:pID)and(CODIGO =:pcodigo)´; cds.Params.parambyname(´pID´).asinteger:=strtoint(Edit1.Text); cds.Params.parambyname(´pcodigo´).asstring:=Edit3.Text; cds.Execute; cds.CommandText:=´´; cds.close; cds.CommandText:=´select * From TABELA´; cds.Open;


Aonde:
Edit1 -->>> o Valor que voce quer atribuir Edit2 -->>> o numero da venda ou numero do pedido.. Tem que ter um identificador Edit3 --->>> O Codigo do produto que voce quer alterar


[b:6679d56820]Importante>>> colocar a propriedade AllowComandText do DatasetProvider em True[/b:6679d56820]

De quelquer maneira o comando While eof do que o amigo resarafim colocou , funciona , no meu modo de ver desde que se faça uma restrição.. A constribuição dele é importante assim como a sua disponibilidade em contribuir... Não estou aqui desacreditando-o em comparação deste ou daquele método.. estou apenas colocando uma maneira que usando o Update. Particularmente eu prefiro o Update


Responder

Gostei + 0

28/10/2006

Vitor5

Amigos, obrigado por estas ajudas. Vou tentar explicar um pouco melhor.
Tenho um form de pedidos, ligado a tabela pedidos, e uma tabela itens. Como trabalho com cômodos e produtos, vários cõmodos podem ter o mesmo produto Ex:

Cômodos Cod Prod Descr Produto Qtde Preco Unitário
Sala 003 Moldura de 10 cm 10,00
Quarto 003 Moldurta de 10 cm 20,00
Cozinha 004 Moldura de 20 cm 15,00
Banheiro 005 Moldura de 30 cm 22,50.
Após digitado, e antes de salvar o pedido ele abre um outro form onde recebe o numero de pedido com Valor Total, Desconto.... E neste form queria colocar um campo onde digitasse o valor unitário e todos os pordutos referente a este codigo receberia o valor, só que no meu caso está atualizando todos os códigos. Não precisaria estar digitando o preço de todos e somente referente a código. (Esse preço tem quer ser digitado na hora do fechamento, não pode estar na tabela). Na minha tabela itens não tem chave primaria, pois por repetir varias vezes os mesmos codigos ela gerava erro, por isso resolvi deixar sem chave primária.Como poderia resolver este codigo?????. Obrigado vitor5


Responder

Gostei + 0

28/10/2006

Marco Salles

Amigo , voce também deve testar o que a gente te propõem e dentro disso dizer o que serve e o que não serve...Este teu problema ja vem de tres tópicos , e é uma coisa relativamente simples

Segue esta outra linha de raciocineo:

1)Após digitado, e antes de salvar o pedido ele abre um outro form onde recebe o numero de pedido com Valor Total, Desconto


[b:c8ae25a33d]Use um Sql para agrupar por codigo de produto [/b:c8ae25a33d]

Descarregue usando o While not eof em um StringGrid... Pesquise aqui no forum sobre o StringGrid

Nesse StringGrid deixe uma Coluna Chamado Valor_Unitário

Ficara assim apos o Agrupamento
Cod Prod Descr Produto -------Qtde -------Preco Unitário 003 ------Moldura de 10 cm --- 30 004 ------Moldura de 20 cm --- 15,00 005 ------Moldura de 30 cm --- 22,50.


Nesse form Que se abriu , apos carregar os valores respctivamente usando uma StringGrid , coloque o valor do preço unitário Correspondente na coluna

Finalmente , na hora de fechar o Form ou em qualquer botao , Varra o StringGrid editando na base de dados

Tipo isso:
While ... Percorre o stringList cds.CommandText:=´´; cds.Close; cds.CommandText:=´update TABELA set VALOR = ´ + QuotedStr(a coluna Valor_unitariorefernte do stringList)+ ´ where CODIGO =:pcodigo´; cds.Params.parambyname(´pcodigo´).asstring:= a coluna CODIGO do STRINGLIST; cds.Execute; FIM DO WHILE DO STRINGLIST cds.CommandText:=´´; cds.close; cds.CommandText:=´select * From TABELA´; cds.Open;


volte para o formulário Principal.....

Tente fazer isso.... Que voce ira conseguir


Responder

Gostei + 0

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

Aceitar