Você está na página 1de 14

Crie seu arquivo no MS Word e salve-o com a extensão DOT ou DOTX (formato de

modelos do MS Word).
Depois de criado o documento vá nas posições desejadas e inclua as variáveis.
Para mostrar os códigos dos campos no documento, siga estas etapas.
1.
1. Clique em Arquivo> Opções > Avançado.
1. Em Exibir conteúdo do documento, marque Mostrar códigos de campo
e… e clique em OK.

Feito isso ao voltar para o documento a variável ficará


destacada { DOCVARIABLE suavariavel \* MERGERFORMAT }

Mas só deixe assim quando quiser modificar o documento, caso contrário você não
verá o conteúdo final.
Agora criei seu fonte e defina o conteúdo para as variáveis usando a
função OLE_SetDocumentVar.
Exemplo:
OLE_SetDocumentVar(hWord,”cContrato“,cContrato)
OLE_SetDocumentVar(hWord,”cNome” ,cNome)
OLE_SetDocumentVar(hWord,”cEmpresa” ,cEmpresa )
OLE_SetDocumentVar(hWord,”cDia“,cDia)
OLE_SetDocumentVar(hWord,”cCidade“,cCidade)

Nome Tipo Descrição Default

hOleLink Numérico Handle da conexão entre o SmartClient e a aplicação MS-Office.

cVariable Array of Record Nome da DocVariable presente no arquivo modelo (.dot.)

cValue Array of Record Conteúdo a ser atribuido na DocVariable descrita no parametro 2 desta
função.

Depois que executar a rotina no Protheus o documento ficará assim:

Agora o código fonte, mas só com alguns campos para exemplificar:


