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

Problemas com consulta


nicolasbraz

Pergunta

segue as duas imagens

http://img19.imageshack.us/img19/7655/imagemaex.jpg

http://img15.imageshack.us/img15/148/imagem2npz.jpg

O problema e que eu so posso fazer consulta dos campos que estao inseridos, o problema e que as vezes podem querer saber quantas funcionarios foram demitidos num certo tempo so que existem funcionarios que trabalham eles não teria uma data de demissao preenchida, então quando eu ativo o campo ele não localiza os funcionarios na empresa.

Link para o comentário
Compartilhar em outros sites

Posts Recomendados

  • 0

Jhonas se eu deixar o codigo assim

if datademini.date = strtodate ( '01/01/2001') then

e o DateEdit com esse codigo ele vai fazer o que eu quero o problema é

Como na query esta escrito para ele comparar qual e maior e menor eu teria que apagar esse codigo da query (FUNC_DATADEM >= :datademini and FUNC_DATADEM <= :datademfin)

Ex:

Se datademini.date = strtodate ('01/01/2001') then

ele apaga o codigo (FUNC_DATADEM >= :datademini and FUNC_DATADEM <= :datademfin) .

Senao ele procura com o codigo da demissao, e mantem a o codigo.

Editado por nicolasbraz
Link para o comentário
Compartilhar em outros sites

  • 0
mas se eu colocar alguma data valida no codigo ele vai so que ai eu preciso ter 1 data final

E a ideia e se o funcionario for demitido coloca a data se não for não coloca.

Se a idéia é esta, então porque voce montou a sua SQL desta maneira ?

O codigo da Query.

select * from FUNCIONARIO
Where 
(Func_NOME like :nome) 
and 
(FUNC_CIDADE like :cidade) 
and 
(FUNC_CARGO like :cargo)
and 
(FUNC_CPF like :cpf) 
and
(FUNC_DATAADM >= :dataadmini and FUNC_DATAADM <= :dataadmfin) 
and
(FUNC_DATADEM >= :datademini and FUNC_DATADEM <= :datademfin)

O código que está em seu botão não corresponde com que que está na sua SQL

se o funcionario for demitido coloca a data se não for não coloca

Neste caso porque não ocorre uma mudanda dentro da sua SQL ? se o funcionario não for demitido, porque o comando para pesquisar data de demissão continua fazendo parte da SQL ?

Pense a respeito

abraço

Link para o comentário
Compartilhar em outros sites

  • 0
O código que está em seu botão não corresponde com que que está na sua SQL

se o funcionario for demitido coloca a data se não for não coloca

Neste caso porque não ocorre uma mudanda dentro da sua SQL ? se o funcionario não for demitido, porque o comando para pesquisar data de demissão continua fazendo parte da SQL ?

Pense a respeito

abraço

Jhonas eu entendo o que voce quer dizer acho não soube explicar o que queria eu coloquei o codigo da minha query, mas não sei o comando que devo usar gostaria de saber o que devo estudar para fazer esse tipo de coisa, para montar minha SQL correta para isso.

Link para o comentário
Compartilhar em outros sites

  • 0
Jhonas eu entendo o que voce quer dizer acho não soube explicar o que queria eu coloquei o codigo da minha query, mas não sei o comando que devo usar gostaria de saber o que devo estudar para fazer esse tipo de coisa, para montar minha SQL correta para isso.

Não me lembro em qual destes posts esta um link para apostilas de SQL ( como montar instruções em SQL ) e tambem vai encontrar outros que poderão tirar muitas das suas dúvidas

Faça uma pesquisa no forum para achar

http://scriptbrasil.com.br/forum/index.php...mp;highlite=SQL

abraço

Link para o comentário
Compartilhar em outros sites

  • 0
Jhonas eu entendo o que voce quer dizer acho não soube explicar o que queria eu coloquei o codigo da minha query, mas não sei o comando que devo usar gostaria de saber o que devo estudar para fazer esse tipo de coisa, para montar minha SQL correta para isso.

