Fórum Erro com IF no parametro de um SQL? #349680

26/11/2007

0

Pessoal, estou com um problema com parametros no SQL

Bom o SQL esta assim
SELECT SIND2.MATRICULA,
      SIND2.ADMISSAO,
      SIND2.ASSOCIADO,
      coalesce(sum(corrente.VALORPG),0) Soma
FROM sind2
inner JOIN corrente ON (sind2.MATRICULA = corrente.MATRICULA)
      WHERE CORRENTE.MATRICULA = :pMatricula
            and extract(month from CORRENTE.MESPGTO) <= :pMes
            and extract(year from CORRENTE.MESPGTO) <= :pAno

group by 1,2,3

order by 2

[b:2898a49b61]OBS: A SQL esta certo para o que eu preciso[/b:2898a49b61]

Os parametros passei assim:

[b:2898a49b61]:pMatricula[/b:2898a49b61] cadastrei como [color=darkblue:2898a49b61]ftString[/color:2898a49b61]
[b:2898a49b61]:pMes e :pAno[/b:2898a49b61] cadastrei como [color=darkblue:2898a49b61]ftSmallInt[/color:2898a49b61]

Ai no aplicativo estou passando assim
[i:2898a49b61][color=olive:2898a49b61]{:primeiro pego o CDS do DM, depois verifico se o edit1 esta vazio, caso esteja em branco não precisa preencher o edit1, ai entra a condição do IF, o seguindo e o terceiro parametro tem que pegar o Mes e o Ano que estão no ComboBox3 e Edit2}[/color:2898a49b61][/i:2898a49b61]
 with dm.cdsMontante do
     begin
     close;
     if (Trim(edit1.Text) <> ´´) then
       Params[0].AsString := Edit1.text
     else
       Params[1].Value:=StrToInt(ComboBox3.Text);
       Params[2].Value:=StrToInt(Edit2.Text);
     open;
     if dm.cdsMontante.IsEmpty then
        MessageDlg(´Nao há registro. Por favor tente novamente´, mtInformation, [mbOK], 0);
     end;


Sei que o problema esta aqui no IF
with dm.cdsMontante do begin close; [color=red:2898a49b61]if (Trim(edit1.Text) <> ´´) then[/color:2898a49b61] Params[0].AsString := Edit1.text [color=red:2898a49b61]else[/color:2898a49b61] Params[1].Value:=StrToInt(ComboBox3.Text); Params[2].Value:=StrToInt(Edit2.Text); open; if dm.cdsMontante.IsEmpty then MessageDlg(´Nao há registro. Por favor tente novamente´, mtInformation, [mbOK], 0); end;

Por que se eu // comentar // estas linhas em vermelho funciona, mais preciso que o usuario tenha a opção de: Ou preencher o Edit1.Text ou deixa-lo em branco.


Bom pessoal, o negócio é que não esta filtrando nada, apenas mostra o resultado do showmessage.

Estou usando os componentes CDSDataSet + CDSProvider + zQuery(Zeos)+Banco de Dados Firebird 2.0


Adriano_servitec

Adriano_servitec

Responder

Posts

27/11/2007

Comodelphi

Qual o erro que da?


Responder

Gostei + 0

27/11/2007

Adriano_servitec

Qual o erro que da?
Olá amigo, não dá erro algum, simplesmente ele não reconhece o IF.

Eu queria apenas se o usuario não digitar no edit1 o filtro me mostrar todos dados cadastrados de um determinado mes/ano caso contrario se digitar algo no edit1 o filtro pegar o codigo+mes/ano tambem.


Entendeu?
Obritgado.


Responder

Gostei + 0

27/11/2007

Comodelphi

pelo que vc descreveu acho que seu if tava com um else desnecessario.
tente assim:

with dm.cdsMontante do
begin
  close;
  if (Trim(edit1.Text) <> ´´) then
    Params[0].AsString := Edit1.text;
   Params[1].Value:=StrToInt(ComboBox3.Text);
   Params[2].Value:=StrToInt(Edit2.Text);
   open;
   if dm.cdsMontante.IsEmpty then
     MessageDlg(´Nao há registro. Por favor tente novamente´, mtInformation, [mbOK], 0);
