BlackTDN :: FINC040 : Filtrando a mBrowse
Autor: иαldσ dj | Publicado: 2016-08-11T15:08:00-03:00

&nbsp; Perguntaram-me: é possível filtrar uma mBrowse que “não suporta personalização de filtro”. Ex.: a mBrowse do programa FINC040? Respondi: Tudo é possível, depende do quanto esteja disposto a pagar (rs). Mas, sim, é possível desde que entenda o funcionamento do sistema. Disse-lhe: Se a mBrowse não aceita filtro, mas a rotina permite um “desvio” utilize o “desvio” para implementar a sua própria mBrowse com filtro. Ex.: //--------------------------------------------------------------------------------------------------------#include "totvs.ch"//--------------------------------------------------------------------------------------------------------&nbsp;&nbsp;&nbsp; /*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Programa:uFinc040x&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Função:U_Finc040x&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Autor:Marinaldo de Jesus (http://blacktdn.com.br)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Data:11/08/2016&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Descrição:Implementar "Filtro de Browse" customizado para a rotina FINC040&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Uso:Chamada a partir do Menu*/&nbsp;&nbsp;&nbsp; //--------------------------------------------------------------------------------------------------------User Function Finc040x(nPosArotina)&nbsp;&nbsp;&nbsp; local cFunName&nbsp;&nbsp;&nbsp; if .not.(IsInCallStack("FINC040"))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cFunName:=SetFunName("FINC040")&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; begin sequence&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Finc040(nPosArotina)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end sequence&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SetFunName(cFunName)&nbsp;&nbsp;&nbsp; endifreturn //--------------------------------------------------------------------------------------------------------&nbsp;&nbsp;&nbsp; /*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Programa:uFinc040x&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Função:U_FC040FIL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Autor:Marinaldo de Jesus (http://blacktdn.com.br)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Data:11/08/2016&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Descrição:PE executado antes da chamada da mBrowse padrão.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Uso:Implementação do PE FC040FIL para mBrowse com FiltroImplementação do PE FC040FIL*/&nbsp;&nbsp;&nbsp; //--------------------------------------------------------------------------------------------------------User Function FC040FIL()&nbsp;&nbsp;&nbsp; local cExprFilTop&nbsp;&nbsp;&nbsp; local lA1XCOLLEC&nbsp;&nbsp;&nbsp; if (IsInCallStack("U_FINC040X"))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cExprFilTop:="EXISTS"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cExprFilTop+=" "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cExprFilTop+="("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cExprFilTop+=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "SELECT DISTINCT 1 FROM"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cExprFilTop+=" "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cExprFilTop+=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RetSQLName("SA1")&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cExprFilTop+=" "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cExprFilTop+=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "SA1"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cExprFilTop+=" "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cExprFilTop+=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "WHERE"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cExprFilTop+=" "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cExprFilTop+=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "SA1.A1_COD=E1_CLIENTE"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cExprFilTop+=" "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cExprFilTop+=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "AND"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cExprFilTop+=" "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cExprFilTop+=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "SA1.A1_LOJA=E1_LOJA"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lA1XCOLLEC:=SA1-&gt;(FieldPos("A1_XCOLLEC")&gt;0)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (lA1XCOLLEC)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cExprFilTop+=" "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cExprFilTop+=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "AND"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cExprFilTop+=" "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cExprFilTop+=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "A1_XCOLLEC='"+cCodUser+"'"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; endif&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cExprFilTop+=" "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cExprFilTop+=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "AND"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cExprFilTop+=" "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cExprFilTop+=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "SA1.D_E_L_E_T_=' '"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cExprFilTop+=")"&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mBrowse(6,1,22,75,"SE1",NIL,NIL,NIL,NIL,NIL,Fa040Legenda("SE1"),NIL,NIL,NIL,NIL,NIL,NIL,NIL,cExprFilTop)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break&nbsp;&nbsp;&nbsp; endifreturn//--------------------------------------------------------------------------------------------------------  E com essa solução perco a funcionalidade padrão? Não. Manterá toda a compatibilidade do código antes da chamada do PE e posterior a ela. Único inconveniente é ter que incluir a opção no Menu. E tem como contornar esse inconveniente? Sim. Mas não garanto o “salto” de BREAK (rs). No modelo acima, o “salto” de BREAK está controlado. Já no exemplo abaixo…. talvez vá para o “limbo” Ex.: //--------------------------------------------------------------------------------------------------------#include "totvs.ch"//--------------------------------------------------------------------------------------------------------&nbsp;&nbsp;&nbsp; /*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Programa:uFinc040x&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Função:U_FC040FIL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Autor:Marinaldo de Jesus (http://blacktdn.com.br)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Data:11/08/2016&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Descrição:PE executado antes da chamada da mBrowse padrão.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Uso:Implementação do PE FC040FIL para mBrowse com Filtro*/&nbsp;&nbsp;&nbsp; //--------------------------------------------------------------------------------------------------------User Function FC040FIL()&nbsp;&nbsp;&nbsp; local cExprFilTop&nbsp;&nbsp;&nbsp; local lA1XCOLLEC&nbsp;&nbsp;&nbsp; cExprFilTop:="EXISTS"&nbsp;&nbsp;&nbsp; cExprFilTop+=" "&nbsp;&nbsp;&nbsp; cExprFilTop+="("&nbsp;&nbsp;&nbsp; cExprFilTop+=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "SELECT DISTINCT 1 FROM"&nbsp;&nbsp;&nbsp; cExprFilTop+=" "&nbsp;&nbsp;&nbsp; cExprFilTop+=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RetSQLName("SA1")&nbsp;&nbsp;&nbsp; cExprFilTop+=" "&nbsp;&nbsp;&nbsp; cExprFilTop+=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "SA1"&nbsp;&nbsp;&nbsp; cExprFilTop+=" "&nbsp;&nbsp;&nbsp; cExprFilTop+=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "WHERE"&nbsp;&nbsp;&nbsp; cExprFilTop+=" "&nbsp;&nbsp;&nbsp; cExprFilTop+=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "SA1.A1_COD=E1_CLIENTE"&nbsp;&nbsp;&nbsp; cExprFilTop+=" "&nbsp;&nbsp;&nbsp; cExprFilTop+=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "AND"&nbsp;&nbsp;&nbsp; cExprFilTop+=" "&nbsp;&nbsp;&nbsp; cExprFilTop+=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "SA1.A1_LOJA=E1_LOJA"&nbsp;&nbsp;&nbsp; lA1XCOLLEC:=SA1-&gt;(FieldPos("A1_XCOLLEC")&gt;0)&nbsp;&nbsp;&nbsp; if (lA1XCOLLEC)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cExprFilTop+=" "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cExprFilTop+=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "AND"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cExprFilTop+=" "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cExprFilTop+=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "A1_XCOLLEC='"+cCodUser+"'"&nbsp;&nbsp;&nbsp; endif&nbsp;&nbsp;&nbsp; cExprFilTop+=" "&nbsp;&nbsp;&nbsp; cExprFilTop+=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "AND"&nbsp;&nbsp;&nbsp; cExprFilTop+=" "&nbsp;&nbsp;&nbsp; cExprFilTop+=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "SA1.D_E_L_E_T_=' '"&nbsp;&nbsp;&nbsp; cExprFilTop+=")"&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; mBrowse(6,1,22,75,"SE1",NIL,NIL,NIL,NIL,NIL,Fa040Legenda("SE1"),NIL,NIL,NIL,NIL,NIL,NIL,NIL,cExprFilTop)&nbsp;&nbsp;&nbsp; breakreturn//-------------------------------------------------------------------------------------------------------- E porque isso funciona? Aí é uma outra história… []s иαldσ dj #pirateandoConhecimentoComVocê