Ir para conteúdo
Fórum Script Brasil
  • 0

Comando Sql


Pirambu!

Pergunta

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

  • 0

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 do

Begin

Close;

SQL.Clear;

SQL.Add('Select * From Tabela');

SQL.Add('Where A = :varA');

Parameters.ParamByName('varA').Value := 'AAA';

Open;

While not(EOF) do

With Query2 do

Begin

Close;

SQL.Clear;

SQL.Add('Insert into Tabela');

...

End;

Acho que é +- isso...

Estou sem Delphi aqui para testar...

Abs.

Link para o comentário
Compartilhar em outros sites

  • 0

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,

Link para o comentário
Compartilhar em outros sites

  • 0

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

Link para o comentário
Compartilhar em outros sites

  • 0
Guest - VAGNER -

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;

Link para o comentário
Compartilhar em outros sites

  • 0

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 then

while not(Query2.Eof)do

begin

tableItensProcessamento.Append;

TableItensProcessamentoPedidoID.Value := Query2PedidoID.Value;

TableItensprocessamentoProdutoID.Value := Query2ProdutoID.Value;

TableItensProcessamentoQuantidade.Value := Query2Quantidade.Value;

end;

TableItensProcessamento.Post;

mais não funcionou,

Link para o comentário
Compartilhar em outros sites

  • 0

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

Link para o comentário
Compartilhar em outros sites

  • 0
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 FROM

pedidos;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

Link para o comentário
Compartilhar em outros sites

  • 0

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

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(: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,

Link para o comentário
Compartilhar em outros sites

  • 0
... 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ços

procedure 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;

Link para o comentário
Compartilhar em outros sites

  • 0

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?

Link para o comentário
Compartilhar em outros sites

  • 0
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

Link para o comentário
Compartilhar em outros sites

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.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...