CONSULTA DE MULTIPLOS CRITERIOS[ECONOMIZAR CODIGO]

WEBIER 04/05/2011 17:05:18
#373219
tenho um codigo onde dependendo do checkbox marcado ele ordena(order by) com um campo ou com varios.

    Dim var_Indice As String
var_Indice = [Ô][Ô]
var_Indice = var_Indice + IIf(ckkORDRef.Value, IIf(var_Indice <> [Ô][Ô], [Ô], [Ô], [Ô][Ô]) + [Ô]PRODUTOS.REF[Ô], [Ô][Ô])
var_Indice = var_Indice + IIf(ckkORDDesc.Value, IIf(var_Indice <> [Ô][Ô], [Ô], [Ô], [Ô][Ô]) + [Ô]PRODUTOS.DESCRICAO[Ô], [Ô][Ô])
var_Indice = var_Indice + IIf(ckkORDFab.Value, IIf(var_Indice <> [Ô][Ô], [Ô], [Ô], [Ô][Ô]) + [Ô]PRODUTOS.FABRICANTE[Ô], [Ô][Ô])
var_Indice = var_Indice + IIf(ckkORDTam.Value, IIf(var_Indice <> [Ô][Ô], [Ô], [Ô], [Ô][Ô]) + [Ô]PRODUTOS.TAMANHO[Ô], [Ô][Ô])
var_Indice = var_Indice + IIf(ckkORDLinha.Value, IIf(var_Indice <> [Ô][Ô], [Ô], [Ô], [Ô][Ô]) + [Ô]PRODUTOS.CATEGORIA[Ô], [Ô][Ô])

If var_Indice <> [Ô][Ô] Then var_Indice = [Ô] ORDER BY [Ô] + var_Indice

sql = SELECT * FROM PRODUTOS WHERE PRODUTOS.ATIVO = TRUE [Ô] & var_Indice


Agora eu gostaria de fazer a mesma coisa com o WHERE... ou seja

se eu marcar o checkbox ckkRef entao:
PRODUTOS.REF = [ô][Ô] & cboConsRef.Text & [Ô][ô]

se eu marcar o checkbox ckkFab entao:
PRODUTOS.FABRICANTE = [ô][Ô] & cboConsFab.Text & [Ô][ô]

e seu eu marcar os 2 checks... entao vai ser os 2 no WHERE.... pode ser 1, 2, 3... ou nenhum campo

São 5 checkbox:
ckkRef = PRODUTOS.REF = [ô][Ô] & cboConsRef.Text & [Ô][ô]
ckkFab = PRODUTOS.FABRICANTE = [ô][Ô] & cboConsFab.Text & [Ô][ô]
ckkTam = PRODUTOS.TAMANHO = [ô][Ô] & cboConsTam.Text & [Ô][ô]
chkLinha = PRODUTOS.CATEGORIA = [ô][Ô] & cboConsLinha.Text & [Ô][ô]
chkProduto = PRODUTOS.DESCRICAO = [ô][Ô] & cboConsProduto.Text & [Ô][ô]
KERPLUNK 05/05/2011 10:17:52
#373261
Resposta escolhida
Divirta-se

Dim Combos As New Collection
Dim Order As New Collection

Combos.Add cboRef.Text, [Ô]PRODUTOS.REF[Ô]
Combos.Add cboDescricao.Text, [Ô]PRODUTOS.DESCRICAO[Ô]
Combos.Add cboFabricante.Text, [Ô]PRODUTOS.FABRICANTE[Ô]
Combos.Add cboTamanho.Text, [Ô]PRODUTOS.TAMANHO[Ô]
Combos.Add cboCategoria.Text, [Ô]PRODUTOS.CATEGORIA[Ô]

If ckkORDRef.Value Then Order.Add [Ô]PRODUTOS.REF[Ô]
If ckkORDDesc.Value Then Order.Add [Ô]PRODUTOS.DESCRICAO[Ô]
If ckkORDFab.Value Then Order.Add [Ô]PRODUTOS.FABRICANTE[Ô]
If ckkORDTam.Value Then Order.Add [Ô]PRODUTOS.TAMANHO[Ô]
If ckkORDLinha.Value Then Order.Add [Ô]PRODUTOS.CATEGORIA[Ô]

Dim Ordem As String
Dim Where As String



