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

Protheus :: Advpl :: Duelo de Titãs :: Harbour x ADVPL

Vez em quando me pego fuçando o código e as Classes disponíveis no Harbour Project para verificar as novidades, acompanhar a evolução da linguagem e, por que não, aprender com os mestres e, durante esse processo, faço algumas descobertas interessantes. Na pasta ..\examples\hbxlsxml da instalação padrão deparei-me com três classes:

CLASS ExcelWriterXML :: xlsxml.prg
CLASS ExcelWriterXML_Sheet  :: xlsxml_s.prg
CLASS ExcelWriterXML_Style  :: xlsxml_y.prg

Lendo a documentação no código fonte, percebi que essas três Classes foram originalmente escritas em PHP:

/*
* $Id: xlsxml_y.prg 17099 2011-10-28 18:34:39Z vouchcac $
*/
/*
* Harbour Project source code:
*
* Copyright 2011 Fausto Di Creddo Trautwein, ftwein@yahoo.com.br
* www - http://www.xharbour.org http://harbour-project.org
*
* Thanks TO Robert F Greer, PHP original version
* http://sourceforge.net/projects/excelwriterxml/

O grande “Fausto Di Creddo Trautwein” teve o trabalho de transcrever o código original em PHP para o Harbour e иαldσ dj (esse que vos escreve) assumiu o compromisso de torná-las utilizáveis em ADVPL.

Para isso vou usar um “Poderoso” recurso do ADVPL herdado do CA-Clipper e existente, também, no Compilador Harbour e em outras linguagens como C e C++:

O Pré-Processador.

Segundo Rick Spence (Clipper 5.2, pag.: 23) : “O Pré-Processador é um importante recurso (…). Imagine-o como um programa que executa antes do compilador. Ele lê seu programa como entrada e gera um arquivo pré-processado como saída. O arquivo de saída, então, serve como entrada para o compilador; o compilador não tem conhecimento e nem se importa com a ocorrência do pré-processamento.”

Vou usar “Constantes Simbólicas ou manifestas”, “Arquivos Includes”, “Macros do Compilador”, “Compilação Condicional” e “Comandos Definidos pelo usuário” além de funções “customizadas” para compatibilizar o código escrito usando a sintaxe e semântica do Harbour para o padrão e limitações (no que diz respeito a evolução natural da linguagem) do ADVPL.

Harbour possui muitos recursos interessantes, disponíveis nas maiorias das linguagens modernas de Alto Nível, mas, infelizmente, ainda não disponíveis em ADVPL, a saber: Hash de Array, sintaxe OOP nativa dentre outras.

A idéia e alterar minimamente o código Harbour de forma que ele possa ser compilado e executado em ambas  plataformas.

O Desafio está lançado. Agora vamos ver o que essas classes fazem e acompanhar o processo de “Compatibilização”.

Os programas que serão compatibilizados são:

image

e os existentes no diretório \tests:

image

Compilando as classes no Harbour:

image

… “hbmk2: Criando biblioteca estáticas... libhbxlsxml.a”

image

agora vamos compilar os programas de teste e ver a saída:

Compilado e executando o exemplo.prg

image

que irá gerar o arquivo example.exe

image

que ao ser executado:

image

irá gerar, como saída, o arquivo example.xml

image

que, aberto pelo Excel, nos dará o seguinte resultado:

image

Para o exemplo1.prg:

image

Analisando o arquivo example.xml teremos:

image

Compilando e executando os demais exemplos teremos:

para o example2.prg

image

e, para o example3.prg

image

Analisando os resultados podemos concluir que as classes

CLASS ExcelWriterXML :: xlsxml.prg
CLASS ExcelWriterXML_Sheet  :: xlsxml_s.prg
CLASS ExcelWriterXML_Style  :: xlsxml_y.prg

servem para gerar arquivos no padrão XML compatíveis com o Microsoft Excel.

Agora, vamos ao trabalho de “Compatibilização”.

Pontos de Atenção:

image

Analisando um fragmento da declaração da classe em Harbour identificamos as seguintes incompatibilidades:

  1. O arquivo de cabeçalho “hbclass.ch”;
  2. CREATE na declaração da Classe;
  3. INIT para inicializar as variáveis;
  4. O operador de Hash {=>} e;

image

Declaração dos Métodos da Classe. Uma forma interessante do Harbour resolver “Nomes Longos” na Classe é Prefixando a Classe ao Método. Teremos que resolver isso no Protheus também. Apesar de podermos criar, no Protheus, Classes com Nomes Longos, Herdando-as da LongClassName, o compilador ADVPL ainda considera o limite de 10 Caracteres para a comparação de Nomes.

image

FOR EACH não implementado em ADVPL

image

Funções exclusivas da Linguagem Harbour

image

image

image

Hash não implementado em Advpl.

image

Sintaxe OOP não implementada em ADVPL.

Ufa.. Bastantes compatibilizações a fazer. Melhor seria reescrever as Classes e os Exemplos usando apenas os Recursos do ADVPL (e cadê a graça). A idéia é manter a compatibilidade. O mesmo código deverá, com poucas alterações, compilar e executar tanto no Harbour quanto no Protheus; além do mais os “Recursos do Pré-Processador” fazem parte da linguagem ADVPL.

… Continua no Próximo “POST”

[]s

иαldσ dj

Comentários

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