Pular para o conteúdo principal

Postagem em destaque

BlackTDN :: LeetCode :: Comparando Implementações Harbour e TLPP para o Desafio Longest Palindromic Substring

_Créditos das imagens: ChatGPT_ ### LeetCode :: Comparando Implementações Harbour e TLPP para o Desafio Longest Palindromic Substring Resolver o problema do [Longest Palindromic Substring](https://leetcode.com/problems/longest-palindromic-substring/description/) é um exercício clássico de programação, que desafia desenvolvedores a encontrar a maior substring palindrômica dentro de uma string. Recentemente, exploramos soluções tanto em Harbour quanto em TLPP (Total Language Protheus Programming). Neste artigo, comparamos as implementações nessas duas linguagens, destacando suas semelhanças, diferenças e funcionalidades específicas. #### Implementações em Harbour ##### Versão 5.1 Essa solução utiliza a técnica de expansão a partir do centro do palíndromo. Cada caractere ou par de caracteres consecutivos é considerado um possível "centro". O algoritmo expande em ambas as direções enquanto os caracteres forem iguais, retornando o maior palíndromo encontrado. ##### Versão 5....

Protheus :: Advpl :: Entendendo RPCSetEnv

GTalk:
Sergio E. S. Souza para mim
10:32 Sergio: eae naldo, bom dia.
posso te fazer uma pergunta, que ninguem soube me responder ate agora?
6 minutos
10:38 eu: diga-la
10:39 ??
10:40 Sergio: vou te explicar calma, rs
10:42 é a respeito do RPCSETENV em um job.
faço a preparacao do ambiente e inicio a leitura de um arquivo e ao fazer a leitura desse arquivo eh que fico sabendo a filial que devo logar para gerar o pedido de venda, entao aqui vai a pergunta:
É possivel executar o rpcsetenv em uma determinada filial e depois na mesma execução mudar a filial invocando novamnete o rpcsetenv para que o execauto inclua na filial correta?
10:43 eu: sim garoto
é possível
desde que vc utilize via StartJob
10:44 hehe
mania de garoto .. garota... ehehehe
devia falar rapa
hehe
...
mas funfa sim
exemplo...

#INCLUDE "PROTHEUS.CH"
#INCLUDE "TBICONN.CH"

Static __cCRLF    := CRLF

/*/
    Funcao:        U_Wally()
    Autor:        Marinaldo de Jesus (Sharing the Experience)
    Data:        27/09/2011
    Descricao:    Demonstrar o uso de RPCSetEnv com Troca de Empresa e/ou Filial
    Sintaxe:    <vide parametros formais>
/*/
User Function Wally()
    EvalPrg( { || Wally() } , "01" , "01" , "SIGAESP" )
Return( NIL )

/*/
    Funcao:        Wally()
    Autor:        Marinaldo de Jesus (Sharing the Experience)
    Data:        27/09/2011
    Descricao:    Wally foi dar uma volta, visitar suas filiais e nos mostrar por onde andou
    Sintaxe:    <vide parametros formais>
/*/
Static Function Wally()

    Local aMsg    := {}
    Local cMsg    := "Quem Fui Eu? " + __cCRLF

    //Estando no Ambiente Atual
    MsgInfo( "Quem Sou Eu? "  + "Empresa: " + cEmpAnt + " Filial: " + cFilAnt , ProcName() + " : " + AllTrim(Str(ProcLine()) ) )

    //Agora testado o novo ambiente 01/02
    aSize( aMsg    , 0 )
    MsgRun( "Aguarde..." , "Dando Uma Volta" , { || ChangeWEF( @aMsg , "01" , "02" , .T. ) } )
    //Carrego as Msg por Onde Passei
    aEval( aMsg , { |cMessage| cMsg += ( cMessage + __cCRLF    ) } )

    //Agora testado o novo ambiente 01/03
    aSize( aMsg    , 0 )
    MsgRun(  "Aguarde..." , "Dando ++Uma Volta" , { || ChangeWEF( @aMsg , "01" , "03" , .T. ) }  )
    //Carrego as Msg por Onde Passei
    aEval( aMsg , { |cMessage| cMsg += ( cMessage + __cCRLF    ) } )

    //Agora testado o novo ambiente 01/01
    aSize( aMsg    , 0 )
    MsgRun(  "Aguarde..." , "Dando Uma Volta++" , { || ChangeWEF( @aMsg , "01" , "01" , .T. ) }  )
    //Carrego as Msg por Onde Passei
    aEval( aMsg , { |cMessage| cMsg += ( cMessage + __cCRLF    ) } )

    //Verifica por Onde Passei
    MsgInfo( cMsg , ProcName() + " : " + AllTrim(Str(ProcLine())) + " :: " + "Caminhos de Wally" )

    //Retesta o ambiente atual
    MsgInfo( "Quem Sou Eu? "  + "Empresa: " + cEmpAnt + " Filial: " + cFilAnt , ProcName() + " : " + AllTrim(Str(ProcLine())) )

