Como posso fazer com que os parâmetros de consulta do MS Access sejam opcionais?

Eu tenho uma consulta que gostaria de filtrar de maneiras diferentes em momentos diferentes. A maneira que eu fiz isso agora, colocando parâmetros no campo de critérios dos campos de consulta relevantes, no entanto, há muitos casos em que eu não quero filtrar em um determinado campo, mas apenas nos outros campos. Existe alguma maneira em que um curinga de algum tipo pode ser passado para o parâmetro de critérios para que eu possa ignorar a filtragem para essa chamada específica da consulta?

0
adicionado editado
Visualizações: 2

6 Respostas

Não tenho certeza se isso ajuda, porque suspeito que você queira fazer isso com uma consulta salva em vez de no VBA; no entanto, a coisa mais fácil que você pode fazer é criar uma consulta linha por linha no VBA e, em seguida, criar um conjunto de registros a partir dele.

Uma maneira bastante interessante seria reescrever a consulta salva e, em seguida, acessá-la; no entanto, se você tiver várias pessoas usando o mesmo banco de dados, poderá encontrar conflitos e confundir o próximo desenvolvedor no final da linha.

Você também pode passar o valor padrão através de programação para a consulta (como discutido em sua pergunta anterior)

0
adicionado

De volta ao meu exame anterior na sua pergunta anterior. Sua consulta parametrizada é uma string parecida com isso:

qr = "Select Tbl_Country.* From Tbl_Country WHERE id_Country = [fid_country]"

dependendo da natureza de fid_country (number, text, guid, date, etc), você terá que substituí-lo por um valor de joker e caracteres de delimitação específicos:

qr = replace(qr,"[fid_country]","""*""")

Para permitir totalmente os curingas, sua consulta original também pode ser:

qr = "Select Tbl_Country.* From Tbl_Country _
      WHERE id_Country LIKE [fid_country]"

Você pode, então, obter valores de wild card para fid_Country, como

qr = replace(qr,"[fid_country]","G*")

Depois disso, você pode usar a string para abrir um conjunto de registros

set rs = currentDb.openRecordset(qr)
0
adicionado

Se você construir sua consulta da seguinte forma:

PARAMETERS ParamA Text ( 255 );
SELECT t.id, t.topic_id
FROM SomeTable t
WHERE t.id Like IIf(IsNull([ParamA]),"*",[ParamA])

Todos os registros serão selecionados se o parâmetro não for preenchido.

0
adicionado
O mesmo trabalho para um GROUP BY opcional?
adicionado o autor Chad, fonte
@Chad Não tenho certeza do que você quer dizer, talvez PARAMETERS ParamA Text (255); SELECT IIf (IsNull ([ParamA]), "*", [ParamA]) Como Expr1, t.id FROM tabela1 AS t GRUPO por IIf (IsNull ([ParamA]), "*", [ParamA]), t. id HAVING (((t.id) Como IIf (IsNull ([ParamA]), "*", [ParamA])));
adicionado o autor Fionnuala, fonte

Eu não acho que você possa. Como você está executando a consulta?

Eu diria que se você precisar de uma consulta que tenha muitas variáveis ​​abertas, coloque-a em um módulo ou classe vba e chame-a, deixando-a construir a string toda vez.

0
adicionado

Bem, você pode retornar valores não nulos passando * como o parâmetro para os campos que você não deseja usar no filtro atual. No Access 2003 (e possivelmente versões anteriores e posteriores), se você estiver usando como [paramName] como seu critério para um campo numérico, Text, Date ou Boolean, um asterisco exibirá todos os registros (que corresponder aos outros critérios que você especificar). Se você quiser retornar valores nulos também, então você pode usar como [paramName] ou Is Null como critério para que ele retorne todos os registros. (Isso funciona melhor se você estiver criando a consulta no código. Se você estiver usando uma consulta existente e não quiser retornar valores nulos quando tiver um valor para filtragem, isso não funcionará.)

Se você estiver filtrando um campo Memorando, terá que tentar outra abordagem.

0
adicionado

Observe que o curinga * com a palavra-chave LIKE só terá o efeito desejado no modo de consulta ANSI-89.

Muitas pessoas supõem erroneamente que o caractere curinga no Access/Jet é sempre *. Não tão. O Jet possui dois curingas:% no modo de consulta ANSI-92 e * no modo de consulta ANSI-89.

O ADO é sempre ANSI-92 e o DAO é sempre ANSI-89, mas a interface do Access também pode ser.

Ao usar a palavra-chave LIKE em um objeto de banco de dados (ou seja, algo que será mantido no arquivo mdb), você deve pensar: o que aconteceria se alguém usasse esse banco de dados usando um Modo de Consulta diferente daquele que geralmente uso? Digamos que você quisesse restringir um campo de texto apenas a caracteres numéricos e escreveu sua Regra de validação como esta:

NOT LIKE "*[!0-9]*"

Se alguém involuntariamente (ou de outra forma) se conectasse ao seu .mdb via ADO, a regra de validação acima permitiria que eles adicionassem dados com caracteres não numéricos e sua integridade de dados seria disparada. Não é bom.

Melhor IMO para sempre codificar para ambos os modos de consulta ANSI. Talvez isto seja melhor conseguido codificando explicitamente para ambos os Modos, e.

NOT LIKE "*[!0-9]*" AND NOT LIKE "%[!0-9]%"

Mas com mais envolvido DML/DDL Jet SQL, isso pode se tornar muito difícil de conseguir de forma concisa. É por isso que eu recomendo usar a palavra-chave ALIKE, que usa o caractere curinga ANSI-92 Query Mode, independentemente do modo de consulta, por exemplo.

NOT ALIKE "%[!0-9]%"

Nota ALIKE não está documentado (e eu assumo que é por isso que meu post original foi marcado). Eu testei isso no Jet 3.51 (Access97), Jet 4.0 (Access2000 a 2003) e ACE (Access2007) e funciona bem. Eu já postei isso nos newsgroups e tive a aprovação dos MVPs do Access. Normalmente, eu mesmo evitaria os recursos não documentados, mas faria uma exceção neste caso, porque o Jet ficou obsoleto por quase uma década e a equipe do Access que o mantém vivo não parece interessada em fazer alterações profundas nos mecanismos (ou correções de bugs! ), que tem o efeito de tornar o motor a jato um produto muito estável.

Para obter mais detalhes sobre os modos de consulta ANSI do Jet, consulte Sobre o modo de consulta ANSI SQL .

0
adicionado
Na verdade, o curinga também depende da interface de dados que você está usando. Em SQL executado via ADO em relação ao SQL Server, você usa "%" em vez do Jet SQL "*", por exemplo.
adicionado o autor David-W-Fenton, fonte
Na verdade, Jet tem dois curingas: "%" no modo de consulta ANSI-92 e "*" no modo de consulta ANSI-89. O ADO é sempre ANSI-92, o DAO é sempre ANSI-89 e a interface do Access também pode ser. Você pode não estar ciente disso porque você sempre usa o DAO.
adicionado o autor onedaywhen, fonte
@Air link agora fixo.
adicionado o autor onedaywhen, fonte
Obrigado. Eu estava tendo a pior hora de encontrar um URL atual que parecia ter o conteúdo descrito - mas talvez não haja um. Não é possível encontrar muitas informações sobre até que ponto isso é um problema em 2010 e versões posteriores do Access.
adicionado o autor Air, fonte