Algumas opções:
- o usuário digitar o filtro, e fazer o teste evitando erro
- o usuário escolher campos, e fazer o filtro pelo programa
- filtros a vontade
@ 0, 0 GET cComando VALID MacroType( cComando ) == "L"
FUNCTION MacroType( cExpression )
LOCAL cType := "U", bBlock
BEGIN SEQUENCE WITH __BreakBlock()
bBlock := hb_MacroBlock( cExpression )
cType := ValType( Eval( bBlock ) )
END SEQUENCE
RETURN cType
O mais interessante pode ser colocar opções diversas, e até evitar erros com variáveis locais/etc.
E deste jeito vai poder ajustar os comandos pra DBF, SQL, etc.
Exemplo:
IF ! Empty( mAtivo )
// Ativo = Ativo + Proposta
mFiltro += iif( mAtivo == "A", " AND ( ESTADO NOT IN ( 'I', 'V', 'E' ) )", " AND ESTADO = " + StringSql( mAtivo ) )
ENDIF
mFiltro += iif( Empty( mEndereco ), "", " AND " + MySqlEnderecoLike( mEndereco ) )
mFiltro += iif( Empty( mClassi ), "", " AND CLASSI = " + StringSql( mClassi ) )
IF mMaisFiltros1 == "S"
mFiltro += iif( mPrecoMin == 0, "", " AND VALOR >= " + LTrim( Str( mPrecoMin ) ) )
mFiltro += iif( mPrecoMax == 0, "", " AND VALOR <= " + LTrim( Str( mPrecoMax ) ) )
mFiltro += iif( Empty( mBairro ), "", " AND BAIRRO LIKE " + StringSql( "%" + Trim( mBairro ) + "%" ) )
mFiltro += iif( Empty( mRegiao ), "", " AND REGIAO LIKE " + StringSql( "%" + Trim( mRegiao ) + "%" ) )
mFiltro += iif( Empty( mCidade ), "", " AND CIDADE LIKE " + StringSql( "%" + Trim( mCidade ) + "%" ) )
IF ! Empty( mSetor )
mFiltro += " AND ( "
nTamanhoFiltro := Len( mFiltro )
cnMySql:cSql := "SELECT * FROM HLBAIRRO WHERE BASETOR = " + StringSql( mSetor )
cTmpFile := cnMySql:SqlToDbf()
SELECT 0
USE ( cTmpFile ) ALIAS temp
DO WHILE ! Eof()
mFiltro += " BABAIRRO=" + StringSql( temp->baBairro ) + " OR "
SKIP
ENDDO
CLOSE DATABASES
FErase( cTmpFile )
IF nTamanhoFiltro == Len( mFiltro ) // pra completar o .OR.
mFiltro += "CODI = CODI"
ELSE
mFiltro += "CODI <> CODI"
ENDIF
mFiltro += " )"
ENDIF
ENDIF
IF mMaisFiltros2 == "S"
mFiltro += iif( Empty( mDormitorioMin ), "", " AND DORMITORIO >= " + LTrim( Str( mDormitorioMin ) ) )
mFiltro += iif( Empty( mDormitorioMax ), "", " AND DORMITORIO <= " + LTrim( Str( mDormitorioMax ) ) )
mFiltro += iif( Empty( mVagasMin ), "", " AND GARAGEM >= " + LTrim( Str( mVagasMin ) ) )
mFiltro += iif( Empty( mVagasMax ), "", " AND GARAGEM <= " + LTrim( Str( mVagasMax ) ) )
mFiltro += iif( Empty( mDataMin ), "", " AND DATAINC >= " + DateSql( mDataMin ) )
mFiltro += iif( Empty( mDataMax ), "", " AND DATAINC <= " + DateSql( mDataMax ) )
ENDIF
IF mMaisFiltros3 == "S"
mFiltro += iif( Empty( mFinanciado ), "", " AND FINANCIADO = " + StringSql( mFinanciado ) )
mFiltro += iif( Empty( mCodC ), "", " AND ( CODC=" + NumberSql( mCodc ) + " OR CODC2=" + NumberSql( mCodc ) + " OR CODC3=" + NumberSql( mCodc ) + " )" )
mFiltro += iif( Empty( mNomePropriet ), "", " AND PROPRNOME LIKE " + StringSql( "%" + Trim( mNomePropriet ) + "%" ) )
mFiltro += iif( Empty( mIdadeMin ), "", " AND IDADE >= " + LTrim( Str( mIdadeMin ) ) )
mFiltro += iif( Empty( mIdadeMax ), "", " AND IDADE <= " + LTrim( Str( mIdadeMax ) ) )
mFiltro += iif( Empty( mExposicao ), "", " AND EXPOSICAO = " + StringSql( mExposicao ) )
mFiltro += iif( Empty( mPlaca ), "", " AND " + iif( mPlaca == "N", "PLACA<>'S'", "PLACA=" + StringSql( mPlaca ) ) )
ENDIF
ENDIF
...
cnMySQl:Execute( "SELECT * FROM IMOVEL WHERE " + mFiltro )
Note que neste caso as variáveis são usadas pra criar o filtro, mas o filtro não depende delas depois.