Return( NIL )

/*/
    Funcao:        Wally()
    Autor:        Marinaldo de Jesus (Sharing the Experience)
    Data:        27/09/2011
    Descricao:    Transporte de Wally
    Sintaxe:    <vide parametros formais>
/*/
Static Function ChangeWEF( aMsg , cEmp , cFil , lRecursa )

    Local cMsg    := ""

    Local lRpcSet := !( cEmpAnt == cEmp .and. cFil == cFilAnt )

    IF !( lRpcSet )
        cMsg    := u_GetMsg( @aMsg , @cEmp , @cFil , @lRpcSet , @lRecursa )
    Else
        cMsg    := StartJob( "u_GetMsg" , GetEnvServer() , .T. , @aMsg , @cEmp , @cFil , @lRpcSet , @lRecursa )
    EndIF

    aAdd( aMsg , cMsg )

Return( NIL )

/*/
    Funcao:        GetMsg()
    Autor:        Marinaldo de Jesus (Sharing the Experience)
    Data:        27/09/2011
    Descricao:    Caminhos do Wally
    Sintaxe:    <vide parametros formais>
/*/
User Function GetMsg( aMsg , cEmp , cFil , lRpcSet , lRecursa )

    Local cMsg    := ""

    IF ( lRpcSet )
        RpcSetType( 3 )
        RpcSetEnv( cEmp , cFil )
    EndIF

    DEFAULT lRecursa    := .F.
    IF ( lRecursa )

        lRecursa        := .F.

        //Agora testado o novo ambiente
        ChangeWEF( @aMsg , "01" , "03" , @lRecursa )
        ChangeWEF( @aMsg , "01" , "02" , @lRecursa )
        ChangeWEF( @aMsg , "01" , "01" , @lRecursa )
        ChangeWEF( @aMsg , cEmp , cFil , @lRecursa )

        aEval( aMsg , { |cMessage| cMsg += ( cMessage + __cCRLF    ) } )

    Else

        cMsg := "Quem Sou Eu? "  + "Empresa: " + cEmpAnt + " Filial: " + cFilAnt +  " " + ProcName() + " : " + AllTrim(Str(ProcLine()))

    EndIF

Return( cMsg )

/*/
    Funcao:        EvalPrg()
    Autor:        Marinaldo de Jesus (Sharing the Experience)
    Data:        27/09/2011
    Descricao:    Start de Wally
    Sintaxe:    <vide parametros formais>
/*/
Static Function EvalPrg( bExec , cEmp , cFil , cModulo )

    Local bWindowInit    := { || Eval( bExec ) }
    Local lPrepEnv        := ( IsBlind() .or. ( Select( "SM0" ) == 0 ) )
    Local uRet

    BEGIN SEQUENCE

        IF ( lPrepEnv )
            RpcSetType( 3 )
            PREPARE ENVIRONMENT EMPRESA( cEmp ) FILIAL ( cFil ) MODULO ( cModulo )
            InitPublic()
            SetsDefault()
            SetModulo( "SIGAESP2" , "ESP2" )
        EndIF

            IF ( Type(  "oMainWnd" ) == "O" )
                uRet := Eval( bExec )
                BREAK
            EndIF

            bWindowInit    := { || uRet := Eval( bExec ) }
            DEFINE WINDOW oMainWnd FROM 001,001 TO 400,500 TITLE OemToAnsi( FunName() )
              ACTIVATE WINDOW oMainWnd MAXIMIZED ON INIT ( Eval( bWindowInit ) , oMainWnd:End() )
        IF ( lPrepEnv )
            RESET ENVIRONMENT
        EndIF   

    END SEQUENCE

Return( uRet )

Teremos:

image

image

image

image 

image

image

RcpSetEnv(), é, de certa forma, um pouco demorada. Então, se a questão for apenas trocar a filial para a ExecAuto poderiamos fazer:

Local cSvFilAnt := cFilAnt

    cFilAnt := "02"
    //codigo
    //ExecAuto(...)
    //+codigo
    cFilAnt := "03"
    //codigo
    //ExecAuto(...)
    //+codigo
    cFilAnt := cSvFilAnt

Apesar do primeiro exemplo ser mais demorado, ele é mais seguro e funcionará com todos os modelos de configuração de Empresa.

P.S: Não preciso executar um RpcClearEnv() após um StartJob() uma vez que a Thread, após o seu retorno, e finalizada por completo.

E.T.: baixe-o clicando aqui.

 

[]s

иαldσ dj

Comentários

Postagens mais visitadas