Dicas do OsmarJr

Parâmetros insuficientes. Eram esperados n...


Sempre que rodo/executo uma consulta/SQL via código que tem uma cláusula WHERE, recebo uma mensagem "Parâmetros insuficientes. Eram esperados n". O que está acontecendo?

Autor: Dev Hashish

Sua cláusula WHERE provavelmente está referenciando um controle de um formulário. Por exemplo:

    strSQL="SELECT * FROM tblPessoas WHERE PessoaID= Forms!NomeDoForm!PessoaID"

Você deve lembrar que o Jet não sabe nada de formulários, relatórios, etc. e tenta avaliar Forms!NomeDoForm!PessoaID como um parâmetro em vez de procurar pelo controle real. E a mensafem de erro é o resultado.

A maneira correta é a concatenação dos valores retornados pelo controle referenciado. (Nota: Se você não tem certeza de como tratar strings e datas nesse contexto, veja o artigo intitulado Usando variáveis em SQL por trás de formulários).

     strSQL="Select * from People where PeopleID=" & forms!SomeForm!PeopleID

De Andy Baron:

Quando uma consulta parametrizada é executada no Access, ele fornece um serviço de expressões que avalia diversos parâmetros. Por exemplo, a referência a um controle de um formulário aberto será avaliada automaticamente, e a consulta que contém o parâmetro usa o valor contido no controle. Este serviço de expressões não está disponível quando se usa código VBA para executar uma consulta ação parametrizada ou para abrir um conjunto de registros em uma consulta parametrizada que devolve registros.

O seu código deve fornecer os valores exatos dos parâmetros a serem usados. Isto se faz através dos objetos QueryDef. Os objetos QueryDef têm uma coleção Parâmetros contendo objetos Parâmetros que tem uma propriedade Nome, uma propriedade Valor e um índice na coleção. Estes objetos são usados para fornecer os valores de parâmetros exigidos.

Set db = CurrentDb
Set qdf = db.QueryDefs("MinhaConsulta")

'É possível o uso de diversas sintaxes
qdf(0) = Me!MeuControle
qdf.Parameters(1) = 123
qdf![forms!frmParametros!txtNovaData] = #2/2/98#

Set rst = qdf.OpenRecordset(dbOpenSnapshot)
'ou qdf.Execute dbFailOnError

Com consultas Access que contém parâmetros que sejam todos referências a controles Access em formulários abertos, podemos simular o serviço de expressões que o Access fornece quando executamos as consultas usando a interface de usuário, como abaixo:

Set db = CurrentDb
Set qdf = db.QueryDefs("MinhaConsulta")

For Each prm In qdf.Parameters
        prm.Value = Eval(prm.Name)
Next prm

Set rs = qdf.OpenRecordset(dbOpenDynaset)
' ou qdf.Execute dbFailOnError

 

Home

Contato | Copyright©Osmar José Correia Júnior | 24-Nov-2005 18:23