Erro com IF no parametro de um SQL?
Pessoal, estou com um problema com parametros no SQL
Bom o SQL esta assim
[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]
Sei que o problema esta aqui no IF
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
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
Curtidas 0
Respostas
Comodelphi
26/11/2007
Qual o erro que da?
GOSTEI 0
Adriano_servitec
26/11/2007
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.
GOSTEI 0
Comodelphi
26/11/2007
pelo que vc descreveu acho que seu if tava com um else desnecessario.
tente assim:
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;
GOSTEI 0
Knight_of_wine
26/11/2007
Creio que é isso mesmo!
Aquele [b:603ffe2bb1]else[/b:603ffe2bb1] ali não está bem encaixado!
Aquele [b:603ffe2bb1]else[/b:603ffe2bb1] ali não está bem encaixado!
GOSTEI 0
Adriano_servitec
26/11/2007
pelo que vc descreveu acho que seu if tava com um else desnecessario.
tente assim:
Ficou a mesma coisa amigo.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;
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.
GOSTEI 0
Comodelphi
26/11/2007
nesse caso seu select tem que ser um pouco diferente:
e também o if...:
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;
GOSTEI 0
Emerson Nascimento
26/11/2007
se eu entendi direito, seu problema está na instrução.
Note que a comparação da matrícula agora é com LIKE, e não mais com =
daí, no seu código, faça:
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;
GOSTEI 0
Martins
26/11/2007
Talvez não faça muito sentido mas tente da seguinte forma:
Boa sorte!
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!
GOSTEI 0
Adriano_servitec
26/11/2007
se eu entendi direito, seu problema está na instrução.
Note que a comparação da matrícula agora é com LIKE, e não mais com =
daí, no seu código, faça:
Olá pessoal, bom eu testei todas as dicas, mais a qual ficou certo aqui para o que eu preciso foi esta aqui acima.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
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;
Obrigado a todos, pela ajuda.
Valeu
Adriano.
GOSTEI 0
Adriano_servitec
26/11/2007
nesse caso seu select tem que ser um pouco diferente:
e também o if...:
Olá amigo, se eu fizer assimSELECT 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
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;
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
GOSTEI 0