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 :: Implementando a Função u_getSM0EmpFilByCNPJ para uso no TOTVS Microsiga Protheus


#Implementando a Função u_getSM0EmpFilByCNPJ em TOTVS Protheus

Hoje vamos explorar uma função bastante útil desenvolvida em TLPP Protheus, chamada-se u_getSM0EmpFilByCNPJ. 

Essa função é responsável por buscar o código da Empresa/Filial utilizando o CNPJ da empresa como parâmetro. 

Vamos entender como ela funciona.

```tlpp

#include "totvs.ch"

function u_getSM0EmpFilByCNPJ(cCNPJ as character) as json

    static oHashMapSM0EmpFilByCNPJ:=tHashMap():New() as object
    
    local aFiliais as array
    local aEmpresas as array
    local aFWArrFilAtu as array

    local cCodEmp as character
    local cCodFil as character
    local cEmpFil as character

    local jEmpFil as json
    local jGetEmpFil as json

    local nFilAtu as numeric
    local nFilial as numeric
    local nFiliais as numeric

    local nEmpresa as numeric
    local nEmpresas as numeric


    jEmpFil:=JSONObject():New()
    jEmpFil["cEmpAnt"]:=cEmpAnt
    jEmpFil["cFilAnt"]:=cFilAnt

    begin sequence

        cCNPJ:=allTrim(cCNPJ)
        cCNPJ:=strTran(cCNPJ,"/","")
        cCNPJ:=strTran(cCNPJ,".","")
        cCNPJ:=strTran(cCNPJ,"-","")

        if (empty(cCNPJ))
            break
        endif

        if (oHashMapSM0EmpFilByCNPJ:Get(cCNPJ,@jGetEmpFil))
            if (;
                (valType(jGetEmpFil)=="J");
                .and.;
                (jEmpFil:HasProperty("cEmpAnt"));
                .and.;
                (jEmpFil:HasProperty("cFilAnt"));
            )
                jEmpFil["cEmpAnt"]:=jGetEmpFil["cEmpAnt"]
                jEmpFil["cFilAnt"]:=jGetEmpFil["cFilAnt"]
                break
            endif
        endif

        aEmpresas:=aClone(FWAllCompany())
        nEmpresas:=Len(aEmpresas)

        for nEmpresa:=1 to nEmpresas
            
            cCodEmp:=aEmpresas[nEmpresa]
            
            aFiliais:=aClone(FWAllFilial(cCodEmp))
            
            nFiliais:=Len(aFiliais)
            for nFilial:=1 To nFiliais
                
                cCodFil:=aFiliais[nFilial]
                
                for nFilAtu:=1 to nFiliais

                    cEmpFil:=(cCodEmp+aFiliais[nFilAtu])

                    aFWArrFilAtu:=aClone(FWArrFilAtu(cCodFil,cEmpFil))

                    if (Empty(aFWArrFilAtu).or.Len(aFWArrFilAtu)<18)
                        //Não encontrou Empresa/Filial?
                        FWFreeArray(@aFWArrFilAtu)
                        loop
                    endif

                    if (cCNPJ==aFWArrFilAtu[18])
                        //Armazena em Cache
                        jGetEmpFil:=JSONObject():New()
                        jGetEmpFil["cEmpAnt"]:=aFWArrFilAtu[1]
                        jGetEmpFil["cFilAnt"]:=aFWArrFilAtu[2]
                        oHashMapSM0EmpFilByCNPJ:Set(cCNPJ,jGetEmpFil)
                        //Define o Retorno
                        jEmpFil["cEmpAnt"]:=jGetEmpFil["cEmpAnt"]
                        jEmpFil["cFilAnt"]:=jGetEmpFil["cFilAnt"]
                        break
                    endif

                    FWFreeArray(@aFWArrFilAtu)
                
                next nFilAtu

            next nFilial

            FWFreeArray(@aFiliais)

        next nEmpresa

    end sequence
    
    FWFreeArray(@aFiliais)
    FWFreeArray(@aEmpresas)
    FWFreeArray(@aFWArrFilAtu)

return(jEmpFil)


```

*Entendendo a Função

Entrada de Parâmetro:

A função recebe como parâmetro o CNPJ da empresa que você deseja obter o código da Empresa/Filial.
Tratamento do CNPJ:

O CNPJ passa por um processo de limpeza, removendo caracteres como "/", ".", e "-".
Cache de Resultados:

Utiliza um objeto tHashMap (oHashMapSM0EmpFilByCNPJ) para armazenar resultados previamente obtidos, evitando consultas repetidas.
Consulta e Armazenamento em Cache:

A função faz consultas utilizando a biblioteca FW (Framework) do TOTVS Protheus para obter informações sobre empresas e filiais.
Caso encontre o CNPJ desejado, os resultados são armazenados em cache para consultas futuras.
Retorno:

Retorna um objeto JSON contendo os códigos da Empresa e Filial correspondentes ao CNPJ informado.

*Utilização:
```tlpp
// Exemplo de Uso
local jResult as json
jResult := u_getSM0EmpFilByCNPJ("12345678901234")
```

*(sys.partitions)*

----

*O ChatGPT colaborou com esta publicação*

Comentários

Postagens mais visitadas