Fórum registro duplicado "sem intenção" #877
28/11/2008
3º DÚVIDA
ESTÁ ACONTECENDO O SEGUINTE ERRO O CÓDIGO ABAIXO, MAS COM POUCA FREQUÊNCIA:
“O PEDIDO ESTÁ SENDO DUPLICANDO QUANDO INICIA ESSE CODIGO, MAS NÃO É TODA VEZ QUE OCORRE ISSO”.
E NEM SEI MESMO SE É ALGUM PROBLEMA COM O CÓDIGO ABAIXO. POR ISSO GOSTARIA QUE DESSEM UMA OLHADA NELE.
Não sei se o “begin e end;” estão colocados corretamente, não permitindo procedimento indecesajo.
procedure TFormSaidas.BtConfirmarClick(Sender: TObject);
var Total: integer;
begin
//soma quantidade de itens
Total := 0;
DM.TbSaida.First;
While not DM.TbSaida.Eof do
begin
Total := Total + DM.TbSaida.FieldByName(Quantidade).AsInteger;
DM.TbSaida.Next;
end;
MascEdit24.Text := IntToStr(Total);
//até aqui
//PARTE 1 - Verifica se o pedido está em branco
if DM.TbSaida.IsEmpty then
begin
ShowMessage(Não é possível imprimir pedido em branco);
exit;
end
else
//PARTE 2 - Pergunta se deseja Gerar Código e Salvar Pedido
if MessageBox(0,Gerar código e "Salvar Pedido?",Salvar Pedido, 0+4+32)=6 then
begin
DM.TbPedido.Open;
DM.TbPedido.Append;
if DM.TbPedido.State in[dsinsert] then
begin
DM.TbPedidoCodigo.AsInteger := dm.id(SELECT MAX(CODIGO) FROM PEDIDOS);
DBEdit1.Text := PoeZeros(DBEdit1.Text,DBEdit1.MaxLength);
DM.TbPedido.FieldByName(Tipo).AsString := MascEdit2.Text;
DM.TbPedido.FieldByName(Sit).AsString := Edit5.Text;
DM.TbPedido.FieldByName(Data).AsDateTime := StrToDate(MascEdit3.Text);
DM.TbPedido.FieldByName(IdCliente).AsString := MascEdit4.Text;
DM.TbPedido.FieldByName(Cliente).AsString := Label7.Caption;
DM.TbPedido.FieldByName(IdVendedor).AsString := MascEdit26.Text;
DM.TbPedido.FieldByName(Vendedor).AsString := Label47.Caption;
DM.TbPedido.FieldByName(CondVenda).AsString := ComboBox3.Text;
DM.TbPedido.FieldByName(RepVenda).AsString := CapRepVenda.Caption;
DM.TbPedido.FieldByName(Tabela).AsString := ComboBox5.Text;
if Rep.Caption = then
begin
DM.TbPedido.FieldByName(Representante).AsString := CapRepVenda.Caption;
DM.TbPedido.FieldByName(Idrep).AsString := codloja.Caption;
end
else
begin
DM.TbPedido.FieldByName(Idrep).AsString := RepCod.Caption;
DM.TbPedido.FieldByName(Representante).AsString := Rep.Caption;
end;
DM.TbPedido.FieldByName(FormaPagto).AsString := ComboBox4.Text;
DM.TbPedido.FieldByName(DescontoPorcento).AsFloat := NumEdit3.Valor;
DM.TbPedido.FieldByName(Desconto).AsFloat := NumEdit4.Valor;
DM.TbPedido.FieldByName(Total).AsFloat := NumEdit5.Valor;
DM.TbPedido.FieldByName(Pessoa).AsString := FJ.Text;
if FJ.Text = F then
DM.TbPedido.FieldByName(cpfcnpj).AsString := MascEdit7.Text
else
DM.TbPedido.FieldByName(cpfcnpj).AsString := MascEdit9.Text;
MascEdit1.Text:= DM.TbPedido.FieldByName(Codigo).AsString;
MascEdit1.Text := PoeZeros(MascEdit1.Text,MascEdit1.MaxLength);
//Operador
DM.TbPedido.FieldByName(Operador).AsString := FormPrincipal.stbMensagens.Panels[2].Text;
DM.TbPedido.FieldByName(DataOp).AsDateTime := StrToDate(FormPrincipal.stbMensagens.Panels[3].Text);
DM.TbPedido.FieldByName(Hora).AsString := FormPrincipal.stbMensagens.Panels[4].Text;
//salva pedido
DM.TbPedido.Post;
DM.TbPedido.ApplyUpdates;
DM.TbPedido.close;
end;
//inserir dados em ItensPedido
with DM.TbItensPedido do
DM.TbSaida.First;
while not DM.TbSaida.Eof do
begin
DM.TbItensPedido.Open;
DM.TbItensPedido.Insert;
DM.TbItensPedido.FieldByName(Pedido).AsString := MascEdit1.Text;
DM.TbItensPedido.FieldByName(Tipo).AsString := MascEdit2.Text;
DM.TbItensPedido.FieldByName(Itens).AsString := DM.TbSaida.fieldByName(Itens).AsString;
DM.TbItensPedido.FieldByName(Produto).AsString:= DM.TbSaida.fieldByName(Produto).AsString;
DM.TbItensPedido.FieldByName(Descricao).AsString:= DM.TbSaida.fieldByName(Descricao).AsString;
DM.TbItensPedido.FieldByName(Und).AsString := DM.TbSaida.fieldByName(Und).AsString;
DM.TbItensPedido.FieldByName(IdVendedor).AsString := MascEdit26.Text;
DM.TbItensPedido.FieldByName(IdRep).AsString := RepCod.Caption;
DM.TbItensPedido.FieldByName(RepVenda).AsString := CapRepVenda.Caption;
DM.TbItensPedido.FieldByName(Quantidade).AsFloat := DM.TbSaida.fieldByName(Quantidade).AsFloat;
DM.TbItensPedido.FieldByName(Unit).AsFloat := DM.TbSaida.fieldByName(Preco).AsFloat;
//Colocando o valor Total já deduzindo o desconto, em editar pedido, os totais saem iguais
DM.TbItensPedido.FieldByName(TotalLiq).AsFloat := (DM.TbSaida.fieldByName(Total).AsFloat) - ((NumEdit3.Valor /100)
* (DM.TbSaida.fieldByName(Total).AsFloat));
DM.TbItensPedido.FieldByName(Total).AsFloat := DM.TbSaida.fieldByName(Total).AsFloat;
DM.TbItensPedido.FieldByName(Artigo).AsString := DM.TbSaida.fieldByName(Artigo).AsString;
DM.TbItensPedido.FieldByName(Grupo).AsString := DM.TbSaida.fieldByName(Grupo).AsString;
DM.TbItensPedido.FieldByName(Marca).AsString := DM.TbSaida.fieldByName(Marca).AsString;
DM.TbItensPedido.FieldByName(Data).AsDateTime := StrToDateTime(MascEdit3.Text);
DM.TbItensPedido.FieldByName(Desconto).AsFloat := NumEdit3.Valor;
DM.TbItensPedido.Post;
DM.TbItensPedido.ApplyUpdates;
DM.TbSaida.Next;
DM.TbItensPedido.Close;
end;
if (Mascedit2.ItemIndex = 0) or (Mascedit2.ItemIndex = 4) then //Mascedit2 é o Combobox Tipo de Pedido
begin
//atualiza as quantidades
with TbProduto do
begin
TbProduto.Open;
DM.TbSaida.First;
while not DM.TbSaida.Eof do
begin
//coloca em Fields[0] para código, Fields[1] para referência
Locate(Fields.Fields[1].FieldName,DM.TbSaida.FieldByName(Produto).AsString,[]);
Edit;
FieldByName(Quantidade).Asfloat := FieldByName(Quantidade).asfloat -
DM.TbSaida.FieldByName(Quantidade).Asfloat;
Post;
ApplyUpdates;
DM.TbSaida.Next;
end;
end;
end; //fim da escolha Tipo de Pedido
//Imprimir pedido
FormVenda := TFormVenda.Create(Self);
FormVenda.QuickRep1.Prepare;
FormVenda.QuickRep1.PrinterSetup;
if FormVenda.Quickrep1.tag=0 then
begin
FormVenda.Quickrep1.Print;
while not DM.TbSaida.IsEmpty do
DM.TbSaida.Delete;
FormSaidas.Close;
end
else
begin
ShowMessage(Impressão cancelada pelo usuário);
while not DM.TbSaida.IsEmpty do
DM.TbSaida.Delete;
FormSaidas.Close;
end;
exit;
end
else //Se não desejar GERAR CÓDIGO E SALVAR PEDIDO o sistema sai com opção NÃO e retorna sem salvar nada
exit;
end;
Posts
28/11/2008
Rodrigo Mourão
Olá Arnoldo.
É muito complicado analisar o código cruamente assim. Preciso saber que tecnologia de acesso a dados você utiliza nesta aplicação (ADO, DBE, DBX, Etc).
Parece que você não esta utilizando ClientDataSet correto ?? Há uma alinha no seguinte código:
//salva pedido
DM.TbPedido.Post;
DM.TbPedido.ApplyUpdates;
DM.TbPedido.close;
Se for ClienteDataSet mesmo não iria compilar pois o mesmo requer um parâmetro com o numero maximo de erros. Outra coisa se utiliza o ApplyUpdates com ClientDataSet não precisa dar post.
Tem mais um detalhe apenas sobre logica. Observe:
DM.TbPedido.Open;
DM.TbPedido.Append;
if DM.TbPedido.State in[dsinsert] then
Se você deu um Append não precisa testar se a tabela esta em DsInsert. Ela estará.Tem outra coisa que não entendi no código:
if Rep.Caption = then
begin
DM.TbPedido.FieldByName(Representante).AsString := CapRepVenda.Caption;
DM.TbPedido.FieldByName(Idrep).AsString := codloja.Caption;
Você compara o caption com o quê ??
Aguardo contato !!
abs
Toda tecnologia de acesso eu uso o Zeos.
Uso:
1)
- Data Module - Meus componentes virtuais estão todos aqui dentro.
Dentro deste Data Module uso apenas uma conexão "Zconnection".
- Zquery
- zUpdateSQL ---> Toda aplicação está conectada desta forma. Para salvar uso sempre o post e ApplyUpdates;
- DataSource
Exemplo: DM.TbPedido ---> Está dentro do Data Module. Lá do "FormPedido" puxo essa zquery.
E é nessa parte do código que as vezes o pedido duplica. Que não é para acontecer. O usuário disse que aparece a tela para imprimir duas vezes. A primeira ele manda imprimir e logo aparece a segunda o pedido duplica.
2)
Tenho notado que aqui nesse editor ele não pega aspas simples:
Quanto a comparação que faço:
if Rep.Caption = ´´ then
begin
DM.TbPedido.FieldByName(Representante).AsString := CapRepVenda.Caption;
DM.TbPedido.FieldByName(Idrep).AsString := codloja.Caption;
end
else
begin
DM.TbPedido.FieldByName(Idrep).AsString := RepCod.Caption;
DM.TbPedido.FieldByName(Representante).AsString := Rep.Caption;
end;
Quero saber se posso continuar usando essa verificação sem problema dentro de outro "if...then"
Gostaria que analisasse o código para mim, para ver se encontra alguma erro.
Se não tiver lhe passado todas informações, pergunte-me novamente.
Aguardo
Arnoldo Nunes
28/11/2008
Rodrigo Mourão
Olá Arnoldo.
Eu verifiquei seu código linha a linha. Eu indentei todo o código por que isso ajuda a identificar possíveis falhas na lógica seja num simples if e foi o que aconteceu.
Eu localizei duas linhas no seu código que estavam orfãs, ou seja, não tinha sentido no seu algoritmo. Uma delas era um with solto e outro era um exit justamente dentro do if que o usuário decide se quer ou não gravar o pedido.
No link abaixo, eu estou lhe enviando um arquivo txt identado com os códigos comentados. Verifique que destaquei as linhas que estavam orfãs. Faça um teste para ver se está tudo ok.
http://video.devmedia.com.br/naoexclusivos/RodrigoMourao/Consultoria/Codigo Indentado.txt
Estamos no aguardo para que possamos encerrar este chamado.
abs.
29/11/2008
Rodrigo Mourão
Olá Arnoldo,
Há mais alguma duvida referente ao chamado ?
Estamos aguardando para podermos encerrá-lo.
abs
Vou testar o código que me enviou. Peço que aguarde só mais um pouco.
Grato por sua atenção,
Arnoldo
Gostaria de saber, ainda dentro daquele código que lhe enviei, se tem como eu usar um procura melhor que o LOCATE?
ACHO O LOCATE MUITO LENTO. PODERIA FAZER ISSO COM UMA QUERY DESSA MESMA FORMA?
if (Mascedit2.ItemIndex = 0) or (Mascedit2.ItemIndex = 4) then //Mascedit2 é o Combobox Tipo de Pedido
begin
//atualiza as quantidades
with TbProduto do
begin
Open;
DM.TbSaida.First;
while not DM.TbSaida.Eof do
begin
//coloca em Fields[0] para código, Fields[1] para referência
Locate(Fields.Fields[1].FieldName,DM.TbSaida.FieldByName(Produto).AsString,[]);
Edit;
FieldByName(Quantidade).Asfloat := FieldByName(Quantidade).asfloat -
DM.TbSaida.FieldByName(Quantidade).Asfloat;
Post;
ApplyUpdates;
DM.TbSaida.Next;
end; // fim do while
end; //fim do with
end; //fim da escolha Tipo de Pedido
29/11/2008
Rodrigo Mourão
Olá Arnoldo,
Existem várias maneiras de fazer isso sim e de uma forma bem mais eficiente.
Se desejar pode estar abrindo um chamado sobre cosultas com componentes criados dinamicamente.
abs.
30/11/2008
Rodrigo Mourão
Olá,
Há mais alguma dúvida sobre o chamado?
Podemos encerrá-los ??
abs.
01/12/2008
Rodrigo Mourão
Arnoldo, como não nos retornou, estamos considerando o chamado encerrado.
De qualquer forma estamos a sua disposição,
abs