Como sempre digo, idente seu código e use a tag CODE para melho visualização da estrutura dele. De acordo com o que você postou, desde a primeira alteração (post#8) em que você incluiu um "else" no código do botão BitBtn2, há um erro nele que resulta na inicialização de parâmetros que em teoria não deveriam ser inicializados conforme o teste realizado no if. Veja o código do post referenciado, com a identação (e uso da tag CODE):

procedure TFrmConFuncionario.BitBtn2Click(Sender: TObject);
Begin
  if datademini.Date = strtoDate ('00/00/0000') then
  begin
    dmdados.sqlconfuncionario.close;
    dmdados.SqlConFuncionario.ParamByName('nome').asstring:='%'+editnome.text+'%';
    dmdados.SqlConFuncionario.ParamByName('cidade').AsString:='%'+EditCidade.Text+'%';
    dmdados.SqlConFuncionario.ParamByName('cargo').AsString:='%'+ComboBox1.Text+'%';
    dmdados.SqlConFuncionario.ParamByName('cpf').AsString:='%'+EditCpf.Text+'%';
    dmdados.SqlConFuncionario.ParamByName('dataadmini').AsDate:=dataadmIni.Date;
    dmdados.SqlConFuncionario.ParamByName('dataadmfin').AsDate:=DataadmFin.Date;
    dmdados.SqlConFuncionario.Open;
  end
  else
    dmdados.SqlConFuncionario.Close;
  dmdados.SqlConFuncionario.ParamByName('nome').asstring:='%'+editnome.text+'%';
  dmdados.SqlConFuncionario.ParamByName('cidade').AsString:='%'+EditCidade.Text+'%';
  dmdados.SqlConFuncionario.ParamByName('cargo').AsString:='%'+ComboBox1.Text+'%';
  dmdados.SqlConFuncionario.ParamByName('cpf').AsString:='%'+EditCpf.Text+'%';
  dmdados.SqlConFuncionario.ParamByName('dataadmini').AsDate:=dataadmIni.Date;
  dmdados.SqlConFuncionario.ParamByName('dataadmfin').AsDate:=DataadmFin.Date;
  dmdados.SqlConFuncionario.ParamByName('datademini').AsDate:=datademini.Date;
  dmdados.SqlConFuncionario.ParamByName('datademfin').AsDate:=datademfin.Date;
  dmdados.SqlConFuncionario.Open;
end;
perceba que não há a delimitação do bloco para o else, o que faz com que todas as linhas abaixo do último Close (no else) sejam processadas. A correção desta esquecimento, ainda passa pela questão da lógica. Os dois blocos fazem praticamente a mesma coisa, logo, não se duplica todo ele, apenas separamos a parte que é diferente e o resto é codificado apenas uma única vez:
procedure TFrmConFuncionario.BitBtn2Click(Sender: TObject);
Begin
  dmdados.sqlconfuncionario.close;
  dmdados.SqlConFuncionario.ParamByName('nome').asstring:='%'+editnome.text+'%';
  dmdados.SqlConFuncionario.ParamByName('cidade').AsString:='%'+EditCidade.Text+'%';
  dmdados.SqlConFuncionario.ParamByName('cargo').AsString:='%'+ComboBox1.Text+'%';
  dmdados.SqlConFuncionario.ParamByName('cpf').AsString:='%'+EditCpf.Text+'%';
  dmdados.SqlConFuncionario.ParamByName('dataadmini').AsDate:=dataadmIni.Date;
  dmdados.SqlConFuncionario.ParamByName('dataadmfin').AsDate:=dataadmFin.Date;

  if datademini.Date = strtoDate ('00/00/0000') then
  begin
  end
  else
  begin
    dmdados.SqlConFuncionario.ParamByName('datademini').AsDate:=datademini.Date;
    dmdados.SqlConFuncionario.ParamByName('datademfin').AsDate:=datademfin.Date;
  end;

  dmdados.SqlConFuncionario.Open;
end;
e que melhor escrito ficaria com o if diferente:
...
  if datademini.Date <> StrToDate ('00/00/0000') then
  begin
    dmdados.SqlConFuncionario.ParamByName('datademini').AsDate:=datademini.Date;
    dmdados.SqlConFuncionario.ParamByName('datademfin').AsDate:=datademfin.Date;
  end;
...
De qualquer modo, não será possível manter um parâmetro definido para a consulta sem que um valor lhe seja atibuído - sua consulta não funionará como deve. Há duas possibilidades para isto. Uma é a construção dinâmica do SQL onde, conforme a situação você irá incluir ou não a linha que deseja filtrar, enquanto que a outra seria um teste no parâmetro recebido e se o valor não for nulo você testa ele com o campo desejado (99% de chances de funcionar com todos os bancos). 1ª opção - Se você adiona os fields ao seu dataset, então, na propriedade SQL (ou similar, conforme componente) você constroi a query sem usar os parâmetros na cláusula where. Com isto, você poderá adicionar os fields sem problema e eles estarão disponíveis para a manipulação no código:
select * from FUNCIONARIO
(depois, no código, você modifica a query dinamicamente para filtrar as informações de acordo com a necessidade) - A manipulação dinâmica da query ficaria como segue:
procedure TFrmConFuncionario.BitBtn2Click(Sender: TObject);
Begin
 // vamos abreviar a escrita usando o "with ... do"
  with dmdados.sqlconfuncionario do
  begin
    Close;  // fechamos a consuta atual
    SQL.Clear;  // limpamos a query
   // reconstruimos a query com a parametrização necessária
    SQL.Add('select * from FUNCIONARIO');
    SQL.Add('Where (Func_NOME like :nome');
    SQL.Add('and (FUNC_CIDADE like :cidade');
    SQL.Add('and (FUNC_CARGO like :cargo');
    SQL.Add('and (FUNC_CPF like :cpf');
    SQL.Add('and (FUNC_DATAADM >= :dataadmini and FUNC_DATAADM <= :dataadmfin');
   // se formos filtrar a data de demissão...
    if datademini.Date <> strtoDate ('00/00/0000') then
      SQL.Add('and (FUNC_DATADEM >= :datademini and FUNC_DATADEM <= :datademfin');

   // inicializando os parâmetros
    ParamByName('nome').asstring:='%'+editnome.text+'%';
    ParamByName('cidade').AsString:='%'+EditCidade.Text+'%';
    ParamByName('cargo').AsString:='%'+ComboBox1.Text+'%';
    ParamByName('cpf').AsString:='%'+EditCpf.Text+'%';
    ParamByName('dataadmini').AsDate:=dataadmIni.Date;
    ParamByName('dataadmfin').AsDate:=dataadmFin.Date;

   // se formos filtrar a data de demissão...
    if datademini.Date <> strtoDate ('00/00/0000') then
    begin
      ParamByName('datademini').AsDate:=datademini.Date;
      ParamByName('datademfin').AsDate:=datademfin.Date;
    end;

    Open;  // abrimos a consulta
  end;
end;
2ª opção - Nesta situação, apenas ampliamos a query atualmente em uso:
select * from FUNCIONARIO Where (Func_NOME like :nome) and (FUNC_CIDADE like :cidade) and (FUNC_CARGO like :cargo) and (FUNC_CPF like :cpf) and (FUNC_DATAADM >= :dataadmini and FUNC_DATAADM <= :dataadmfin) and ((:datademini is null) or (FUNC_DATADEM >= :datademini and FUNC_DATADEM <= :datademfin))
observe a inclusão de "(:datademini is null) or ". Isto fará com que, sendo o parâmetro datademini nulo, a consulta não considere o filtro para FUNC_DATADEM. A desvantagem, pode ser a degradação do desempenho da consulta caso haja um índice para o campo em questão, uma vez que não será utilizado o índice para a otimização da query (sempre que usamos o OR estamos jujeitos a isto). - no código inicializamos o parâmetro em questão com null ao chamarmos o método Clear:
procedure TFrmConFuncionario.BitBtn2Click(Sender: TObject);
Begin
  dmdados.sqlconfuncionario.close;
  dmdados.SqlConFuncionario.ParamByName('nome').asstring:='%'+editnome.text+'%';
  dmdados.SqlConFuncionario.ParamByName('cidade').AsString:='%'+EditCidade.Text+'%';
  dmdados.SqlConFuncionario.ParamByName('cargo').AsString:='%'+ComboBox1.Text+'%';
  dmdados.SqlConFuncionario.ParamByName('cpf').AsString:='%'+EditCpf.Text+'%';
  dmdados.SqlConFuncionario.ParamByName('dataadmini').AsDate:=dataadmIni.Date;
  dmdados.SqlConFuncionario.ParamByName('dataadmfin').AsDate:=dataadmFin.Date;
 // neste caso, se a data for "vazia", setamos os parâmetros para nulo com o Clear
  if datademini.Date = strtoDate ('00/00/0000') then
  begin
    dmdados.SqlConFuncionario.ParamByName('datademini').Clear;
    dmdados.SqlConFuncionario.ParamByName('datademfin').Clear;
  end;
end;

Apenas mais uma observação: se você for passar valores completos nos campos como cidade, cargo, cpf,..., não use o LIKE use a igualdade. E, se houver a questão da distinção entre maiúsculas e minúsculas, você deve fazer uso de funções que convertam os campos para um dos dois tipos, já que normalmente os bancos fazem distinção entre um e outro, podendo interferir nos resultados.

Espero que possa ter ajudado a compreer algo mais a respeito desta questão.

Abraços

Editado por Micheus
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,4k
×
×
  • Criar Novo...