Fórum registro duplicado "sem intenção" #877

28/11/2008

0

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;  
Arnoldo Lima

Arnoldo Lima

Responder

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
Responder

Gostei + 0

28/11/2008

Arnoldo Lima

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  
Responder

Gostei + 0

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

Gostei + 0

29/11/2008

Rodrigo Mourão

Olá Arnoldo,   Há mais alguma duvida referente ao chamado ?   Estamos aguardando para podermos encerrá-lo.   abs
Responder

Gostei + 0

29/11/2008

Arnoldo Lima

Vou testar o código que me enviou. Peço que aguarde só mais um pouco. Grato por sua atenção, Arnoldo
Responder

Gostei + 0

29/11/2008

Arnoldo Lima

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
Responder

Gostei + 0

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

Gostei + 0

30/11/2008

Rodrigo Mourão

Olá,   Há mais alguma dúvida sobre o chamado?   Podemos encerrá-los ??   abs.
Responder

Gostei + 0

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
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar