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

Consulta Sql Com Editmask


Vivendo&Aprendendo

Pergunta

Olá galera!

Seguinte tenho um form com um DBGrid, um Combo e um EditMask. quando escolho no meu combo DATA VENCIMENTO ele joga para o editmask a mascara ##/##/#### mas ai por ter a mascara ele zera o grid eu preciso usar a mascara mas não está dando certo, pois com ela só aparece o registro que digitei a data de vencimento quando termino de digitar e não como o sql faz trazendo todos os registros parecidos..

Como posso fazer isso?

Alexandre

Link para o comentário
Compartilhar em outros sites

14 respostass a esta questão

Posts Recomendados

  • 0

cara estou utilizando o OnChange, mas como ficaria isso com a exceção?

E não dá erro enquanto você preenche a data? Para campos textos este lance de ir preenchendo e ele buscando é tranquilo, porém para dados que só tem algum significado quando estão completos (como é o caso de uma data) isso não é lá muito prático de se fazer.

Relendo seu primeiro post eu notei o seguinte "pois com ela só aparece o registro que digitei a data de vencimento quando termino de digitar e não como o sql faz trazendo todos os registros parecidos". Uma data só é uma data se estiver completa, ou seja, se tiver dia, mês e ano, no mínimo. Você quer procurar datas incompletas? Se o cara digitar "25/ / " você quer procurar os registros só com esse 25? Se for, a lógica vai ser bem diferente do normal.

De qualquer maneira, acredito que você poderia fazer isso aqui no evento OnChange da MaskEdit:

var busca : Boolean;

begin
  busca := True;
  try
    StrToDate(MaskEdit1.Text);
  except on EConvertError do
    busca := False;
  end;

  if (busca) then
  begin
    ...
  end;

end;

Isso faria com que a busca só fosse executada quando fosse inserida uma data válida na MaskEdit. Seria isso que você quer?

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Graymalkin, não seria também necessário que o colega Vivendo&Aprendendo testasse a opção selecionada no combo, já que:

quando escolho no meu combo DATA VENCIMENTO ele joga para o editmask a mascara ##/##/####
e o seu exemplo considera este campo como sendo sempre data? (sá para clarear)
Link para o comentário
Compartilhar em outros sites

  • 0

var busca : Boolean;

begin
  busca := True;
  try
    StrToDate(MaskEdit1.Text);
  except on EConvertError do
    busca := False;
  end;

  if (busca) then
  begin
    ...
  end;

end;
cara coloquei esse código no OnChange e no OnClick do Combo coloquei para que quando for a DATA e jogar para o editMask a mascara mas da erro dizendo que a data é inválida. Meu código ficou dessa forma: OnClick do combo
  EdtBusca.SetFocus;
  If CbbBusca.ItemIndex = 1 Then
    EdtBusca.EditMask := '##/##/####;1;_'
  else
    EdtBusca.Clear;
Busca no OnChange do edit
  busca := True;
  try
    StrToDate(EdtBusca.Text);
  except on EConvertError do
    busca := False;
  end;

  if (busca) and (CbbBusca.ItemIndex = 1) then
  begin
    ADOContasReceber.Close;
    ADOContasReceber.SQL.Clear;
    ADOContasReceber.SQL.Add('Select * From ContasReceber');
    ADOContasReceber.SQL.Add('Where Situacao = "A PAGAR" and DataVencimento Like :pDat ');
    ADOContasReceber.SQL.Add('Order By Cliente');
    ADOContasReceber.Parameters[0].Value := EdtBusca.Text + '%';
    ADOContasReceber.Open;
  end;

cara acho que vou ter que fazer isso de outra maneira, não queria deixar sem a mascara.

falou

Link para o comentário
Compartilhar em outros sites

  • 0

Nunca utilizei LIKE com campo data (acredito que não deva funcionar), a memos que o campo date na query seja transformado para string e daí comparado à uma data no formato string. O que costumo fazer é atualizar a query no evento OnExit (falando de um campo tipo date) quando o campo data já está devidamente preenchido e validado.

Como questionei no post anterior, acredito que o seu bloco try except (em "Busca no OnChange do edit") deveria ficar dentro da validação "if (busca) and (CbbBusca.ItemIndex = 1) then", já que aparentemente apenas nesta condição você utiliza o valor de EdtBusca.Text como um campo de data. Para situações que não o seja, a execption com certeza ocorrerá.

Link para o comentário
Compartilhar em outros sites

  • 0

Micheus fiz da seguinte maneira e deu erro na hora que escolho no combo o item da data

  busca := True;
  try
    StrToDate(EdtBusca.Text);
    if (busca) and (CbbBusca.ItemIndex = 1) then
    begin
      ADOContasReceber.Close;
      ADOContasReceber.SQL.Clear;
      ADOContasReceber.SQL.Add('Select * From ContasReceber');
      ADOContasReceber.SQL.Add('Where Situacao = "A PAGAR" and DataVencimento Like :pDat ');
      ADOContasReceber.SQL.Add('Order By Cliente');
      ADOContasReceber.Parameters[0].Value := EdtBusca.Text + '%';
      ADOContasReceber.Open;
    end;
  except on EConvertError do
    busca := False;
  end;

Será que tem como fazer isso de outra maneira?

falou

Link para o comentário
Compartilhar em outros sites

  • 0

Importante, sobre OnChange...

Ao tomar decisões a partir do evento OnChange, é preciso desativar esta propriedade antes de verificar (ou alterar) o seu conteúdo ou executar a tarefa que se quer com os dados do campo preenchido - se estiverem corretos. Veja neste exemplo que só vamos transformar o nome "paulo" de minúsculo para maiúsculo se a comparação for completa.

Procedure TForm1.Edit1Change(Sender: TObject);

Begin

Edit1.OnChange := Nil;

If Edit1.Text='paulo' then

Edit1.Text := 'PAULO';

{EndIf}

Edit1.OnChange := Edit1Change;

End;

********** Assim evita-se que o evento seja chamado recursivamente até dar um estouro de pilha.

Quanto à sua pesquisa, seria melhor fazê-la a partir de um evento keypress e, quando à pesquisa com datas, é importante definir uma faixa de possibilidade da pesquisa. Por exemplo, como só mantemos os registros de notas fiscais por cinco anos, não permitimos uma pesquisa na tabela de notas fiscais com a data 01/02/1998... ou mesmo a pesquisa de uma data que não existe ainda , como as notas fiscais emitidas no mês que vem (28/05/2006)...

Veja neste exemplo que a data só será pesquisada se o usuário teclar Enter no campo maskedit e se a data for válida...

Coloque um maskedit (##/##/####) e um label no form.

var

Form1: TForm1;

dData2SetKey, dData1, dData2: TDateTime;

sData2SetKey: String;

bDataOk: Boolean;

implementation

{$R *.dfm}

Procedure TForm1.MaskEdit1KeyPress(Sender: TObject; var Key: Char);

Begin

If (key=#13) then

Begin

Try

dData2SetKey := StrToDate(MaskEdit1.Text);

bDataOk := True;

Except

dData2SetKey := StrToDate('01/01/1900');

bDataOk := False;

End;

If bDataOk then

Begin // Data ok. Ver se é válida.

If (dData2SetKey>=dData1) and (dData2SetKey<=dData2) then

Begin // A data é válida.

sData2SetKey := DateToStr(dData2SetKey);

sData2SetKey := Copy(sData2SetKey,4,3)+

Copy(sData2SetKey,1,3)+

Copy(sData2SetKey,7,4);

Label1.Caption := 'Pesquisando por '+sData2setKey;

//

// Aqui vai a sua pesquisa! ************************************************

//

End

Else

Label1.Caption := 'Data Não Permitida para pesquisa.';

{EndIf (dData2SetKey...}

End

Else

Label1.Caption := 'Data Inválida';

{EndIf bDataOk}

End;

{EndIf}

End;

Procedure TForm1.FormCreate(Sender: TObject);

Begin

// Para notas fiscais, só posso pesquisar de hoje até cinco anos atrás. Então a faixa (range) será

dData1 := Date()-(365*5);

dData2 := Date();

End;

End.

Abraços!

Link para o comentário
Compartilhar em outros sites

  • 0
Procedure TForm1.Edit1Change(Sender: TObject);

Begin

Edit1.OnChange := Nil;

If Edit1.Text='paulo' then

Edit1.Text := 'PAULO';

{EndIf}

Edit1.OnChange := Edit1Change;

End;

********** Assim evita-se que o evento seja chamado recursivamente até dar um estouro de pilha.

Com relação a este exemplo, se você depurar este código verá que haverá apenas uma nova chamada no momento da atribuição do novo valor - porque evidentimente ele mudou (change) e não haverá estouro de pilha, logo, tal cuidado não chega a ser crítico para este caso (também, poderia ser resolvido se fosse alterada a propriedade CharCase para ecUpperCase no componente). Contudo talvez o mais relevante seja observar (às vezes nota-se que não é observado) que a cada tecla pressionada neste campo (componente) será gerado o evento OnChange e para algumas codificações este não seria o evento mais apropriado.

A parti do seu código o que sugeri foi o seguinte:

  Busca := True;
    if (busca) and (CbbBusca.ItemIndex = 1) then
    begin
    try
      ADOContasReceber.Close;
      ADOContasReceber.SQL.Clear;
      ADOContasReceber.SQL.Add('Select * From ContasReceber');
      ADOContasReceber.SQL.Add('Where Situacao = "A PAGAR" and DataVencimento = :pDat ');
      ADOContasReceber.SQL.Add('Order By Cliente');
  // na linha abaixo, havendo erro, repõe o foco no Edit1
      ADOContasReceber.ParamByName('pDat').AsDateTime := StrToDate(EdtBusca.Text);
      ADOContasReceber.Open;
    end;
  except on EConvertError do
    begin
      Edit1.SetFocus;
      busca := False;
    // aqui, uma mensagem informando sobre o erro seria conveniente
    end;
  end;

Observe que este código deveria ser aplicado apenas com o campo de data completamente preenchido já que passamos para a query a data convertida. Assim, o local mais apropriado para execução do código seria, como o colega paulobergo, no evento OnKeyPressed onde você testaria a tecla ENTER (#13), ou no evento OnExit. Observe que se você altera um campo e deseja atualizar alguma coisa como reflexo disto, não necessariamente apenas ENTER seja a tecla a ser verificada, já que para mudar de campo dentro de uma janela do Windows, você utiliza a tecla TAB ou o MOUSE e nestes casos o evento OnExit sempre é gerado (eu dou preferência a esta opção). Algumas vezes utilizo um botão (onde efetivo o processo de localização).

Para utilizar a digitação parcial da data como você faria com um texto (string) através do LIKE e utilizando o evento OnChange, vale o que o colega Graymalkin disse:

Veja se o seu BD tem uma função para converter de data para string, daí sim você vai poder utilizar o LIKE
Mesmo assim tenha em mente que estando a data no formato dd/mm/yyyy, você digita o nº 1 e serão listados todos os registros onde a data começa com um (15/10/1995; 1/6/2005), logo o resultado estará (provavelmente) muito longe do desejado. Assim, acredito que quando se tratar de pesquisa por data, a melhor opção é pesquisar pelo campo completo.

A título de validação, vale o que o colega paulobergo disse:

quando à pesquisa com datas, é importante definir uma faixa de possibilidade da pesquisa

[]s

Link para o comentário
Compartilhar em outros sites

  • 0

Galera a pesquisa eu consegui fazer com uma select. Agora me respondam uma coisa é possível fazer com que na hora que eu escolher DATA VENCIMENTO no Combobox não seja limpa a grade do grid, pois quando escolho ele limpa todo o grid e só acha o registro depois de estar tudo digitado.

Link para o comentário
Compartilhar em outros sites

  • 0

Se você está fechando o DataSet, associado ao DBGrid, quando seleciona a opção no ComboBox e apenas o abre após concluída a digitação isto sempre vai ocorrer. Há de se saber em que momento você fecha e retorna a abrir o dataset.

Em alguns casos, escolher o momento de fechar para em seguida abrir o dataset pode ser o suficiente para resolver o "problema", visto que algumas consultas são retornadas rapidamente. Mas, se achar que esta opção não está lhe servindo, pode utilizar as procedures DisableControls e EnableControls do componente TDataSet (ex. extraído do help):

with CustTable do
begin
  DisableControls;
  try
    First;
    while not EOF do
    begin
      { Process each record here }
      ...
      Next;
    end;
  finally
    EnableControls;
  end;
end;

Estes procedimentos farão com que os componentes que estão ligados ao DataSet fiquem "congelados" (DisableControls) até que você diga para descongelá-los (EnableControls) quando, então, serão atualizados.

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,3k
    • Posts
      652,3k
×
×
  • Criar Novo...