Pular para o conteúdo principal

Postagem em destaque

🚀 Oferecendo Serviços Remotos de Desenvolvedor AdvPL e Mais 🖥️

🚀 Oferecendo Serviços Remotos de Desenvolvedor AdvPL e Mais 🖥️ Olá pessoal, Espero que este post encontre todos vocês bem! É com grande entusiasmo que compartilho que estou expandindo meus serviços como Desenvolvedor AdvPL para novos desafios e colaborações. Com mais de duas décadas de experiência sólida, minha jornada profissional tem sido enriquecedora, com a oportunidade de participar de projetos empolgantes ao longo dos anos. Agora, estou ansioso para trazer minha experiência e habilidades para novas equipes e projetos, trabalhando de forma remota. Minha expertise abrange não apenas AdvPL, mas também outras tecnologias-chave, incluindo JS, SQL, Infraestrutura e Otimização de Processos. Acredito que essa combinação de conhecimentos me permite oferecer soluções abrangentes e eficazes para uma variedade de necessidades de desenvolvimento. Acredito que a tecnologia tem o poder de transformar negócios e impulsionar o sucesso, e estou comprometido em ajudar meus clientes a alcançar seu

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 deste blog

BlackTDN :: RLeg ~ Desvendando a Função ParamBox

Para quem precisar desenvolver uma interface de entrada de dados, coisa rápida, e não quer ter aquele trabalhão danado que todos já sabemos, o Protheus tem uma função que ajuda muito, é uma interface semelhante a função Pergunte, porém com muito mais opção de objeto de entrada de dados, alias até colocar o scrollbox desta interface com todos os objetos em outra MsDialog ou Wizard é simples. Vejam o exemplo abaixo, boa sorte! Rleg. //---------------------------------------------------------- // Função exemplo utilizando a função ParamBox() //---------------------------------------------------------- User Function xParamBox() Local aRet := {} Local aParamBox := {} Local aCombo := {"Janeiro","Fevereiro","Março","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"} Local i := 0 Private cCadastro := "xParambox" // ---------------

BlackTDN :: Customizando a interface de Login no Protheus e by You

A publicação “ BlackTDN :: By You e sua nova tela de login ”  de nosso amigo OBona deu o que falar e, em função disso, esse que a muito não vos escreve resolveu criar uma versão onde será possível personalizar, “por completo”, a tela de login no Protheus/by You. Considerando que OBona já havia “mapeado, identificado e customizado” as imagens peguei-as emprestadas para o exemplo que se segue: O primeiro passo para a customização “total” da interface de login do Protheus/by You será implementar o “Ponto de Entrada” ChgPrDir (Diretório de impressão) . Usaremos esse PE juntamente como programa U_FindMsObject.prg (apresentado pela primeira vez em: Protheus :: ADVPL : The Container : Presents Pandora's box ). Diferente do exemplo proposto por OBona, que substitui, durante o processo de compilação, as imagens padrões do sistema (excluindo-as) por imagens customizadas (com o mesmo nome) este novo exemplo mantém, no RPO, as imagens padrões adicionando novas imagens customizadas que serã

Protheus :: Chamando Funções do Menu Diretamente e sem a Necessidade de Login

Ferne$ perguntou: "...é possível abrir alguma rotina do sistema sem solicitar login ao usuário, como por exemplo a rotina MATA010..." Sim Ferne$, é possível sim. Abaixo um Exemplo para a Chamada à função MATA010 sem a necessidade de Login no sistema. #INCLUDE "PROTHEUS.CH" #INCLUDE "TBICONN.CH" /*/ Funcao: MATA010Ex Data: 30/04/2011 Autor: Marinaldo de Jesus Descricao: Executar a Funcao MATA010 diretamente sem a necessidade de LOGIN no Protheus Sintaxe: 1 ) U_MATA010Ex ( Chamada diretamente na Tela de Entrada do Sistema ) ; ou 2 ) totvsclient.exe -q -p=u_MATA010Ex -a=01;01 -c=rnp_local -e=rnp -m -l ( Chamada Via Linha de Comando ) /*/ User Function MATA010Ex( cEmpFil ) Local aEmpFil Local bWindowInit := { || __Execute( "MATA010()" , "xxxxxxxxxxxxxxxxxxxx" , "MATA010" , "SIGAFAT" , "SIGAFAT", 1 , .T. ) } Local cEmp Local cFil Local cMod Local cModName := "SIGAFAT" DEFA