IBDATASET x DBGRID
Pessoal estou com o seguinte problema com mestre/detalhe quando tendo inseir um produto atravéz
de um grid, e não consegui uma solução:
Tenho um Tabela denominada ´PEDIDO´ (mestre) e outra denominada ´ITENS_PEDIDO´(detalhe).
ligadas da seguinte forma:
[b:c601003ee3]ITENS_PEDIDO ´datasource´ = datasource_pedido;[/b:c601003ee3]
no sql do dataset ITENS_PEDIDO: ´select * from ITENS_PEDIDOS WHERE ID=:ID´
Acontece que quando tento incluir [b:c601003ee3]´MAIS DE UM ITEM´ [/b:c601003ee3]do pedido, atraves de um [b:c601003ee3] dbgrid[/b:c601003ee3](datasource_item_pedido), após digitar
o segundo item, [b:c601003ee3]quando gravo[/b:c601003ee3], o primeiro produto digitado e repetido no segundo item([b:c601003ee3]simplesmente repete[/b:c601003ee3])
, e quando digito mais de dois itens, toda vez que insiro um novo item o anterior [b:c601003ee3]repete o primeiro item [/b:c601003ee3]
digitado, e assim suscessivamente. Se após incluir 10 registros, todos eles [b:c601003ee3]repetem o primeiro item inserido.[/b:c601003ee3]
não sei o que fazer..
utilizo as instruções abaixo para um novo pedido..
// Cria/Atualiza Novo valor para esta pedido
dmBaseDados.IBControleSequencia.close;
dmBaseDados.IBControleSequencia.SelectSQL.Clear;
dmBaseDados.IBControleSequencia.SelectSQL.Add(´UPDATE Controle_sequencia´+
´ Set NUM_PEDIDO = NUM_PEDIDO + 1´);
dmBaseDados.IBControleSequencia.ExecSQL;
// seleciona linha a para buscar novo Numero do novo pedido
dmBaseDados.IBControleSequencia.close;
dmBaseDados.IBControleSequencia.SelectSQL.Clear;
dmBaseDados.IBControleSequencia.SelectSQL.Add(´Select * from controle_sequencia´);
dmBaseDados.IBControleSequencia.open;
Numero_Pedido:=dmBaseDados.IBControleSequencia.FieldByname(´NUM_PEDIDO´).asinteger;
IBDataSet.close;
IBDataSet.SelectSQL.Clear;
IBDataSet.SelectSQL.Add(´INSERT INTO PEDIDOS ´+
´(ID) ´+´ VALUES(:Num_Pedido)´);
IBDataSet.Parambyname(´Num_Pedido´).asinteger:=Numero_Pedido;
IBDataSet.ExecSQL;
IBDataSet.active:=false;
IBItensPedidos.Active:=False;
IBDataSet.SelectSQL.Clear;
IBDataSet.SelectSQL.Add(´Select * from PEDIDOS ´+
´ Where ID= ´+IntToStr(Numero_Pedido));
IBDataSet.active:=true;
IBItensPedidos.Active:=true;
IBDataSet.Edit;
IBItensPedidos.Edit;
de um grid, e não consegui uma solução:
Tenho um Tabela denominada ´PEDIDO´ (mestre) e outra denominada ´ITENS_PEDIDO´(detalhe).
ligadas da seguinte forma:
[b:c601003ee3]ITENS_PEDIDO ´datasource´ = datasource_pedido;[/b:c601003ee3]
no sql do dataset ITENS_PEDIDO: ´select * from ITENS_PEDIDOS WHERE ID=:ID´
Acontece que quando tento incluir [b:c601003ee3]´MAIS DE UM ITEM´ [/b:c601003ee3]do pedido, atraves de um [b:c601003ee3] dbgrid[/b:c601003ee3](datasource_item_pedido), após digitar
o segundo item, [b:c601003ee3]quando gravo[/b:c601003ee3], o primeiro produto digitado e repetido no segundo item([b:c601003ee3]simplesmente repete[/b:c601003ee3])
, e quando digito mais de dois itens, toda vez que insiro um novo item o anterior [b:c601003ee3]repete o primeiro item [/b:c601003ee3]
digitado, e assim suscessivamente. Se após incluir 10 registros, todos eles [b:c601003ee3]repetem o primeiro item inserido.[/b:c601003ee3]
não sei o que fazer..
utilizo as instruções abaixo para um novo pedido..
// Cria/Atualiza Novo valor para esta pedido
dmBaseDados.IBControleSequencia.close;
dmBaseDados.IBControleSequencia.SelectSQL.Clear;
dmBaseDados.IBControleSequencia.SelectSQL.Add(´UPDATE Controle_sequencia´+
´ Set NUM_PEDIDO = NUM_PEDIDO + 1´);
dmBaseDados.IBControleSequencia.ExecSQL;
// seleciona linha a para buscar novo Numero do novo pedido
dmBaseDados.IBControleSequencia.close;
dmBaseDados.IBControleSequencia.SelectSQL.Clear;
dmBaseDados.IBControleSequencia.SelectSQL.Add(´Select * from controle_sequencia´);
dmBaseDados.IBControleSequencia.open;
Numero_Pedido:=dmBaseDados.IBControleSequencia.FieldByname(´NUM_PEDIDO´).asinteger;
IBDataSet.close;
IBDataSet.SelectSQL.Clear;
IBDataSet.SelectSQL.Add(´INSERT INTO PEDIDOS ´+
´(ID) ´+´ VALUES(:Num_Pedido)´);
IBDataSet.Parambyname(´Num_Pedido´).asinteger:=Numero_Pedido;
IBDataSet.ExecSQL;
IBDataSet.active:=false;
IBItensPedidos.Active:=False;
IBDataSet.SelectSQL.Clear;
IBDataSet.SelectSQL.Add(´Select * from PEDIDOS ´+
´ Where ID= ´+IntToStr(Numero_Pedido));
IBDataSet.active:=true;
IBItensPedidos.Active:=true;
IBDataSet.Edit;
IBItensPedidos.Edit;
Siro
Curtidas 0
Respostas
Siro
07/08/2003
SOBE
GOSTEI 0
Siro
07/08/2003
Sobe
GOSTEI 0
Siro
07/08/2003
Poxa!!!!! será que ninguem vai me axiliar????
Pessoal, preciso fazer fazer um mestre/detalhe com [b:9f82e17594]IBDATASET,[/b:9f82e17594] e poder inserir em um grid registros na tabela detalhe, pois preciso navegar pelo dataset (next, prior, etc.. como um mestre detalhe com IBTABlE).
Da forma que fiz, consigo navegar pelos registros, mas estou com [b:9f82e17594]problemas para inserir dados na tabela detalhe[/b:9f82e17594]..
Pessoal, preciso fazer fazer um mestre/detalhe com [b:9f82e17594]IBDATASET,[/b:9f82e17594] e poder inserir em um grid registros na tabela detalhe, pois preciso navegar pelo dataset (next, prior, etc.. como um mestre detalhe com IBTABlE).
Da forma que fiz, consigo navegar pelos registros, mas estou com [b:9f82e17594]problemas para inserir dados na tabela detalhe[/b:9f82e17594]..
GOSTEI 0
Fava
07/08/2003
Se você está com problemas na inserção do detalhe você deveria postar o código de inserção do detalhe (itens) e não do metre (pedido).
GOSTEI 0
Siro
07/08/2003
Se você está com problemas na inserção do detalhe você deveria postar o código de inserção do detalhe (itens) e não do metre (pedido).
NO evendo OnNewRecord do IbItensPedidos ulilizo
IBItensPedidosID.AsInteger:=IBDataSetID.AsInteger;
No evento [b:e513cd2a90]ColExit[/b:e513cd2a90] do grid estou ulilizando o procedimento listado abaixo, mas após a inserção do primeiro registro, todos dos demais que tentar incluir e [b:e513cd2a90]repete o primeiro item inserido[/b:e513cd2a90], [u:e513cd2a90]tentei utilizar um
botão[/u:e513cd2a90] com o procedimento (abaixo da procedure do grid), mas continuou na mesma situação..
[b:e513cd2a90]procedure TFormPedidos.grdProdutosColExit(Sender: TObject);
begin[/b:e513cd2a90]
if(IBItensPedidos.State = dsinsert) or (IBItensPedidos.State = dsedit) then
begin
if(( grdProdutos.SelectedIndex = 2) and (grdProdutos.Fields[2].AsString <> ´´)) then
begin
// query localizando o produto em estoque
dmBaseDados.IBQryProduto.close;
dmBaseDados.IBQryProduto.SQL.Clear;
dmBaseDados.IBQryProduto.SQL.Add(´Select * from PRODUTOS ´+
´Where ID =:pID´);
dmBaseDados.IBQryProduto.parambyname(´pID´).AsInteger:=grdProdutos.Fields[2].AsInteger;
dmBaseDados.IBQryProduto.Open;
IF dmBaseDados.IBQryProduto.RecordCount = 0 then
begin
Mensagem(´Código produto Inválido - favor corrigir´);
grdProdutos.SetFocus;
grdProdutos.SelectedIndex:=2;
end
else
Begin
IBItensPedidosID.AsInteger:=IBDataSetID.AsInteger;
IBItensPedidosID_PRODUTO.AsInteger:= dmBaseDados.IBQryProdutoID.AsInteger;
IBItensPedidosCODIGO_BARRAS.AsString:= dmBaseDados.IBQryProdutoCODIGO_DE_BARRAS.AsString;
IBItensPedidosDESCRICAO_PRODUTO.AsString:= dmBaseDados.IBQryProdutoDESCRICAO_ABREVIADA.AsString;
IBItensPedidosVALOR_UNITARIO.AsFloat:= dmBaseDados.IBQryProdutoVALOR_VENDA.AsFloat;
IBItensPedidosICMS.AsFloat:=dmBaseDados.IBQryProdutoICMS_SAIDA.AsFloat;
IBItensPedidosIPI.AsFloat:=dmBaseDados.IBQryProdutoIPI_SAIDA.AsFloat;
//IBItensPedidosQUANT_PRODUTO.AsInteger:=1;
grdProdutos.SelectedIndex:= 5;
end;
end;
if(( grdProdutos.SelectedIndex = 5) and (grdProdutos.Fields[5].AsString <> ´´)) then
begin
IBItensPedidosVALOR_TOTAL.AsFloat:=IBItensPedidosVALOR_UNITARIO.AsFloat * IBItensPedidosQUANT_PRODUTO.AsInteger;
end;
if(( grdProdutos.SelectedIndex = 6) and (grdProdutos.Fields[6].AsString <> ´´)) then
begin
IBItensPedidosVALOR_TOTAL.AsFloat:= IBItensPedidosQUANT_PRODUTO.AsInteger * IBItensPedidosVALOR_UNITARIO.AsFloat;
//grdProdutos.SelectedIndex:= 4;
end;
end;
end;
PROCEDIMENTO UTILIZADO NO BOTÃO:
[b:e513cd2a90]procedure TFormPedidos.btn_IncluirItemClick(Sender: TObject);[/b:e513cd2a90]var
begin
Application.CreateForm(TFormInclusaoProdutosSaidas,FormInclusaoProdutosSaidas);
try
if FormInclusaoProdutosSaidas.ShowModal = mrok then
Begin
IBItensPedidos.Insert;
//IBItensPedidos.Append;
//IBItensPedidos.FieldByname(´ID´).asinteger:=Numero_Pedido;
IBItensPedidosID.AsInteger:=IBDataSetID.AsInteger;
IBItensPedidos.FieldByname(´ID_PRODUTO´).AsString :=dmBaseDados.IBQryProduto.FieldByname(´ID´).AsString;
IBItensPedidos.FieldByname(´CODIGO_BARRAS´).AsString :=dmBaseDados.IBQryProduto.FieldByname(´CODIGO_DE_BARRAS´).AsString;
IBItensPedidos.FieldByname(´ICMS´).asfloat := StrToFloat(FormInclusaoProdutosSaidas.edtIcms.Text);
IBItensPedidos.FieldByname(´DESCRICAO_PRODUTO´).asstring :=dmBaseDados.IBQryProduto.FieldByname(´DESCRICAO_ABREVIADA´).asstring;
IBItensPedidos.FieldByname(´QUANT_PRODUTO´).asinteger :=StrToInt(FormInclusaoProdutosSaidas.edtQuantidade.Text);
IBItensPedidos.FieldByname(´VALOR_UNITARIO´).asfloat :=Valor_de_venda;
IBItensPedidos.FieldByname(´VALOR_TOTAL´).asfloat :=Valor_de_venda*StrToInt(FormInclusaoProdutosSaidas.edtQuantidade.Text);
IBItensPedidos.FieldByname(´NUM_ITEM´).asinteger :=Num_sequencia_item_vendido;
IBItensPedidos.Post;
grdProdutos.SetFocus;
END;
finally
FormInclusaoProdutosSaidas.Free;
end;
END;
GOSTEI 0
Siro
07/08/2003
Sobe
GOSTEI 0