Fórum Codigo para campos Duplicados #331779
22/10/2006
0
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
Curtir tópico
+ 0Posts
23/10/2006
Nigro
Gostei + 0
23/10/2006
Vitor5
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????
Gostei + 0
24/10/2006
Raserafim
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;
Gostei + 0
24/10/2006
Rinez
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.
Gostei + 0
24/10/2006
Vitor5
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
Gostei + 0
26/10/2006
Vitor5
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
Gostei + 0
27/10/2006
Raserafim
posta aqui o seu código.
Gostei + 0
27/10/2006
Vitor5
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????
Gostei + 0
27/10/2006
Marco Salles
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
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
Gostei + 0
27/10/2006
Vitor5
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
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
Gostei + 0
28/10/2006
Raserafim
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).
Gostei + 0
28/10/2006
Raserafim
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;
Gostei + 0
28/10/2006
Marco Salles
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
assim poderia tentar :
Aonde:
[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
Gostei + 0
28/10/2006
Vitor5
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
Gostei + 0
28/10/2006
Marco Salles
Segue esta outra linha de raciocineo:
[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
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:
volte para o formulário Principal.....
Tente fazer isso.... Que voce ira conseguir
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)