end;



Responder

Gostei + 0

27/11/2007

Knight_of_wine

Creio que é isso mesmo!

Aquele [b:603ffe2bb1]else[/b:603ffe2bb1] ali não está bem encaixado!


Responder

Gostei + 0

27/11/2007

Adriano_servitec

pelo que vc descreveu acho que seu if tava com um else desnecessario. tente assim:
with dm.cdsMontante do
begin
  close;
  if (Trim(edit1.Text) <> ´´) then
    Params[0].AsString := Edit1.text;
   Params[1].Value:=StrToInt(ComboBox3.Text);
   Params[2].Value:=StrToInt(Edit2.Text);
   open;
   if dm.cdsMontante.IsEmpty then
     MessageDlg(´Nao há registro. Por favor tente novamente´, mtInformation, [mbOK], 0);
end;
Ficou a mesma coisa amigo.

Explicando:
Tenho dois edits + um combobox

no edit1 digito o numero da matricula (parametro [0])
no combobox digito o mes (01...12)
no edit2 o ano (2007...etc)

ai pesso para filtrar num botão o select
vamos supor que eu digitar no edit1 7506 no combo 11 no edit2 2007, ai filtra por codigo da matricula e aparece no dbgrid, agora se eu deixar o edit1 vazio e digitar no combo 11 e no edit2 2007 diz a mensagem [b:28112b33b0]MessageDlg(´Nao há registro. Por favor tente novamente´, mtInformation, [mbOK], 0);
[/b:28112b33b0], sendo que tem registros neste mes.

Entendeu amigo?
Obrigado.


Responder

Gostei + 0

27/11/2007

Comodelphi

nesse caso seu select tem que ser um pouco diferente:

SELECT SIND2.MATRICULA, 
      SIND2.ADMISSAO, 
      SIND2.ASSOCIADO, 
      coalesce(sum(corrente.VALORPG),0) Soma 
FROM sind2 
inner JOIN corrente ON (sind2.MATRICULA = corrente.MATRICULA) 
      WHERE (:pMatricula IS NULL or CORRENTE.MATRICULA = :pMatricula)
            and extract(month from CORRENTE.MESPGTO) <= :pMes 
            and extract(year from CORRENTE.MESPGTO) <= :pAno 

group by 1,2,3 
order by 2


e também o if...:

with dm.cdsMontante do 
begin 
  close; 
  if (Trim(edit1.Text) <> ´´) then 
    Params[0].AsString := Edit1.text
  else 
    Params[0].Clear;

   Params[1].Value:=StrToInt(ComboBox3.Text); 
   Params[2].Value:=StrToInt(Edit2.Text); 
   open; 
   if dm.cdsMontante.IsEmpty then 
     MessageDlg(´Nao há registro. Por favor tente novamente´, mtInformation, [mbOK], 0); 
end;



Responder

Gostei + 0

27/11/2007

Emerson Nascimento

se eu entendi direito, seu problema está na instrução.

SELECT SIND2.MATRICULA,
      SIND2.ADMISSAO,
      SIND2.ASSOCIADO,
      coalesce(sum(corrente.VALORPG),0) Soma
FROM sind2
inner JOIN corrente ON (sind2.MATRICULA = corrente.MATRICULA)
WHERE CORRENTE.MATRICULA LIKE :pMatricula
     and extract(month from CORRENTE.MESPGTO) <= :pMes
     and extract(year from CORRENTE.MESPGTO) <= :pAno
group by 1,2,3
order by 2


Note que a comparação da matrícula agora é com LIKE, e não mais com =

daí, no seu código, faça:
with dm.cdsMontante do
begin
  close;

  // o parâmetro ´0´ deve ser preenchido
  if (Trim(edit1.Text) <> ´´) then
    Params[0].AsString := Edit1.text
  else
    Params[0].AsString := ´¬´;

  Params[1].Value := StrToInt(ComboBox3.Text);
  Params[2].Value := StrToInt(Edit2.Text);

  open;

  if dm.cdsMontante.IsEmpty then
    MessageDlg(´Nao há registro. Por favor tente novamente´, mtInformation, [mbOK], 0);