If Order.Count > 0 Then Ordem = [Ô] ORDER BY [Ô]

For i = 1 To Order.Count
Ordem = Ordem & Order(i) & [Ô],[Ô]
Where = Where & [Ô] AND [Ô] & Order(i) & [Ô]=[Ô] & Combos.Item(Order(i))
Next
If Len(Ordem) > 0 Then Ordem = Left(Ordem, Len(Ordem) - 1)

sql = [Ô]SELECT * FROM PRODUTOS WHERE PRODUTOS.ATIVO = TRUE [Ô] & Where & Ordem
MsgBox sql
WEBIER 05/05/2011 12:22:26
#373272
tem como vc tirar o ORDER BY dessa consulta...

ou seja... tudo que eu marca somente influenciará no WHERE

dessa forma ai... se eu marcar um check ele coloca tanto no WHERE como tb no ORDER BY... quero só no WHERE

São 5 checkbox:
ckkRef = PRODUTOS.REF = [ô][Ô] & cboConsRef.Text & [Ô][ô]
ckkFab = PRODUTOS.FABRICANTE = [ô][Ô] & cboConsFab.Text & [Ô][ô]
ckkTam = PRODUTOS.TAMANHO = [ô][Ô] & cboConsTam.Text & [Ô][ô]
chkLinha = PRODUTOS.CATEGORIA = [ô][Ô] & cboConsLinha.Text & [Ô][ô]
chkProduto = PRODUTOS.DESCRICAO = [ô][Ô] & cboConsProduto.Text & [Ô][ô]
KERPLUNK 05/05/2011 13:14:54
#373278
Subistitua:
sql = [Ô]SELECT * FROM PRODUTOS WHERE PRODUTOS.ATIVO = TRUE [Ô] & Where & Ordem

Por:
sql = [Ô]SELECT * FROM PRODUTOS WHERE PRODUTOS.ATIVO = TRUE [Ô] & Where
WEBIER 05/05/2011 16:15:30
#373306
Citação:

:
Subistitua:
sql = [Ô]SELECT * FROM PRODUTOS WHERE PRODUTOS.ATIVO = TRUE [Ô] & Where & Ordem

Por:
sql = [Ô]SELECT * FROM PRODUTOS WHERE PRODUTOS.ATIVO = TRUE [Ô] & Where



ficou certo...

só para finalizar... caso eu queira tanto o WHERE como o ORDER BY usando essa ideia...

a ideia seria

