Pular para o conteúdo principal

Postagem em destaque

BlackTDN :: LeetCode (17) :: Comparando Implementações do Desafio "Letter Combinations of a Phone Number" em Harbour e TOTVS TLPP

_Créditos das imagens: ChatGPT_ # LeetCode (17) :: Comparando Implementações do Desafio "Letter Combinations of a Phone Number" em Harbour e TOTVS TLPP O desafio [**"Letter Combinations of a Phone Number"**](https://leetcode.com/problems/letter-combinations-of-a-phone-number/description/) (Combinações de Letras de um Número de Telefone) é um problema clássico de programação que envolve a geração de todas as combinações possíveis de letras que um número de telefone pode representar, com base no mapeamento tradicional dos teclados de telefone. Abaixo, comparamos duas implementações desse desafio: uma em **Harbour** e outra em **TOTVS TLPP** (TOTVS Language Plus Plus). ## O Desafio Dada uma string contendo dígitos de 2 a 9, retorne todas as combinações possíveis de letras que esses dígitos podem representar. O mapeamento dos dígitos para as letras é o mesmo dos teclados de telefone tradicionais: - 2: "abc" - 3: "def" - 4: "ghi" - 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