end;



Responder

Gostei + 0

27/11/2007

Martins

Talvez não faça muito sentido mas tente da seguinte forma:

with dm.cdsMontante do 
begin 
close; 
if (Trim(edit1.Text) <> ´´) then 
Params[0].AsString := Edit1.text 
else 
begin
Params[1].Value:=StrToInt(ComboBox3.Text); 
Params[2].Value:=StrToInt(Edit2.Text); 
end;
open; 
if dm.cdsMontante.IsEmpty then 
MessageDlg(´Nao há registro. Por favor tente novamente´, mtInformation, [mbOK], 0); 
end; 



Boa sorte!


Responder

Gostei + 0

27/11/2007

Adriano_servitec

se eu entendi direito, seu problema está na instrução.
SELECT SIND2.MATRICULA,
      SIND2.ADMISSAO,
      SIND2.ASSOCIADO,
      coalesce(sum(corrente.VALORPG),0) Soma
FROM sind2
inner JOIN corrente ON (sind2.MATRICULA = corrente.MATRICULA)
WHERE CORRENTE.MATRICULA LIKE :pMatricula
     and extract(month from CORRENTE.MESPGTO) <= :pMes
     and extract(year from CORRENTE.MESPGTO) <= :pAno
group by 1,2,3
order by 2
Note que a comparação da matrícula agora é com LIKE, e não mais com = daí, no seu código, faça:
with dm.cdsMontante do
begin
  close;

  // o parâmetro ´0´ deve ser preenchido
  if (Trim(edit1.Text) <> ´´) then
    Params[0].AsString := Edit1.text
  else
    Params[0].AsString := ´¬´;

  Params[1].Value := StrToInt(ComboBox3.Text);
  Params[2].Value := StrToInt(Edit2.Text);

  open;

  if dm.cdsMontante.IsEmpty then
    MessageDlg(´Nao há registro. Por favor tente novamente´, mtInformation, [mbOK], 0);
end;
Olá pessoal, bom eu testei todas as dicas, mais a qual ficou certo aqui para o que eu preciso foi esta aqui acima.

Obrigado a todos, pela ajuda.
Valeu
Adriano.


Responder

Gostei + 0

27/11/2007

Adriano_servitec

nesse caso seu select tem que ser um pouco diferente:

SELECT SIND2.MATRICULA, 
      SIND2.ADMISSAO, 
      SIND2.ASSOCIADO, 
      coalesce(sum(corrente.VALORPG),0) Soma 
FROM sind2 
inner JOIN corrente ON (sind2.MATRICULA = corrente.MATRICULA) 
      WHERE (:pMatricula IS NULL or CORRENTE.MATRICULA = :pMatricula)
            and extract(month from CORRENTE.MESPGTO) <= :pMes 
            and extract(year from CORRENTE.MESPGTO) <= :pAno 

group by 1,2,3 
order by 2
e também o if...:
with dm.cdsMontante do 
begin 
  close; 
  if (Trim(edit1.Text) <> ´´) then 
    Params[0].AsString := Edit1.text
  else 
    Params[0].Clear;

   Params[1].Value:=StrToInt(ComboBox3.Text); 
   Params[2].Value:=StrToInt(Edit2.Text); 
   open; 
   if dm.cdsMontante.IsEmpty then 
     MessageDlg(´Nao há registro. Por favor tente novamente´, mtInformation, [mbOK], 0); 
end;
Olá amigo, se eu fizer assim
SELECT SIND2.MATRICULA,
      SIND2.ADMISSAO,
      SIND2.ASSOCIADO,
      coalesce(sum(corrente.VALORPG),0) Soma
FROM sind2
inner JOIN corrente ON (sind2.MATRICULA = corrente.MATRICULA)
      WHERE (:pMatricula = ´´ OR CORRENTE.MATRICULA = :pMatricula)
            and extract(month from CORRENTE.MESPGTO) <= :pMes
            and extract(year from CORRENTE.MESPGTO) <= :pAno

group by 1,2,3

order by 2
funciona, mais com o is null não...Mesmo assim obrigado


Responder

Gostei + 0

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

Aceitar