no WHERE
se eu marcar o checkbox [txt-color=#e80000]ckkRef[/txt-color] = PRODUTOS.REF = [ô][Ô] & cboConsRef.Text & [Ô][ô]
se eu marcar o checkbox [txt-color=#e80000]ckkFab[/txt-color] = PRODUTOS.FABRICANTE = [ô][Ô] & cboConsFab.Text & [Ô][ô]
se eu marcar o checkbox [txt-color=#e80000]ckkTam[/txt-color] = PRODUTOS.TAMANHO = [ô][Ô] & cboConsTam.Text & [Ô][ô]
se eu marcar o checkbox [txt-color=#e80000]chkLinha[/txt-color] = PRODUTOS.CATEGORIA = [ô][Ô] & cboConsLinha.Text & [Ô][ô]
se eu marcar o checkbox [txt-color=#e80000]chkProduto[/txt-color] = PRODUTOS.DESCRICAO = [ô][Ô] & cboConsProduto.Text & [Ô][ô]

no ORDER BY
se eu marcar o checkbox [txt-color=#e80000]ckkORDRef [/txt-color]= [Ô]PRODUTOS.REF[Ô]
se eu marcar o checkbox [txt-color=#e80000]ckkORDDesc[/txt-color] = [Ô]PRODUTOS.DESCRICAO[Ô]
se eu marcar o checkbox [txt-color=#e80000]ckkORDFab[/txt-color] = [Ô]PRODUTOS.FABRICANTE[Ô]
se eu marcar o checkbox [txt-color=#e80000]ckkORDTam[/txt-color] = [Ô]PRODUTOS.TAMANHO[Ô]
se eu marcar o checkbox [txt-color=#e80000]ckkORDLinha[/txt-color] = [Ô]PRODUTOS.CATEGORIA[Ô]

obs: note que existe checkbox para o WHERE diferentes dos ORDER BY... ou seja... eu posso querer fazer uma consulta por FABRICANTE e ordenar por DESCRICAO.

da forma que está... quando marco um check... ele usa o mesmo campo para os 2 (WHERE E ORDER BY)

KERPLUNK 05/05/2011 16:21:09
#373307
Isso mesmo a idéia é essa. Vc vai ter um for...next para cada cláusula, um para o Where e outro para o Order.
WEBIER 05/05/2011 16:58:35
#373312
a coisa que não entendi foi que vc usou somente 1 check para usar um campo para as duas coisas...

exemplo:
If ckkORDRef.Value Then Order.Add [Ô]PRODUTOS.REF[Ô]

se eu marcar o ckkORDRef... ele vai usar tanto o campo PRODUTOS.REF no WHERE como tambem no ORDER BY

WEBIER 05/05/2011 18:35:06
#373322
RESOLVI COM O PROPRIO EXEMPLO QUE DEI NO INICIO

    Dim var_Criterio As String
var_Criterio = [Ô][Ô]
var_Criterio = var_Criterio + IIf(chkProduto.Value, IIf(var_Criterio <> [Ô][Ô], [Ô] AND [Ô], [Ô][Ô]) + [Ô]PRODUTOS.REF[Ô], [Ô][Ô])
var_Criterio = var_Criterio + IIf(chkRef.Value, IIf(var_Criterio <> [Ô][Ô], [Ô] AND [Ô], [Ô][Ô]) + [Ô]PRODUTOS.DESCRICAO[Ô], [Ô][Ô])
var_Criterio = var_Criterio + IIf(chkTam.Value, IIf(var_Criterio <> [Ô][Ô], [Ô] AND [Ô], [Ô][Ô]) + [Ô]PRODUTOS.TAMANHO[Ô], [Ô][Ô])
var_Criterio = var_Criterio + IIf(chkFab.Value, IIf(var_Criterio <> [Ô][Ô], [Ô] AND [Ô], [Ô][Ô]) + [Ô]PRODUTOS.FABRICANTE = [ô][Ô] & cboConsFab.Text & [Ô][ô][Ô], [Ô][Ô])
var_Criterio = var_Criterio + IIf(chkLinha.Value, IIf(var_Criterio <> [Ô][Ô], [Ô] AND [Ô], [Ô][Ô]) + [Ô]PRODUTOS.CATEGORIA = [ô][Ô] & cboConsLinha.Text & [Ô][ô][Ô], [Ô][Ô])

If var_Criterio <> [Ô][Ô] Then var_Criterio = [Ô] WHERE [Ô] + var_Criterio

Dim var_Indice As String
var_Indice = [Ô][Ô]
var_Indice = var_Indice + IIf(ckkORDRef.Value, IIf(var_Indice <> [Ô][Ô], [Ô], [Ô], [Ô][Ô]) + [Ô]PRODUTOS.REF[Ô], [Ô][Ô])
var_Indice = var_Indice + IIf(ckkORDDesc.Value, IIf(var_Indice <> [Ô][Ô], [Ô], [Ô], [Ô][Ô]) + [Ô]PRODUTOS.DESCRICAO[Ô], [Ô][Ô])
var_Indice = var_Indice + IIf(ckkORDFab.Value, IIf(var_Indice <> [Ô][Ô], [Ô], [Ô], [Ô][Ô]) + [Ô]PRODUTOS.FABRICANTE[Ô], [Ô][Ô])
var_Indice = var_Indice + IIf(ckkORDTam.Value, IIf(var_Indice <> [Ô][Ô], [Ô], [Ô], [Ô][Ô]) + [Ô]PRODUTOS.TAMANHO[Ô], [Ô][Ô])
var_Indice = var_Indice + IIf(ckkORDLinha.Value, IIf(var_Indice <> [Ô][Ô], [Ô], [Ô], [Ô][Ô]) + [Ô]PRODUTOS.CATEGORIA[Ô], [Ô][Ô])

If var_Indice <> [Ô][Ô] Then var_Indice = [Ô] ORDER BY [Ô] + var_Indice

Call Abrir_BancodeDados
SQL = [Ô]SELECT * from PRODUTOS [Ô] & var_Criterio & [Ô] [Ô] & var_Indice
Set RS = BD.OpenRecordset(SQL)

Formatar_Grid
Tópico encerrado , respostas não são mais permitidas