Codigo para campos Duplicados

Delphi

22/10/2006

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

Curtidas 0

Respostas

Nigro

Nigro

22/10/2006

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.


GOSTEI 0
Vitor5

Vitor5

22/10/2006

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????


GOSTEI 0
Raserafim

Raserafim

22/10/2006

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;



GOSTEI 0
Rinez

Rinez

22/10/2006

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.


GOSTEI 0
Vitor5

Vitor5

22/10/2006

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


GOSTEI 0
Vitor5

Vitor5

22/10/2006

[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


GOSTEI 0
Raserafim

Raserafim

22/10/2006

se vc fez nesta lógica, deveria funcionar.

posta aqui o seu código.


GOSTEI 0
Vitor5

Vitor5

22/10/2006

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????


GOSTEI 0
Marco Salles

Marco Salles

22/10/2006

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


GOSTEI 0
Vitor5

Vitor5

22/10/2006

[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


GOSTEI 0
Raserafim

Raserafim

22/10/2006

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).


GOSTEI 0
Raserafim

Raserafim

22/10/2006

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;



GOSTEI 0
Marco Salles

Marco Salles

22/10/2006

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


GOSTEI 0
Vitor5

Vitor5

22/10/2006

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


GOSTEI 0
Marco Salles

Marco Salles

22/10/2006

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


GOSTEI 0
Vitor5

Vitor5

22/10/2006

[quote:65cc8937ad=´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:65cc8937ad]Use um Sql para agrupar por codigo de produto [/b:65cc8937ad]

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[/quote:65cc8937ad]


Amigo desculpe pela minha falta de conhecimento, sou iniciante em Delphi, estou engatinhando ainda, comprei vários livros e nenhum especifica stringgrid. Tem alguma apostila ou artigo de como trabalhar com stringgrid?. Pelo que andei lendo nos foruns, talvez resolva este probreminha onde dei uma encalhada. Obrigado


GOSTEI 0
Vitor5

Vitor5

22/10/2006

:oops:
Amigo Marcos Sales, essa idéia de usar um stringgrid achei legal, andei pesquisando mais ainda falta eu entender como fazer isto. Acho que ficaria mais fácil. Se eu antes de gravar ele abrir um form onde esteja uma stringgrid, com os campos cod_prod e valor unitário. Depois de fechar ele me vai me trazer na tabela itens os preços referente ao digitado na stringgrid. Isto ficaria muito mais fácil. Como faria o código para o stringgrid receber esse valor? E como fazer o código para retornar ao form de Pedidos?
Eu estava o simpledataset e datasorce da paleta dbExpress, só que mesmo eu usando como Query ele não permitia o uso de funções sql que vc tinha me enviado. Fiz um teste colocando uma query do DBExpress, parece que a coisa está melhor. Em todo meu form estou usando o simpledataset e não datasetprovider.


GOSTEI 0
Marco Salles

Marco Salles

22/10/2006

Em todo meu form estou usando o simpledataset e não datasetprovider.


[b:455d3a0f34]Olha , eu fiz aqui , rapidinho , usando o DbExpress + SqlQuery + DataSetProvide + ClientDataSet..[/b:455d3a0f34]

Sugiro que voce [color=darkred:455d3a0f34]acompanhe o Exemplo [/color:455d3a0f34]e estude e certamente voce ira conseguir adapta-lo para o que voce quer....

[b:455d3a0f34]Mas acompanhe mesmo; Leia com atenção[/b:455d3a0f34]

No IbExpert Criei uma Tabela Chamada Moldura com os campos
Items --->> Chave primaria ID ---->>> Identificador de pedido (campo que possivelmente sera usado para se relacionar com outra tabela Comodos -->> Campo VarChar 10 Cod Prod -->> Campo Var Char 4 Not Null Descr Produto -->> Campo Var Char 10 Qtde -->> Campo Integer Not Null Preco Unitário -->> Campo Decimal 10,2


No Ib Expert mesmo eu digitei varios dados... Sempre respeitando o campo Items com o campo ID....Assim para cada novo registro o campo Items por se tratar de chave primária sera incrementado e o campo ID sera sempre igual , quando se trata de um mesmo pedido ou venda.... O Unico campo que não coloquei nenhum valor , foi o campo Valor_Unitário


No Form Principal , coloquei
Um SqlConection -->>> Um SqlQuery -->> chamei de Sql um DataSurce -->> chamei de Ds um DataSetProvider -->> chamei de Dps Um ClientDataSet -->> chamei de cds um DbGrdid -->> Ligado ao DataSorce ( Ds) Coloquei no Sqlquery a propriedade Sql Select * From MOLDURA


Um SqlQuery -->> chamei de SqlG um DataSurce -->> chamei de DsG um DataSetProvider -->> chamei de DpsG Um ClientDataSet -->> chamei de cdsG Observe que este G sera De Group É importante que a propriedade [poAllowCommandText] esteja em True NO DataSetProvider (DpsG) Não precisa colocar nenhuma instrução Sql No SqlG observe que so tem um sqlConnection... [b:455d3a0f34]Para os Dois SqlQuery[/b:455d3a0f34]


Coloco dois formulários O form1 com todos os componentes anteriores e o Form2 com um StringGrid.... [b:455d3a0f34]Chamei de Sgd[/b:455d3a0f34]


Finalmente no form1 em algum Botão que chamo o form2 Faço

cdsg.CommandText:=´´; cdsg.Close; cdsg.CommandText:=´Select Cod Produto,Descr Produto,Sum(Qauntidade) as Total ´+ ´FromE3o coloquei nenhum valor , foi o campo Valor_Unitário


No Form Principal , coloquei
Um SqlConection -->>> Um SqlQuery -->> chamei de Sql um DataSurce -->> chamei de Ds um DataSetProvider -->> chamei de Dps Um ClientDataSet -->> chamei de cds um DbGrdid -->> Ligado ao DataSorce ( Ds) Coloquei no Sqlquery a propriedade Sql Select * From MOLDURA


Um SqlQuery -->> chamei de SqlG um DataSurce -->> chamei de DsG um DataSetProvider -->> chamei de DpsG Um ClientDataSet -->> chamei de cdsG Observe que este G sera De Group É importante que a propriedade [poAllowCommandText] esteja em True NO DataSetProvider (DpsG) Não precisa colocar nenhuma instrução Sql No SqlG observe que so tem um sqlConnection... [b:455d3a0f34]Para os Dois SqlQuery[/b:455d3a0f34]


Coloco dois formulários O form1 com todos os componentes anteriores e o Form2 com um StringGrid.... [b:455d3a0f34]Chamei de Sgd[/b:455d3a0f34]


Finalmente no form1 em algum Botão que chamo o form2 Faço

cdsg.CommandText:=´´; cdsg.Close; cdsg.CommandText:=´Select Cod Produto,Descr Produto,Sum(Qauntidade) as Total ´+ ´From Moldura Where Id =:pId ´+ ´Group By Cod Produto,Descr Produto´; cdsg.Params.ParamByName(´pId´).AsInteger:=cds.fieldbyName(´ID´).AsInteger; cdsg.Execute; cdsg.Open; form2.ShowModal;


{O Que esta instrução faz...Ora , ele ira agrupar e somar.. Ate ai tudo bem}


Coloco dois formulários O form1 com todos os componentes anteriores e o Form2 com um StringGrid.... [b:455d3a0f34]Chamei de Sgd[/b:455d3a0f34]



No evento OnShow do Form2 Fiz o seguinte:

procedure TForm2.FormShow(Sender: TObject); var i:integer; begin Sgd.Cells[0,0]:=´Codigo_Moldura´; Sgd.Cells[1,0]:=´Descrição_Moldura´; Sgd.Cells[2,0]:=´Quantidade´; Sgd.Cells[3,0]:=´Valor_Unitario´; sgd.RowCount:=Form1.cdsG.RecordCount+1; i:=1; form1.cdsG.First; While not Form1.cdsG.Eof do begin Sgd.Cells[0,i]:=form1.cdsG.fieldByName(´Cod Produto´).AsString; Sgd.Cells[1,i]:=form1.cdsG.fieldByName(´Descr Produto´).AsString; Sgd.Cells[2,i]:=form1.cdsG.fieldByName(´Total´).AsString; form1.cdsG.Next; i:=i+1; end; end;[¬ Moldura Where Id =:pId ´+ ´Group By Cod Produto,Descr Produto´; cdsg.Params.ParamByName(´pId´).AsInteger:=cds.fieldbyName(´ID´).AsInteger; cdsg.Execute; cdsg.Open; form2.ShowModal;


{O Que esta instrução faz...Ora , ele ira agrupar e somar.. Ate ai tudo bem}


Coloco dois formulários O form1 com todos os componentes anteriores e o Form2 com um StringGrid.... [b:455d3a0f34]Chamei de Sgd[/b:455d3a0f34]



No evento OnShow do Form2 Fiz o seguinte:

procedure TForm2.FormShow(Sender: TObject); var i:integer; begin Sgd.Cells[0,0]:=´Codigo_Moldura´; Sgd.Cells[1,0]:=´Descrição_Moldura´; Sgd.Cells[2,0]:=´Quantidade´; Sgd.Cells[3,0]:=´Valor_Unitario´; sgd.RowCount:=Form1.cdsG.RecordCount+1; i:=1; form1.cdsG.First; While not Form1.cdsG.Eof do begin Sgd.Cells[0,i]:=form1.cdsG.fieldByName(´Cod Produto´).AsString; Sgd.Cells[1,i]:=form1.cdsG.fieldByName(´Descr Produto´).AsString; Sgd.Cells[2,i]:=form1.cdsG.fieldByName(´Total´).AsString; form1.cdsG.Next; i:=i+1; end; end;



Ainda coloquei este codigo para evitar erros acidentais de edição

procedure TForm2.SgdClick(Sender: TObject); begin if sgd.Col = 3 Then sgd.Options:=sgd.Options + [goEditing] else sgd.Options:=sgd.Options - [goEditing]





Por fim ,,, nesse momento do form2 , esta tudo agrupado , esperando somente o usuário digitar o valor de Preço unitario para cada Moldura

Feito isto em um Botão <pode também ser no fechamento do Form> Digite o seguinte codigo

procedure TForm2.Button1Click(Sender: TObject); var i:integer; begin form1.cds.CommandText:=´´; form1.cds.Close; for i:=1 to Sgd.RowCount-1 do begin form1.cds.CommandText:=´Update Moldura set Preco Unitario =:pNovoValor ´+ ´Where Cod Produto =:PCodigo´; form1.cds.Params.ParamByName(´pNovoValor´).AsString:=Sgd.Cells[3,i]; Form1.cds.Params.ParamByName(´PCodigo´).AsString:=Sgd.Cells[0,i]; Form1.cds.Execute; form1.cds.CommandText:=´´; end; Form1.cds.CommandText:=´select * From Moldura´; Form1.cds.Open; end;


e fin2Fquote]


Ainda coloquei este codigo para evitar erros acidentais de edição

procedure TForm2.SgdClick(Sender: TObject); begin if sgd.Col = 3 Then sgd.Options:=sgd.Options + [goEditing] else sgd.Options:=sgd.Options - [goEditing]





Por fim ,,, nesse momento do form2 , esta tudo agrupado , esperando somente o usuário digitar o valor de Preço unitario para cada Moldura

Feito isto em um Botão <pode também ser no fechamento do Form> Digite o seguinte codigo

procedure TForm2.Button1Click(Sender: TObject); var i:integer; begin form1.cds.CommandText:=´´; form1.cds.Close; for i:=1 to Sgd.RowCount-1 do begin form1.cds.CommandText:=´Update Moldura set Preco Unitario =:pNovoValor ´+ ´Where Cod Produto =:PCodigo´; form1.cds.Params.ParamByName(´pNovoValor´).AsString:=Sgd.Cells[3,i]; Form1.cds.Params.ParamByName(´PCodigo´).AsString:=Sgd.Cells[0,i]; Form1.cds.Execute; form1.cds.CommandText:=´´; end; Form1.cds.CommandText:=´select * From Moldura´; Form1.cds.Open; end;


e finalmente é so fechar o formulário form2 que os valores digitados na coluna do preco no StringGrid ja estarão no campo Preco Unitario



Aqui eu não me preocupei na parte visual e nen tambouco com a validação dos dados < verificar se o que o usuário digitou é um valor preco válido , Por exemplo>


Teste este exemplo isolado , estude as etapas , e adpate as suas necessidades...
Cuidados para não comer os epaçoes vazios , na instruçãoes do ComandText do ClientDataSet



Boa sorte:


GOSTEI 0
Marco Salles

Marco Salles

22/10/2006

[b:1475c64211]amigo a mesagem anterior teve algumas coisas estranhamente duplicadas.... Acho que foi erro do site :cry: :cry:
Estou aqui postando novamente , para não ficar confuso:[/b:1475c64211]

Em todo meu form estou usando o simpledataset e não datasetprovider.


[b:1475c64211]Olha , eu fiz aqui , rapidinho , usando o DbExpress + SqlQuery + DataSetProvide + ClientDataSet..[/b:1475c64211]

Sugiro que voce [color=darkred:1475c64211]acompanhe o Exemplo [/color:1475c64211]e estude e certamente voce ira conseguir adapta-lo para o que voce quer....

[b:1475c64211]Mas acompanhe mesmo; Leia com atenção[/b:1475c64211]

No IbExpert Criei uma Tabela Chamada Moldura com os campos
Items --->> Chave primaria ID ---->>> Identificador de pedido (campo que possivelmente sera usado para se relacionar com outra tabela Comodos -->> Campo VarChar 10 Cod Prod -->> Campo Var Char 4 Not Null Descr Produto -->> Campo Var Char 10 Qtde -->> Campo Integer Not Null Preco Unitário -->> Campo Decimal 10,2


No Ib Expert mesmo eu digitei varios dados... Sempre respeitando o campo Items com o campo ID....Assim para cada novo registro o campo Items por se tratar de chave primária sera incrementado e o campo ID sera sempre igual , quando se trata de um mesmo pedido ou venda.... O Unico campo que não coloquei nenhum valor , foi o campo Valor_Unitário


No Form Principal , coloquei
Um SqlConection -->>> Um SqlQuery -->> chamei de Sql um DataSurce -->> chamei de Ds um DataSetProvider -->> chamei de Dps Um ClientDataSet -->> chamei de cds um DbGrdid -->> Ligado ao DataSorce ( Ds) Coloquei no Sqlquery a propriedade Sql Select * From MOLDURA


Um SqlQuery -->> chamei de SqlG um DataSurce -->> chamei de DsG um DataSetProvider -->> chamei de DpsG Um ClientDataSet -->> chamei de cdsG Observe que este G sera De Group É importante que a propriedade [poAllowCommandText] esteja em True NO DataSetProvider (DpsG) Não precisa colocar nenhuma instrução Sql No SqlG observe que so tem um sqlConnection... [b:1475c64211]Para os Dois SqlQuery[/b:1475c64211]


Coloco dois formulários O form1 com todos os componentes anteriores e o Form2 com um StringGrid.... [b:1475c64211]Chamei de Sgd[/b:1475c64211]


Finalmente no form1 em algum Botão que chamo o form2 Faço

¬0 o campo Items por se tratar de chave primária sera incrementado e o campo ID sera sempre igual , quando se trata de um mesmo pedido ou venda.... O Unico campo que não coloquei nenhum valor , foi o campo Valor_Unitário


No Form Principal , coloquei
Um SqlConection -->>> Um SqlQuery -->> chamei de Sql um DataSurce -->> chamei de Ds um DataSetProvider -->> chamei de Dps Um ClientDataSet -->> chamei de cds um DbGrdid -->> Ligado ao DataSorce ( Ds) Coloquei no Sqlquery a propriedade Sql Select * From MOLDURA


Um SqlQuery -->> chamei de SqlG um DataSurce -->> chamei de DsG um DataSetProvider -->> chamei de DpsG Um ClientDataSet -->> chamei de cdsG Observe que este G sera De Group É importante que a propriedade [poAllowCommandText] esteja em True NO DataSetProvider (DpsG) Não precisa colocar nenhuma instrução Sql No SqlG observe que so tem um sqlConnection... [b:1475c64211]Para os Dois SqlQuery[/b:1475c64211]


Coloco dois formulários O form1 com todos os componentes anteriores e o Form2 com um StringGrid.... [b:1475c64211]Chamei de Sgd[/b:1475c64211]


Finalmente no form1 em algum Botão que chamo o form2 Faço

cdsg.CommandText:=´´; cdsg.Close; cdsg.CommandText:=´Select Cod Produto,Descr Produto,Sum(Qauntidade) as Total ´+ ´From Moldura Where Id =:pId ´+ ´Group By Cod Produto,Descr Produto´; cdsg.Params.ParamByName(´pId´).AsInteger:=cds.fieldbyName(´ID´).AsInteger; cdsg.Execute; cdsg.Open; form2.ShowModal;


{O Que esta instrução faz...Ora , ele ira agrupar e somar.. Ate ai tudo bem}



No evento OnShow do Form2 Fiz o seguinte:

procedure TForm2.FormShow(Sender: TObject); var i:integer; begin Sgd.Cells[0,0]:=´Codigo_Moldura´; Sgd.Cells[1,0]:=´Descrição_Moldura´; Sgd.Cells[2,0]:=´Quantidade´; Sgd.Cells[3,0]:=´Valor_Unitario´; sgd.RowCount:=Form1.cdsG.RecordCount+1; i:=1; form1.cdsG.First; While not Form1.cdsG.Eof do begin Sgd.Cells[0,i]:=form1.cdsG.fieldByName(´Cod Produto´).AsString; Sgd.Cells[1,i]:=form1.cdsG.fieldByName(´Descr Produto´).AsString; Sgd.Cells[2,i]:=form1.cdsG.fieldByName(´Total´).AsString; form1.cdsG.Next; i:=i+1; end; end;[/quotD cdsg.CommandText:=´´; cdsg.Close; cdsg.CommandText:=´Select Cod Produto,Descr Produto,Sum(Qauntidade) as Total ´+ ´From Moldura Where Id =:pId ´+ ´Group By Cod Produto,Descr Produto´; cdsg.Params.ParamByName(´pId´).AsInteger:=cds.fieldbyName(´ID´).AsInteger; cdsg.Execute; cdsg.Open; form2.ShowModal;


{O Que esta instrução faz...Ora , ele ira agrupar e somar.. Ate ai tudo bem}



No evento OnShow do Form2 Fiz o seguinte:

procedure TForm2.FormShow(Sender: TObject); var i:integer; begin Sgd.Cells[0,0]:=´Codigo_Moldura´; Sgd.Cells[1,0]:=´Descrição_Moldura´; Sgd.Cells[2,0]:=´Quantidade´; Sgd.Cells[3,0]:=´Valor_Unitario´; sgd.RowCount:=Form1.cdsG.RecordCount+1; i:=1; form1.cdsG.First; While not Form1.cdsG.Eof do begin Sgd.Cells[0,i]:=form1.cdsG.fieldByName(´Cod Produto´).AsString; Sgd.Cells[1,i]:=form1.cdsG.fieldByName(´Descr Produto´).AsString; Sgd.Cells[2,i]:=form1.cdsG.fieldByName(´Total´).AsString; form1.cdsG.Next; i:=i+1; end; end;



Ainda coloquei este codigo para evitar erros acidentais de edição

procedure TForm2.SgdClick(Sender: TObject); begin if sgd.Col = 3 Then sgd.Options:=sgd.Options + [goEditing] else sgd.Options:=sgd.Options - [goEditing]





Por fim ,,, nesse momento do form2 , esta tudo agrupado , esperando somente o usuário digitar o valor de Preço unitario para cada Moldura

Feito isto em um Botão <pode também ser no fechamento do Form> Digite o seguinte codigo

procedure TForm2.Button1Click(Sender: TObject); var i:integer; begin form1.cds.CommandText:=´´; form1.cds.Close; for i:=1 to Sgd.RowCount-1 do begin form1.cds.CommandText:=´Update Moldura set Preco Unitario =:pNovoValor ´+ ´Where Cod Produto =:PCodigo´; form1.cds.Params.ParamByName(´pNovoValor´).AsString:=Sgd.Cells[3,i]; Form1.cds.Params.ParamByName(´PCodigo´).AsString:=Sgd.Cells[0,i]; Form1.cds.Execute; form1.cds.CommandText:=´´; end; Form1.cds.CommandText:=´select * From Moldura´; Form1.cds.Open; end;


e finalmente]


Ainda coloquei este codigo para evitar erros acidentais de edição

procedure TForm2.SgdClick(Sender: TObject); begin if sgd.Col = 3 Then sgd.Options:=sgd.Options + [goEditing] else sgd.Options:=sgd.Options - [goEditing]





Por fim ,,, nesse momento do form2 , esta tudo agrupado , esperando somente o usuário digitar o valor de Preço unitario para cada Moldura

Feito isto em um Botão <pode também ser no fechamento do Form> Digite o seguinte codigo

procedure TForm2.Button1Click(Sender: TObject); var i:integer; begin form1.cds.CommandText:=´´; form1.cds.Close; for i:=1 to Sgd.RowCount-1 do begin form1.cds.CommandText:=´Update Moldura set Preco Unitario =:pNovoValor ´+ ´Where Cod Produto =:PCodigo´; form1.cds.Params.ParamByName(´pNovoValor´).AsString:=Sgd.Cells[3,i]; Form1.cds.Params.ParamByName(´PCodigo´).AsString:=Sgd.Cells[0,i]; Form1.cds.Execute; form1.cds.CommandText:=´´; end; Form1.cds.CommandText:=´select * From Moldura´; Form1.cds.Open; end;


e finalmente é so fechar o formulário form2 que os valores digitados na coluna do preco no StringGrid ja estarão no campo Preco Unitario



Aqui eu não me preocupei na parte visual e nen tambouco com a validação dos dados < verificar se o que o usuário digitou é um valor preco válido , Por exemplo>


Teste este exemplo isolado , estude as etapas , e adpate as suas necessidades...
Cuidados para não comer os epaçoes vazios , na instruçãoes do ComandText do ClientDataSet



Boa sorte:


GOSTEI 0
Marco Salles

Marco Salles

22/10/2006

Ainda da duplicando partes de codigo :evil: :evil: :evil: :evil: :evil:


GOSTEI 0
Vitor5

Vitor5

22/10/2006

Amigo, que Aula que vc me deu hein....Coisa de mestre. Contudo isto acho impossível dar errado. Vou testar esta noite, pois faço isto nas horas de folga. Quanto a trabalhar com SimpleDataset e DataSorce, no meu caso que meu form de PEDIDO E ITENS, já estão pronto, devo começar a usar DatasetProvider,.... e outros que nem você mencionou???
Teria problema em trabalhar com SimpleDataset e DataSetProvider, digo usar os dois no DataModule?????Obrigado pelo super código


GOSTEI 0
Marco Salles

Marco Salles

22/10/2006

o SimpleDataSet é um conjunto de quatro componentes, e facilita a conexão rápida com banco de dados, indicado para criação de aplicações simples e protótipos....

Mas para o exemplo funcionar , voce deve fazer algumas alteraçoes:

1)
Coloque um [b:b65c8ebc49]SqlConnection[/b:b65c8ebc49] no Form Coloque para este exemplo [b:b65c8ebc49]Tres TsimpleDataSet [/b:b65c8ebc49]e aponte a propriedade Connection dos Tres para o SqlConnection


Chame o Primeiro de SpDs e o Segundo De SpDsG e o Terceiro de SpDsU


Na propriedade comandText do SpDs escreva Select * From Moldura


[b:b65c8ebc49]No Segundo SimpleDataSet escreva na propriedade ComandText [/b:b65c8ebc49]

Select Codigo_Moldura,Descricao_Moldura,Sum(Qauntidade) as Total From Moldura Where Id =:pId Group By Codigo_Moldura,Descricao_Moldura


em seguida Vá na propreidade Params <atenção : Abaixo da propriedade packRecork> e defina o tipo de parametro
DataType -->>>String Name -->>> PId


[b:b65c8ebc49]No terceiro SimpleDataSet escreva na propriedade ComandText [/b:b65c8ebc49]


Update Moldura set Valor_Unitario =:pNovoValor Where Codigo_Moldura =:PCodigo


em seguida Vá na propreidade Params <atenção : Abaixo da propriedade packRecork> e defina os tipos de parametros
DataType -->>>String Name -->>> pNovoValor DataType -->>>String Name -->>> pCodigo


Agora escreva os seguintes Codigos:

procedure TForm1.Button1Click(Sender: TObject);
begin
spdsg.Close;
Spdsg.Params[0].AsInteger:=SpDs.fieldbyName(´ID´).AsInteger;
Spdsg.Open;
form2.ShowModal;
end;

e para carregar os valores

procedure TForm2.FormShow(Sender: TObject); var i:integer; begin Sgd.Cells[0,0]:=´Codigo_Moldura´; Sgd.Cells[1,0]:=´Descrição_Moldura´; Sgd.Cells[2,0]:=´Quantidade´; Sgd.Cells[3,0]:=´Valor_Unitario´; sgd.RowCount:=Form1.SpDsG.RecordCount+1; i:=1; form1.SpdsG.First; While not Form1.SpdsG.Eof do begin Sgd.Cells[0,i]:=form1.SpdsG.fieldByName(´Codigo_Moldura´).AsString; Sgd.Cells[1,i]:=form1.SpdsG.fieldByName(´Descricao_Moldura´).AsString; Sgd.Cells[2,i]:uote]Update Moldura set Valor_Unitario =:pNovoValor Where Codigo_Moldura =:PCodigo


em seguida Vá na propreidade Params <atenção : Abaixo da propriedade packRecork> e defina os tipos de parametros
DataType -->>>String Name -->>> pNovoValor DataType -->>>String Name -->>> pCodigo


Agora escreva os seguintes Codigos:

procedure TForm1.Button1Click(Sender: TObject);
begin
spdsg.Close;
Spdsg.Params[0].AsInteger:=SpDs.fieldbyName(´ID´).AsInteger;
Spdsg.Open;
form2.ShowModal;
end;

e para carregar os valores

procedure TForm2.FormShow(Sender: TObject); var i:integer; begin Sgd.Cells[0,0]:=´Codigo_Moldura´; Sgd.Cells[1,0]:=´Descrição_Moldura´; Sgd.Cells[2,0]:=´Quantidade´; Sgd.Cells[3,0]:=´Valor_Unitario´; sgd.RowCount:=Form1.SpDsG.RecordCount+1; i:=1; form1.SpdsG.First; While not Form1.SpdsG.Eof do begin Sgd.Cells[0,i]:=form1.SpdsG.fieldByName(´Codigo_Moldura´).AsString; Sgd.Cells[1,i]:=form1.SpdsG.fieldByName(´Descricao_Moldura´).AsString; Sgd.Cells[2,i]:=form1.SpdsG.fieldByName(´Total´).AsString; form1.SpDsG.Next; i:=i+1; end; end;


e para salvar os valores

procedure TForm2.Button1Click(Sender: TObject); var i:integer; begin form1.SpDsU.Close; for i:=1 to Sgd.RowCount-1 do begin form1.SpdsU.Params[0].AsString:=Sgd.Cells[3,i]; Form1.SpdsU.Params[1].AsString:=Sgd.Cells[0,i]; Form1.SpdsU.Execute; form1.SpdsU.close; end; Form1.Spds.DataSet.CommandText:=´´; Form1.Spds.Close; Form1.Spds.DataSet.CommandText:=´select * From Moldura´; Form1.Spds.Open; end;


O segredo é voce adaptar isto á sua necessidade....


GOSTEI 0
Vitor5

Vitor5

22/10/2006

Boa noite amigo, estou de volta com mais duvidas!!!
Será que aqui tem um erro???
e para carregar os valores

e para carregar os valores

Citação:
procedure TForm2.FormShow(Sender: TObject);
var
i:integer;
begin
Sgd.Cells[0,0]:=´Codigo_Moldura´;
Sgd.Cells[1,0]:=´Descrição_Moldura´;
Sgd.Cells[2,0]:=´Quantidade´;
Sgd.Cells[3,0]:=´Valor_Unitario´;
sgd.RowCount:=Form1.SpDsG.RecordCount+1;
i:=1;
form1.SpdsG.First;
While not Form1.SpdsG.Eof do
begin
Sgd.Cells[0,i]:=form1.SpdsG.fieldByName(´Codigo_Moldura´).AsString;
Sgd.Cells[1,i]:=form1.SpdsG.fieldByName(´Descricao_Moldura´).AsString;
[b:a620855002]Sgd.Cells[2,i]:uote]Update Moldura set Valor_Unitario =:pNovoValor [/b:a620855002]
Where Codigo_Moldura =:PCodigo

