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 :: Contabilização CSV

Uma amiga aqui do RJ estava tentando generalizar a Contabilização TXT (CTBA500) para que fosse possível contabilizar arquivos do tipo CSV. O Problema é que a Rotina de Contabilização TXT é muito amarrada e muito sensível ao formato do arquivo. Sendo assim…: Segue uma versão ao estilo BlackTDN para a Contabilização CSV como alternativa a opção Padrão.

PS.: Não queria codificar. Queria usar o MILE, mas não tive opção. Os processos de Lançamentos Manuais não possuem ExecAuto e muito menos MVC. Então: ao código…

#include "totvs.ch"
#include "tryexception.ch"

#ifdef SPANIS
        #define STR0000 "AVISO!!!"
        #define STR0001 "Este Programa Irá efetuar a Contabilização CSV conforme parâmetros Selecionados"
        #define STR0002 "Contabilização CSV"
        #define STR0003 "Inicio da Contabilização"
        #define STR0004 "Final da Contabilização"
        #define STR0005 "Arquivo: "
        #define STR0006 "Não Encontrado"
        #define STR0007 "Lote Contábil ("
        #define STR0008 ")"
        #define STR0009 "Lançamento Padrão ("
        #define STR0010 ") Inválido"
        #define STR0011 "O arquivo Informado ("
        #define STR0012 ") Nãoo possui conteúdo para Contabilização"
        #define STR0013 "Contabilizando. Aguarde..."
        #define STR0014 "Ocorreram Erros Durante o Processo de Contabilizaçao. Retorne a Rotina para Visualizar o LOG de Processo"
        #define STR0015 "Contabilizando Arquivo: "
        #define STR0016 "Contabilizando no Lote: "
        #define STR0017 "Arquivo Contabilizado: "
        #define STR0018 "Para essa conta ("
        #define STR0019 ")o Código de Centro de Custo é de Preenchimento Obrigatório"
        #define STR0020 "Cancelado Pelo Usuário"
        #define STR0021 "Processando: "
#else
    #ifdef ENGLISH
        #define STR0000 "AVISO!!!"
        #define STR0001 "Este Programa Irá efetuar a Contabilização CSV conforme parâmetros Selecionados"
        #define STR0002 "Contabilização CSV"
        #define STR0003 "Inicio da Contabilização"
        #define STR0004 "Final da Contabilização"
        #define STR0005 "Arquivo: "
        #define STR0006 "Não Encontrado"
        #define STR0007 "Lote Contábil ("
        #define STR0008 ")"
        #define STR0009 "Lançamento Padrão ("
        #define STR0010 ") Inválido"
        #define STR0011 "O arquivo Informado ("
        #define STR0012 ") Nãoo possui conteúdo para Contabilização"
        #define STR0013 "Contabilizando. Aguarde..."
        #define STR0014 "Ocorreram Erros Durante o Processo de Contabilizaçao. Retorne a Rotina para Visualizar o LOG de Processo"
        #define STR0015 "Contabilizando Arquivo: "
        #define STR0016 "Contabilizando no Lote: "
        #define STR0017 "Arquivo Contabilizado: "
        #define STR0018 "Para essa conta ("
        #define STR0019 ")o Código de Centro de Custo é de Preenchimento Obrigatório"
        #define STR0020 "Cancelado Pelo Usuário"
        #define STR0021 "Processando: "
    #else
        #define STR0000 "AVISO!!!"
        #define STR0001 "Este Programa Irá efetuar a Contabilização CSV conforme parâmetros Selecionados"
        #define STR0002 "Contabilização CSV"
        #define STR0003 "Inicio da Contabilização"
        #define STR0004 "Final da Contabilização"
        #define STR0005 "Arquivo: "
        #define STR0006 "Não Encontrado"
        #define STR0007 "Lote Contábil ("
        #define STR0008 ")"
        #define STR0009 "Lançamento Padrão ("
        #define STR0010 ") Inválido"
        #define STR0011 "O arquivo Informado ("
        #define STR0012 ") Nãoo possui conteúdo para Contabilização"
        #define STR0013 "Contabilizando. Aguarde..."
        #define STR0014 "Ocorreram Erros Durante o Processo de Contabilizaçao. Retorne a Rotina para Visualizar o LOG de Processo"
        #define STR0015 "Contabilizando Arquivo: "
        #define STR0016 "Contabilizando no Lote: "
        #define STR0017 "Arquivo Contabilizado: "
        #define STR0018 "Para essa conta ("
        #define STR0019 ")o Código de Centro de Custo é de Preenchimento Obrigatório"
        #define STR0020 "Cancelado Pelo Usuário"
        #define STR0021 "Processando: "
    #endif
