Visualizando dados do Protheus no Word (97 a 2010)


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: RCOM152exemplodocumentogerado RCOM152modelooriginal 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"]

RCOM152telainicialexemplo RCOM152parametrosexemplo RCOM152escolhaapasta RCOM152escolhaoarquivo