Muitas vezes precisamos deixar a disposição do usuário uma tela com vários filtros possÃveis, para quando clicar no botão " pesquisa " haver o retorno do que foi solicitado, quem usa DBF já está acostumado a codificar essa situação, mas quem vai utilizar SQL, muda um pouco, então abaixo segue o fonte de uma função que filtra informações em uma tabela de contas a pagar, e mostra como concatenar o filtro.
obs : rotina feita em um sistema com harbour 3.2 e minigui extended 17.10
STATIC FUNCTION Filtrar_cpag()
LOCAL oQuery
LOCAL cQuery
LOCAL oRow := {}
LOCAL n_i := 0
LOCAL v_id_fornecedor := Form_cpag.Tbox_id_fornecedor.value
LOCAL v_id_documento := Form_cpag.Tbox_id_documento.value
LOCAL v_data_inicio := TData( Form_cpag.data_inicio.value )
LOCAL v_data_final := TData( Form_cpag.data_final.value )
LOCAL v_tipo_filtro := Form_cpag.radio_pq_01.value
/*
possÃveis valores para " v_tipo_filtro "
1 = Somente contas PENDENTES
2 = Somente contas QUITADAS
3 = Contas PENDENTES e QUITADAS
*/
LOCAL v_pesq_data := Form_cpag.Chbox_data.value
LOCAL v_pesq_fornecedor := Form_cpag.Chbox_fornecedor.value
LOCAL v_pesq_documento := Form_cpag.Chbox_documento.value
LOCAL v_sql := ''
/*
verifica se ao menos uma pesquisa foi
selecionada pelo usuário
*/
IF v_pesq_data == .F. .AND. v_pesq_fornecedor == .F. .AND. v_pesq_documento == .F.
MsgInfo('Ao menos um critério de pesquisa deve estar selecionado, tecle ENTER','Atenção')
RETURN( Nil )
ENDIF
/*
gerar o sql para pesquisa
*/
/*
data
*/
IF v_pesq_data
v_sql += "data_venc >= '"+v_data_inicio+"' and data_venc <= '"+v_data_final+"'"
ENDIF
/*
fornecedor
*/
IF v_pesq_fornecedor .AND. v_id_fornecedor <> 0
v_sql += ' and id_fornec = '+Alltrim(Str(v_id_fornecedor))
ENDIF
/*
documento
*/
IF v_pesq_documento .AND. v_id_documento <> 0
v_sql += ' and id_documento = '+Alltrim(Str(v_id_documento))
ENDIF
/*
situação : pendente, quitado, ambos
*/
IF v_tipo_filtro == 1
v_sql += ' and quitado = 2'
ELSEIF v_tipo_filtro == 2
v_sql += ' and quitado = 1'
ELSEIF v_tipo_filtro == 3
v_sql += ' and quitado <> 0'
ENDIF
/*
definir " order by "
*/
/*
default
*/
v_sql += ' order by data_venc'
/*
se escolher fornecedor
*/
IF v_pesq_fornecedor .AND. v_id_fornecedor <> 0
v_sql += ', nome_fornec'
ENDIF
/*
se escolher documento
*/
IF v_pesq_documento .AND. v_id_documento <> 0
v_sql += ', nome_documento'
ENDIF
/*
limpa o grid
*/
DELETE ITEM ALL FROM Grid_cpag OF Form_cpag
/*
executa pesquisa
*/
oQuery := oMySQL:Query("select * from cpag where "+v_sql)
/*
verifica se houve erro
- se houver mostra onde ocorreu
*/
IF oQuery:NetErr()
MsgExclamation( 'ERRO na Pesquisa : ' + oQuery:Error() )
RETURN( Nil )
ENDIF
/*
popula o grid com o resultado da pesquisa
*/
FOR n_i := 1 TO oQuery:LastRec()
oRow := oQuery:GetRow( n_i )
ADD ITEM {AllTrim(Str(oRow:FieldGet(1))),a_quitado[oRow:FieldGet(9)],DToC(oRow:FieldGet(6)),Alltrim(oRow:FieldGet(15)),Str(oRow:FieldGet(7),14,2),AllTrim(Str(oRow:FieldGet(2))),AllTrim(oRow:FieldGet(3)),AllTrim(Str(oRow:FieldGet(4))),AllTrim(oRow:FieldGet(5)),AllTrim(Str(oRow:FieldGet(14)))} TO Grid_cpag OF Form_cpag
oQuery:Skip( 1 )
NEXT n_i
/*
limpar pesquisa
*/
oQuery:Destroy()
RETURN( Nil )
Abraços