Pular para o conteúdo principal

Postagem em destaque

BlackTDN :: cArqTab :: Otimizando a Abertura do Sistema: Como a Escolha do Método de Carregamento Afeta o Desempenho

_Créditos da imagem: Gerada com auxílio do ChatGPT_ # cArqTab :: Como o carregamento de informações em uma variável pode tornar lenta a abertura do sistema TOTVS Microsiga Protheus --- # Comparando LoadFromDBQuery e LoadFromDBWhile: Vantagens e Desempenho No desenvolvimento de soluções para o TOTVS Microsiga Protheus, otimizar o tempo de execução das funções é essencial, especialmente quando lidamos com grandes volumes de dados. Neste artigo, vamos analisar a diferença de desempenho entre os métodos `LoadFromDBQuery` e `LoadFromDBWhile`, utilizando os tempos de execução para demonstrar a vantagem de cada abordagem. ## Contexto do Teste Para avaliar o desempenho, executamos dois procedimentos distintos: - **U_TSTArqTabLoadDBQuery**: utiliza a função `LoadFromDBQuery`. - **U_TSTArqTabLoadDBWhile**: utiliza a função `LoadFromDBWhile`. Os comandos foram executados no ambiente Cygwin, e PowerShell e os tempos foram medidos da seguinte forma: *Cygwin ```bash $ time C:/totvs/tst/sma

Protheus :: Advpl :: Usando cExprFilTop Para Filtrar o Cadastro de Fornecedores de Acordo com Documento de Entrada na mBrowse

A dica de hoje é um exemplo de como utilizar o parâmetro cExprFilTop ( parâmetro 19 da mBrowswe ) para Filtrar os Fornecedores que possuem Documento de Entrada e, consequentemente, os Documentos de Entrada vinculados a Esses Fornecedores. O código em si é bem simples e de fácil assimilação, e pode ser usado como base para outros filtros e outros relacionamentos.

O Código:

#INCLUDE "PROTHEUS.CH"
#IFDEF __TRYEXCEPTION__
    #INCLUDE "TRYEXCEPTION.CH"
#ENDIF   

/*/
    Function:    U_MATA103F
    Autor:       Marinaldo de Jesus
    Data:        18/01/2011
    Descricao:   Cadastro de Fornecedores/Doc.Entrada
    Sintaxe:     U_MATA103F
/*/
User Function MATA103F()

    Local aArea        := GetArea()
    Local aSA2Area     := SA2->( GetArea() )
    Local aSF1Area     := SF1->( GetArea() )
    Local cExprFilTop  := ""

    BEGIN SEQUENCE

   Private aRotina     := {;
                             { "Pesquisar" , "PesqBrw", 0 , 01 } ,;
                             { "Doc. de Entrada","StaticCall(U_MATA103F,MATA103NFE,'SA2',SA2->(Recno()),2)",0,02};
                          }

        Private aTela        := {}
        Private aGets        := {}

        Private cCadastro    := OemToAnsi( "Cadastro de Fornecedores vs Contratos" )
        Private bFiltraBrw   := { || .F. }

        cExprFilTop    := "A2_COD+A2_LOJA "
        cExprFilTop    += "IN "
        cExprFilTop    += "("
        cExprFilTop    += "SELECT DISTINCT "
        cExprFilTop    +=         "SA2.A2_COD+SA2.A2_LOJA "
        cExprFilTop    += "FROM "
        cExprFilTop    +=         RetSqlName( "SA2" ) + " SA2, "
        cExprFilTop    +=        RetSqlName( "SF1" ) + " SF1 "
        cExprFilTop    += "WHERE "
        cExprFilTop    +=         "SA2.D_E_L_E_T_<>'*' "
        cExprFilTop    +=    " AND "
        cExprFilTop    +=         "SF1.D_E_L_E_T_<>'*' "
        cExprFilTop    +=    " AND "
        cExprFilTop    +=         "SA2.A2_FILIAL='" + xFilial( "SA2" ) + "'"
        cExprFilTop    +=    " AND "
        cExprFilTop    +=         "SF1.F1_FILIAL='" + xFilial( "SF1" ) + "'"
        cExprFilTop    +=    " AND "
        cExprFilTop    +=         "SA2.A2_COD=SF1.F1_FORNECE "
        cExprFilTop    +=    " AND "
        cExprFilTop    +=         "SA2.A2_LOJA=SF1.F1_LOJA "
        cExprFilTop    += ")"

        MBrowse(6,1,22,75,"SA2",NIL,NIL,NIL,NIL,NIL,NIL,NIL,NIL,NIL,NIL,NIL,NIL,NIL,cExprFilTop)

    END SEQUENCE

    RestArea( aSF1Area )
    RestArea( aSA2Area )
    RestArea( aArea )

Return( NIL )

/*/
    Function:    MATA103NFE
    Autor:       Marinaldo de Jesus
    Data:        18/01/2011
    Descricao:   Chamada a Rotina de Nota Fiscal de Entrada
    Sintaxe:     StaticCall(U_MATA103F,MATA103NFE,cAlias,nReg,nOpc)
/*/
Static Function MATA103NFE( cAlias , nReg , nOpc )

    Local aArea         := GetArea()
    Local aIndex        := {}
    Local aSF1Area      := SF1->( GetArea() )
    Local aModuloReSet  := SetModulo( "SIGACOM" , "COM" )
    Local bSvFilBrw     := bFiltraBrw
    Local cFiltra       := ""
    Local cSF1Alias     := "SF1"
    Local cSF1KeySeek

    Local nSF1Reg
    Local nSF1Order     := RetOrder( cSF1Alias , "F1_FILIAL+F1_FORNECE+F1_LOJA+F1_DOC" )

    Local uRet

    Private aTela       := {}
    Private aGets       := {}

    #IFDEF __TRYEXCEPTION__
        TRYEXCEPTION
    #ENDIF   

        ( cAlias )->( MsGoto( nReg ) )

        cFiltra       := "F1_FORNECE+F1_LOJA$'" + SA2->( A2_COD+A2_LOJA ) + "'"

        bFiltraBrw    := { || FilBrowse( "SF1" , @aIndex , @cFiltra ) }

        SF1->( dbSetOrder( nSF1Order ) )
        SF1->( Eval( bFiltraBrw ) )       

        uRet := __Execute( "MATA103()" , "xxxxxxxxxxxxxxxxxxxx" , "MATA103" , AllTrim(Str(nModulo)) , "" , 1 , .T. )

        SF1->( EndFilBrw( "SF1" , aIndex ) )

    #IFDEF __TRYEXCEPTION__

        CATCHEXCEPTION USING oException
            IF ( ValType( oException ) == "O" )
                Help( "" , 1 , ProcName() , NIL , OemToAnsi( oException:Description ) , 1 , 0 )
                ConOut( CaptureError() )
            EndIF
        ENDEXCEPTION

    #ENDIF

    bFiltraBrw    := bSvFilBrw
    SA2->( Eval( bFiltraBrw ) )

    ReSetModulo( aModuloReSet )

    RestArea( aSF1Area )
    RestArea( aArea )

Return( uRet )

Static Function __Dummy( lRecursa )
    #IFDEF __TRYEXCEPTION__
        Local oException
        TRYEXCEPTION
    #ENDIF
            DEFAULT lRecursa := .F.
            IF !( lRecursa )
                BREAK
            EndIF
            MATA103NFE()
            lRecursa := __Dummy( .F. )
    #IFDEF __TRYEXCEPTION__
        CATCHEXCEPTION USING oException
        ENDEXCEPTION
    #ENDIF   
Return( lRecursa )

Inclua a Chamada ao Menu do Módulo como em:

<MenuItem Status="Enable">
    <Title lang="pt">Fornecedor / Doc. Entrada</Title>
    <Title lang="es">Fornecedor / Doc. Entrada</Title>
    <Title lang="en">Fornecedor / Doc. Entrada</Title>
    <Function>MATA103F</Function>
    <Type>03</Type>
    <Tables>SA2</Tables>
    <Tables>SF1</Tables>
    <Tables>SD1</Tables>
    <Access>xxxxxxxxxx</Access>
    <Module>02</Module>
    <Owner>2</Owner>
</MenuItem>

Para baixar o código, clique aqui.

[]s

иαldσ dj

Comentários

Postar um comentário

Postagens mais visitadas