Integração com o Word através das funções OLE_* – Maratona AdvPL e TL++ 374

Nesse vídeo demonstraremos a utilização das funções OLE_* (OLE_CreateLink, OLE_SetDocumentVar, OLE_UpdateFields, etc), que servem para criar uma integração com um arquivo do Word.

Abaixo o código fonte desenvolvido para o exemplo em vídeo acima:

//Bibliotecas
#Include "TOTVS.ch"

/*/{Protheus.doc} User Function zExe374
Realiza a integração com o Microsoft Word, populando um arquivo de modelo dot
@type Function
@author Atilio
@since 28/03/2023
@see https://tdn.totvs.com/display/public/framework/OLE_CreateLink e https://tdn.totvs.com/display/public/framework/OLE_NewFile e https://tdn.totvs.com/pages/releaseview.action?pageId=603118924
@obs 

    Função OLE_CreateLink
    Parâmetros
        + cOLETypeLink   , Caractere    , String que representa a conexão com Word
        + cOnError       , Caractere    , Compatibilidade
        + lCabec         , Lógico       , Permite habilitar a edição de campos também no cabeçalho e rodapé do modelo do Word
    Retorno
        + hOleLink       , Numérico     , Handle criado

    Função OLE_NewFile
    Parâmetros
        + hOleLink       , Numérico     , Handle criado através da OLE_CreateLink
        + cDocTemplate   , Caractere    , Caminho com o modelo do documento do Word
    Retorno
        Função não tem retorno

    Função OLE_SetDocumentVar
    Parâmetros
        + hOleLink       , Numérico     , Handle criado através da OLE_CreateLink
        + cVariable      , Caractere    , Nome da variável dentro do modelo do Word
        + cValue         , Caractere    , Valor a ser atribuído
    Retorno
        Função não tem retorno

    Função OLE_UpdateFields
    Parâmetros
        + hOleLink       , Numérico     , Handle criado através da OLE_CreateLink
    Retorno
        Função não tem retorno
    
    Função OLE_SaveAsFile
    Parâmetros
        + hOleLink       , Numérico     , Handle criado através da OLE_CreateLink
        + cFileName      , Caractere    , Nome do arquivo que será salvo
        + cPassword      , Caractere    , Senha do arquivo do Word (caso haja)
        + cWritePassword , Caractere    , Senha que será definida na escrita do Word
        + lReadOnly      , Lógico       , Atributo se o arquivo será somente leitura
    Retorno
        Função não tem retorno

    **** Apoie nosso projeto, se inscreva em https://www.youtube.com/TerminalDeInformacao ****
/*/

User Function zExe374()
    Local aArea     := FWGetArea()
    Local aPergs    := {}
	Local cProduto  := Space(TamSX3('B1_COD')[1])
    
    //Adicionando os parametros do ParamBox
    aAdd(aPergs, {1, "Produto",  cProduto,  "", ".T.", "SB1", ".T.", 80,  .F.}) // MV_PAR01
    
    //Se a pergunta for confirma, cria as definicoes do relatorio
    If ParamBox(aPergs, "Informe os parâmetros", , , , , , , , , .F., .F.)
        Processa({|| fMontaRel()}, "Processando...")
    EndIf
     
    FWRestArea(aArea)
Return

Static Function fMontaRel()
    Local nHandWord  := 0
    Local cPastaTmp  := GetTempPath()
    Local cArqOrigi  := "\x_dots\produto.dotx"
    Local cArqLocal  := cPastaTmp + "produtos.dotx"
    Local cArqPDF    := cPastaTmp + "produtos.pdf"

    DbSelectArea("SB1")
    SB1->(DbSetOrder(1)) // Filial + Produto
    If SB1->(MsSeek(FWxFilial("SB1") + MV_PAR01))

        //Copia o dot do servidor para a máquina local
        __CopyFile(cArqOrigi, cArqLocal)

        //Cria um ponteiro e já chama o arquivo
        nHandWord := OLE_CreateLink()
        OLE_NewFile(nHandWord, cArqLocal)
        
        //Setando o conteúdo das DocVariables
        OLE_SetDocumentVar(nHandWord, "CodProduto",  Alltrim(SB1->B1_COD))
        OLE_SetDocumentVar(nHandWord, "DescProduto", Alltrim(SB1->B1_DESC))
        OLE_SetDocumentVar(nHandWord, "UnidProduto", Alltrim(SB1->B1_UM))
        OLE_SetDocumentVar(nHandWord, "DataGeracao", dToC(Date()))
        OLE_SetDocumentVar(nHandWord, "HoraGeracao", Time())
        
        //Atualizando campos
        OLE_UpdateFields(nHandWord)
        
        //Gera o PDF do documento
        OLE_SetProperty(nHandWord,'208',.F.)
        OLE_SaveAsFile( nHandWord, cArqPDF, , , .F., 17 )

        //Fechando o arquivo e o link
        OLE_CloseFile(nHandWord)
        Sleep(1000)
        OLE_CloseLink(nHandWord)

        //Abre o PDF
        ShellExecute("OPEN", cArqPDF, "", cPastaTmp, 1 )

    Else
        FWAlertError("Produto não encontrado!", "Falha")
    EndIf
Return

Bom pessoal, por hoje é só.

Abraços e até a próxima.

Dan (Daniel Atilio)
Cristão de ramificação protestante. Especialista em Engenharia de Software pela FIB, graduado em Banco de Dados pela FATEC Bauru e técnico em informática pelo CTI da Unesp. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor e mantenedor do portal Terminal de Informação.

Deixe uma resposta

Terminal de Informação