Bem, acho que a coisa é por aí, mas delculpe o tormento. Tenho algumas duvidas com parametros ainda, no meu form ainda não havia mexido com isto. Bom quanto ao SqlConection e com simpledataset, aqui no meu delphi não preciso usar SqlConnection com o simpledataset, o próprio simpledataset faz a conexão com o banco através da propriedade ´Connection´. Tenho no meu banco de dados uma tabela para Controle de Sequencia, que controla todos os numeros de autonumeração da tabela. Nesta tabela tenho um campo Registro onde é a chave primaria desta tabela, e muitos outros como ´ Cod_Fornecedor, Cod_Cliente........Numero_Pedido, RegistroItensPedido.... Teria como criar um um parametro referente a estes campos?????. Dá pra dar uma luizinha????


GOSTEI 0
Vitor5

Vitor5

22/10/2006

No meu form de pedido tenho um botão adiconar onde tem o seguinte código....
procedure TformPedidos.btnadicionarClick(Sender: TObject);
var
intNumeroPedido:integer;
begin
inherited;
if Sender = btnAdicionar then
begin
try

dm.sdsControle.Edit;
dm.sdsControleNUMERO_PEDIDO.AsInteger:=dm.sdsControleNUMERO_PEDIDO.AsInteger +1;
dm.sdsControle.Post;
dm.sdsControle.ApplyUpdates(-1);
intNumeroPedido:=dm.sdsControleNUMERO_PEDIDO.asinteger;

