Pesquisa SQL concatenando informações

Forum sobre SQL.

Moderador: Moderadores

MSDN
Usuário Nível 4
Usuário Nível 4
Mensagens: 741
Registrado em: 28 Nov 2003 15:55
Localização: CWB
Contato:

Pesquisa SQL concatenando informações

Mensagem por MSDN »

Prezados,
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

Código: Selecionar todos

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
Responder