Clipper On Line • Ver Tópico - Pesquisa SQL concatenando informações

Pesquisa SQL concatenando informações

Discussão sobre SQL

Moderador: Moderadores

 

Pesquisa SQL concatenando informações

Mensagempor MSDN » 11 Nov 2017 20:13

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

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
MSDN
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 741
Data de registro: 28 Nov 2003 14:55
Cidade/Estado: CWB
Curtiu: 178 vezes
Mens.Curtidas: 123 vezes



Retornar para SQL

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 6 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro