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 :: Harbour/ADVPL :: Send/GetData uma alternativa a apconnxcontrol.ocx

Vimos, em Protheus :: apconnxcontrol.ocx with Harbour e Protheus :: apconnxcontrol.ocx, PowerShell e SendMessage para envio de Mensagem a Usuário Específico, que é possível a comunicação e transferência de dados usando apconnxcontrol.ocx. Um exemplo mais completo poderá ser obtido em “integração do Protheus com C# (Luis Gustavo Pessoa Lacombe)”.

O problema com apconnxcontrol.ocx é sua instalação. Temos que garantir que estaremos utilizando, sempre, a última versão do aplicativo.

Uma alternativa, na comunicação de dados entre aplicações externas e o protheus, poderá ser a técnica desenvolvida por Roberto Lopez (criador da Harbour MiniGui e mantenedor do fórum HMG Fórum para divulgação de suas idéias) para comunicação entre aplicações da HMG.hmg A idéia básica é que cada aplicação possua um Nome (StationName) e um local para Gravação/Compartilhamento dos Dados (CommPath). Os dados são gravados em arquivos Nomeados de acordo com o Destino.Origem e são enviados e recuperados, respectivamente, através das funções SendData e GetData (funções essas muito simples de implementar em qualquer linguagem). Uma idéia bem simples, de fácil implementação e que resolve muitos problemas de comunicação de dados e que não necessita de nenhum aplicativo adicional. Além disso é extensível (poderá ter os recursos ampliados de acordo com a necessidade e, se padronizado, servir como base de comunicação com qualquer aplicação).

As funções originais SendData e GetData foram adaptadas para o Protheus e, com isso, além de servirem para comunicação de dados entre aplicações da HMG poderão ser utilizadas para comunicação entre aplicações do Protheus e aplicações externas; como o próprio Harbour.

Veremos, agora, um exemplo de SendData e GetData usando uma aplicação em Harbour e, posteriormente, o mesmo exemplo usando o Protheus como Receptor/Transmissor dos Dados. Nele termos:

  1. Como aplicação receptora:  'John_Station' e;
  2. Como aplicação transmissora: 'Roberto_Station'

Os nomes dos exemplos originais do HMG foram mantidos.

O código, para o envio dos dados, baseado no HMG:

/*
* MINIGUI - Harbour Win32 GUI library Demo
*
* Copyright 2002 Roberto Lopez <harbourminigui@gmail.com>
* http://harbourminigui.googlepages.com/
*/

#include "minigui.ch"

Function Main

    Set StationName To 'Roberto_Station'
    Set CommPath    To 'D:\totvs\p10\ndj\pdata\comm\'

    DEFINE WINDOW Form_0 ;
        AT 0,0 ;
        WIDTH 640 HEIGHT 480 ;
        TITLE 'MiniGUI Communications Demo' ;
        ICON 'DEMO.ICO' ;
        MAIN ;
        FONT 'Arial' SIZE 10

        DEFINE MAIN MENU
            POPUP 'File'
                ITEM 'SendData'    ACTION SendTest()
                ITEM 'Exit'        ACTION Form_0.Release
            END POPUP
            POPUP 'Help'
                ITEM 'About'        ACTION MsgInfo ("MiniGUI Communications Demo")
            END POPUP
        END MENU

    END WINDOW

    CENTER WINDOW Form_0

    ACTIVATE WINDOW Form_0

Return Nil

Procedure SendTest
Local aData := {} , aMultiData := {}

    aAdd ( aData , 'Juan'      )
    aAdd ( aData , 'Carlos'  )
    aAdd ( aData , 'Roberto' )

    aAdd ( aMultiData , {'John','Smith','555-5555'} )
    aAdd ( aMultiData , {'Peter','Gomez','543-8372'} )
    aAdd ( aMultiData , {'Albert','Anderson','854-8273'} )

    SendData ( 'John_Station' , 100 )

    SendData ( 'John_Station' , Date() )

    SendData ( 'John_Station' , Time() )

    SendData ( 'John_Station' , .t. )

    SendData ( 'John_Station' , aData )

    SendData ( 'John_Station' , aMultiData )

Return

e, para a recepção:

/*
* MINIGUI - Harbour Win32 GUI library Demo
*
* Copyright 2002 Roberto Lopez <harbourminigui@gmail.com>
* http://harbourminigui.googlepages.com/
*/

#include "minigui.ch"

Function Main

    Set StationName To 'John_Station'
    Set CommPath    To 'D:\totvs\p10\ndj\pdata\comm\'

    DEFINE WINDOW Form_0 ;
        AT 0,0 ;
        WIDTH 640 HEIGHT 480 ;
        TITLE 'MiniGUI Communications Demo' ;
        ICON 'DEMO.ICO' ;
        MAIN ;
        FONT 'Arial' SIZE 10

        DEFINE MAIN MENU
            POPUP 'File'
                ITEM 'GetData'     ACTION GetTest()
                ITEM 'Exit'        ACTION Form_0.Release
            END POPUP
            POPUP 'Help'
                ITEM 'About'       ACTION MsgInfo ("MiniGUI Communications Demo")
            END POPUP
        END MENU

    END WINDOW

    CENTER WINDOW Form_0

    ACTIVATE WINDOW Form_0

Return Nil

Procedure GetTest()
Local r , i

    Repeat

        r := GetData()

        If Valtype (r) == 'A'

            If Valtype ( r [1] ) != 'A'

                Aeval ( r, { |i| MsgInfo( i ) } )

            Else

                For Each i In r

                    Aeval ( i, { |j| MsgInfo( j ) } )

                Next

            EndIf

        ElseIf r # Nil

            MsgInfo( r )

        EndIf

    Until r # Nil

