Fala galera!
Continuando o post sobre integração Advpl x Word, hoje vamos detalhar sobre a codificação da rotina. Vamos criar um novo programa no Developer Studio e nomeá-lo. Darei o nome de AdvplDoc.prw, mas você pode definir o nome que preferir.
Primeiramente vamos dar uma olhada no código fonte e posteriormente passaremos ponto a ponto com uma breve explicação.
#include "protheus.ch" #include "rwmake.ch" #include "tbiconn.ch" #include "msole.ch" /** _________________________________________________________________________________ ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦ ¦¦+---------------------------------------------------------------------------+¦¦ ¦¦¦Programa ¦ ADVPLDOC ¦ Autor ¦ Renan Ramos ¦ Data ¦ 19.05.16 ¦¦¦ ¦¦¦----------+----------------------------------------------------------------¦¦¦ ¦¦¦Descriçäo ¦ Realiza integração do Protheus com documentos Word. ¦¦¦ ¦¦+---------------------------------------------------------------------------+¦¦ ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦ ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ */ user function advplDoc local hWord local cTitulo1 := "Arquivo Word" local cExtensao := "Modelo Word | *.dot | *.dotx" local cFileOpen := "" PREPARE ENVIRONMENT EMPRESA "99" FILIAL "01" cFileOpen := cGetFile(cExtensao, cTitulo1,,,.T.) hWord := OLE_CreateLink() OLE_SetProperty(hWord, oleWdVisible, .T.) OLE_SetProperty(hWord, oleWdPrintBack, .F.) OLE_NewFile(hWord, cFileOpen) dbSelectArea("SA1") dbSetOrder(1) dbGoTop() OLE_SetDocumentVar(hWord, "A1_COD" ,SA1->A1_COD) OLE_SetDocumentVar(hWord, "A1_NOME" ,SA1->A1_NOME) OLE_SetDocumentVar(hWord, "A1_END" ,SA1->A1_END) OLE_SetDocumentVar(hWord, "A1_BAIRRO",SA1->A1_BAIRRO) OLE_SetDocumentVar(hWord, "A1_MUN" ,SA1->A1_MUN) OLE_SetDocumentVar(hWord, "A1_EST" ,SA1->A1_EST) OLE_UpdateFields(hWord) OLE_saveFile(hWord) OLE_PrintFile(hWord,"ALL",,,1) cFileSave := subStr(cFileOpen,1,At(".",trim(cFileOpen))-1) OLE_saveAsField(hWord, cFileSave+".doc") OLE_closeLink(hWord) return
Como podem perceber, é um fonte pequeno sem muitas linhas. Um ponto fundamental para conseguir realizar a comunicação é lembrar de incluir a biblioteca msole.ch, pois esta biblioteca permite que você possa utilizar as funções para efetuar a comunicação com o Word.
A biblioteca tbiconn.ch permite que você utilize o comando PREPARE ENVIRONMET EMPRESA, isto é muito útil, pois permite que você faça o teste da rotina sem ter a necessidade de acessar o Protheus e fazer todo o processo desde o login até a execução do programa. Para utilizá-lo, basta adicionar a empresa (no meu caso 99, pois é base teste) e a filial. Seu objetivo é inicializar o ambiente no qual será testada a rotina.
A método OLE_CreateLink() faz a conexão entre o Protheus e o MS-Office. Para verificar se a conexão foi realizada com sucesso, é indicado utilizar uma variável do tipo numérico (handle) para que receba o retorno desta função. Se o retorno da função for 0, a conexão ocorreu com sucesso, mas caso seja -1, houve problema na conexão.
Assim que a conexão estiver estabelecida, utilizaremos o método OLE_NewFile(nHandle, cPath) que possui dois parâmetros:
- nHandle: é o valor retornado da método OLE_CreateLink();
- cPath: é o diretório onde se encontra o arquivo que receberá os valores do Protheus.
Na parte seguinte do código, temos a conexão com banco (SA1), onde ordenamos e posicionamos nos registros satisfatórios.
Como em minha base tenho somente um cliente registrado, não foi necessário fazer um filtro e posicionar em um registro específico. Então, após posicionar ou filtrar no registro relacionado ao cliente desejado, vamos setar as variáveis com os valores correspondentes aos campos da tabela.
A método OLE_SetDocumentVar() define o conteúdo que será passado à variável que inserimos no documento no post anterior. Lembre-se que o nome da variável nesta função deve ser a mesma que foi inserida no documento Word, mas não necessariamente na mesma sequência.
Na sequencia temos três importantes métodos que são descritos a seguir:
- OLE_UpdateFields: atualiza todas as variáveis do documento word criado;
- OLE_saveFile: salva o documento atualizado;
- OLE_PrintFile: executa a impressão do arquivo word. O parâmetro definido como "ALL" define que seja impresso todo documento.
Ao final do fonte, é chamado o método OLE_CloseLink() que é responsável por encerrar a conexão entre Protheus e Word.
Bom galera, espero que este post ajude vocês a desenvolverem uma rotina que facilite a vida do usuário. Acessem nosso GitHub, todos os códigos - inclusive o desse post - estão disponíveis para consultas e uso.
Até mais!
;)
Nenhum comentário:
Postar um comentário