Pirambu! Postado Janeiro 2, 2007 Denunciar Share Postado Janeiro 2, 2007 eu estou tenho uma tabela que contem os pedidos(numero Pedido, produto, quantidade)onde é usada apenas como consulta,e outra como processamento de Pedidos(pedidos, produto, quantidade),eu preciso usar um "edit.Text" para informar um número do pedido, então, estou usando uma query para fazer o filtro na "tablePedidos" até ai tudo bem,só que o DBGrid estar ligado a "TableProcessamentoPedido" que deve ser incluido todos os registro filtrados na "TablePedidos",eu tentei assim: O Dbgrid ligado a Query1 que com o codigo abaixo incluir os registro da "TablePedidos" na "TableProcessamentoPedidos":INSERT INTO ProcessamentoPedido(PedidoID,produtoID,quantidade)SELECT pedidos.pedidoID, pedidos.ProdutoID, pedidos.Quantidade FROMpedidos;mais não funcionou, Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Pirambu! Postado Janeiro 4, 2007 Autor Denunciar Share Postado Janeiro 4, 2007 Vou explicar melhor,tenho uma query que faz um filtro de uma tabela, e quero que os itens filtrados seja incluidos em uma outra tabela Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Kikonanet Postado Janeiro 5, 2007 Denunciar Share Postado Janeiro 5, 2007 Olá pirambu,Se eu entendi direito quando você filtrar os dados você já pode inserir direto na outra tabela... você pode usar uma Query para isso... E com outra query você insere no banco.Ex: With Query1 doBeginClose;SQL.Clear;SQL.Add('Select * From Tabela');SQL.Add('Where A = :varA');Parameters.ParamByName('varA').Value := 'AAA'; Open;While not(EOF) doWith Query2 doBeginClose;SQL.Clear;SQL.Add('Insert into Tabela');... End;Acho que é +- isso...Estou sem Delphi aqui para testar...Abs. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Pirambu! Postado Janeiro 8, 2007 Autor Denunciar Share Postado Janeiro 8, 2007 Desculpe pela demora.Cara tentei mais deu um erro, acho que é na chave prim. então tirei todas as chaves da tabela que vai receber os dados , dei o mesmo erro.coloquei assim os codigos:with query1 do begin close; sql.Add('select * from pedidos'); sql.Add('where pedidoid =:ID'); params.ParamByName('ID').Value := tableprocessamentoPedidosPedidoID.Value; open; while not(eof) do with query2 do begin close; sql.Add('insert into itensprocessamentopedido'); e tentei assim : sql.Add('insert into itensprocessamentopedido(produtoID, quantidade'); open; end; end;das duas forma deu erro, Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Kikonanet Postado Janeiro 8, 2007 Denunciar Share Postado Janeiro 8, 2007 Olá,sql.Add('insert into itensprocessamentopedido'); e tentei assim : sql.Add('insert into itensprocessamentopedido(produtoID, quantidade');O problema esta na SQL... Tente assim:Ex: Insert into itensprocessamentopedido(produtoID,quantidade)Values (1,2)sql.Add('insert into itensprocessamentopedido(produtoID, quantidade)');sql.Add('Values (:id,:qtde)')params.ParamByName('id').Value = '2';params.ParamByName('qtde').Value = '3';executeSQL // se eu não me engano é isso... Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Guest - VAGNER - Postado Janeiro 8, 2007 Denunciar Share Postado Janeiro 8, 2007 se você quiser gravar os dados de uma consulta, acho que você pode fazer assim. with query1 do begin close; sql.clear; sql.add('select * from TABELA where campo = :campo'); parambyname('campo') := VariavelPassada; open if not isempty then tabela.append; tabelaCampo1.valeu := Qery1CAmpo1value; tabelaCampo2valeu := Query1CAmpo2value; tabelaCampo3valeu := Query1CAmpo3value; tabela.post; end; Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Pirambu! Postado Janeiro 9, 2007 Autor Denunciar Share Postado Janeiro 9, 2007 Vagner: da forma que você mostrou ele adiciona apenas um registro, no meu caso preciso adicionar todos os registro que forem filtrados: tentei usar if not isEmpty thenwhile not(Query2.Eof)dobegin tableItensProcessamento.Append; TableItensProcessamentoPedidoID.Value := Query2PedidoID.Value; TableItensprocessamentoProdutoID.Value := Query2ProdutoID.Value; TableItensProcessamentoQuantidade.Value := Query2Quantidade.Value; end; TableItensProcessamento.Post;mais não funcionou, Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Pirambu! Postado Janeiro 9, 2007 Autor Denunciar Share Postado Janeiro 9, 2007 KIKO: tentei usando Sql. mais não compilou, parcando na linha do params.ParamByName eu coloque assim:with query1 do begin close; sql.Clear; sql.Add('select * from pedidos'); sql.Add('where pedidoid =:ID'); params.ParamByName('ID').Value := tableprocessamentoPedidosPedidoID.Value; open; while not(eof) do with query3 do begin close; sql.add('insert into itensprocessamentopedido(produtoID, quantidade)'); SQL.Add('VALUES(:produtoID,:quantidade)'); params.ParamByName('produtoID').Value := '2'; params.ParamByName('quantidade').Value := '3'; execSQL; end; end;mais estar dando erro, e informa esta mensagem: TIPE MISMATCH IN EXPRESSION Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Micheus Postado Janeiro 10, 2007 Denunciar Share Postado Janeiro 10, 2007 eu preciso usar um "edit.Text" para informar um número do pedido, então, estou usando uma query para fazer o filtro na "tablePedidos" até ai tudo bem,só que o DBGrid estar ligado a "TableProcessamentoPedido" que deve ser incluido todos os registro filtrados na "TablePedidos",Pirambu!, o objetivo seria o usuário informar (via edit.Text) o pedido a ser processado e então você mostrar os items a processar num DBGrid, para daí, a título de confirmação o usuário, por ex. clicar num botão para processá-lo?Se a idéia é esta, então, seu procedimento seria mais ou menos aquele passado pelo Kikonanet e no seu post #4:- você precisa de um SQL para seleção dos itens a serem mostrados no DBGrid - serão os items a serem processados;- partindo do princípio que o usuário irá confirmar este processamento, no momento da confirmação (p.e. um evento OnClick de um botão associado a esta ação) você utiliza o SQL de insersão - serão os item inclusos na tabela TableProcessamentoPedido;eu tentei assim: O Dbgrid ligado a Query1 que com o codigo abaixo incluir os registro da "TablePedidos" na "TableProcessamentoPedidos":INSERT INTO ProcessamentoPedido(PedidoID,produtoID,quantidade)SELECT pedidos.pedidoID, pedidos.ProdutoID, pedidos.Quantidade FROMpedidos;mais não funcionou,Observe que no DBGrid você apresenta dados vindos de uma instrução SQL utilizando um SELECT. O resultado da Query (TQuery), neste caso, é obtido pelo comando Open, entretanto, quando você utiza comandos como INSET, DELETE ou UPDADE, você utiliza o método ExecSQL o qual não retornará linha alguma - logo, apesar de você popular sua tabela, com esta mesma Query você não verá nada no DBGrid.Mas, pelos últimos posts, parece que você já percebeu isto.KIKO: tentei usando Sql. mais não compilou, parcando na linha do params.ParamByName eu coloque assim: with query1 do begin close; sql.Clear; sql.Add('select * from pedidos'); sql.Add('where pedidoid =:ID'); params.ParamByName('ID').Value := tableprocessamentoPedidosPedidoID.Value; open; while not(eof) do with query3 do begin close; sql.add('insert into itensprocessamentopedido(produtoID, quantidade)'); SQL.Add('VALUES(:produtoID,:quantidade)'); params.ParamByName('produtoID').Value := '2'; params.ParamByName('quantidade').Value := '3'; execSQL; end;end;Se você estiver utilizando TQuey, você deverá retirar o params, o método é chamado da seguinte forma <tquery>.ParamByName(<nome_campo>).Value (ou .AsString, .AsInteger). Já se estiver utilizando componente da paleta ADO, então terá que trocar params para parameters.Qual banco de dados você está utilizando? Qual componente de acesso?Entretanto, observe que o Kikonanet apenas exemplificou. você não vai querer atribuir valores fixos, então seguindo sua SQL inicial:INSERT INTO ProcessamentoPedido(PedidoID,produtoID,quantidade)SELECT pedidos.pedidoID, pedidos.ProdutoID, pedidos.Quantidade FROM pedidos;with query1 do begin close; sql.Clear; sql.Add('select pedidoID, ProdutoID, Quantidade'); sql.Add('from pedidos'); sql.Add('where pedidoid =:ID'); ParamByName('ID').Value := StrToInt(edit.Text); // pressupondo que seja do tipo inteiro open; end; // basta inicializá-la uma vez antes do loop with query3 do begin sql.clear; sql.add('insert into itensprocessamentopedido(PedidoID,produtoID,quantidade)'); sql.Add('VALUES(:produtoID,:quantidade)'); end; // percorre todas as linhas retornadas em query1 while not query1.eof do begin query1.ParamByName('PedidoID').Value := Query1.FieldByName('PedidoID').Value; query1.ParamByName('produtoID').Value := Query1.FieldByName('produtoID').Value; query1.ParamByName('quantidade').Value := Query1.FieldByName('quantidade').Value; execSQL; // inclui o item atual de query1 em query3 query1.next; // avança para próxima linha na query1 end; Tenha cuidado quando utilizar estruturas aninhadas com o comando With..do. Se houver possibilidade de dúvida de quem seja a propriedade ou método utilizados, utilize o objeto de referência explicitamente. Voce pode, ainda, mostrar no DBGrid os itens que serão processados (query1) e utilizar aquela query inicial que fará o insert. Para bastaria colocar a instrução SQL na query3 e passar a mesma parametrização utilizada na query1. Substituindo no exemplo acima:... with query3 do begin sql.clear; sql.add('INSERT INTO ProcessamentoPedido(PedidoID,produtoID,quantidade)'); sql.Add('SELECT pedidoID, ProdutoID, Quantidade'); sql.Add('FROM pedidos'); sql.Add('WHERE PedidoID =:ID'); ParamByName('ID').Value := StrToInt(edit.Text); // pressupondo que seja do tipo inteiro ExecSQL; end; e não teria mais a parte do loop, já que as inclusões foram feitas via SQL.Abraços Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Pirambu! Postado Janeiro 16, 2007 Autor Denunciar Share Postado Janeiro 16, 2007 Oi Micheus, valeu pela força e desculpa ter demorado a responder, eu tentei fazer da forma que você indicou, mais deu um erro, não entra o registro, Query1 : parameter " pedidoID' not Found, adicionei duas query ao form : query1 e query2 ficou assim:procedure TForm1.BBProcessarClick(Sender: TObject);beginif edit1.Text = '' thenbegin showmessage('Não há valor para Consulta'); exit;end;with query1 do begin close; sql.Clear; sql.Add('Select pedidoID,produtoID, quantidade'); sql.Add('From Pedidos'); sql.Add('Where pedidoID =:ID'); parambyname('ID').Value := StrToInt(edit1.Text); open; end;with query2 do begin sql.Clear; sql.add('INSERT INTO itensprocessamentopedido(pedidoID,produtoID,quantidade)'); sql.Add('values(:produtoID,:quantidade)'); end; while not query1.Eof do begin query1.ParamByName('pedidoID').Value := query1.fieldbyname('pedidoID').Value; query1.ExecSQL; query1.Next; end; edit1.SetFocus; end;então eu fiz apenas até o primeiro WITH e filtrou certinho, e não entendir o porquer da mensagem, Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Micheus Postado Janeiro 16, 2007 Denunciar Share Postado Janeiro 16, 2007 ... eu tentei fazer da forma que você indicou, mais deu um erro, não entra o registro, Query1 : parameter " pedidoID' not Found, ...E ele está compatível com o código que você utilizou.Dei uma "acertada" nele. Observe e compare os comentários que coloquei no meio do código, para que você entenda onde estavam os problemas. Acredito que agora fique Ok.Por gentileza, quando postar código, utilize a marcação apropriada (botãozinho com o # na barra de botões do editor). Dá muito trabalho ler o código sem a identação.Abraçosprocedure TForm1.BBProcessarClick(Sender: TObject); begin if edit1.Text = '' then begin showmessage('Não há valor para Consulta'); exit; end; with query1 do begin close; sql.Clear; sql.Add('Select pedidoID,produtoID, quantidade'); sql.Add('From Pedidos'); sql.Add('Where pedidoID =:ID'); parambyname('ID').Value := StrToInt(edit1.Text); open; end; // Até aqui, você obteve apenas os registros da tabela Pedidos filtrados pelo ID informado // Aqui estamos preparando a query2 para inserção na tabela ItensProcessamentoPedido (vixe que nome grande...) // Eu corrigi a parte do VALUES, porque você esqueceu de colocar o parâmetro PedidoID. Note // que você informa no INSERT INTO que incluirá 3 campos, logo tem que passar os 3 valores with query2 do begin sql.Clear; sql.Add('INSERT INTO itensprocessamentopedido(pedidoID, produtoID, quantidade)'); sql.Add('values(:pedidoID, :produtoID, :quantidade)'); end; // Agora nesta parte, iremos percorrer o resultado obtido na query1 e utilizar seus // valores para inclusão na tabela ItensProcessamentoPedido via query2 // Aqui, há nova correção, note que você tem que atribuir os campos da query1 para os // parâmetros da query2, mas você deu uma "viajadinha" (rsrsrs) e atribuiu novamente a query1 // Lembre também que teremos que fornecer os 3 parâmetros esperados na query2, então... while not query1.Eof do begin query2.ParamByName('pedidoID').Value := query1.fieldbyname('pedidoID').Value; query2.ParamByName('produtoID').Value := query1.fieldbyname('produtoID').Value; query2.ParamByName('quantidade').Value := query1.fieldbyname('quantidade').Value; query2.ExecSQL; query1.Next; end; edit1.SetFocus; end; Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Pirambu! Postado Janeiro 17, 2007 Autor Denunciar Share Postado Janeiro 17, 2007 procedure TForm1.BBconfirmarClick(Sender: TObject); begin if edit1.Text = '' then begin showmessage('Não há valor para Consulta'); exit; end; with query1 do begin close; sql.Clear; sql.Add('Select pedidoID,produtoID, quantidade'); sql.Add('From Pedidos'); sql.Add('Where pedidoID =:ID'); parambyname('ID').Value := StrToInt(edit1.Text); open; end; with query2 do begin sql.Clear; sql.add('INSERT INTO itensprocessamentopedido(pedidoID,produtoID,quantidade)'); sql.Add('values(:pedidoID,:produtoID, :quantidade)'); end; while not query1.Eof do begin query2.ParamByName('pedidoID').Value := query1.fieldbyname('pedidoID').Value; query2.ParamByName('produtoID').Value := query1.fieldbyname('produtoID').Value; query2.ParamByName('quantidade').Value := query1.fieldbyname('produtoID').Value; query2.ExecSQL; query1.Next; end; edit1.SetFocus; end;Micheus, valeu pela parciência, mais deu um erro " Tipey mismatch in expression"na tabela que vai receber as informações existem mais campos elem dos 'PedidoID, ProdutoID,quantidade', então eu criei uma tabela apenas com estes campos e deu o mesmo erro.será que falta algo no codigo SQL? Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Micheus Postado Janeiro 18, 2007 Denunciar Share Postado Janeiro 18, 2007 Micheus, valeu pela parciência, mais deu um erro " Tipey mismatch in expression"na tabela que vai receber as informações existem mais campos elem dos 'PedidoID, ProdutoID,quantidade', então eu criei uma tabela apenas com estes campos e deu o mesmo erro.será que falta algo no codigo SQL?Esse erro ocorre na execução do programa certo?! Ele não estaria ocorrendo na atribuição dos parâmetros, não?!por que você modificou a passagem de parâmetros :huh:: query2.ParamByName('pedidoID').Value := query1.fieldbyname('pedidoID').Value; query2.ParamByName('produtoID').Value := query1.fieldbyname('produtoID').Value; query2.ParamByName('quantidade').Value := query1.fieldbyname('produtoID').Value;quando eu lhe sugeri desta forma <_<: query2.ParamByName('pedidoID').Value := query1.fieldbyname('pedidoID').Value; query2.ParamByName('produtoID').Value := query1.fieldbyname('produtoID').Value; query2.ParamByName('quantidade').Value := query1.fieldbyname('quantidade').Value;Bom, se não for por causa do que coloquei acima, tente colocar a parametrização desta forma: query2.ParamByName('pedidoID').AsInteger := query1.fieldbyname('pedidoID').AsInteger; query2.ParamByName('produtoID').AsInteger := query1.fieldbyname('produtoID').AsInteger; query2.ParamByName('quantidade').AsFloat := query1.fieldbyname('quantidade').AsFloat;Se ainda não for por isso, haveria alguma possibilidade de haverem tipos de campos diferentes (com o mesmo nome) nas duas tabelas envolvidas?Abraços Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Pirambu! Postado Janeiro 18, 2007 Autor Denunciar Share Postado Janeiro 18, 2007 Micheus, deu certo. :D funcionou direitinho, ficou ótimo.Espero um dia porder ajudar.Obrigado Micheus! Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
Pirambu!
eu estou tenho uma tabela que contem os pedidos(numero Pedido, produto, quantidade)
onde é usada apenas como consulta,
e outra como processamento de Pedidos(pedidos, produto, quantidade),
eu preciso usar um "edit.Text" para informar um número do pedido, então,
estou usando uma query para fazer o filtro na "tablePedidos" até ai tudo bem,
só que o DBGrid estar ligado a "TableProcessamentoPedido" que deve ser incluido todos
os registro filtrados na "TablePedidos",
eu tentei assim:
O Dbgrid ligado a Query1 que com o codigo abaixo incluir os registro da "TablePedidos" na
"TableProcessamentoPedidos":
INSERT INTO ProcessamentoPedido(PedidoID,produtoID,quantidade)
SELECT pedidos.pedidoID, pedidos.ProdutoID, pedidos.Quantidade FROM
pedidos;mais não funcionou,
Link para o comentário
Compartilhar em outros sites
13 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.