dm.sdsPedidos.Append;
dm.sdsPedidosDATA_PEDIDO.AsDateTime:=date;
dm.sdsPedidosNUMERO_PEDIDO.AsInteger:=intNumeropedido;
grpItensPedido.Enabled:=true;
dbLookupVendedor.Enabled:=true;
dbLookupArquitetos.Enabled:=true;
dbLookupClientes.Enabled:=true;
fldModelos.KeyValue:=´´;
chrModo:=´I´;
except
msgStatus(´´);
Mensagem(´Impossível adicionar novo registro!´);
end;
end
else if Sender = btnEditar then
begin
try
dm.sdsPedidos.Edit;
dm.sdsItensPedido.Edit;
chrModo:=´A´;
except
msgStatus(´´);
Mensagem(´Impossível entrar no modo de edição!´);
end;

end;
grpItensPedido.Enabled:=true;
dbLookupVendedor.Enabled:=true;
dbLookupArquitetos.Enabled:=true;
dbLookupClientes.Enabled:=true;

MoveFoco;
LimpaProdutos;
end;
E tenho também um botão para incluir os Itens
....procedure TformPedidos.btnIncluirClick(Sender: TObject);
var
strComodos,strDim1,strDim2,strProdutos,
strModelo,strMl,strM2,strQtde:string;
strCodProd:integer;
intRegistro:integer;
begin
if Trim(fldComodos.Caption)= ´´ then
Mensagem(´Selecione um cômodo para incluir no pedido!´)

