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!
;)