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

BalckTDN :: Customizando a Interface da DANFE e NFeSefaz

 

NFeDANFE e NFeSefaz, dois “desprazeres” que faria questão de não conhecer. Mas, infelizmente, um mal necessário.

Ajusta “Layout” aqui, um “pixel” para direita, outro para esquerda. As vezes a “fonte” que não agrada ou uma regra específica, não tratada no sistema padrão, que deve ser customizada e tudo “de acordo” com a legislação.

Um parto sem sim. Um Filho que nasce várias vezes. Um verdadeiro “Frankenstein” (desses que não tem um pai só).

Recentemente a TOTVS lançou uma nova versão do trio: DANFEII, DANFEIII e NFESEFAZ e, vamos lá fazer a comparação e os devidos ajustes e “compatibilização”. Afinal, o “Pai da Criança” nos forneceu um novo “template” e temos que seguir as especificações. E como ficam as nossas alterações?

BlackTDN, usando “diretivas do Pre-Processador” vai sugerir uma ideia de como customizar o “famigerado Trio” de forma a manter a compatibilidade com as alterações legais ou “bugais” fornecidas pela TOTVS de forma a manter as suas versões compatíveis e personalizadas.

Nos exemplos que se seguem duas diretivas foram definidas: TOTVS_DANFE e CUSTOM_DANFE. Elas servirão para separar e “unificar” ambas as versões: A PADRÃO e a CUSTOMIZADA.

Com elas será possível ter uma versão “IGUALZINHA” a da TOTVS e com todas as modificações advindas das particularidades de seus “clientes.

Aos exemplos:

Considerando o DANFEII. Primeiro declaramos as diretivas que serão utilizadas no corpo do programa para diferenciar a versão TOTVS e a versão CUSTOM. Na realidade a única e real Diretiva é a CUSTOM_DANFE uma vez que a TOTVS_DANFE será usada única e somente para a comparação (A não ser que queira validar a versão TOTVS):

image

A partir da declaração, tudo o que for modificado no arquivo deverá estrar entre:

#IFDEF TOTVS_DANFE

//…. para o código padrão

#ELSE //CUSTOM_DANFE

//… para o código modificado

#ENDIF

ou

#IFDEF CUSTOM_DANFE

//… para o código que só existirá na versão customizada.

#ENDIF

Fazendo isso poderemos usar uma ferramenta de comparação de arquivos fontes (winmerge, ap7diff, etc.) para comparar e ajustar apenas o necessário mantendo o nosso código 100% compatível com a versão disponibilizada pelo fornecedor, no caso a TOTVS, e 100% customizável e de fácil gerenciamento e manutenção.

Exemplo 1 Customização DANFE TOTVS

Exemplo 2 Customização DANFE TOTVS

Exemplo 3 Customização DANFE TOTVS

etc…

Dessa forma, manteremos no mesmo arquivo fonte a versão “ORIGINAL” e a versão customizada de forma a:

1) Poder comparar e “compatibilizar” com novas versões;

2) Saber EXATAMENTE o que foi “customizado”.

Um exemplo do código “padrão” versus “customizado” poderá ser obtido ao clicar em: TOTVS exemplo customização DANFE e NFeSefaz. (utilize a ferramenta de comparação de código fonte de sua preferência para comparar os códigos de exemplo para um melhor entendimento da técnica utilizada).

Vale lembrar que o código disponibilizado para “download” tem a finalidade apenas didática e para demonstrar a “técnica” de customização e a “boa” prática. O código “OFICIAL” deverá ser “baixado” a partir do portal da fornecedora da solução.

[]s
иαldσ dj

Comentários

  1. Naldo, na realidade essa técnica é interessante não apenas para DANFE e NFeSped mas para qualquer programa fonte fornecido pela TOTVS que possa ser modificado pelo usuário. Basta apenas definir a Diretiva para o Pré-Processador e Pronto.

    Boa Sacada.

    ResponderExcluir
    Respostas
    1. Interessante mesmo. Usei essa técnica para customizar o Recibo de Pagamento da Folha. Levando em consideração que ele tem bastantes alterações por porte do pessoal do RH, fiz o seguinte:

      #IFNDEF TOTVS_RECIBO
      #DEFINE CUSTOM_RECIBO
      #ENDIF

      e o que é padrão fica entre a diretiva TOTVS_RECIBO, caso contrário, CUSTOM_RECIBO...

      Naldo, de fato uma bela sacada. Simples mas eficiente.

      tks por #compartilhar#.

      Excluir
  2. Na verdade perdi meu código fonte do DANFE e queria saber se este aqui está bom e bonitinho. E como colocar padrão CUSTOM ?? ao invés do da totvs

    ResponderExcluir
  3. Primeiramente, obrigado pelo belo post! Uma dúvida para usar essas diretivas, eu preciso fazer alguma configuração no meu ide?

    Obrigado!

    ResponderExcluir

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