#INCLUDE "PROTHEUS.CH"
#INCLUDE "MSOLE.CH"
#INCLUDE "TOTVS.CH"
user function fModWord()
// ------------------------------------------------------------------------//
// Area de declaração de variaveis //
//-------------------------------------------------------------------------//
Local cCadastro := OemtoAnsi("Integração com MS-Word")
Local aMensagem :={}
Local aBotoes :={}
Local nOpca := 0
Local nPos := 0
Private cPerg :=Padr("FMODWORD",10)
//-------------------------------------------------------------------
// Cria/Verifica as perguntas selecionadas
//-------------------------------------------------------------------
Pergunte(cPerg,.F.)
AjustaSX1()
AADD(aMensagem,OemToAnsi("Esta rotina irá imprimir um contrato, clique no botão PARAM para informar
o PC a") )
AADD(aMensagem,OemToAnsi("ser impressa e os demais parametros.") )
AADD(aBotoes, { 5,.T.,{|| Pergunte(cPerg,.T. )}})
AADD(aBotoes, { 6,.T.,{|o| nOpca := 1,FechaBatch()}})
AADD(aBotoes, { 2,.T.,{|o| FechaBatch() }} )
FormBatch( cCadastro, aMensagem, aBotoes )
/*
+------------------------------------------------------------------
| Variaveis utilizadas para parametros
+------------------------------------------------------------------
| Variaveis utilizadas para parametros
| mv_par01 // Arquivo Modelo
| mv_par02 // Pasta de destino do documento
| mv_par03 // Método de saida 1 = Impressora 2 = apenas Arquivo
+-------------------------------------------------------------------
*/
If nOpca == 1
PRIVATE hWord := OLE_CreateLink()
PRIVATE cArquivo := Alltrim(mv_par01)
PRIVATE cPath := AllTrim(mv_par02)
PRIVATE nImpress := mv_par03
nPos := Rat("\",cPath)
If nPos <= 0
cPath := cPath + "\"
EndIF
if(!File(cArquivo))
Alert("Arquivo modelo não existe!")
return
Endif
IF Upper( Subst( AllTrim( cArquivo ), - 3 ) ) != Upper( AllTrim( "DOT" ) ) .AND.;
Upper( Subst( AllTrim( cArquivo ), - 4 ) ) != Upper( AllTrim( "DOTM" ) ) .AND.;
Upper( Subst( AllTrim( cArquivo ), - 4 ) ) != Upper( AllTrim( "DOTX" ) )
MsgAlert( "Arquivo Invalido!"+CRLF+"Extensões permitidas: DOT ou DOTM ou DOTX" )
Return
EndIf
If (hWord < "0")
Alert("MS-WORD nao encontrado nessa maquina!!!")
Return
Endif
Processa({|| Imprimir() },"Aguarde...")
EndIf
Return
Static Function Imprimir()
// ------------------------------------------------------------------------//
// Area de declaração de variaveis //
//-------------------------------------------------------------------------//
Local cNome := "João das Coves"
Local cEmpresa := "AC/DC Industrias Ltda"
Local cDia := "10"
Local cCidade := "São Paulo"
Local cAdm := "Pedro AC"
Local cNumero := "120"
Local cCPF := "123.456.789-00"
Local nValor := 2530.25
Local cExtenso := Extenso(nValor)
Local cContrato := "000123456"

// ------------------------------------------------------------------------//
// Abre as tabelas para consulta //
//-------------------------------------------------------------------------//
set softseek off
// Inicializa o Ole com o MS-Word
BeginMsOle()
If (hWord >= "0")
IncProc("Processando documento...")
OLE_CloseLink(hWord) //fecha o Link com o Word
hWord := OLE_CreateLink()
OLE_NewFile(hWord,cArquivo)
If nImpress==1
OLE_SetProperty( hWord, oleWdVisible, .F. )
OLE_SetProperty( hWord, oleWdPrintBack, .T. )
Else
OLE_SetProperty( hWord, oleWdVisible, .T. )
OLE_SetProperty( hWord, oleWdPrintBack, .F. )
EndIf
OLE_SaveAsFile(hWord,cPath+"Contrato" + cContrato + ".doc")
//OLE_SaveFile(hWord)
OLE_SetDocumentVar(hWord,"cContrato",cContrato)
OLE_SetDocumentVar(hWord,"cNome" ,cNome)
OLE_SetDocumentVar(hWord,"cEmpresa" ,cEmpresa )
OLE_SetDocumentVar(hWord,"cDia" ,cDia)
OLE_SetDocumentVar(hWord,"cCidade" ,cCidade)
OLE_SetDocumentVar(hWord,"cAdm" ,cAdm)
OLE_SetDocumentVar(hWord,"cNumero" ,cNumero)
OLE_SetDocumentVar(hWord,"cCPF" ,cCPF)
OLE_SetDocumentVar(hWord,"cValor" ,Transform(nValor,"@E 9,999,999.99"))
OLE_SetDocumentVar(hWord,"cExtenso" ,cExtenso)
//--Atualiza Variaveis
OLE_UpDateFields(hWord)
OLE_SaveFile ( hWord )
IF nImpress==1
OLE_SetProperty( hWord, '208', .F. )
OLE_PrintFile( hWord, "ALL",,, 1 )
OLE_CloseLink( hWord )//fecha o Link com o Word
else
Aviso("Atenção", "Alterne para o programa do Ms-Word para visualizar o contrato contrato" +
cContrato + ".doc ou clique no botao para fechar.", {"Fechar"})
OLE_SaveAsFile(hWord,cPath+"Contrato" + cContrato + ".doc")
Endif
Endif

EndMsOle()
OLE_CloseLink( hWord )//fecha o Link com o Word
Return
Static Function AjustaSx1()
PutSx1(cPerg,"01","Arquivo Modelo ","","","mv_ch1","C",99,0,0,"G","","DIR","","","mv_par01")
PutSx1(cPerg,"02","Pasta Destino ","","","mv_ch2","C",99,0,0,"G","","HSSDIR","","","mv_par02")
PutSX1(cPerg,"03","Saída ","","","mv_ch3","N",01,0,0,"C","","","","","mv_par03","Impressora", "", "",
"","Arquivo")
Return

Fonte arquivo modelo

modelocontrato.do
tx
Assunto
Produto ADVPL
:

Versões: P11 e P12

Ocorrên
cia:
Integração Protheus x MS Word
Ambien P11
te:

Passo a Para efetuar a integração entre um documento MS Word e o Protheus


passo: devemos criar um modelo (.dot) no formato desejado e incluir as
devidas variáveis.
Antes, porém será útil configurarmos o Word de forma a visualizarmos
as variáveis incluídas.

1. Em Ferramentas \ Opções selecione a opção


* Para exibição das variáveis, selecionar o campo ‘código de campos’.
Será útil também a seleção do campo ‘indicadores’ para a exibição dos
indicadores no caso de utilização de tabelas dinâmicas, em que serão
necessárias a implantação de macros.

Obs. Ao término do desenvolvimento não esquecer de


demarcar a opção de ‘código de campos’
2. Para a inclusão das variáveis clique em Inserir \ Campo.
• Selecione em ‘categorias’ a opção ‘automação de documento’ e
em ‘nomes de campos’ a opção ‘DocVariable’
• Digite o nome da variável que deverá ser referenciada no
rdmake.
E selecione o botão OK.

Obs.: Repita o passo 2 para todas as partes variáveis do documento.

3. Para a inclusão do indicador.


• Após a inclusão de todas as variáveis no sistema, insira um
indicador na tabela para iniciarmos o tratamento da macro.
Posicione o cursor na ultima coluna da tabela e clique em ‘inserir
\ indicador...’

• Nomeie o indicador, com o mesmo nome da macro que será


criada no documento e acionada na rotina Protheus através da
função OLE_ExecuteMacro(), e clique no botão ‘Adicionar’
• O indicador foi inserido

Obs. Repita a operação 3 para todas as tabelas a serem inseridas


dinamicamente.

4. Para importar uma macro, selecione ‘Ferramentas \ Macro \ Editor do


Visual Basic’ para acionar o editor e a importe através do menu
‘Arquivo \ Importar’, em seguida selecione o arquivo (.bas) e clique no
botão abrir. (conforme demonstrado nas próximas 3 imagens.
5. Após esta a importação da macro, clique no botão salvar, feche o
editor e salve o modelo do documento (.dot)
Obs. Repita as operações 4 e 5 para todas as macros existentes.

Modelo de rotina (.PRW)


#include "rwmake.ch"
User Function intword()
@ 96,012 TO 250,400 DIALOG oDlg TITLE OemToAnsi("Integracao
com MS-Word")
@ 08,005 TO 048,190
@ 18,010 SAY OemToAnsi("Impressao de orcamentos")

@ 56,130 BMPBUTTON TYPE 1 ACTION WordImp()


@ 56,160 BMPBUTTON TYPE 2 ACTION Close(oDlg)

ACTIVATE DIALOG oDlg CENTERED

Return()

Static Function WordImp()


Local wcOrcam, wcData, wcCliente, wcNroLinha
Local waCod := {}
Local waDescr := {}
Local waVTot := {}
Local nAuxTot := 0
Local nK
Local cPathDot :=
"C:\PROTHEUS\AP_PDV\DOT\INTWORD.DOT"
Private hWord

Close(oDlg)

wcNumero := "121212"
wcData := AllTrim(Str(Day(dDataBase),2))+;
' de '+AllTrim(MesExtenso(dDataBase))+' de '+;
AllTrim(Str(Year(dDataBase),4))
wcCliente := "CLIENTE TESTE INTEGRACAO WORD"

for nK := 1 to 10
aAdd(waCod,"PR"+strZero(nK,3))
aAdd(waDescr,"PRODUTO NRO "+strZero(nK,3))
aAdd(waVTot,Transform(nK*100,"@E 999,999,999.99"))
nAuxTot += nK*100
next
//Conecta ao word
hWord := OLE_CreateLink()
OLE_NewFile(hWord, cPathDot )

//Montagem das variaveis do cabecalho


OLE_SetDocumentVar(hWord, 'Prt_numero', wcNumero)
OLE_SetDocumentVar(hWord, 'Prt_Data', wcData)
OLE_SetDocumentVar(hWord, 'Prt_Cliente', wcCliente)
OLE_SetDocumentVar(hWord,
'Prt_nroitens',str(Len(waCod))) //variavel para identificar o numero
total de linhas na parte variavel
//Sera utilizado na macro do documento para execucao do for next

//Montagem das variaveis dos itens. No documento word estas variaveis


serao criadas //dinamicamente da seguinte forma:
//prt_cod1, prt_cod2 ... prt_cod10
for nK := 1 to Len(waCod)
OLE_SetDocumentVar(hWord,"Prt_Cod"+AllTrim(Str(nK)),waCod[nK
])
OLE_SetDocumentVar(hWord,"Prt_Descr"+AllTrim(Str(nK)),waD
escr[nK])
OLE_SetDocumentVar(hWord,"Prt_VTot"+AllTrim(Str(nK)),waV
Tot[nK])
next

OLE_ExecuteMacro(hWord,"tabitens")

OLE_SetDocumentVar(hWord, 'prt_totorc', Transform(nAuxTot,"@E


999,999,999.99"))

OLE_UpdateFields(hWord) // Atualizando as variaveis do documento


do Word
If MsgYesNo("Imprime o Documento ?")
Ole_PrintFile(hWord,"ALL",,,1)
EndIf

If MsgYesNo("Fecha o Word e Corta o Link ?")


OLE_CloseFile( hWord )
OLE_CloseLink( hWord )
Endif
Return()

/////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////
Modelo de macro (.BAS)

Sub tabitens()

' Item Macro


' Macro recorded 31/03/2005 by Adalberto
'
Dim nItens As Integer
Dim Campo As String

Selection.GoTo What:=wdGoToBookmark, Name:="tabitens"


Selection.Find.ClearFormatting
With Selection.Find
.Text = ""
.Replacement.Text = ""
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
End With

nItens = Val(ActiveDocument.Variables.ITEM("prt_nroitens").Value)

For K = 1 To nItens

' Insere uma nova linha na tabela


Selection.MoveRight Unit:=wdCell

' Insere o campo Codigo do Produto


Campo = "DOCVARIABLE prt_cod" & Trim(Str(K))
Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty,
Text:=Campo, PreserveFormatting:=True

' Insere o campo Descricao do Produto


Selection.MoveRight
Campo = "DOCVARIABLE prt_descr" & Trim(Str(K))
Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty,
Text:=Campo, PreserveFormatting:=True

' Insere o campo Total


Selection.MoveRight
Campo = "DOCVARIABLE prt_vtot" & Trim(Str(K))
Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty,
Text:=Campo, PreserveFormatting:=True
Next
End Sub

Você também pode gostar