CONSULTA DE MULTIPLOS CRITERIOS[ECONOMIZAR CODIGO]
tenho um codigo onde dependendo do checkbox marcado ele ordena(order by) com um campo ou com varios.
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 & [Ô][ô]
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 & [Ô][ô]
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
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
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 & [Ô][ô]
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 & [Ô][ô]
Subistitua:
sql = [Ô]SELECT * FROM PRODUTOS WHERE PRODUTOS.ATIVO = TRUE [Ô] & Where & Ordem
Por:
sql = [Ô]SELECT * FROM PRODUTOS WHERE PRODUTOS.ATIVO = TRUE [Ô] & Where
sql = [Ô]SELECT * FROM PRODUTOS WHERE PRODUTOS.ATIVO = TRUE [Ô] & Where & Ordem
Por:
sql = [Ô]SELECT * FROM PRODUTOS WHERE PRODUTOS.ATIVO = TRUE [Ô] & Where
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)
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.
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
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
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