Criando um contrato em MS Word e integrando com o Protheus


Conforme já foi exemplificado no artigo https://www.blogadvpl.com/visualizando-dados-do-protheus-no-word-97-a-2010/, irei agora mostrar um exemplo dentro de um contrato (sem uso de macros).

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. Clique em ArquivoOpções > Avançado.
  1. Em Exibir conteúdo do documento, marque Mostrar códigos de campo e... e clique em OK.

opcoes avançadas word

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

Obrigatório

hOleLink

Numérico

Handle da conexão entre o SmartClient e a aplicação MS-Office.

 

X

cVariable

Array of Record

Nome da DocVariable presente no arquivo modelo (.dot.)

 

X

cValue

Array of Record

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

 

X

 

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

[sdm_download id="3018" fancy="1" new_window="1" button_text="Copiar agora!"]

 Bem simples, não?