else
begin
if Trim(fldProduto.Caption) =´´ then
Mensagem(´Selecione um produto para incluir no pedido!´)
else
begin

if Trim(fldQtde.Text) =´´ then
Mensagem(´Digite uma quantidade para incluir no pedido!´)


else
Begin
strComodos:=Trim(fldComodos.Caption);
strDim1:=(Trim(fldDim1.Text));
strDim2:=(Trim(fldDim2.Text));
strProdutos:=(trim(fldProduto.Caption));
strCodProd:=dm.sdsDescricaoCODIStatus(´´);
Mensagem(´Impossível entrar no modo de edição!´);
end;

end;
grpItensPedido.Enabled:=true;
dbLookupVendedor.Enabled:=true;
dbLookupArquitetos.Enabled:=true;
dbLookupClientes.Enabled:=true;

MoveFoco;
LimpaProdutos;
end;
E tenho também um botão para incluir os Itens
....procedure TformPedidos.btnIncluirClick(Sender: TObject);
var
strComodos,strDim1,strDim2,strProdutos,
strModelo,strMl,strM2,strQtde:string;
strCodProd:integer;
intRegistro:integer;
begin
if Trim(fldComodos.Caption)= ´´ then
Mensagem(´Selecione um cômodo para incluir no pedido!´)

else
begin
if Trim(fldProduto.Caption) =´´ then
Mensagem(´Selecione um produto para incluir no pedido!´)
else
begin

if Trim(fldQtde.Text) =´´ then
Mensagem(´Digite uma quantidade para incluir no pedido!´)


else
Begin
strComodos:=Trim(fldComodos.Caption);
strDim1:=(Trim(fldDim1.Text));
strDim2:=(Trim(fldDim2.Text));
strProdutos:=(trim(fldProduto.Caption));
strCodProd:=dm.sdsDescricaoCODIGO_DESCRICAO.AsInteger;
strMl:=(trim(fldTotalMl.Caption));
strM2:=(trim(fldTotalM2.Caption));
strModelo:=(Trim(fldModelos.Text));
strQtde:=(trim(fldQtde.Text));

dm.sdsControle.Edit;
dm.sdsControleREGISTRO_ITEM_PEDIDO.AsInteger:=
dm.sdsControleREGISTRO_ITEM_PEDIDO.AsInteger +1;
dm.sdsControle.Post;
dm.sdsControle.ApplyUpdates(-1);
intRegistro:=dm.sdsControleREGISTRO_ITEM_PEDIDO.AsInteger;

dm.sdsItensPedido.Append;
dm.sdsItensPedidoRegistro.asInteger:=intRegistro;

dm.sdsItensPedidoCOMODOS.AsString:=strComodos;
dm.sdsItensPedidoDIM1.AsString:=strDim1;
dm.sdsItensPedidoDIM2.AsString:=strDim2;
dm.sdsItensPedidoNOME_PROD.AsString:=strProdutos;
dm.sdsItensPedidoCOD_PROD.AsInteger:=strCodProd;
dm.sdsItensPedidoML.AsString:=strMl;
dm.sdsItensPedidoM2.AsString:=strM2;
dm.sdsItensPedidoMODELO.AsString:=strModelo;
dm.sdsItensPedidoQTDE.AsString:=strQtde;

LimpaProdutos;
end;
end;
end;
end;
E no botão gravar tenho......
procedure TformPedidos.btnGravarClick(Sender: TObject);
var
strCliente:string;
Formulario: tformRecebimentos;
begGO_DESCRICAO.AsInteger;
strMl:=(trim(fldTotalMl.Caption));
strM2:=(trim(fldTotalM2.Caption));
strModelo:=(Trim(fldModelos.Text));
strQtde:=(trim(fldQtde.Text));

dm.sdsControle.Edit;
dm.sdsControleREGISTRO_ITEM_PEDIDO.AsInteger:=
dm.sdsControleREGISTRO_ITEM_PEDIDO.AsInteger +1;
dm.sdsControle.Post;
dm.sdsControle.ApplyUpdates(-1);
intRegistro:=dm.sdsControleREGISTRO_ITEM_PEDIDO.AsInteger;

dm.sdsItensPedido.Append;
dm.sdsItensPedidoRegistro.asInteger:=intRegistro;

dm.sdsItensPedidoCOMODOS.AsString:=strComodos;
dm.sdsItensPedidoDIM1.AsString:=strDim1;
dm.sdsItensPedidoDIM2.AsString:=strDim2;
dm.sdsItensPedidoNOME_PROD.AsString:=strProdutos;
dm.sdsItensPedidoCOD_PROD.AsInteger:=strCodProd;
dm.sdsItensPedidoML.AsString:=strMl;
dm.sdsItensPedidoM2.AsString:=strM2;
dm.sdsItensPedidoMODELO.AsString:=strModelo;
dm.sdsItensPedidoQTDE.AsString:=strQtde;

LimpaProdutos;
end;
end;
end;
end;
E no botão gravar tenho......
procedure TformPedidos.btnGravarClick(Sender: TObject);
var
strCliente:string;
Formulario: tformRecebimentos;
begin
inherited;

strCliente:=dbLookupClientes.Text;


dm.sdsPedidosNOME_CLIENTE.AsString:=strCliente;
dm.sdsPedidos.Post;
dm.sdsPedidos.ApplyUpdates(-1);

dm.sdsItensPedido.Edit;
dm.sdsItensPedidoNUMERO_PEDIDO.AsInteger:=dm.sdsPedidosNUMERO_PEDIDO.AsInteger;
dm.sdsItensPedido.Post;
dm.sdsItensPedido.ApplyUpdates(-1);

grpItensPedido.Enabled:=false;
dbLookupClientes.Enabled:=false;
dbLookupArquitetos.Enabled:=false;
dbLookupVendedor.Enabled:=false;
Vamos supor que: Antes de gravar ele teria que abrir o form que chamo de recebimento( onde seria digitado o preço e ......). E para o evento ondblClick do grid do meu form de pedido tenho o seguinte codigo....
procedure TformPedidos.dbGridItensDblClick(Sender: TObject);
begin
inherited;
btnEditar.Click;
btnIncluir.Enabled:=false;
fldComodos.Caption:=´´;
fldComodos.Caption:=dm.sdsItenspedidoComodos.asString;
fldDim1.Text:=dm.sdsItensPedidoDIM1.AsString;
fldDim2.Text:=dm.sdsItensPedidoDIM2.AsString;
fldProduto.Caption:=dm.sdsItensPedidoNOME_PROD.AsString;
fldModelos.KeyValue:=dm.sdsItensPedidoMODELO.AsString;
fldTotalMl.Caption:=dm.sdsItensPedidoML.AsString;
fldTotalM2.Captin
inherited;

strCliente:=dbLookupClientes.Text;


dm.sdsPedidosNOME_CLIENTE.AsString:=strCliente;
dm.sdsPedidos.Post;
dm.sdsPedidos.ApplyUpdates(-1);

dm.sdsItensPedido.Edit;
dm.sdsItensPedidoNUMERO_PEDIDO.AsInteger:=dm.sdsPedidosNUMERO_PEDIDO.AsInteger;
dm.sdsItensPedido.Post;
dm.sdsItensPedido.ApplyUpdates(-1);