#endif

user function CSV2CTB()

    Local aArea:=GetArea()

    Local bProcess:={|oProcess|CSV2CTB(@oProcess,@cPerg,@lError)}

    Local cPerg:="U_CSV2CTB"
    Local cDescri:=OemToAnsi(STR0001)

    Local dSvDataBase:=dDataBase

    Local lError:=.F.

    Local oProcess

    Private aRotina:={;
                                {"","",0,1},;
                                {"","",0,2},;
                                {"","",0,3},;
                                {"","",0,4};
                             }

    Private Inclui:=.T.

    Private cProcess:=ProcName()
    Private cCadastro:=OemtoAnsi(STR0002)
   
    Private aCSVLine:=Array(0)

    if .not.(Type("cCancel")=="C")
        Private cCancel:=STR0020
    endif  
   
    oProcess:=tNewProcess():New(cProcess,cCadastro,bProcess,cDescri,cPerg,NIL,NIL,NIL,NIL,.T.,.F.)

    if (lError)
        MsgAlert(STR0014,STR0000)
    endif

    dDataBase:=dSvDataBase

    RestArea(aArea)

return(NIL)

static function CSV2CTB(oProcess,cPerg,lError)

    Local oException
   
    Pergunte(cPerg,.F.)

    oProcess:SaveLog(OemToAnsi(STR0003))

    TRYEXCEPTION

        if .not.(PgsExclusive())
           UserException(GetHelp("PGSEXC"))
        endif

        if (FindFunction("CTBSERIALI"))
            While !(CTBSerialI("CTBPROC","ON"))
            End While
        endif

        CSVToCTB(oProcess,@lError)

        if (FindFunction("CTBSERIALF"))
            CTBSerialF("CTBPROC","ON")
        endif

    CATCHEXCEPTION USING oException

        lError:=.T.
        oProcess:SaveLog("ERRO: "+OemToAnsi(oException:Description))

    ENDEXCEPTION

    PgsShared()

    oProcess:SaveLog(OemToAnsi(STR0004))

return(NIL)

static function CSVToCTB(oProcess,lError)

    Local cFile:=AllTrim(MV_PAR03)
    Local cLote:=MV_PAR04
    Local cPadrao:=MV_PAR06
    Local cToken:=IF(MV_PAR07==1,",",IF(MV_PAR07==2,";","|"))
   
    Local cRecNo
    Local cRecNos
    Local cCSVLine

    Local dSvDtBase:=dDataBase

    Local lHead:=.F.
    Local lPadrao:=.F.
    Local lAglut:=(MV_PAR02==1)
    Local lDigita:=(MV_PAR01==1)
    Local lQuebra:=(MV_PAR05==1)

    Local nTotal
    Local nValor
    Local nHdlPrv

    Local nRecNo:=0
    Local nRecNos
   
    Local oException

    TRYEXCEPTION

        if Empty(cFile)
            UserException(GetHelp("NOFLEIMPOR")+" "+OemToAnsi(STR0005+cFile+" "+STR0006))
        endif
       
        oProcess:SaveLog(STR0015+cLote)

        if Empty(cLote)
            UserException(GetHelp("NOCT210LOT")+" "+OemToAnsi(STR0007+cLote+STR0008))
        endif
       
        oProcess:SaveLog(STR0016+cLote)

        lPadrao:=VerPadrao(cPadrao)
        if .not.(lPadrao)
            UserException(GetHelp("NOLANCPADRAO")+" "+OemToAnsi(STR0009+cPadrao+STR0010)) 
        endif

        ft_fUse(cFile)

        nRecNos:=ft_fLastRec()

        if (Empty(nRecNos))
            UserException(OemToAnsi(STR0011+cFile+STR0012))
        endif

        oProcess:SetRegua1(nRecNos)
        oProcess:SetRegua2(nRecNos)
        cRecNos:=StrZero(nRecNos,10)

        while (.not.(ft_fEof()))

            //"Contabilizando. Aguarde..."
            oProcess:IncRegua1(STR0013)
            if (oProcess:lEnd)
                UserException(cCancel)
            endif

            //Atualiza aCSVLine com a Linha Corrente
            cCSVLine:=ft_fReadLn()
            aCSVLine:=StrTokArr(cCSVLine,cToken)
           
            if .not.(lHead)
                lHead:=.T.
                nHdlPrv:=HeadProva(cLote,cProcess,SubStr(cUsuario,7,6),@cFile)
            endif
           
            nTotal+=DetProva(nHdlPrv,cPadrao,cProcess,cLote)
           
            if (lQuebra)
                //Cada linha contabilizada sera um documento
                RodaProva(@nHdlPrv,@nTotal)
                cA100Incl(@cFile,@nHdlPrv,3,@cLote,@lDigita,@lAglut)
                lHead:=.F.
            endif

            //"Processando: "
            nRecNo++
            cRecNo:=StrZero(nRecNo,10)
            oProcess:IncRegua2(STR0021+"["+cRecNo+"/"+cRecNos+"]")
            if (oProcess:lEnd)
                UserException(cCancel)
            endif

            ft_fSkip()

        end while

        ft_fUse()

        if (lHead)
            RodaProva(@nHdlPrv,@nTotal)
            cA100Incl(@cFile,@nHdlPrv,3,@cLote,@lDigita,@lAglut)
        endif

        oProcess:SaveLog(STR0017+cFile)
       
    CATCHEXCEPTION USING oException

        ft_fUse()
        lError:=.T.
        oProcess:SaveLog("ERRO: "+OemToAnsi(oException:Description))

    ENDEXCEPTION

    dDataBase:=dSvDtBase

