Uma funcionalidade interessante do Protheus é utilizar o Word para geração de documentos como contratos, orçamentos de compra e venda, entre outros. No exemplo, irei gerar um Pedido de Compras para ser utilizado no Word (Este fonte foi readaptado com base de outros fontes) O diferencial é que a inserção dos itens no documento será dinâmico, ou seja, as linhas serão geradas conforme a quantidade de itens existentes no Pedido de Compras. E para que isso possa acontecer, criei uma macro para o arquivo modelo word (DOTM) que permita fazer com que as variaveis usadas no documento modelo seja criada conforme a quantidade de itens no pedido. Outra coisa que fiz foi disponibilizar o documento em arquivo e impressão. Caso define a impressora com o PDF Creator por exemplo como padrão, a impressão será gerada em formato PDF, caso contrário irá direto para a impressora padrão. O precesso é bem simples, é usado o componente OLE. Esta rotina foi testada em Office 97,200,2003,2007 e 2010. Como não tenho o Office 2013 ainda não pude testar, mas se você testar e conseguir, escreva e compartilhe sua experiência. Exemplo de como devemos criar o modelo no Word: Notem que há uma tabela para a inserção do itens, mas só possue o cabeçalho, isso porque esta tabela será gerada no momento em que rodar a rotina que gerará o documento. No fonte advpl, irei chamar a macro, veja abaixo como ficaria considerando que tenho 5 itens no meu pedido: [gallery columns="4" link="file" ids="4048,4049"] Continua na página 2... Veja como é a macro:
[sdm-download id="2169" fancy="1" new_window="1" show_size="1" button_text="Clique aqui para copiar a Macro"]
[sdm-download id="2174" fancy="1" new_window="1" show_size="1" button_text="Clique aqui para copiar o Modelo Word"]
Agora irei postar parte do meu fonte, contendo as informações principais para executar.#INCLUDE "PROTHEUS.CH" #INCLUDE "MSOLE.CH" User Function RCOM152() /*declaracao das variaveis e códificação*/ // 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 /*continuação do fonte*/ OLE_SetDocumentVar(hWord, 'TOTAL_DE_ITENS', Str(nTotItens)) OLE_ExecuteMacro(hWord,"InserirLinhas") /*continuação do fonte*/ For I := 1 to nTotItens OLE_SetDocumentVar(hWord, "cItem"+Alltrim(Str(i)) , Alltrim(_aItem[i]) ) OLE_SetDocumentVar(hWord, "cProduto"+Alltrim(Str(i)) , Alltrim(_aCodPro[i]) ) OLE_SetDocumentVar(hWord, "cDesc"+Alltrim(Str(i)) , Alltrim(_aDesc[i])) OLE_SetDocumentVar(hWord, "cUM"+Alltrim(Str(i)) , Alltrim(_aUnd [i])) OLE_SetDocumentVar(hWord, "cQtde"+Alltrim(Str(i)) , transform(_aQtd[i],"@E 9999,999.99")) OLE_SetDocumentVar(hWord, "cUnitario"+Alltrim(Str(i)) , transform(_aPreco[i],"@E 9999,999.999")) OLE_SetDocumentVar(hWord, "cTotal"+Alltrim(Str(i)) , transform(Round(_aQtd[i]*_aPreco[i],2),"@E 9999,999.999")) OLE_SetDocumentVar(hWord, "cData"+Alltrim(Str(i)) , _aEntr[i]) Next //--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 documento PC" + _cNum + ".DOC ou clique no botao para fechar.", {"Fechar"}) OLE_SaveAsFile(hWord,cPath+"PC" + _cNum + ".DOC") Endif /*continuação do fonte*/ EndMsOle() OLE_CloseLink( hWord )//fecha o Link com o Word /*continuação do fonte*/ Return
[sdm-download id="2173" fancy="2" new_window="1" show_size="1" button_text="Copiar código fonte completo"]