grpItensPedido.Enabled:=false;
dbLookupClientes.Enabled:=false;
dbLookupArquitetos.Enabled:=false;
dbLookupVendedor.Enabled:=false;
Vamos supor que: Antes de gravar ele teria que abrir o form que chamo de recebimento( onde seria digitado o preço e ......). E para o evento ondblClick do grid do meu form de pedido tenho o seguinte codigo....
procedure TformPedidos.dbGridItensDblClick(Sender: TObject);
begin
inherited;
btnEditar.Click;
btnIncluir.Enabled:=false;
fldComodos.Caption:=´´;
fldComodos.Caption:=dm.sdsItenspedidoComodos.asString;
fldDim1.Text:=dm.sdsItensPedidoDIM1.AsString;
fldDim2.Text:=dm.sdsItensPedidoDIM2.AsString;
fldProduto.Caption:=dm.sdsItensPedidoNOME_PROD.AsString;
fldModelos.KeyValue:=dm.sdsItensPedidoMODELO.AsString;
fldTotalMl.Caption:=dm.sdsItensPedidoML.AsString;
fldTotalM2.Caption:=dm.sdsItensPedidoM2.AsString;
fldQtde.Text:=dm.sdsItensPedidoQTDE.AsString;

end;
Este evento me traz os codigos devolta nos edits para serem editados, achei que isto me resolve. O princípio usado é de continuar a usar o simpledataset e o data sorce.Obrigado Vitor5


GOSTEI 0
Vitor5

Vitor5

22/10/2006

Os campos de minha tabela de itens são....
Registro.....Integer...NotNull......chavePrimaria
NumeroPedido......Integer....NOtNull
Comodos......VarChar.......
Dim1............VarChar....
Dim2............VarChar.....
Ml.................VarChar.....
M2................VarChar...
Cod_Prod......VarChar....
Nome_Prod...VarChar....
Qtde.............VarChar....(Usei como varchar por usar 10,20....)
Preco............VarChar...
E minha tabela de Pedidos tenho.......
Numero_Pedido....Integer.....NotNull ....chavePrimaria
Data_Pedido........Date
Código_Cliente....integer
Código_Vendedor....Integer
Nome_Cliente.........VarChar
Vendedor...............VarChar
Nome_Usuario........VarChar
ValorTotal..............Decimal
Forma_Pagamento ...VarChar
Desc.........................VarChar
Acrescimo.................VarChar
Valor_Mão_Obra........VarChar
:oops: E aí o que fazer????Sei que há diversas formas de programar, cada um pensa de um jeito, mas dei uma enroscada ´Bonita´ neste form hein.........


GOSTEI 0
Marco Salles

Marco Salles

22/10/2006

Amigo , tuto que eu tinha para comentar nesse tópico eu ja comentei...
Com fazer um agrupamento com ClientDatase e posteriormente com SimpleDataSet , Com carrregar no StringGrid com ClientDataSet e posteriormente com SimploDataSet , Como Faer um Updata Com clienteDaTaSet e posteriormente com SimpleDataSet...enfim...

Porém quanto a sua afriamção:

Bom quanto ao SqlConection e com simpledataset, aqui no meu delphi não preciso usar SqlConnection com o simpledataset, o próprio simpledataset faz a conexão com o banco através da propriedade ´Connection´.

[b:96525d6665]Se voce quiser usar o SimpleDataSet , e escolher um connection.ConnectionName , cada SimpleDataSet Terá sua conexão interna. Voce pode ter uma única aplicação consumindo dezenas de conexões com o servidor SQl , que alem do numero de licenças entre outros , será um grande problema[/b:96525d6665]
Então amigo , o aconselhável é usar no DataModulo um SqlConnection e ligar os SimpleDataSet nele

Boa sorte


GOSTEI 0
Vitor5

Vitor5

22/10/2006

Desculpe minha falta de conhecimento, só pra encerrar este forum, você poderia me dizer como fazer esta conexão no datamodule suando um sql connection. O Tico e o Teco estão meio perdidos!


GOSTEI 0
Marco Salles

Marco Salles

22/10/2006

Não ha de que amigo...

é simples...

Quando eu disse DataModulo é na verdade uma especie de um formulário , aonde a gente tem por praxi colocar todos os componentes de conexão ... Para ficar mais agrupado e organizado , facilitando assim a manutenção de nossos aplicativos.. Procure no seu Delphi sobre DataModulo e o adicione ao seu Projeto. Com eu disse anteriormente é como se fosse um formulário

Nesse DataModulo , voce coloca todos os seus TsimpleDataSet e na propriedade SqlConnection do seus SimpleDataSet voce aponte para o componente SqlConnection... Voce deve configurar apenas o SqlConnetion para que este se comuninque com o Banco.. .

Não acho que voce deva interroper este tópico , a não ser que julgue necessário... O que eu lhe disse no meu ultimo post é que voce deveria tentar entender o que lhe passei , mesmo que o banco seje diferentes , mesmo que não seje exatamente o que voce precise de imediato... Mas voce teria a partir disso , algo que lhe daria suporte para que voce estende-sse no proximo passo para a sua real necessidade...
Esperaria que voce fisseze o seguinte:
´Olha Marcos fiz como voce falou , criei o seu banco , inseri os componentes , configure etc.. mas esta dando este erro etc..´
Isto seria mais fácil a nossa comunicação , pois estariamos falando uma mesma linguagem;;

Mas não desita e aproveite o feriado

Boa sorte


GOSTEI 0
Vitor5

Vitor5

22/10/2006