return(NIL)

static function GetHelp(cHelp)
return(StrTran(Ap5GetHelp(cHelp),CRLF," "))

static function ChkCSVLine(nAT)
    if (type("aCSVLine")=="A")
        return(Len(aCSVLine)>=nAT)
    endif
return(.F.)

static function GetCSVLine(nAT)
    if ChkCSVLine(nAT)
        return(aCSVLine[nAT])
    endif
return("")

static function __Dummy()
    if (.f.)
        GetCSVLine()
        __Dummy()
    endif
return(.f.)

Para obter o código original (SRC) e as configurações CT5 (LP) e SX1 (Perguntas), clique aqui.

[]s

иαldσ dj

Comentários

  1. Bom dia Naldo, você poderia disponibilizar também o modelo do CSV pf ? Obrigado Everton Santos

    ResponderExcluir
    Respostas
    1. Everton, não precisa do Modelo. O Modelo pode ser Montado segundo a sua necessidade.

      Excluir
  2. Boa tarde Naldo. Estou tentando utilizar a sua rotina para fazer a contabilização online com csv mas a minha duvida é a mesma do Everton. Não estou conseguindo rodar a rotina porque não sei ao certo o quê colocar no arquivo csv. O nosso arquivo TXT tem a estrutura abaixo:
    001 1120401001 8231 64 - IRRF ADIANTAMENTO 3.1.1.01.13.08 3.1.1.01.13.08

    ResponderExcluir
  3. Olá, Naldo! Como entro em contato com você para uma consultoria?

    Meu problema:
    A rotina atual do compras é onde os lançamentos das notas fiscais são considerados todos os impostos destacados no documento, e esses lançamentos são ajustados em outro ambiente (livros fiscais) onde os impostos são ajustados conforme a tributação da empresa. Dessa forma, a contabilidade está tendo muito trabalho manual para inserir os créditos de PIS e COFINS e o ICMS DIFAL sobre as notas de entrada.

    A apuração atual é toda alterada dentro de Livros Fiscais, e para fins de otimizar os trabalhos de todos os setores, queremos saber se há a possibilidade de trazer esses lançamentos dos créditos de PIS e COFINS e do DIFAL sobre as compras do módulo Livros Fiscais para Contabilidade Gerencial.

    prsfpf@gmail.com

    ResponderExcluir
    Respostas
    1. https://www.linkedin.com/in/marinaldo-de-jesus-66392346/

      Excluir

Postar um comentário

Postagens mais visitadas