Protheus :: Filtrando a mBrowse de acordo com a Legenda de Cores
O Filtro da mBrowse, baseado na Legenda de Cores, é algo que já deveria existir no sistema padrão. Ele facilitaria muito a vida do usuário mas, infelizmente, isso não é uma verdade. Quem sabe, após este "post", a totvs/microsiga não decida implementa-lo em versões futuras do protheus/by you.
Enquanto isso não se torna realidade, vou postar aqui uma dica e disponibilizar um exemplo de código fonte de: "Como Implementar o Filtro da mBrowse baseado na Legenda de Cores".
Dada a característica da implementação atual das cores e legenda na mBrowse, esse, acredito eu, seja o maior "POG" que já implementei usando Advpl. Ele é funcional, é elegante, mas não deixa de ser um "POG".
Ele passa a ser um "POG" à partir do momento que tenho que "roubar" (parafraseando Wilson de Godoy) a Legenda de cores bem como a regra de sua implementação usando "tratamento de erro" para criar uma função de propósito geral (pois servirá para toda e qualquer mBrowse que possua legenda e cujo programa nos permita "roubar" essas características), e específico, pois será utilizado para o fim a que se propõe.
A função terá duas características principais:
A primeira será retornar a Descrição da Legenda de acordo com a sua condição: útil para a impressão de relatórios;
A segunda, retornara a expressão advpl que será utilizada para a implementação do Filtro.
Bem. Vamos ao código.
Utilizarei, nesse exemplo, os programas MATA110 (Solicitação de Compras) e MATA120 (Pedido de Compras) através dos seguintes "Pontos de Entrada":
Para o MATA110:
MTA110MNU - Ponto de Entrada MTA110MNU, executado na MATA110, na MenuDef, sera utilizado alterar as Opcoes do aRotina;
MT110LEG - Implementacao do Ponto de Entrada MT110LEG executado na funcao A110Legenda do programa MATA110 para adicionar novos elementos na Legenda;
MT110COR - Implementacao do Ponto de Entrada MT110COR executado na funcao MATA110 do programa MATA110 Tratamento de cores na mBrowse; e
Para o MATA120:
MT120BRW - Implementacao do Ponto de Entrada MT120BRW para a Inclusao de Novas Opcoes no Menu do aRotina do programa MATA120;
MT120LEG - Implementacao do Ponto de Entrada MT120LEG executado na funcao A120Legenda do programa MATA120 para adicionar novos elementos na Legenda;
MT120COR - Implementacao do Ponto de Entrada MT120COR executado na funcao MATA120 do programa MATA120 Tratamento de cores na mBrowse.
O Programa u_mBrowseLFilter.PRG contém todas as funções basicas para o tratameto de filtro na mBrowse
#INCLUDE "PROTHEUS.CH" #INCLUDE "TRYEXCEPTION.CH" Static __cMbrRstFilter /*/ Funcao: BrwLegenda Autor: Marinaldo de Jesus Data: 22/04/2011 Descricao: Legenda de Cores Sintaxe: StaticCall( u_mBrowseLFilter , BrwLegenda , cTitulo , cMensagem , aLegend , bAction , cMsgAction ) /*/ Static Function BrwLegenda( cTitulo , cMensagem , aLegend , bAction , cMsgAction ) Local aListBox Local nItem Local nItens Local oDlg Local oFont Local oListBox BEGIN SEQUENCE DEFAULT aLegend := {} nItens := Len( aLegend ) IF ( nItens == 0 ) BREAK EndIF DEFAULT cTitulo := "BrwLegenda" DEFAULT cMensagem := "" DEFAULT bAction := { |cResName| !Empty( cResName ) } DEFAULT cMsgAction := "" aListBox := Array( nItens , 3 ) For nItem := 1 To nItens aListBox[ nItem ][ 1 ] := LoadBitmap( GetResources() , aLegend[ nItem ][ 1 ] ) aListBox[ nItem ][ 2 ] := aLegend[ nItem ][ 2 ] Next nItem DEFINE MSDIALOG oDlg FROM 0,0 TO 345,410 TITLE OemToAnsi( cTitulo ) OF GetWndDefault() PIXEL DEFINE FONT oFont NAME "Arial" SIZE 0, -13 BOLD @ 03 , 05 SAY OemToAnsi( cMensagem ) OF oDlg PIXEL SIZE 200 , 010 FONT oFont @ 11 , 05 TO 012 , 200 LABEL "" OF oDlg PIXEL @ 15 , 05 LISTBOX oListBox FIELDS HEADER " ", "Status" SIZE 200 , 150 OF oDlg PIXEL oListBox:SetArray( aListBox ) oListBox:bLDblClick := { || Eval( bAction , aLegend[ oListBox:nAt][ 1 ] ) , oDlg:End() } oListBox:bLine := { || { aListBox[ oListBox:nAt ][ 01 ] , aListBox[ oListBox:nAt ][ 02 ] } } oListBox:cToolTip := OemToAnsi( cMsgAction ) oListBox:Refresh() ACTIVATE MSDIALOG oDlg CENTERED END SEQUENCE Return( NIL ) /*/ Funcao: BrwGetSLeg Autor: Marinaldo de Jesus Data: 22/04/2011 Descricao: Retornar o Status conforme Array de Cores da mBrowse Sintaxe: StaticCall( u_mBrowseLFilter , BrwGetSLeg , cAlias , bGetColors , bGetLegend , cResName , lArrColors ) /*/ Static Function BrwGetSLeg( cAlias , bGetColors , bGetLegend , cResName , lArrColors ) Local cBmpColor := "" Local lFilter := ( ValType( cResName ) == "C" ) Local nLoop Local nLoops Local uC1Ret Private __aColors_ := {} Private __aLegend_ := {} TRYEXCEPTION Eval( bGetColors ) //Obtem __aColors_ ENDEXCEPTION TRYEXCEPTION Eval( bGetLegend ) //Obtem __aLegend_ ENDEXCEPTION BEGIN SEQUENCE DEFAULT lArrColors := .F. IF ( lArrColors ) uC1Ret := { __aColors_ , __aLegend_ } BREAK EndIF TRYEXCEPTION IF ( lFilter ) cResName := Upper( AllTrim( cResName ) ) EndIF DEFAULT cAlias := Alias() nLoops := Len( __aColors_ ) For nLoop := 1 To nLoops IF ( lFilter ) cBmpColor := Upper( AllTrim( __aColors_[ nLoop ][ 2 ] ) ) nPosBmp := aScan( __aLegend_ , { |aBmpLeg| Upper( AllTrim( aBmpLeg[ 1 ] ) ) == cBmpColor } ) IF !( nPosBmp == 0 ) uC1Ret := __aColors_[ nLoop ][ 1 ] //Obtem a Condicao de Filtro EndIF Else IF ( cAlias )->( &( __aColors_[ nLoop ][ 1 ] ) ) //Analisa a Condicao cBmpColor := Upper( AllTrim( __aColors_[ nLoop ][ 2 ] ) ) nPosBmp := aScan( __aLegend_ , { |aBmpLeg| Upper( AllTrim( aBmpLeg[ 1 ] ) ) == cBmpColor } ) IF !( nPosBmp == 0 ) uC1Ret := OemToAnsi( __aLegend_[ nPosBmp ][ 2 ] ) //Obtem a Descricao EndIF Exit EndIF EndIF Next nLoop DEFAULT uC1Ret := "" CATCHEXCEPTION uC1Ret := "" ENDEXCEPTION END SEQUENCE Return( uC1Ret ) /*/ Funcao: BrwFiltLeg Autor: Marinaldo de Jesus Data: 22/04/2011 Descricao: Filtra o Browse de acordo com a Opcao da Legenda da mBrowse Sintaxe: StaticCall( u_mBrowseLFilter , BrwFiltLeg , cAlias , aColors , aLegend , cTitle , cMsg , cMsgAction , cVarName ) /*/ Static Function BrwFiltLeg( cAlias , aColors , aLegend , cTitle , cMsg , cMsgAction , cVarName ) Local aIndex Local bAction := { |cResName| cBmpName := cResName } Local cBmpName Local cExpFilter Local cSvExprFilTop Local nBmpPos BrwLegenda( OemToAnsi( cTitle ) , OemToAnsi( cMsg ) , @aLegend , bAction , OemToAnsi( cMsgAction ) ) nBmpPos := aScan( aColors , { |aBmp| Upper( AllTrim( aBmp[2] ) ) == cBmpName } ) IF ( nBmpPos > 0 ) cExpFilter := aColors[ nBmpPos ][ 1 ] Else cExpFilter := "" EndIF cSvExprFilTop := ( cAlias )->( dbFilter() ) __cMbrRstFilter := cSvExprFilTop IF ( Type( cVarName ) == "C" ) &( cVarName ) := cSvExprFilTop EndIF aIndex := {} EndFilBrw( cAlias , @aIndex ) ( cAlias )->( dbClearFilter() ) bFiltraBrw := { || FilBrowse( cAlias , @aIndex , @cExpFilter ) } Eval( bFiltraBrw ) oObjBrow := GetObjBrow() oObjBrow:ResetLen() oObjBrow:GoTop() oObjBrow:Refresh() Return( cSvExprFilTop ) /*/ Funcao: MbrRstFilter Autor: Marinaldo de Jesus Data: 22/04/2011 Descricao: Restaura o Filtro de Browse Sintaxe: StaticCall( u_mBrowseLFilter , MbrRstFilter, cAlias , cVarName ) /*/ Static Function MbrRstFilter( cAlias , cVarName ) Local aIndex Local oObjBrow Local cMbrRstFilter IF ( ( ValType( cVarName )== "C" ) ) cMbrRstFilter := &( cVarName ) Else cMbrRstFilter := &( __cMbrRstFilter ) EndIF aIndex := {} EndFilBrw( cAlias , @aIndex ) ( cAlias )->( dbClearFilter() ) bFiltraBrw := { || FilBrowse( cAlias , @aIndex , @cMbrRstFilter ) } Eval( bFiltraBrw ) oObjBrow := GetObjBrow() oObjBrow:ResetLen() oObjBrow:GoTop() oObjBrow:Refresh() Return( NIL ) /*/ Funcao: __Dummy Autor: Marinaldo de Jesus Data: 22/04/2011 Descricao: __Dummy (nao faz nada, apenas previne warning de compilacao) Sintaxe:/*/ Static Function __Dummy( lRecursa ) Local oException TRYEXCEPTION DEFAULT lRecursa := .F. IF !( lRecursa ) BREAK EndIF BrwLegenda() BrwGetSLeg() BrwFiltLeg() MbrRstFilter() lRecursa := __Dummy( .F. ) CATCHEXCEPTION USING oException ENDEXCEPTION Return( lRecursa )
Para implementar o filtro na mBrowse do Programa MATA110 (Solicitação de Compras) Fariamos:
Ponto de Entrada MT110LEG : Implementar Legendas Especificas e/ou Retorna-las para o Filtro da mBrowse
#INCLUDE "PROTHEUS.CH" /*/ Funcao: MT110LEG Autor: Marinaldo de Jesus Descricao: Implementacao do Ponto de Entrada MT110LEG executado na funcao A110Legenda do programa MATA110 para adicionar novos elementos na Legenda /*/ User Function MT110LEG() Local aLegend := ParamIxb[1] //Obtenho a Legenda padrao //Testo o Tipo IF !( ValType( aLegend ) == "A" ) aLegend := {} EndIF /*/ Se necessario, adiciono novos elementos aa Legenda Padrao aAdd( aLegend , { "CRDIMG16" , OemToAnsi( "Em Pré-Analise" ) } ) aAdd( aLegend , { "CFGIMG16" , OemToAnsi( "Suspensa ou Aguardando Alterações" ) } ) /*/ //Verifico se estou querendo, apenas, as informacoes da Legenda IF IsInCallStack( "GetC1Status" ) //"Roubo"/Recupero as Informacoes da Legenda de Cores __aLegend_ := aLegend //Forco o Erro UserException( "IGetC1Status" ) EndIF Return( aLegend )
Ponto de Entrada MT110COR : Implementar Regra para cores e/ou Retorna-las para o Filtro da mBrowse
#INCLUDE "PROTHEUS.CH" #INCLUDE "TRYEXCEPTION.CH" /*/ Funcao: MT110COR Autor: Marinaldo de Jesus Descricao: Implementacao do Ponto de Entrada MT110COR executado na funcao MATA110 do programa MATA110 Tratamento de cores na mBrowse /*/ User Function MT110COR() Local aCores := ParamIxb[1] //Obtenho a Legenda padrao Local nBmpPos //Testo o Tipo IF !( ValType( aCores ) == "A" ) aCores := {} EndIF /*/ Se necessario, adiciono novos elementos aa Legenda Padrao IF nToL(SC1->( FieldPos( "C1_APROV" ) ) ) aAdd( aCores , { "C1_APROV=='1'" , "CRDIMG16" } ) //"Em Pré-Analise" aAdd( aCores , { "C1_APROV=='2'" , "CFGIMG16" } ) //"Suspensa ou Aguardando Alterações" EndIF /*/ nBmpPos := aScan( aCores , { |aBmp| Upper( AllTrim( aBmp[2] ) ) == "BR_AMARELO" } ) IF ( nBmpPos > 0 ) IF !( "C1_QUANT" $ aCores[ nBmpPos ][1] ) aCores[ nBmpPos ][1] += " .AND. C1_QUJE<>C1_QUANT" //Redefino SC Parcialmente Atendida (Tem um BUG na Logica padrao) EndIF EndIF //Verifico se estou querendo, apenas, as informacoes da Legenda IF IsInCallStack( "GetC1Status" ) //"Roubo"/Recupero as Informacoes da Legenda de Cores __aColors_ := aCores //Forco o Erro UserException( "IGetC1Status" ) EndIF Return( aCores ) /*/ Funcao: GetC1Status Autor: Marinaldo de Jesus Descricao: Retornar o Status da SC1 conforme Array de Cores da mBrowse Sintaxe: StaticCall( U_MT110COR , GetC1Status , cAlias , cResName , lArrColors ) /*/ Static Function GetC1Status( cAlias , cResName , lArrColors ) Local bGetColors := { || Mata110() } Local bGetLegend := { || A110Legenda() } DEFAULT cAlias := "SC1" Return( StaticCall( u_mBrowseLFilter , BrwGetSLeg , @cAlias , @bGetColors , @bGetLegend , @cResName , @lArrColors ) ) /*/ Funcao: __Dummy Autor: Marinaldo de Jesus Data: 22/04/2011 Descricao: __Dummy (nao faz nada, apenas previne warning de compilacao) Sintaxe:/*/ Static Function __Dummy( lRecursa ) Local oException TRYEXCEPTION DEFAULT lRecursa := .F. IF !( lRecursa ) BREAK EndIF GetC1Status() lRecursa := __Dummy( .F. ) CATCHEXCEPTION USING oException ENDEXCEPTION Return( lRecursa )
Ponto de Entrada MTA110MNU: Implementar a Chamada as Funcoes no Menu aRotina da mBrowse
#INCLUDE "PROTHEUS.CH" #INCLUDE "TRYEXCEPTION.CH" /*/ Funcao: MTA110MNU Autor: Marinaldo de Jesus Data: 07/01/2011 Descricao: Ponto de Entrada MTA110MNU, executado na MATA110, na MenuDef, sera utilizado alterar as Opcoes do aRotina /*/ User Function MTA110MNU() Local aMenuPopUp Local nIndex TRYEXCEPTION //Testo o Tipo IF !( Type( "aRotina" ) == "A" ) BREAK EndIF PUBLIC __cSC1FMbr //Ira armazenar o Filtro Atual //Adiciono Novo Sub-Menu ao Menu aRotina aMenuPopUp := {} aAdd( aMenuPopUp , Array( 4 ) ) nIndex := Len( aMenuPopUp ) aMenuPopUp[nIndex][1] := OemToAnsi( "Filtrar Legenda" ) aMenuPopUp[nIndex][2] := "StaticCall( U_MTA110MNU , SC1FiltLeg )" aMenuPopUp[nIndex][3] := 0 aMenuPopUp[nIndex][4] := 3 aAdd( aMenuPopUp , Array( 4 ) ) nIndex := Len( aMenuPopUp ) aMenuPopUp[nIndex][1] := OemToAnsi( "Limpar Filtro" ) aMenuPopUp[nIndex][2] := "StaticCall( U_MTA110MNU , MbrRstFilter )" aMenuPopUp[nIndex][3] := 0 aMenuPopUp[nIndex][4] := 3 //Adiciono uma nova Opcao no Menu aRotina aAdd( aRotina , Array( 4 ) ) nIndex := Len( aRotina ) aRotina[ nIndex ][1] := "Filtro &Legenda" aRotina[ nIndex ][2] := aMenuPopUp aRotina[ nIndex ][3] := 0 aRotina[ nIndex ][4] := 1 CATCHEXCEPTION USING oException IF ( ValType( oException ) == "O" ) Help( "" , 1 , ProcName() , NIL , OemToAnsi( oException:Description ) , 1 , 0 ) ConOut( CaptureError() ) EndIF ENDEXCEPTION Return( NIL ) /*/ Funcao: SC1FiltLeg Autor: Marinaldo de Jesus Data: 15/03/2011 Descricao: Filtra o Browse de acordo com a Opcao da Legenda da mBrowse /*/ Static Function SC1FiltLeg() Local aGetSc1 Local aColors Local aLegend Local cSvExprFilTop aGetSc1 := StaticCall( U_MT110COR , GetC1Status , "SC1" , NIL , .T. ) aColors := aGetSc1[1] aLegend := aGetSc1[2] cSvExprFilTop := StaticCall( u_mBrowseLFilter , BrwFiltLeg , "SC1" , @aColors , @aLegend , "Solicitação de Compras" , "Legenda" , "Duplo Clique para ativar o Filtro" , "__cSC1FMbr" ) Return( cSvExprFilTop ) /*/ Funcao: MbrRstFilter Autor: Marinaldo de Jesus Data: 15/03/2011 Descricao: Restaura o Filtro de Browse /*/ Static Function MbrRstFilter() Return( StaticCall( u_mBrowseLFilter , MbrRstFilter , "SC1" , "__cSC1FMbr" ) ) /*/ Funcao: __Dummy Autor: Marinaldo de Jesus Data: 22/04/2011 Descricao: __Dummy (nao faz nada, apenas previne warning de compilacao) Sintaxe:/*/ Static Function __Dummy( lRecursa ) Local oException TRYEXCEPTION DEFAULT lRecursa := .F. IF !( lRecursa ) BREAK EndIF SC1FromAC9() SC1FiltLeg() MbrRstFilter() lRecursa := __Dummy( .F. ) CATCHEXCEPTION USING oException ENDEXCEPTION Return( lRecursa )
Para implementar o filtro na mBrowse do Programa MATA120 (Pedidos de Compras) Fariamos:
Ponto de Entrada MT120LEG : Implementar Legendas Especificas e/ou Retorna-las para o Filtro da mBrowse
#INCLUDE "PROTHEUS.CH" /*/ Funcao: MT120LEG Autor: Marinaldo de Jesus Descricao: Implementacao do Ponto de Entrada MT120LEG executado na funcao A120Legenda do programa MATA120 para adicionar novos elementos na Legenda /*/ User Function MT120LEG() Local aLegend := ParamIxb[1] ////Obtenho a Legenda padrao //Testo o Tipo IF !( ValType( aLegend ) == "A" ) aLegend := {} EndIF /*/ Se necessario, adiciono novos elementos aa Legenda Padrao aAdd( aLegend , { "RNPSOLICITACNT_16" , OemToAnsi( "Solicitação de Contrato" ) } ) aAdd( aLegend , { "RNPADITIVOCNT_16" , OemToAnsi( "Solicitação de Aditivo" ) } ) aAdd( aLegend , { "BPMSDOCA_16" , OemToAnsi( "Bloqueado por Contrato" ) } ) aAdd( aLegend , { "CADEADO_16" , OemToAnsi( "Bloqueado por Orçamento" ) } ) /*/ //Verifico se estou querendo, apenas, as informacoes da Legenda IF IsInCallStack( "GetC7Status" ) //"Roubo"/Recupero as Informacoes da Legenda de Cores __aLegend_ := aLegend //Forco o Erro UserException( "IGetC7Status" ) EndIF Return( aLegend )
Ponto de Entrada MT120COR : Implementar Regra para cores e/ou Retorna-las para o Filtro da mBrowse
#INCLUDE "PROTHEUS.CH" #INCLUDE "TRYEXCEPTION.CH" /*/ Funcao: MT120COR Autor: Marinaldo de Jesus Descricao: Implementacao do Ponto de Entrada MT120COR executado na funcao MATA120 do programa MATA120 Tratamento de cores na mBrowse /*/ User Function MT120COR() Local aCores := ParamIxb[1] //Obtenho a Legenda padrao * Local cC7XCTNCNB := Space( GetSx3Cache( "C7_XCTNCNB" , "X3_TAMANHO" ) ) //Tratamento especifico para novos elementos //Testo o Tipo IF !( ValType( aCores ) == "A" ) aCores := {} EndIF /*/ Se necessario, adiciono novos elementos aa Legenda Padrao aAdd( aCores , { "C7_XCNTSOL .and. !C7_XCNTADT .and. C7_XCTNCNB == '" +cC7XCTNCNB + "'" , "RNPSOLICITACNT_16" } ) //"Solicitação de Contrato" aAdd( aCores , { "C7_XCNTSOL .and. C7_XCNTADT .and. C7_XCTNCNB == '" +cC7XCTNCNB + "'" , "RNPADITIVOCNT_16" } ) //"Solicitação de Aditivo" aAdd( aCores , { "C7_CONAPRO=='B' .and. C7_XCTNCNB <> '" +cC7XCTNCNB + "' .and. C7_QUJE>=C7_QUANT" , "BPMSDOCA_16" } ) //"Bloqueado por Contrato" aAdd( aCores , { ".F." , "CADEADO_16" } ) //"Bloqueado por Orçamento" /*/ //Verifico se estou querendo, apenas, as informacoes da Legenda IF IsInCallStack( "GetC7Status" ) //"Roubo"/Recupero as Informacoes da Legenda de Cores __aColors_ := aCores //Forco o Erro UserException( "IGetC7Status" ) EndIF Return( aCores ) /*/ Funcao: GetC7Status Autor: Marinaldo de Jesus Descricao: Retornar o Status da SC7 conforme Array de Cores da mBrowse Sintaxe: StaticCall( U_MT120COR , GetC7Status , cAlias , cResName , lArrColors ) /*/ Static Function GetC7Status( cAlias , cResName , lArrColors ) Local bGetColors := { || Mata120() } Local bGetLegend := { || A120Legenda() } DEFAULT cAlias := "SC7" Return( StaticCall( u_mBrowseLFilter , BrwGetSLeg , @cAlias , @bGetColors , @bGetLegend , @cResName , @lArrColors ) ) /*/ Funcao: __Dummy Autor: Marinaldo de Jesus Data: 22/04/2011 Descricao: __Dummy (nao faz nada, apenas previne warning de compilacao) Sintaxe:/*/ Static Function __Dummy( lRecursa ) Local oException TRYEXCEPTION DEFAULT lRecursa := .F. IF !( lRecursa ) BREAK EndIF GetC7Status() lRecursa := __Dummy( .F. ) CATCHEXCEPTION USING oException ENDEXCEPTION Return( lRecursa )
Ponto de Entrada MTA110BRW: Implementar a Chamada as Funcoes no Menu aRotina da mBrowse
#INCLUDE "PROTHEUS.CH" #INCLUDE "TRYEXCEPTION.CH" /*/ Funcao: MT120BRW Autor: Marinaldo de Jesus Data: 22/12/2010 Descricao: Implementacao do Ponto de Entrada MT120BRW para a Inclusao de Novas Opcoes no Menu do aRotina do programa MATA120 /*/ User Function MT120BRW() Local aMnuPopUP Local cMsgHelp Local nIndex Local oException TRYEXCEPTION //Testo o Tipo IF !( Type( "aRotina" ) == "A" ) BREAK EndIF PUBLIC __cSC7FMbr //Ira armazenar o Filtro Atual //Adiciono Novo Sub-Menu ao Menu aRotina aMenuPopUp := {} aAdd( aMenuPopUp , Array( 4 ) ) nIndex := Len( aMenuPopUp ) aMenuPopUp[nIndex][1] := OemToAnsi( "Filtrar Legenda" ) aMenuPopUp[nIndex][2] := "StaticCall( U_MT120BRW , SC7FiltLeg )" aMenuPopUp[nIndex][3] := 0 aMenuPopUp[nIndex][4] := 3 aAdd( aMenuPopUp , Array( 4 ) ) nIndex := Len( aMenuPopUp ) aMenuPopUp[nIndex][1] := OemToAnsi( "Limpar Filtro" ) aMenuPopUp[nIndex][2] := "StaticCall( U_MT120BRW , MbrRstFilter )" aMenuPopUp[nIndex][3] := 0 aMenuPopUp[nIndex][4] := 3 //Adiciono uma nova Opcao no Menu aRotina aAdd( aRotina , Array( 4 ) ) nIndex := Len( aRotina ) aRotina[ nIndex ][1] := "Filtro &Legenda" aRotina[ nIndex ][2] := aMenuPopUp aRotina[ nIndex ][3] := 0 aRotina[ nIndex ][4] := 1 CATCHEXCEPTION USING oException IF ( ValType( oException ) == "O" ) cMsgHelp := oException:Description Help( "" , 1 , ProcName() , NIL , OemToAnsi( cMsgHelp ) , 1 , 0 ) ConOut( CaptureError() ) EndIF ENDEXCEPTION Return( NIL ) /*/ Funcao: SC7FiltLeg Autor: Marinaldo de Jesus Data: 20/03/2011 Descricao: Filtra o Browse de acordo com a Opcao da Legenda da mBrowse /*/ Static Function SC7FiltLeg() Local aGetSC7 Local aColors Local aLegend Local cSvExprFilTop aGetSC7 := StaticCall( U_MT120COR , GetC7Status , "SC7" , NIL , .T. ) aColors := aGetSC7[1] aLegend := aGetSC7[2] cSvExprFilTop := StaticCall( u_mBrowseLFilter , BrwFiltLeg , "SC7" , @aColors , @aLegend , "Solicitação de Compras" , "Legenda" , "Duplo Clique para ativar o Filtro" , "__cSC7FMbr" ) Return( cSvExprFilTop ) /*/ Funcao: MbrRstFilter Autor: Marinaldo de Jesus Data: 20/03/2011 Descricao: Restaura o Filtro de Browse /*/ Static Function MbrRstFilter() Return( StaticCall( u_mBrowseLFilter , MbrRstFilter , "SC7" , "__cSC7FMbr" ) ) /*/ Funcao: __Dummy Autor: Marinaldo de Jesus Data: 22/04/2011 Descricao: __Dummy (nao faz nada, apenas previne warning de compilacao) Sintaxe:/*/ Static Function __Dummy( lRecursa ) Local oException TRYEXCEPTION DEFAULT lRecursa := .F. IF !( lRecursa ) BREAK EndIF SC7FiltLeg() MbrRstFilter() lRecursa := __Dummy( .F. ) CATCHEXCEPTION USING oException ENDEXCEPTION Return( lRecursa )
Para obter a Descrição da Legenda de Solicitação de Compras Fariamos algo como:
#INCLUDE "PROTHEUS.CH" #INCLUDE "TBICONN.CH" User Function C1LStatus() Local cC1DLStatus PREPARE ENVIRONMENT EMPRESA "01" FILIAL "01" ChkFile( "SC1" ) While SC1->( !Eof() ) //Obtenho a Descricao do Status cC1DLStatus := StaticCall( U_MT110COR , GetC1Status ) //Direciono a Saida para o Console do Server ConOut( cC1DLStatus ) SC1->( dbSkip() ) End While RESET ENVIRONMENT Return( NIL )
e, para obter a Descrição da Legenda do Pedido de Compras:
#INCLUDE "PROTHEUS.CH" #INCLUDE "TBICONN.CH" User Function C7LStatus() Local cC7DLStatus PREPARE ENVIRONMENT EMPRESA "01" FILIAL "01" ChkFile( "SC7" ) While SC7->( !Eof() ) //Obtenho a Descricao do Status cC7DLStatus := StaticCall( U_MT120COR , GetC7Status ) //Direciono a Saida para o Console do Server ConOut( cC7DLStatus ) SC7->( dbSkip() ) End While RESET ENVIRONMENT Return( NIL )
Vale salientar que, apesar dos exemplos serem 100% funcionais eles podem deixar de vir a funcionar em versões futuras do protheus/by you pois não atentem as caracteristicas de desenvolvimento de customizações do Protheus. A totvs/microsiga poderá, a qualquer momento e sem prévio aviso e, até descaracterizando a premissa de "manter o legado", alterar as funções padrões aqui utilizadas. Então, como recomendação, utilize estes códigos apenas se extremamente necessários ou considerando-os, apenas, como exemplos didaticos.
Como sempre, para baixar a versão completa, clique aqui.
Tenho dito: "simples assim".
[]s иαldσ dj
Doideira Papai do AdvPL.
ResponderExcluirQueria mandar um recado para o LC (Láercio Consentino), quer melhorar seu produto.
Olha oque esse menino aqui anda fazendo!
Totvs, atualmente está mais para TONTVS!
Um cara da Totvs BH, chamado [x] teve uma ideia parecida. Mas nao tao bem estruturada!
ResponderExcluirDepois lhe enviarei o codigo.
senhores, bom dia.
ResponderExcluirantes de mais nada parabéns pelo site. Tem me ajudado bastante.
Necessito de filtrar as solicitações de compra utilizando duas tabelas: SC1 e Z03 onde:
cQuery += " C1_FILIAL='"+xFilial("SC1")+"' AND C1_USER = '"+__cUserID+"' "
//cQuery += " AND Z03_FILIAL='"+xFilial("Z03")+"' AND Z03_USER = '"+__cUserID+"' "
//cQuery += " AND C1_CC = Z03_CC "
//cQuery += " AND C1_USER = Z03_USER "
Utilizei o ponto de entrada MT110QRY mas não rolou. Nem chamou.
Utilizando o PE MT110FIL funciona mas apenas uma tabela.
cQuery += " C1_FILIAL='"+xFilial("SC1")+"' .AND. C1_USER = '"+__cUserID+"' "
Tem jeito?
obrigado.
Existem legendas que os filtros são em SQL e outras são em ADVPL eu fiz um tratamento ae funciona para qualquer tipo.
ResponderExcluirEsse fonte ainda está funcionando, pois não está filtrando. Será que o Protheus sofreu alguma alteração que parou o funcionamento. Desde já agradeço.
ResponderExcluirEsse fonte ainda está funcionando corretamente ou o Protheus atualizou algo que não funciona mais? Realizei os procedimentos e o mesmo não está filtrando. Desde já agradeço!!
ResponderExcluir