Continuo agradecendo por sua paciência. Quanto ao datamodule isto eu sei, tenho em meu projeto. Talvez não tenha me expressado direito. O sqlConnection faz a ligação com banco de dados. Criei uma conexão chamada de Conexão(faz a ligação com meu banco). Se eu colocar um sqlConnection, na sua propriedade ConnectionName eu aponto para ´Conexão´. Até aí tudo bem, só que o simpledataset da paleta do dbExpress, no meu aqui não tem como ligar ao sqlConnection. Não sei se entendeu minha dúvida referente a isto. Quanto ao executar os códigos estou tentando mais não há um erro aqui
Citação:
procedure TForm2.FormShow(Sender: TObject);
var
i:integer;
begin
Sgd.Cells[0,0]:=´Codigo_Moldura´;
Sgd.Cells[1,0]:=´Descrição_Moldura´;
Sgd.Cells[2,0]:=´Quantidade´;
Sgd.Cells[3,0]:=´Valor_Unitario´;
sgd.RowCount:=Form1.cdsG.RecordCount+1;
i:=1;
form1.cdsG.First;
While not Form1.cdsG.Eof do
begin
Sgd.Cells[0,i]:=form1.cdsG.fieldByName(´Cod Produto´).AsString;
Sgd.Cells[1,i]:=form1.cdsG.fieldByName(´Descr Produto´).AsString;
Sgd.Cells[2,i]:=form1.cdsG.fieldByName(´Total´).AsString;
form1.cdsG.Next;
i:=i+1;
end;
[b:557db7d294]end;[¬ Moldura Where Id =:pId ´+ [/b:557db7d294]
´Group By Cod Produto,Descr Produto´;
cdsg.Params.ParamByName(´pId´).AsInteger:=cds.fieldbyName(´ID´).AsInteger;
cdsg.Execute;
cdsg.Open;
[b:557db7d294]form2.ShowModal; [/b:557db7d294]Neste caso aqui estou usando :
[b:557db7d294] begin
if (Application.FindComponent(´formRecebimentos´)=nil) then
begin
Formulario:=tformRecebimentos.Create(Application);[/b:557db7d294]
Para abrir o formulario. Estou partindo de fazer o teste usando sqlquery, datasetprovider, clientedataset.....Obrigado


GOSTEI 0
Marco Salles

Marco Salles

22/10/2006

Até aí tudo bem, só que o simpledataset da paleta do dbExpress, no meu aqui não tem como ligar ao sqlConnection.


Tem sim... É que voce deve estar tentando acessar a propriedade Nem
ConnectionName do SimpleDataSet

No objeto Inspector , na Propreidade Connection do SimpleDataSet , aonde vem geralmete inscrito :
[b:bbe14f6263]
SimpleDataSet1.InternalConnection troque por NomeDoSeuSqlConnection
[/b:bbe14f6263]

Quanto ao executar os códigos estou tentando mais não há um erro aqui

Não entendi qual o erro ???
[b:bbe14f6263]Para abrir o formulario. Estou partindo de fazer o teste usando sqlquery, datasetprovider, clientedataset.....Obrigado[/b:bbe14f6263]
partindo :?: :?: ???Não consegui entender o que voce escreveu ??


GOSTEI 0
Vitor5

Vitor5

22/10/2006

Amigo, erro de minha parte referente ao simpledataset e sqlconnection. Agora que vc deu a dica, deu pra entender esta parte. Neste momento estou tentando usar com o simpledataset e sqlConection, mas acho que aqui ainda tem um erro ........
procedure TformRecebimentos.FormShow(Sender: TObject);
var
i:integer;
begin
inherited;
sgd.Cells[0,0]:=´Cod_Prod´;
sgd.Cells[1,0]:=´Nome_Prod´;
sgd.Cells[2,0]:=´Qtde´;
sgd.Cells[3,0]:=´Preco´;
sgd.RowCount:=dm.sdsG.RecordCount +1;
i:=1;
dm.sdsG.First;
while not dm.sdsG.Eof do
begin
sgd.Cells[0,i]:=dm.sdsG.fieldByName(´Cód_Prod´).AsString;
sgd.Cells[1,i]:=dm.sdsG.fieldByName(´Nome_Prod´).AsString;
sgd.Cells[3,i]:=Update Itens set Preco =pNovoValor
Where Cod_Prod =pCodigo;
i:=i +1;
O erro que está dando é imcompatible type string and procedure..Sabe me dizer por que, este código copie de seu exemplo usando o simpledataset que está neste forum


GOSTEI 0
Vitor5

Vitor5

22/10/2006

Esqueci de dizer que o erro está aqui:
sgd.Cells[3,i]:=Update Itens set Preco =pNovoValor
Where Cod_Prod =pCodigo;[b:c7b1953a01]. Já tentei de várias formas[/b:c7b1953a01]


GOSTEI 0
Marco Salles

Marco Salles

22/10/2006

ja temos um avanço

Acontece que no dia que eu postei este tópico o site estava meio doido.. Duplicando várias partes e comendo outra.. No formShow Voce so Carrega o StringGrid

procedure TForm2.FormShow(Sender: TObject); var i:integer; begin Sgd.Cells[0,0]:=´Codigo_Moldura´; Sgd.Cells[1,0]:=´Descrição_Moldura´; Sgd.Cells[2,0]:=´Quantidade´; Sgd.Cells[3,0]:=´Valor_Unitario´; sgd.RowCount:=Form1.SpDsG.RecordCount+1; i:=1; form1.SpdsG.First; While not Form1.SpdsG.Eof do begin Sgd.Cells[0,i]:=form1.SpdsG.fieldByName(´Codigo_Moldura´).AsString; Sgd.Cells[1,i]:=form1.SpdsG.fieldByName(´Descricao_Moldura´).AsString; Sgd.Cells[2,i]:=form1.SpdsG.fieldByName(´Total´).AsString; form1.SpDsG.Next; i:=i+1; end; end;


Não tem nesse evento nenhum Update... O update e a proxima eatapa , depois que voce digitar no StringGrid.. [b:6750adf62f]Tente carregar ai[/b:6750adf62f]


GOSTEI 0
Vitor5

Vitor5

22/10/2006

Amigo, já vi vc entende, já tem livros escritos????Se tiver me avisa que irei comprar. Comecei a gostar da coisa, não sei se como você disse tinha erros por causa do site, estava meio confuso ali, mas agora a coisa começou a melhorar. O princípio usado é de continuar a usar o simpledataset.
Criei o meu form de Pedidos e Itens Pedido. No form Itens Pedido tenho um botão Incluir os itens. Coloquei um botão para abrir o segundo form onde chamei de formRecebimentos.
Só que quando abro o formRecebimentos ele abre legal e carrega aquilo que nós estávamos estudando(stringGrid), só que os dados da tabela itens desaparecem, mas deve ser alguma coisa fácil de resolver.
Agora quanto ao código para devolver ao formItens, como ficará, sabendo que no site teve aquele erros de duplicação?????Obrigado


GOSTEI 0
Marco Salles

Marco Salles

22/10/2006

Não era para desaparecer nada ... Porque o exemplo que lhe passei se usa tres simpleDataSet ligados a tabela pedidos.. Vamos recordar

:

Coloque um SqlConnection no Form Coloque para este exemplo Tres TsimpleDataSet e aponte a propriedade Connection dos Tres para o SqlConnection


Citação:
Chame o Primeiro de SpDs e o Segundo De SpDsG e o Terceiro de SpDsU




[b:390f63703f][color=darkred:390f63703f]*******ATENÇÃO :::: Digamos que este seja o seu DataSet Principal ***
Aonde estão os Dados da Tabela Items[/color:390f63703f][/b:390f63703f]

Citação:
Na propriedade comandText do SpDs escreva Select * From Moldura



No Segundo SimpleDataSet escreva na propriedade ComandText

Citação: Select Codigo_Moldura,Descricao_Moldura,Sum(Qauntidade) as Total From Moldura Where Id =:pId Group By Codigo_Moldura,Descricao_Moldura


em seguida Vá na propreidade Params <atenção : [b:390f63703f]Abaixo da propriedade packRecork>[/b:390f63703f] e defina o tipo de parametro Citação: DataType -->>>String Name -->>> PId


No terceiro SimpleDataSet escreva na propriedade ComandText


Citação: Update Moldura set Valor_Unitario =:pNovoValor Where Codigo_Moldura =:PCodigo


em seguida Vá na propreidade Params <atenção : [b:390f63703f]Abaixo da propriedade packRecork> [/b:390f63703f]e defina os tipos de parametros Citação: DataType -->>>String Name -->>> pNovoValor DataType -->>>String Name -->>> pCodigo


Então .. O que voce estamos tentando fazer:::
1)Apresentar os dados no Formulario Atraves de um SimpleDataSet 2)Agrupar estes Dados Segundo algum Critério usando O Segundo SimpleDataSet 3)Com os Dados do segundo SimpleDataSet iremos abrir um formulário que contém um StringGrid 4)Editamos dados no StringGrid e apos isso , usando uma instruçao do Terceiro SimpleDataSet Fazemos uma Operação de Update na tabela ****No Final dessa etapa , note que no codigo que lhe passei , executo novamente uma instrução Sql no SimpleDataSet1 (Principal) a fim de atualizar os dados que foram alterados com a instrução Update do Terceiro SimpleDataSet


Quanto ao Codigo ele esta bem descriminado no t¬
DataType -->>>String
Name -->>> PId


No terceiro SimpleDataSet escreva na propriedade ComandText


Citação: Update Moldura set Valor_Unitario =:pNovoValor Where Codigo_Moldura =:PCodigo


em seguida Vá na propreidade Params <atenção : [b:390f63703f]Abaixo da propriedade packRecork> [/b:390f63703f]e defina os tipos de parametros Citação: DataType -->>>String Name -->>> pNovoValor DataType -->>>String Name -->>> pCodigo


Então .. O que voce estamos tentando fazer:::
1)Apresentar os dados no Formulario Atraves de um SimpleDataSet 2)Agrupar estes Dados Segundo algum Critério usando O Segundo SimpleDataSet 3)Com os Dados do segundo SimpleDataSet iremos abrir um formulário que contém um StringGrid 4)Editamos dados no StringGrid e apos isso , usando uma instruçao do Terceiro SimpleDataSet Fazemos uma Operação de Update na tabela ****No Final dessa etapa , note que no codigo que lhe passei , executo novamente uma instrução Sql no SimpleDataSet1 (Principal) a fim de atualizar os dados que foram alterados com a instrução Update do Terceiro SimpleDataSet


Quanto ao Codigo ele esta bem descriminado no tópicos anteriores.. O mais importante é voce entender o raciocineo que lhe passei...
Se mesmo assim voce não conseguir acha-lo , eu posto novamente

[b:390f63703f]Voce esta quase conseguindo...[/b:390f63703f]


GOSTEI 0
Vitor5

Vitor5

22/10/2006

Você já tem alguém tão difícil de entender como eu....rsrs
Marcos, o que vc me ensinou está perfeito. Na verdade quando disse para usar o form2.ShowModal, ele dava um erro. Como estou usando formulários do tipo filho(MDIChild) o erro pode ser de meu código, na verdade não auterei em nada meu codigo, somente acrescentei sobre o que me disse.
Quando dou um click no botão para abrir o form2 (eles desaparecem do form Principal), mas carrega os dados (agrupa os itens no segundo form normal). Deve ser algum erro de meu código. Depois de agrupado como trazer e atualizar a tabela????


GOSTEI 0
Vitor5

Vitor5

22/10/2006

Esqueci de dizer que uso assim para abrir o form:
procedure TformPedidos.BitBtn1Click(Sender: TObject);
var
Formulario: tformRecebimentos;
begin
inherited;
dm.sdsG.Close;
dm.sdsG.Params[0].AsInteger :=dm.sdsItensPedido.fieldByName(´Numero_Pedido´).AsInteger;
dm.sdsG.Open;
[color=red:b1ae63d540]begin
if (Application.FindComponent(´formRecebimentos´)=nil) then
begin
Formulario:=tformRecebimentos.Create(Application);[/color:b1ae63d540]
Como vc faz para no forum ficar tudo organizado nas citações????Acho Legal o jeito que você faz


GOSTEI 0
Marco Salles

Marco Salles

22/10/2006

Esqueci de dizer que uso assim para abrir o form:


[color=darkred:c0f588053b][b:c0f588053b]Importante e curioso[/b:c0f588053b][/color:c0f588053b]Se voce estiver
trabalhando com MDI , o form so pode ser Chamado na forma ShowModal se ele tiver com FormStyl:=fsNormal Além disso a propriedade Visible desse formulário tem que estar Cetada em False...


Para chamar o Form faça assim:Coloque ele com FormStyl:=fsNormal e faça ssim:

try FormQueVouChamar:=TformQueVouChamer.Create(nil); FormQueVouChamar.ShowmOdal; finally FormQueVouChamar.Releas; end;



[color=darkred:c0f588053b][b:c0f588053b]para salver os valores :[/b:c0f588053b][/color:c0f588053b]

procedure TForm2.Button1Click(Sender: TObject); var i:integer; begin form1.SpDsU.Close; for i:=1 to Sgd.RowCount-1 do begin form1.SpdsU.Params[0].AsString:=Sgd.Cells[3,i]; Form1.SpdsU.Params[1].AsString:=Sgd.Cells[0,i]; Form1.SpdsU.Execute; form1.SpdsU.close; end; Form1.Spds.DataSet.CommandText:=´´; Form1.Spds.Close; Form1.Spds.DataSet.CommandText:=´select * From Moldura´; Form1.Spds.Open; end;


Como vc faz para no forum ficar tudo organizado nas citações????Acho Legal o jeito que você faz


Acima da caixa de mensagem <Aonde Voce escreve> Tem ums Botoes
B / U quote Code etc... Marque o texto que voce quer e click nun desse botões

A outra dúvida :::

Quando dou um click no botão para abrir o form2 (eles desaparecem do form Principal), mas carrega os dados (agrupa os itens no segundo form normal).

O que desaparece ???? Os dados ????


GOSTEI 0
Vitor5

Vitor5

22/10/2006

