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....

BlackTDN :: CTBR040 por Filial, é Possível? (Da série, Pedidos Inusitados)

 Vez ou outra recebo uns pedidos um tanto quanto inusitados. Este queria imprimir o CTBR040 (Balancete) por filial, NÃO considerando o parâmetro "Seleciona Filiais" (que não atendia às expectativas do cliente). Mas selecionando todas as filiais e totalizando-as no mesmo relatório. Eu disse.... Deixe-me pensar...... E, a resposta, acredito que já sabem qual foi: Sim. É possível. Mas terei que usar algumas funções de minha biblioteca. Quer experimentar? Lá vai o código:

#include "totvs.ch"

procedure u_CTBR040BlackTDN(wnRel)

    local aFiliais:=AdmGetFil() as array

    local cSVFilAnt:=cFilAnt as character
    local cSpaceQuadro as character

    local oReport as object

    //Todas as Privates definidas em CTBR040 devem ser inicializada aqui.
    private aSelFil:=Array(0) as array
    private aQuadro:=array(8) as array

    cSpaceQuadro:=Space(Len(CriaVar("CT1_CONTA")))
    aFill(aQuadro,cSpaceQuadro)

    dfv():Default(@wnRel,ProcName())

    //Obtem a Definição do Relatorio a partir da CTBR040
    oReport:=ExecIn():CallProc("ULTRA_SECRET","CTBR040","REPORTDEF",@wNRel)
    //Obtem o Action do Realatorio
    bAction:=oReport:GetAction()
    //Redefine o Action do Relatorio
    oReport:SetAction({|oReport|PrintReport(@oReport,@wNRel,@aFiliais,@bAction)})
    //Chama PrintDialog
    oReport:PrintDialog()

    //Restaura a Filial de Entrada
    SetFilAnt(cSVFilAnt)

return

static function SetFilAnt(cFil)
    cFilAnt:=cFil
return(FWSM0Util():setSM0PositionBycFilAnt())

static function PrintReport(oReport,wNRel,aFiliais,bAction) 
    
    local nFilial as numeric
    local nFiliais as numeric

    local oCell as object
    local oSection:=oReport:Section(1) as object

    nFiliais:=Len(aFiliais)
    for nFilial:=1 to nFiliais
        cFil:=aFiliais[nFilial]
        //Seta a Filial Corrente
        SetFilAnt(cFil)
        //CTBR040 Inicia TRFunction no Corpo do Programa (Q M... Isso complica tudo.)        
        //Os Breaks e as Functions Precisam ser "Zerados(as)" para não dar erro e Totalizar corretamente
        //Remove Os Breaks de TReport
        aEval(oReport:aBreak,{|e|aSize(e:aFunction,0)})
        aSize(oReport:aBreak,0)
        //Remove As Functions de TReport
        aSize(oReport:aFunction,0)
        //Remove Os Breaks de TRSection
        aEval(oSection:aBreak,{|e|aSize(e:aFunction,0)})
        aSize(oSection:aBreak,0)
        //Remove As Functions de TRSection
        aSize(oSection:aFunction,0)
        //Remove As Functions de TRCell
        oCell:=oSection:Cell("SALDODEB")
        aSize(oCell:aFunction,0)
        //Remove As Functions de TRCell
        oCell:=oSection:Cell("SALDOCRD")
        aSize(oCell:aFunction,0)
        //Remove As Functions de TRCell
        oCell:=oSection:Cell("MOVIMENTO")
        aSize(oCell:aFunction,0)
        //Seta Pagina Inicial
        oReport:oPage:lFirstPage:=.T.
        //Imprime o Relatório Padrao
        Eval(bAction,oReport)
        //Armazena a Ultima Pagina que será utilizada no PE MVCHANGE
        CacheData():Set("u_CTBR040BlackTDN","MV_PAR09",(oReport:oPage:nPage+1))
        //Quebra de Pagina a Cada nova Filial
        oReport:EndPage()
    next nfilial

return

 Vai precisar do Ponto de Entrada U_MVCHANGE para Controlar a Paginação.

#include "totvs.ch"

procedure U_MVCHANGE()
    local cPergunta:=ParamIXB[1] 
    if (("CTR040"$cPergunta).and.IsInCallStack("u_CTBR040BlackTDN"))
        MV_PAR09:=CacheData():Get("u_CTBR040BlackTDN","MV_PAR09",MV_PAR09)
    endif
return      
 

Comentários

Postar um comentário

Postagens mais visitadas