Return

(Olha que interessante: Harbour suporta Repeat/Until)

Executando os exemplos do HMG teremos:

image

image

Os dados serão gravados em: D:\totvs\p10\ndj\pdata\comm conforme definição

image

e agora; usando GetDada:

image

image

image image image image image image

A cada dado obtido o arquivo que o originou é excluído até que todos os dados tenham sido recuperados e todos os arquivos excluídos.

image

Agora, o mesmo exemplo no Protheus:

Vou usar o Programa SendData em Harbour para Enviar os Dados e U_HBDataEx para recuperá-los a partir do Protheus.

image

image

image

image

e mostrar a saída no Browser:

image

O código do Exemplo de GetData, no Protheus, poderá ser obtido em: Source path: svn/trunk/harbour/samples/MiniGUI/comm/U_HBDataEx.prg ou através do svn/update em sua cópia local. O exemplo depende de: NDJLIB023.prg e NDJ.CH

No Exemplo abaixo, o Protheus Envia e Recebe os Dados. A opção de “Reenviar” é para o teste com captura pelo Harbour dos dados gerados pelo Protheus.

#INCLUDE "NDJ.CH"

#DEFINE HBDataExCommPath    "D:\totvs\p10\ndj\pdata\comm"

/*/
    Procedure:  HBDataEx
    Autor:      Marinaldo de Jesus
    Data:       22/02/2012
    Descricao:  Exemplo de Uso de GetData e SendData
    Sintaxe:    U_HBDataEx
/*/
USER PROCEDURE HBDataEx()
    MsgRun( "Aguarde...." , "Enviando Dados" , { || HBSDataEx() } )
    MsgRun( "Aguarde...." , "Obtendo Dados"  , { || HBGDataEx() } )
    IF MsgNoYes( "Reenviar os Dados" )
        MsgRun( "Aguarde...." , "Enviando Dados" , { || HBSDataEx() } )
    EndIF   
Return

/*/
    Procedure:  HBGDataEx
    Autor:      Marinaldo de Jesus
    Data:       22/02/2012
    Descricao:  Exemplo de Uso da GetData
    Sintaxe:    HBGDataEx
/*/
Static Procedure HBGDataEx()

    Local aData
    Local oData

    Set StationName To "John_Station"
    Set CommPath    To HBDataExCommPath

    aData    := StaticCall( NDJLIB023 , GetAllData )
    oData    := U_TVarInfoNew( aData , "HbGetData" )
    oData:Save(.T.,.F.)
    oData:Show()
    Sleep( 3000 ) //Wait 3 seconds to erase files

    oData:Close( .T. , .T. )

    oData := NIL

Return

/*/
    Procedure:  HBSDataEx
    Autor:      Marinaldo de Jesus
    Data:       22/02/2012
    Descricao:  Exemplo de Uso da SendData
    Sintaxe:    HBSDataEx
/*/
Static Procedure HBSDataEx()

    Local aData
    Local aMultData
    Local cDest    := "John_Station"

    Local nI
    Local nF        := 20
    Local nB
    Local nT

    Set StationName To "Robert_Station"
    Set CommPath    To HBDataExCommPath

    StaticCall( NDJLIB023 , SendData , cDest , "Olá" )
    StaticCall( NDJLIB023 , SendData , cDest , 123456.789 )
    StaticCall( NDJLIB023 , SendData , cDest , .T. )
    StaticCall( NDJLIB023 , SendData , cDest , .F. )
    StaticCall( NDJLIB023 , SendData , cDest , Date() )
    StaticCall( NDJLIB023 , SendData , cDest , Dtos(Date()) )

    aData    := {;
                     { "Naldo"     , Date() , .T. , 1500.00                        },;
                     { "OverFail"  , Date() - 100 , .F.            , 1500.00 * 4   },;
                     { "RLeg"      , Date() + 100 , .F. .or. .T.  , 1500.00 / 2   },;
                     { "OBona"     , Date() - 100 , .T. .and. .F. , 1500.00 * 100 },;
                     { "LF Altran" , Date() + 100 , .T. .and. .F. , 1500.00 * 2   },;
                     { "C Regazzo" , Date() - 100 , .T. .and. .F. , 1500.00 / 4   };
                }

    StaticCall( NDJLIB023 , SendData , cDest , aClone( aData ) )
    aMultData    := Array(0)
    nT           := Len( aData )

    For nI := 1 To nF
        For nB := 1 To nT
            aData[nB][1] := Embaralha( aData[nB][1] , 0 )
            aData[nB][2] := aData[nB][2] + nI
            aData[nB][3] := !( aData[nB][3] )
            aData[nB][4] += ( nB * nI )
            aAdd( aMultData , aClone( aData[nB] ) )
        Next nB   
    Next nI

    StaticCall( NDJLIB023 , SendData , cDest , aMultData )
    aSize( aMultData , 0 )
    aMultData := NIL

Return

Static Function __Dummy( lRecursa )
    Local oException
    TRYEXCEPTION
        lRecursa := .F.
        IF !( lRecursa )
            BREAK
        EndIF
        lRecursa    := __Dummy( .F. )
        SYMBOL_UNUSED( __cCRLF )
    CATCHEXCEPTION USING oException
    ENDEXCEPTION
Return( lRecursa )

image

image

[]s

иαldσ dj

Comentários

  1. Bom artigo. Legal ver que existem várias possibilidades de integração do Protheus com outras linguagens. Parabéns.

    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" // ---------------

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

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ã