Sim os dados do formPrincipal(Que seria da tabela Itens)Será que não pode ser por causa do formMDIChild?????


GOSTEI 0
Marco Salles

Marco Salles

22/10/2006

Sim os dados do formPrincipal(Que seria da tabela Itens)Será que não pode ser por causa do formMDIChild?????


Não.. Faça um teste antee e comunique...

Execute o Agrupamento , mas não chame o formulário

e veja se os dados aida continuam lá


GOSTEI 0
Vitor5

Vitor5

22/10/2006

Sim, antes de abrir ele ainda mantem os dados


GOSTEI 0
Marco Salles

Marco Salles

22/10/2006

Então faça a segunda experiencia

agrupe e chame o form .. Mas não carregue o StringGri


GOSTEI 0
Vitor5

Vitor5

22/10/2006

O erro que dá está na hora de clicar no botão para devolver o codigo para o form principal....Eis o erro

You have received the following message:

Project xxxx raised exception class yyyyy with message ´zzzzzz´.

Process stopped. Use Step or Run to continue.

Mas sou Brasileiro e não devo desistir nunca, sei que vai dar certo


GOSTEI 0
Marco Salles

Marco Salles

22/10/2006

Bem , ja esta quase no final...

O erro que dá está na hora de clicar no botão para devolver o codigo para o form principal....Eis o erro


Coloque o codigo que voce esta usando <com a sua terminologia> aonde voce faz o Update....

Mas lembre-se de que criamos ou pelo menos voce deveria ter criado parametros no SimpleDataSet.. Alem do mais , esses paramentros devem ter o tipo de dados definidos corretamente <Ver a mensagem aonde foi postado isso>
Lembre-se por fim que no Objeto Inspctor Do TsimpleDataSet tem ´Duas´
propriedade Params a que me refiro é aquela que fica abaixo do PacketRecorts

Também no formulário principal ,< depois de conferido esses parametros bem como o seu tipo >, antes de voce ir para o novo formulário , faça um teste simples com seu Update..
Escreva por exemplo em Um Botão:
procedure TForm2.Button1Click(Sender: TObject);
var i:integer; begin //Sql Do SimplDataSet que ira gerar o Update... Esta Sql //ja fora definitivamente Gerado na propriedade ComandText SeuDataSetUpadate.Close; Colq AQUI um valor Text Válido; SeuDataSetUpadate.Params[0].AsString:=´AQUI valor´; //Colo aqui uma condição válida SeuDataSetUpadate.Params[1].AsString:=´AQUI condição´ SeuDataSetUpadate.Execute; SeuDataSetUpadate.close; //Sql do TsimpleDataSetPrincipal SeuDataSetPrincipal.DataSet.CommandText:=´´; Close; SeuDataSetUpadate.CommandText:=´select * From Moldura´; SeuDataSetUpadate.Open; end;


Boa sorte...


GOSTEI 0
Vitor5

Vitor5

22/10/2006

Olá tudo bem. Com esta super ajuda que vem me dando, também acho que logo conseguirei.
Quanto ao parametro está na propriedade params abaixo da PacketRecords como me falou, o tipo de parametro aqui colocado foi o ´ftString´. Está correto?
Quanto a erro que vem dando que seria este erro????
Deixo explicar melhor como está meu form, para ver se pode haver algum erro aqui.
O formPrincipal que é ´Pedidos´, ele está abrindo suas tabelas no onSHow, só que seus campos estão bloqueados(não podem ser editados ou acrescentado desde que seja apertado o botão adicionar, editar etc....
Quando dou botão adicionar ele permite que seja editado as tabelas. Neste form tenho a seção itensPedido, que tem um dbGrid ligado a tabela itens e a tabela pedidos.
Tenho um envento no ondlbClick do dbGrid para me devolver aos Edits. Isto que mencionei poderia ter alguma coisa que pudesse estar atrapalhando este código?????
Não entendi muito bem como fazer este teste simples que acabou de me passar!Obrigado


GOSTEI 0
Vitor5

Vitor5

22/10/2006

O código do botão para abrir o form 2 está assim:
begin
inherited;
dm.sdsG.Close;
dm.sdsG.Params[0].AsInteger :=dm.sdsItensPedido.fieldByName(´Numero_Pedido´).AsInteger;
dm.sdsG.Open;
try
formRecebimentos:=tformRecebimentos.Create(nil);
formRecebimentos.ShowModal;
finally
FormRecebimentos.Release;

///////////////////////////////////////////
O código do form2 está assim:
procedure TformRecebimentos.FormShow(Sender: TObject);
var
i:integer;

begin
inherited;
dm.sdsG.Open;
sgd.Cells[0,0]:=´Cod_Prod´;
sgd.Cells[1,0]:=´Nome_Prod´;
sgd.Cells[2,0]:=´Qtde´;
sgd.Cells[3,0]:=´Preco´;
sgd.RowCount:=dm.sdsG.RecordCount +1;
i:=1;
dm.sdsG.First;
while not dm.sdsG.Eof do
begin
sgd.Cells[0,i]:=dm.sdsG.fieldByName(´Cod_Prod´).AsString;
sgd.Cells[1,i]:=dm.sdsG.fieldByName(´Nome_Prod´).AsString;
sgd.Cells[2,i]:=dm.sdsG.fieldByName(´Total´).AsString;
dm.sdsG.Next;
i:=i +1;

end;
end;

procedure TformRecebimentos.sgdClick(Sender: TObject);
begin
inherited;
begin
if sgd.Col = 3 Then
sgd.Options:=sgd.Options + [goEditing]
else
sgd.Options:=sgd.Options - [goEditing]
end;
end;
:roll:
procedure TformRecebimentos.Button1Click(Sender: TObject);
var
i:integer;
begin
inherited;
dm.sdsU.Close;
for i:=1 to sgd.RowCount -1 do
begin
dm.sdsU.Params[0].AsString:=sgd.Cells[3,i];
dm.sdsU.Params[1].AsString:=sgd.Cells[0,i];
dm.sdsU.Execute;
dm.sdsU.Close;
end;

dm.sdsItensPedido.DataSet.CommandText:=´´;
dm.sdsItensPedido.Close;
dm.sdsItensPedido.DataSet.CommandText:=´Select * From Itens´;
dm.sdsItensPedido.Open;
end;


GOSTEI 0
Marco Salles

Marco Salles

22/10/2006

Veja bem...Não devemos complicar o que é para ser fácil

O seu problema no momento se estou entendendo bem é na hora do Update

Então sugire que voce desse um update simples , no proprio form principal

Não entendi muito bem como fazer este teste simples que acabou de me passar!Obrigado


então no form proncipal voce vai escrever num botão e reportar o resultado:


dm.sdsU.Close; for i:=1 to sgd.RowCount -1 do begin dm.sdsU.Params[0].AsString:=tem que colocar aqui um valor dm.sdsU.Params[1].AsString:=tem que colocar aqui uma condiçao Válida dm.sdsU.Execute; dm.sdsU.Close; end; dm.sdsItensPedido.DataSet.CommandText:=´´; dm.sdsItensPedido.Close; dm.sdsItensPedido.DataSet.CommandText:=´Select * From Itens´; dm.sdsItensPedido.Open; end;


é so isso... Faça um Update e jeja se o valor que voce colocou foi inserido ou alterado no campo aonde voce informou sua condição

Apos isto report o resultado


GOSTEI 0
Vitor5

Vitor5

22/10/2006

Amigo desculpe, mais ainda não tenho o dom de entender este update. sei que logo ficará fácil. Obrigado


GOSTEI 0
Vitor5

Vitor5

22/10/2006

então no form proncipal voce vai escrever num botão e reportar o resultado:


dm.sdsU.Close; for i:=1 to sgd.RowCount -1 do begin dm.sdsU.Params[0].AsString:=[b:581b2091df]tem que colocar aqui um valor[/b:581b2091df]dm.sdsU.Params[1].AsString:=[b:581b2091df]tem que colocar aqui uma condiçao Válida[/b:581b2091df] dm.sdsU.Execute; dm.sdsU.Close; end; dm.sdsItensPedido.DataSet.CommandText:=´´; dm.sdsItensPedido.Close; dm.sdsItensPedido.DataSet.CommandText:=´Select * From Itens´; dm.sdsItensPedido.Open; end;




[b:581b2091df]Apos isto report o resultado
[/b:581b2091df]
Parece que quando rodo ele no form 2 ele aponta para:
dm.sdsU.Close;
Pode haver um erro com simpledatasetUpdate????Teria que usar o fieldsEditor do simpledataset?????


GOSTEI 0
Marco Salles

Marco Salles

22/10/2006

Pedi para voce excutar o Update no Formulário principal e Tb para que voce comentasse sobre possíveis erros...

Porém voce disse isto :

Parece que quando rodo ele no form 2 ele aponta para: dm.sdsU.Close; Pode haver um erro com simpledatasetUpdate????Teria que usar o fieldsEditor do simpledataset?????


Não entendi nada da sua mensagem.. Por favor seje mais objetivo


GOSTEI 0
Vitor5

Vitor5

22/10/2006

Como fazer o update no formPrincipal, isto que não entendi. Meu raciocínio ainda é devagar, nesta parte do update. Mas vamos chegar lá...


GOSTEI 0
Marco Salles

Marco Salles

22/10/2006

A Linguagem é a mesma ....

O que que nos temos..

Um TSimpleDataSet Ligado a Base de dados com um comando Text Definido desta maneira :

Update Moldura set Valor_Unitario =:pNovoValor Where Codigo_Moldura =:PCodigo


nesse Sql temos dois paramentros....
O parametro pNovoValor é o valor que iremos atribuir ao campo Valor do(s) Registro(s) cujo o(s) Codigo(s) seje(am) igual ao codigo Informado
que no caso foi o Pcodigo

Assim se na basse de dados tivermos um Registro que tem o Codigo de moldura igual a ´0001´ e se definirmos como PNovovalor = 100 , quando fizermos o Updade nesta Base de Dados , vamos esperar que todas as molduras cujo código seja miguias a ´0001´ , tenham o valor do seu CampoPreco_unitario , alterado para 100..

e para excecutar este comando fazemos:


begin //este SpDsU . Não precisa ter nenhum DataSouce Ligado a ele form1.SpDsU.Close; form1.SpdsU.Params[0].AsString:=´100´ Form1.SpdsU.Params[1].AsString:=´0001´; Form1.SpdsU.Execute; //para apresentar os dados no dbGrid que tem a visualização para efeito //do usuário Form1.Spds.Close; Form1.Spds.Open; end;


Exceute o codigo acima no formulário ante de carregar a StringGrid .. é so isso


GOSTEI 0
Vitor5

Vitor5

22/10/2006

Não estou conseguindo enchergar onde estou errando...
O meu simpledatasetUpdate tem este código:

Update Itens set Preco =: pNovoValor
Where Cod_Prod =:PCodigo(tinha um datasource ligado a ele, mas tirei).

No formPrincipal tenho um botão que chama o form2(Recebimentos) assim:

procedure TformPedidos.btnPrecoClick(Sender: TObject);
begin
inherited;
dm.sdsG.Close;
dm.sdsG.Params[0].AsInteger :=dm.sdsItensPedido.fieldByName(´Numero_Pedido´).AsInteger;
dm.sdsG.Open;

try
formRecebimentos:=tformRecebimentos.Create(nil);
formRecebimentos.ShowModal;
finally
FormRecebimentos.Release;

end;
end;

No onshow do form2(Recebimentos) está assim:
procedure TformRecebimentos.FormShow(Sender: TObject);
var
i:integer;

begin
inherited;
dm.sdsG.Open;
sgd.Cells[0,0]:=´Cod_Prod´;
sgd.Cells[1,0]:=´Nome_Prod´;
sgd.Cells[2,0]:=´Qtde´;
sgd.Cells[3,0]:=´Preco´;
sgd.RowCount:=dm.sdsG.RecordCount +1;
i:=1;
dm.sdsG.First;
while not dm.sdsG.Eof do
begin
sgd.Cells[0,i]:=dm.sdsG.fieldByName(´Cod_Prod´).AsString;
sgd.Cells[1,i]:=dm.sdsG.fieldByName(´Nome_Prod´).AsString;
sgd.Cells[2,i]:=dm.sdsG.fieldByName(´Total´).AsString;
dm.sdsG.Next;
i:=i +1;
end;
end;
E no form2(recebimentos) tenho um botão para voltar que está assim:

procedure TformRecebimentos.Button1Click(Sender: TObject);
var
i:integer;
begin
inherited;

dm.sdsU.Close;
for i:=1 to sgd.RowCount -1 do
begin
dm.sdsU.Params[0].AsString:=sgd.Cells[3,i];
dm.sdsU.Params[1].AsString:=sgd.Cells[0,i];
dm.sdsU.Execute;
dm.sdsU.Close;
end;
dm.sdsItensPedido.DataSet.CommandText:=´´;
dm.sdsItensPedido.Close;
dm.sdsItensPedido.DataSet.CommandText:=´Select * From Itens´;
dm.sdsItensPedido.Open;

Tô meio confuso, mas depois que este código rodar, gostaria de uma super aula sua para entender perfeitamente o funcionamento deste código, mas isto podemos deixar um pouquinho mais adiante. Será que dá pra dar uma olhadinha no código que enviei?0A i:=1;
dm.sdsG.First;
while not dm.sdsG.Eof do
begin
sgd.Cells[0,i]:=dm.sdsG.fieldByName(´Cod_Prod´).AsString;
sgd.Cells[1,i]:=dm.sdsG.fieldByName(´Nome_Prod´).AsString;
sgd.Cells[2,i]:=dm.sdsG.fieldByName(´Total´).AsString;
dm.sdsG.Next;
i:=i +1;
end;
end;
E no form2(recebimentos) tenho um botão para voltar que está assim:

procedure TformRecebimentos.Button1Click(Sender: TObject);
var
i:integer;
begin
inherited;

dm.sdsU.Close;
for i:=1 to sgd.RowCount -1 do
begin
dm.sdsU.Params[0].AsString:=sgd.Cells[3,i];
dm.sdsU.Params[1].AsString:=sgd.Cells[0,i];
dm.sdsU.Execute;
dm.sdsU.Close;
end;
dm.sdsItensPedido.DataSet.CommandText:=´´;
dm.sdsItensPedido.Close;
dm.sdsItensPedido.DataSet.CommandText:=´Select * From Itens´;
dm.sdsItensPedido.Open;

Tô meio confuso, mas depois que este código rodar, gostaria de uma super aula sua para entender perfeitamente o funcionamento deste código, mas isto podemos deixar um pouquinho mais adiante. Será que dá pra dar uma olhadinha no código que enviei??????Muito Obrigado por sua ajuda


GOSTEI 0
Vitor5

Vitor5

22/10/2006

O site tá loco tá duplicando, porque está acontecendo isto?????


GOSTEI 0
Vitor5

Vitor5

22/10/2006

Ainda tá difícil


GOSTEI 0
Vitor5

Vitor5

22/10/2006

Estou devolva, poderíamos tentar concluir este código, prometo prestar bastante a atenção. Obrigado


GOSTEI 0
Marco Salles

Marco Salles

22/10/2006

Mas não tem erro...Amigo

Esqueça o seu projeto .

Abra um novo projeto e coloque nele
um sqlconection
um simpledataset
um datasource
um grid

escolha uma tabela e um banco de daods qualquer..
Na propriedade cpmandText do SimpleDataSet escreva
select * From Nome Da Sua Tabela


Faça as ligaçoes e rode o programa... Beleza. VAmos para a parte dois)

Parte Dois) Update
Coloque um outro SimpleDataSet e ligue-o ao SqlConection
Na sua propriedade Params escreva

update NomeDaSuaTabela set NomeDeUmCampo = :pNome where NomeDeUmCampo =:pId


Va na propriedade params abaixo do [b:59bfe434ae]PacketRecord[/b:59bfe434ae] e insira dois paramentros com os nome [b:59bfe434ae]Pnome e PId[/b:59bfe434ae].. coloque os tipos certos para esses parametros (FtStrin , FtInteger etcc)


Amigo em um Botão escreva

begin //estou chamando de spd o meu simpleDataSet spd.Close; //no edit1 coloque o nome do novo valor que voce quer dar para // o campo spd.Params[0].AsString:=edit1.text; //no edit2 Coloque um valor valido que ja esteja na tabela.. Estou //supondo aqui que o campo é do tipo integer , e que o parametro //fora definido com sendo do tipo FtInteger spd.Params[1].AsInteger:=strtoint(edit2.Text); spd.Execute; end;


[color=darkred:59bfe434ae][b:59bfe434ae]click no botaão .. feche e abra novamente sua aplicação[/b:59bfe434ae][/color:59bfe434ae] e veja se o campo anterior cujo Id voce definiu no edit2.tex , não esta agora valendo o valor definido por voce no edit1.text

Não é possivel de dar erro... Faço isso toda hora e quantas vezes for preciso.. Capriche ai e leia com atenção e boa sorte


GOSTEI 0
Vitor5

Vitor5

22/10/2006

:oops: Amigo, juro pra você que não onde ainda estou errando, como vc mesmo disse isto é fácil demais. Fiz os teste como mandou
Abri um novo projeto, colquei um sqlConnection, um simpledataset, um datasource, um dbgrid, um segundo simpledataset(onde dei o nome de spd, como no seu exemplo) e escrevi o código que disse:
update Cargos set Nome_Cargo =:pNome
Where Nome_Cargo =:PId
Não sei se entendi bem mas coloquei dois Edits e um botão no form:
No onshow do form coloquei simpledataset1.open;
E no botão do form coloquei o código assim:
////////////////////////

procedure TForm1.Button1Click(Sender: TObject);
begin
spd.Close;
spd.Params[0].asString:=Edit1.text;
spd.Params[1].asInteger:=strToInt(edit2.text);
spd.Execute;

end;
Não sei sé é isto que me passou ???
Sendo que usei uma tabela que tenho(Cargos) onde:
Codigo_Cargo é integer e uma chave primaria
Descricao_Cargo que está como varchar(Usei esta tabela para tentar fazer o teste)
Tento digitar algo e clicar no botão ele dá o erro ´ No Mapping for error Code Found´. Obrigado


GOSTEI 0
Marco Salles

Marco Salles

22/10/2006

update Cargos set [b:33ee56d199]Nome_Cargo[/b:33ee56d199] =:pNome Where [b:33ee56d199]Nome_Cargo[/b:33ee56d199] =:PId


se este foi o codigo que voce escreveu no comandText do SimpleDataSet Dps , não esta correto... Pois voce esta alterando o Campo Nome_Cargo e usando como uma clausula o Próprio Campo <Campo_Cargo>

Não faz sentido...

[b:33ee56d199]Use um outro campo na clausu-la where [/b:33ee56d199]e conforme foi postado o codigo , este campo neste exemplo (usando strttoint(edit2.text)) , tem que ser [b:33ee56d199]integer..[/b:33ee56d199]

Atenção.... Não esqueça de criar os parametros no spd

Boa sorte...


GOSTEI 0
Vitor5

Vitor5

22/10/2006

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;
Amigo depois de muitas horas de teste, muitos neuronios queimados, muitas informações ao mesmo tempo, resolvi testar seu código várias vezes e realmente funcionou....
Obrigadão a você e ao Marco Sales, pela paciência que tiveram comigo. O código do Marcos Sales é excelente, mas no meu caso o seu código pra mim funcionou melhor..Por isso estou colocando um[b] FIM[/b]




GOSTEI 0
POSTAR