Fórum cosultas com componentes criados dinamicamente #932

01/12/2008

0

Uso o Locate para pesuisa de produtos e em alguma outra parte do meu aplicativo. Porém, é visível a demora da pesquisa usando LOCATE. Gostaria de saber como posso utilisar outro forma mais eficiente e rápida para fazer pesquisa. Se possível, mande um exemplo para mim. Aguardo, Arnoldo.
Arnoldo Lima

Arnoldo Lima

Responder

Post mais votado

02/12/2008

Obrigado, o código resolveu. Está bom agora.   Tenho só uma última dúvida para encerrarmos essse assunto. Gostaria muito que me ajudasse.   É o seguinte.   Como faço para colocar uma condição " if ... then"  nessa busca.    //nova busca começa
   QryBusca := TZQuery.Create(Self);
   QryBusca.Connection := DM.conexao;    QryBusca.Close;
   QryBusca.Sql.Clear;
   QryBusca.SQL.Add(Select Quantidade, Unidade, Produto, Artigo, Grupo, Marca, PrecoAtacado, PrecoVenda from                                 Produtos);
   QryBusca.SQL.Add(WHERE Referencia = :Referencia);
   QryBusca.ParamByName(Referencia).AsString := MascEdit8.Text;
   QryBusca.Open;    MascEdit10.Text := QryBusca.FieldByName(Quantidade).AsString;
   MascEdit6.Text := QryBusca.FieldByName(Unidade).AsString;
   Label25.Caption := QryBusca.FieldByName(Produto).AsString;
   Edit2.Text := QryBusca.FieldByName(Artigo).AsString;
   Edit3.Text := QryBusca.FieldByName(Grupo).AsString;
   Edit4.Text := QryBusca.FieldByName(Marca).AsString;
       if ComboBox5.ItemIndex = 0 then
       MascEdit11.Text := FormatFloat(0.#0,,(QryBusca.FieldByName(PrecoAtacado).AsFloat))
       else
       MascEdit11.Text := FormatFloat(0.#0,,(QryBusca.FieldByName(PrecoVenda).AsFloat));
 {  end
    else
    begin
    ShowMessage(Produto não encontrado);   --> aqui, se a busca não encontrar o Produto ele avisa.
    MascEdit8.SetFocus;
    exit;
    end;        }
   //nova busca termina     Como faço para colocar o "if ... then" nesse código.   Aguardo. Arnoldo

Arnoldo Lima

Arnoldo Lima
Responder

Gostei + 1

Mais Posts

01/12/2008

Rodrigo Mourão

Olá Arnoldo, estarei providenciando !!   abs
Responder

Gostei + 0

02/12/2008

Rodrigo Mourão

Segue video com exemplo. abs

[#VIDEO-35#]
Responder

Gostei + 0

02/12/2008

Arnoldo Lima

Por getileza, aguarde um pouco enquanto analiso o vídeo. Preciso de um tempo para isso. Gostaria de tirar mais alguma dúvida sobre o mesmo assunto.   Arnoldo
Responder

Gostei + 0

02/12/2008

Arnoldo Lima

Eu adaptei seu código para o meu sistema. FUNCIONOU DA SEGUINTE FORMA.   if (Mascedit2.ItemIndex = 0) or (Mascedit2.ItemIndex = 4) then  //Escolhe tipo de Pedido pra baixar ou não estoq     begin
    Qry := TZQuery.Create(Self);
    Qry.Connection := DM.conexao;
    DM.TbSaida.First;
         while not DM.TbSaida.Eof do
         begin
           Qry.Close;
           Qry.SQL.Add(Select Quantidade from Produtos);
           Qry.SQL.Add(WHERE Referencia = :Referencia);
           Qry.ParamByName(Referencia).AsString := DM.TbSaida.FieldByName(Produto).asstring;
           Qry.Open;
           Qry.Edit;
           Qry.Fields[0].AsFloat := Qry.Fields[0].AsFloat - DM.TbSaida.FieldByName(Quantidade).Asfloat;
           Qry.Post;
           DM.TbSaida.Next;
          end;
    end;   //Fim da escolha tipo de Pedido       //observação1: Escolho o tipo de pedido, porque as vezes na empresa não precisa dar baixa na quantidade       de produtos aí escolhes "Pedido Remessa por exemplo. Esse não daria baixa, o estoque ficaria como estava.      //Essa variável eu declarei no início do procedimento:  "Qry: TZQuery; " - Lá no início do código.      Esse é o código antigo:         {   //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     }          POR GENTILEZA, DÊ UMA OLHADA E ME DIGA SE ESTÁ TUDO OK OU SE EU POSSO MELHORAR MINHA ADAPTAÇÃO DO CÓDIGO.   Ainda sobre esse assunto gostaria de saber se posso adaptar outro LOCATE. Lhe envio em seguida.   Grato, Arnoldo
Responder

Gostei + 0

02/12/2008

Arnoldo Lima

Como ficaria o LOCATE no seguinte código:   //faz busca precisa do código do produto
  if DM.TbSaida.Locate(Produto,MascEdit8.Text,[]) then
     begin
     ShowMessage(O produto já foi lançado);
     if Application.MessageBox(SIM para adicionar outro item - NÃO para EDITAR ou FECHAR o PEDIDO,Sair,MB_YESNO + MB_ICONINFORMATION + MB_DEFBUTTON2)= IdYes then
         MascEdit8.SetFocus
         else
         begin
          if NumEdit3.Enabled = True then
             NumEdit3.SetFocus
             else
             begin
             NumEdit3.Enabled := True;
             NumEdit3.SetFocus;
             NumEdit4.Enabled := False;
             end;
          Exit;
         end;
     end;
  //até aqui faz a busca para saber se o código é igual na tabela saída   //pega os dados da tabela Produtos e traz para o Pedido
  With TbProduto do
  begin
    Open;
    Refresh;                    //coloa aqui 0 (zero) para buscar pelo código, 1 (um) para buscar pela referência
     if  Locate(FieldDefs.Items[1].Name,MascEdit8.Text,[]) then
        begin
        MascEdit10.Text := FieldByName(Quantidade).AsString;
        MascEdit6.Text := FieldByName(Unidade).AsString;
        Label25.Caption := FieldByName(Produto).AsString;
        Edit2.Text := FieldByName(Artigo).AsString;
        Edit3.Text := FieldByName(Grupo).AsString;
        Edit4.Text := FieldByName(Marca).AsString;         if ComboBox5.ItemIndex = 0 then
          MascEdit11.Text := FormatFloat(0.#0,,(FieldByName(PrecoAtacado).AsFloat))
        else
          MascEdit11.Text := FormatFloat(0.#0,,(FieldByName(PrecoVenda).AsFloat));
        end
        else
        begin
        ShowMessage(Produto não encontrado);
        MascEdit8.SetFocus;
        exit;
        end;
        Close;
        end;   MascEdit12.Text := 0;   Aguardo Arnoldo
Responder

Gostei + 0

02/12/2008

Arnoldo Lima

DEU ERRO.  SOCORRO!!!   Tinha testado somente com um produto, mas quando fui testar com mais deu ERRO.   Vou lhe enviar novamente o novo e o velho código:   if (Mascedit2.ItemIndex = 0) or (Mascedit2.ItemIndex = 4) then  //Escolhe Tipo de Pedido - Mascedit2 é o Combobox Tipo de Pedido
        begin
          Qry := TZQuery.Create(Self);
          Qry.Connection := DM.conexao;
          DM.TbSaida.First;
          while not DM.TbSaida.Eof do
          begin
           Qry.Close;
           Qry.SQL.Add(Select Quantidade from Produtos);
           Qry.SQL.Add(WHERE Referencia = :Referencia);
           Qry.ParamByName(Referencia).AsString := DM.TbSaida.FieldByName(Produto).asstring;
           Qry.Open;
           Qry.Edit;
           Qry.Fields[0].AsFloat := Qry.Fields[0].AsFloat - DM.TbSaida.FieldByName(Quantidade).Asfloat;
           Qry.Post;
           DM.TbSaida.Next;
          end;
        end; //fim da escolha Tipo de Pedido        CÓDIGO VELHO - Funcionava beleza e dava baixa nos produtos listados no pedido:       {   //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     }   Se eu listar mais de 1 produto ele dá erro. A partir do segundo ele já não da baixa no estoque.  
Responder

Gostei + 0

02/12/2008

Rodrigo Mourão

Olá Arnoldo, quanto a sua adaptação parece estar tudo ok, sintaticamente sim. Agora você precisa testar seu código para ver se esta ok.   Agora quando a segunda dúvida. Você já está usando locate. Se for mudar para Query o processo é o mesmo demostrado na vídeo.   abs
Responder

Gostei + 0

02/12/2008

Arnoldo Lima

Testei o código, mas só funciona para 1 produto. Quando coloco 2 ou mais para dar baixa na quantidade no estoque dá erro. Ela só aceita um e dá uma mensagem de erro.   if (Mascedit2.ItemIndex = 0) or (Mascedit2.ItemIndex = 4) then  //Escolhe Tipo de Pedido - Mascedit2 é o Combobox Tipo de Pedido
        begin
          Qry := TZQuery.Create(Self);
          Qry.Connection := DM.conexao;
          DM.TbSaida.First;
          while not DM.TbSaida.Eof do
          begin
           //Qry.Close;
           Qry.SQL.Add(Select Quantidade from Produtos);
           Qry.SQL.Add(WHERE Referencia = :Referencia);
           Qry.ParamByName(Referencia).AsString := DM.TbSaida.FieldByName(Produto).asstring;
           Qry.Open;
           Qry.Edit;
           Qry.Fields[0].AsFloat := Qry.Fields[0].AsFloat - DM.TbSaida.FieldByName(Quantidade).Asfloat;
           Qry.Post;
           DM.TbSaida.Next;
          end;
        end; //fim da escolha Tipo de Pedido   So atualiza a quantidade de 1 produto no pedido depois dá erro.   O que está acontecendo?
Responder

Gostei + 0

02/12/2008

Rodrigo Mourão

Arnoldo,   Você tem que depurar o código, "deu erro" fica muito vago.   Coloque um break point na rotina e depure. Verifique se os valores estão sendo passados corretamente.   Outra coisa existe um comando Prepare que alguns DataSet do Delphi suporte que serve para preparar a query quando criada dinamicamente. Como Zeos é um componente de terceiro eu não posso afirmar mas verifique se ele suporta este método.   Se suportar chame-o antes de passar o valor para o parametro.   abs !!
Responder

Gostei + 0

02/12/2008

Arnoldo Lima

Quando executo o código:   if (Mascedit2.ItemIndex = 0) or (Mascedit2.ItemIndex = 4) then  //Escolhe Tipo de Pedido - Mascedit2 é o Combobox Tipo de Pedido
        begin
          Qry := TZQuery.Create(Self);
          Qry.Connection := DM.conexao;
          DM.TbSaida.First;
          while not DM.TbSaida.Eof do
          begin
           Qry.Close;
           Qry.SQL.Add(Select Quantidade from Produtos);
           Qry.SQL.Add(WHERE Referencia = :Referencia);
           Qry.ParamByName(Referencia).AsString := DM.TbSaida.FieldByName(Produto).asstring;
           Qry.Open;
           Qry.Edit;
           Qry.Fields[0].AsFloat := Qry.Fields[0].AsFloat - DM.TbSaida.FieldByName(Quantidade).Asfloat;
           Qry.Post;
           DM.TbSaida.Next;
          end;
        end; //fim da escolha Tipo de Pedido     1- O que o código faz?     R. Procura quantidade da tabela Produtos. Depois edita somente A "Referencia" que está em Produtos de acordo  com a TbSaida.   Obs. Antes desse código vou colocando um por um os produtos dentro da tabela "TbSaida".   2- O que faço depois? Justamente o código acima. Vou dando baixa na quantidade da tabela "Produtos" um por um até o fim da "TbSaida" onde estão os produtos lançados para venda no momento.       O código acima funciona somente para 1 (um) produto na tabela "TbSaida", quando coloco acima de 1 aparece a mensagem abaixo:         SQL Error: You have an error your SQL syntax; check the manual that corresponds
    to your MySQL server version for the right syntax to use near
   "SelecQuantidade from Produtos WHERE Referencia = 100104" at line 1.     Obs. "100104" é a referencia de um dos produtos que estão lançados na TbSaida.     Por exemplo: Se lanço os produtos na tabela "TbSaida":             100102 - Celular           100104 - Fone de ouvido           100106- Pen drive   O erro acima aparece logo na referência "100104" .   Aguardo resposta, Arnoldo                  
Responder

Gostei + 0

02/12/2008

Rodrigo Mourão

Agora Sim  !!!!!  Coma mensagem fica claro !!


Vamos lá na minha vídeo eu usei ADO  pois não tenho o Zeos.  O commandtext no ADO e String já o Seu componente e um TString. Repare voce da ADD.

Sendo Assim sempre que entrar no código tem que dar um Clear se nao ele vai concatenar um select no outro por isso o erro no segundo. Observe:

         DM.TbSaida.First;
          while not DM.TbSaida.Eof do
          begin
           Qry.Close;
           Qry.Sql.Clear;
           Qry.SQL.Add(Select Quantidade from Produtos);
           Qry.SQL.Add(WHERE Referencia = :Referencia);
           Qry.ParamByName(Referencia).AsString := DM.TbSaida.FieldByName(Produto).asstring;
           Qry.Open;
           Qry.Edit;
           Qry.Fields[0].AsFloat := Qry.Fields[0].AsFloat - DM.TbSaida.FieldByName(Quantidade).Asfloat;
           Qry.Post;
           DM.TbSaida.Next;
          end;


Isso ira resolver !!

Aguardo retorno para encerrar o chamado !!!!


Responder

Gostei + 0

02/12/2008

Rodrigo Mourão

Olá Arnoldo, alguma novidade??

O Código resolveu ???


abs !!
Responder

Gostei + 0

02/12/2008

Rodrigo Mourão

QryBusca := TZQuery.Create(Self);
   QryBusca.Connection := DM.conexao;    QryBusca.Close;
   QryBusca.Sql.Clear;
   QryBusca.SQL.Add(Select Quantidade, Unidade, Produto, Artigo, Grupo, Marca, PrecoAtacado, PrecoVenda from                                 Produtos);
   QryBusca.SQL.Add(WHERE Referencia = :Referencia);
   QryBusca.ParamByName(Referencia).AsString := MascEdit8.Text;
   QryBusca.Open;
if Qry.RecordCount = 1 then
begin
   MascEdit10.Text := QryBusca.FieldByName(Quantidade).AsString;
   MascEdit6.Text := QryBusca.FieldByName(Unidade).AsString;
   Label25.Caption := QryBusca.FieldByName(Produto).AsString;
   Edit2.Text := QryBusca.FieldByName(Artigo).AsString;
   Edit3.Text := QryBusca.FieldByName(Grupo).AsString;
   Edit4.Text := QryBusca.FieldByName(Marca).AsString;
       if ComboBox5.ItemIndex = 0 then
       MascEdit11.Text := FormatFloat(0.#0,,(QryBusca.FieldByName(PrecoAtacado).AsFloat))
       else
       MascEdit11.Text := FormatFloat(0.#0,,(QryBusca.FieldByName(PrecoVenda).AsFloat));
end
    else
    begin
    ShowMessage(Produto não encontrado);   --> aqui, se a busca não encontrar o Produto ele avisa.
    MascEdit8.SetFocus;
    exit;
    end;       
Responder

Gostei + 0

02/12/2008

Arnoldo Lima

Vou testar, depoi lhe falo arnoldo
Responder

Gostei + 0

03/12/2008

Rodrigo Mourão

Olá, Arnoldo !!   O Código esta Ok ??? Podemos encerrar o Chamado ???   Estamos no aguardo !!!  abs.  
Responder

Gostei + 0

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

Aceitar