relatorio rtf

Discussão em 'EMS , HCM e Totvs 11' iniciado por Marcos Gomes, Março 6, 2025.

  1. Marcos Gomes

    Marcos Gomes Membro Participativo

    Pessoal, boa tarde,...


    preciso gerar um relatório rtf com base em um modelo .... mais o relatorio vai ter vaarias paginas...

    tem algum exemplo disso por ai ?

    não achei nada sobre isso na documentacao :)
  2. rodolfo.rcs

    rodolfo.rcs Membro Participativo

    Marcos, bom dia.

    Segue exemplo. Neste caso, junto 3 layouts, head, body e footer em um mesmo arquivo .docx.

    /********************************************************************************
    ** Copyright DATASUL S.A. (1997)
    ** Todos os Direitos Reservados.
    **
    **
    ** Este fonte e de propriedade exclusiva da DATASUL, sua reproducao
    ** parcial ou total por qualquer meio, so podera ser feita mediante
    ** autorizacao expressa.
    *******************************************************************************/
    {include/i-prgvrs.i MI0304RP 2.00.00.053 } /*** "010053" 05/12/2024 15:21:34 ***/

    &IF "{&EMSFND_VERSION}" >= "1.00" &THEN
    {include/i-license-manager.i mi0304rp MMI}
    &ENDIF

    //{include/i_fnctrad.i}
    /*******************************************************************************
    ******
    ** Programa: MI/ESMI0304.P
    **
    ** Autor...: Datasul S/A
    **
    ** Data....: Março de 2025
    **
    ** Objetivo: Ficha de Manutencao
    ****************************************************************************** */
    /***********************************************************/
    define temp-table tt-param no-undo
    field destino as integer
    field arquivo as char format "x(35)"
    field usuario as char format "x(12)"
    field data-exec as date
    field hora-exec as integer
    field classifica as integer
    field desc-classifica as char format "x(40)"
    field modelo-rtf as char format "x(35)"
    field l-habilitaRtf as LOG
    FIELD ord-manut-ini LIKE ord-manut.nr-ord-produ
    FIELD ord-manut-fim LIKE ord-manut.nr-ord-produ
    FIELD dt-manut-ini LIKE ord-manut.dt-manut
    FIELD dt-manut-fim LIKE ord-manut.dt-manut
    FIELD sc-codigo-ini LIKE ord-manut.sc-codigo
    FIELD sc-codigo-fim LIKE ord-manut.sc-codigo
    FIELD cd-equipto-ini LIKE equipto.cd-equipto
    FIELD cd-equipto-fim LIKE equipto.cd-equipto
    FIELD cd-equipe-ini LIKE equipe.cd-equipe
    FIELD cd-equipe-fim LIKE equipe.cd-equipe
    FIELD cd-tipo-ini LIKE manut.cd-tipo
    FIELD cd-tipo-fim LIKE manut.cd-tipo
    FIELD cd-planejado-ini LIKE ord-manut.cd-planejado
    FIELD cd-planejado-fim LIKE ord-manut.cd-planejado
    FIELD cod-estabel-ini LIKE ord-manut.cod-estabel
    FIELD cod-estabel-fim LIKE ord-manut.cod-estabel.

    DEFINE TEMP-TABLE ttFormulario NO-UNDO
    FIELD idFormulario AS INTEGER
    FIELD conteudo AS CHARACTER.

    DEFINE TEMP-TABLE ttTexto NO-UNDO
    FIELD idFormulario AS INTEGER
    FIELD pos AS INTEGER
    FIELD texto AS CHARACTER.

    DEFINE TEMP-TABLE tt-layout NO-UNDO
    FIELD id AS INTEGER
    FIELD linha AS CHAR.

    {include/tt-edit.i}
    {include/pi-edit.i}

    DEF VAR ch-app-word AS COM-HANDLE NO-UNDO.
    DEF VAR gcDiretorio AS CHAR NO-UNDO.
    DEF VAR cLinha AS CHAR NO-UNDO.
    DEF VAR pcArqH AS CHAR NO-UNDO.
    DEF VAR pcArqB AS CHAR NO-UNDO.
    DEF VAR pcArqB2 AS CHAR NO-UNDO.
    DEF VAR pcArqF AS CHAR NO-UNDO.
    DEF VAR c-arq-saida AS CHAR NO-UNDO.
    DEF VAR cSeqAux AS CHAR NO-UNDO.
    DEF VAR i AS INTEGER NO-UNDO.
    DEF VAR valorDec AS DECIMAL FORMAT ">>>,>>>,>>9.9999" NO-UNDO.
    DEF VAR valorFor AS CHARACTER FORMAT "999999999".
    DEF VAR i-count AS INTEGER NO-UNDO.
    DEF VAR l-word AS LOGICAL NO-UNDO.
    DEF VAR h-acomp AS HANDLE NO-UNDO.
    DEF STREAM sInput.
    DEF STREAM sOutput.


    def temp-table tt-raw-digita
    field raw-digita as raw.

    def input parameter raw-param as raw no-undo.
    def input parameter table for tt-raw-digita.

    create tt-param.
    raw-transfer raw-param to tt-param.

    /********************************************************************************/
    /* include padrão para variáveis para o log */
    {include/i-rpvar.i}

    {utp\ut-glob.i}

    /*Define variáveis do corpo do relatório*/

    /* include padrão para output de log */
    {include/i-rpout.i &STREAM="STREAM str-rp"}

    /* include com a definição da frame de cabeçalho e rodapé */
    {include/i-rpcab.i &STREAM="str-rp"}

    /* bloco principal do programa */
    Assign c-programa = "ESMI0304"
    c-versao = "12.1.2704"
    c-revisao = ".00.001"
    c-empresa = "xxxxx"
    c-sistema = "MIP"
    c-titulo-relat = "RELATÓRIO FICHA MANUTENÇÃO".

    Run utp/ut-acomp.p Persistent Set h-acomp.
    {utp/ut-liter.i Processando *}
    Run pi-inicializar IN h-acomp (Input Return-value).


    find first param-global no-lock no-error.

    if avail param-global then
    assign c-empresa = grupo.

    assign c-programa = "MI/0304"
    c-versao = "0.00"
    c-revisao = "000".

    find first tt-param no-lock no-error.
    find first param-mi no-lock no-error.

    /* Corpo relatório*/
    ASSIGN l-word = YES.

    RUN pi-cria-word. // Criar arquivo word para configuração do layout

    // Ajusta mensagem padrão tarefas
    /*
    Técnico: _____________________________ Hora início: ___:___ Hora Término ___:___
    Observações Apontamento:
    */

    FIND FIRST mensagem NO-LOCK
    WHERE mensagem.cod-mensagem = 185 NO-ERROR.

    EMPTY TEMP-TABLE ttFormulario.
    EMPTY TEMP-TABLE ttTexto.

    CREATE ttFormulario.
    ASSIGN ttFormulario.idFormulario = 1
    ttFormulario.conteudo = mensagem.texto-mensag.

    /* Quebrar o texto original em linhas e armazenar na tabela temporária */
    DO i = 1 TO NUM-ENTRIES(ttFormulario.conteudo, CHR(10)):

    ASSIGN cLinha = ENTRY(i, ttFOrmulario.conteudo, CHR(10)).
    CREATE ttTexto.
    ASSIGN ttTexto.texto = cLinha
    ttTexto.pos = i
    ttTexto.idFormulario = 1.
    END.

    FOR EACH ord-manut NO-LOCK
    WHERE ord-manut.cod-estabel >= tt-param.cod-estabel-ini
    AND ord-manut.cod-estabel <= tt-param.cod-estabel-fim
    AND ord-manut.nr-ord-produ >= tt-param.ord-manut-ini
    AND ord-manut.nr-ord-produ <= tt-param.ord-manut-fim
    AND ord-manut.dt-manut >= tt-param.dt-manut-ini
    AND ord-manut.dt-manut <= tt-param.dt-manut-fim
    AND ord-manut.sc-codigo >= tt-param.sc-codigo-ini
    AND ord-manut.sc-codigo <= tt-param.sc-codigo-fim
    AND ord-manut.cd-equipto >= tt-param.cd-equipto-ini
    AND ord-manut.cd-equipto <= tt-param.cd-equipto-fim
    AND ord-manut.cd-equip-res >= tt-param.cd-equipe-ini
    AND ord-manut.cd-equip-res <= tt-param.cd-equipe-fim
    AND ord-manut.tp-manut >= tt-param.cd-tipo-ini
    AND ord-manut.tp-manut <= tt-param.cd-tipo-fim
    AND ord-manut.cd-planejado >= tt-param.cd-planejado-ini
    AND ord-manut.cd-planejado <= tt-param.cd-planejado-fim.

    RUN pi-acompanhar IN h-acomp (INPUT "Ordem Manutenção - " + STRING(ord-manut.nr-ord-produ)).

    find equipto
    where equipto.cd-equipto = ord-manut.cd-equipto no-lock no-error.
    FIND tag
    WHERE tag.cd-tag = ord-manut.cd-tag NO-LOCK NO-ERROR.
    FIND equipe NO-LOCK
    WHERE equipe.cd-equip = ord-manut.cd-equip-res NO-ERROR.
    IF l-word = YES THEN
    DO:
    ASSIGN
    pcArqH = "head" + STRING(ord-manut.nr-ord-prod) + ".doc"
    gcDiretorio = SEARCH("mip/layout/ordem_head.rtf")
    l-word = NO.
    RUN pi-headFirst.
    OS-DELETE VALUE(SESSION:TEMP-DIRECTORY + "/" + pcArqH) NO-ERROR.
    END.
    ELSE DO:
    //IF ch-app-word:Selection:Information(3) MOD 2 = 0 THEN
    //ch-app-word:SELECTION:InsertBreak(7).
    ch-app-word:SELECTION:InsertBreak(7).
    IF ch-app-word:Selection:Information(3) MOD 2 = 0 THEN
    ch-app-word:SELECTION:InsertBreak(7).

    ASSIGN
    pcArqH = "head" + STRING(ord-manut.nr-ord-prod) + ".doc"
    gcDiretorio = SEARCH("mip/layout/ordem_head.rtf").
    RUN pi-head.
    OS-DELETE VALUE(SESSION:TEMP-DIRECTORY + "/" + pcArqH) NO-ERROR.
    END.
    // Atualiza layout body
    ASSIGN
    pcArqB = "body" + STRING(ord-manut.nr-ord-prod) + ".doc".
    gcDiretorio = SEARCH("mip/layout/ordem_body.rtf").
    RUN pi-body.
    OS-DELETE VALUE(SESSION:TEMP-DIRECTORY + "/" + pcArqB) NO-ERROR.
    //atualiza layout footer
    ASSIGN
    pcArqF = "footer" + STRING(ord-manut.nr-ord-prod) + ".doc"
    gcDiretorio = SEARCH("mip/layout/ordem_footer.rtf").
    RUN pi-footer.
    OS-DELETE VALUE(SESSION:TEMP-DIRECTORY + "/" + pcArqF) NO-ERROR.

    END.


    //{include/i-rpcab.i}
    //{include/i-rpout.i}

    {include/i-rpclo.i &STREAM="STREAM str-rp"}

    run pi-finalizar in h-acomp.

    //{include/i-rpclo.i}
    //{include/pi-edit.i}

    RUN pi-finaliza.
    RUN pi-imprimir.

    RETURN "OK".

    PROCEDURE pi-cria-word:

    CREATE 'Word.Application':U ch-app-word. /* Cria uma aplica»’o WORD */
    ch-app-word:WindowState = 2. /* O estado dois para o Word ² minimizado */
    ch-app-word:VISIBLE = NO. /* Apenas para n’o mostrar que o word estÿ sendo utilizado em tela */
    c-arq-saida = SESSION:TEMP-DIRECTORY + "/" + "ordemMi" + STRING(TIME) + ".docx".

    END PROCEDURE.

    PROCEDURE pi-headFirst.

    INPUT STREAM sInput FROM VALUE(gcDiretorio).
    OUTPUT STREAM sOutput TO VALUE(SESSION:TEMP-DIRECTORY + "/" + pcArqH) NO-CONVERT.

    REPEAT:
    IMPORT STREAM sInput UNFORMAT cLinha.
    IF INDEX(cLinha,"@") > 0 THEN DO:
    ASSIGN cLinha = REPLACE(cLinha, "@numeroOrdem", string(ord-manut.nr-ord-produ)).
    //ASSIGN cLinha = REPLACE(cLinha, "#Teste2","TESTE 2").
    END.
    IF INDEX(cLinha,"@descricaoOrdem") > 0 THEN
    DO:
    ASSIGN cLinha = REPLACE(cLinha,"@descricaoOrdem", ord-manut.des-man-corr).
    END.
    IF INDEX(cLinha,"@equipamento") > 0 THEN DO:
    ASSIGN cLinha = REPLACE(cLinha,"@equipamento",equipto.cd-equipto).
    END.
    IF INDEX(cLinha,"@descricaoEquipamento") > 0 THEN DO:
    ASSIGN cLinha = REPLACE(cLinha,"@descricaoEquipamento",equipto.descricao).
    END.
    IF INDEX(cLinha,"@tag") > 0 THEN DO:
    ASSIGN cLinha = REPLACE(cLinha,"@tag",ord-manut.cd-tag).
    END.
    IF INDEX(cLinha,"@descricaoTag") > 0 THEN DO:
    ASSIGN cLinha = REPLACE(cLinha,"@descricaoTag",tag.descricao).
    END.
    IF INDEX(cLinha,"@manutencao") > 0 THEN DO:
    ASSIGN cLinha = REPLACE(cLinha,"@manutencao",ord-manut.cd-manut).
    END.
    IF INDEX(cLinha,"@descricaoManutencao") > 0 THEN DO:
    ASSIGN cLinha = REPLACE(cLinha,"@descricaoManutencao",tag.descricao).
    END.
    IF INDEX(cLinha,"@dataPrevistaManutencao") > 0 THEN DO:
    ASSIGN cLinha = REPLACE(cLinha,"@dataPrevistaManutencao",string(ord-manut.dt-manut,"99/99/9999")).
    END.
    IF INDEX(cLinha,"@dataInicioMaisCedo") > 0 THEN DO:
    ASSIGN cLinha = REPLACE(cLinha,"@dataInicioMaisCedo",string(ord-manut.dt-ini-cedo,"99/99/9999")).
    END.
    IF INDEX(cLinha,"@dataPrevistaTermino") > 0 THEN DO:
    ASSIGN cLinha = REPLACE(cLinha,"@dataPrevistaTermino",string(ord-manut.dt-prev,"99/99/9999")).
    END.
    IF INDEX(cLinha,"@dataInicioMaisTarde") > 0 THEN DO:
    ASSIGN cLinha = REPLACE(cLinha,"@dataInicioMaisTarde",string(ord-manut.dt-ini-tarde,"99/99/9999")).
    END.
    IF INDEX(cLinha,"@equipe") > 0 THEN DO:
    ASSIGN cLinha = REPLACE(cLinha,"@equipe",ord-manut.cd-equip-res).
    END.
    IF INDEX(cLinha,"@descricaoEquipe") > 0 THEN DO:
    ASSIGN cLinha = REPLACE(cLinha,"@descricaoEquipe",equipe.desc-equipe).
    END.
    IF INDEX(cLinha,"@planejador") > 0 THEN DO:
    ASSIGN cLinha = REPLACE(cLinha,"@planejador",ord-manut.cd-planejado).
    END.
    IF INDEX(cLinha,"@unidadeNegocio") > 0 THEN DO:
    ASSIGN cLinha = REPLACE(cLinha,"@unidadeNegocio",ord-manut.cod-unid-neg).
    END.
    /*
    IF INDEX(cLinha,"@narrativaOrdem") > 0 THEN
    DO:
    FOR EACH ttTexto NO-LOCK
    BREAK BY ttTexto.idFormulario:
    IF FIRST-OF(ttTexto.idFormulario) THEN
    DO:
    ASSIGN cLinha = REPLACE(cLinha, "@narrativaOrdem", ttTexto.texto).
    END.
    ELSE DO:
    ASSIGN
    cLinha = cLinha + "\par"
    cLinha = cLinha + "\" + strinG(ttTexto.pos) + ttTexto.texto.
    //cLinha = cLinha + ttTexto.texto.
    END.
    END.
    cLinha = REPLACE(cLinha, CHR(10), "\par").
    END.
    IF INDEX(cLinha,"@numeroDecimal") > 0 THEN
    DO:
    cLinha = REPLACE(cLinha,"@numeroDecimal",STRING(valorFor)).

    END.
    */
    //PUT STREAM soutput UNFORMATTED "{\rtf1\ansi" SKIP.
    //PUT STREAM soutput UNFORMATTED "{rtf1\ansi" SKIP.
    PUT STREAM sOutput UNFORMATTED cLinha SKIP.
    //PUT STREAM sOutput UNFORMATTED "}" SKIP.
    end.

    PUT STREAM sOutput "~\par }}".
    INPUT STREAM sInput CLOSE.
    OUTPUT STREAM sOutput CLOSE.

    //ch-app-word:Documents:ADD(SESSION:TEMP-DIRECTORY + "/" + "head.doc"). /* Abre o arquivo */
    ch-app-word:Documents:ADD(SESSION:TEMP-DIRECTORY + "/" + pcArqH). /* Abre o arquivo */

    END PROCEDURE.

    PROCEDURE pi-head.

    INPUT STREAM sInput FROM VALUE(gcDiretorio).
    OUTPUT STREAM sOutput TO VALUE(SESSION:TEMP-DIRECTORY + "/" + pcArqH) NO-CONVERT.

    REPEAT:
    IMPORT STREAM sInput UNFORMAT cLinha.
    IF INDEX(cLinha,"@") > 0 THEN DO:
    ASSIGN cLinha = REPLACE(cLinha, "@numeroOrdem", string(ord-manut.nr-ord-produ)).
    //ASSIGN cLinha = REPLACE(cLinha, "#Teste2","TESTE 2").
    END.
    IF INDEX(cLinha,"@descricaoOrdem") > 0 THEN
    DO:
    ASSIGN cLinha = REPLACE(cLinha,"@descricaoOrdem", ord-manut.des-man-corr).
    END.
    IF INDEX(cLinha,"@equipamento") > 0 THEN DO:
    ASSIGN cLinha = REPLACE(cLinha,"@equipamento",equipto.cd-equipto).
    END.
    IF INDEX(cLinha,"@descricaoEquipamento") > 0 THEN DO:
    ASSIGN cLinha = REPLACE(cLinha,"@descricaoEquipamento",equipto.descricao).
    END.
    IF INDEX(cLinha,"@tag") > 0 THEN DO:
    ASSIGN cLinha = REPLACE(cLinha,"@tag",ord-manut.cd-tag).
    END.
    IF INDEX(cLinha,"@descricaoTag") > 0 THEN DO:
    ASSIGN cLinha = REPLACE(cLinha,"@descricaoTag",tag.descricao).
    END.
    IF INDEX(cLinha,"@manutencao") > 0 THEN DO:
    ASSIGN cLinha = REPLACE(cLinha,"@manutencao",ord-manut.cd-manut).
    END.
    IF INDEX(cLinha,"@descricaoManutencao") > 0 THEN DO:
    ASSIGN cLinha = REPLACE(cLinha,"@descricaoManutencao",tag.descricao).
    END.
    IF INDEX(cLinha,"@dataPrevistaManutencao") > 0 THEN DO:
    ASSIGN cLinha = REPLACE(cLinha,"@dataPrevistaManutencao",string(ord-manut.dt-manut,"99/99/9999")).
    END.
    IF INDEX(cLinha,"@dataInicioMaisCedo") > 0 THEN DO:
    ASSIGN cLinha = REPLACE(cLinha,"@dataInicioMaisCedo",string(ord-manut.dt-ini-cedo,"99/99/9999")).
    END.
    IF INDEX(cLinha,"@dataPrevistaTermino") > 0 THEN DO:
    ASSIGN cLinha = REPLACE(cLinha,"@dataPrevistaTermino",string(ord-manut.dt-prev,"99/99/9999")).
    END.
    IF INDEX(cLinha,"@dataInicioMaisTarde") > 0 THEN DO:
    ASSIGN cLinha = REPLACE(cLinha,"@dataInicioMaisTarde",string(ord-manut.dt-ini-tarde,"99/99/9999")).
    END.
    IF INDEX(cLinha,"@equipe") > 0 THEN DO:
    ASSIGN cLinha = REPLACE(cLinha,"@equipe",ord-manut.cd-equip-res).
    END.
    IF INDEX(cLinha,"@descricaoEquipe") > 0 THEN DO:
    ASSIGN cLinha = REPLACE(cLinha,"@descricaoEquipe",equipe.desc-equipe).
    END.
    IF INDEX(cLinha,"@planejador") > 0 THEN DO:
    ASSIGN cLinha = REPLACE(cLinha,"@planejador",ord-manut.cd-planejado).
    END.
    IF INDEX(cLinha,"@unidadeNegocio") > 0 THEN DO:
    ASSIGN cLinha = REPLACE(cLinha,"@unidadeNegocio",ord-manut.cod-unid-neg).
    END.
    /*
    IF INDEX(cLinha,"@narrativaOrdem") > 0 THEN
    DO:
    FOR EACH ttTexto NO-LOCK
    BREAK BY ttTexto.idFormulario:
    IF FIRST-OF(ttTexto.idFormulario) THEN
    DO:
    ASSIGN cLinha = REPLACE(cLinha, "@narrativaOrdem", ttTexto.texto).
    END.
    ELSE DO:
    ASSIGN
    cLinha = cLinha + "\par"
    cLinha = cLinha + "\" + strinG(ttTexto.pos) + ttTexto.texto.
    //cLinha = cLinha + ttTexto.texto.
    END.
    END.
    cLinha = REPLACE(cLinha, CHR(10), "\par").
    END.
    */
    IF INDEX(cLinha,"@numeroDecimal") > 0 THEN
    DO:
    cLinha = REPLACE(cLinha,"@numeroDecimal",STRING(valorFor)).

    END.
    //PUT STREAM soutput UNFORMATTED "{\rtf1\ansi" SKIP.
    //PUT STREAM soutput UNFORMATTED "{rtf1\ansi" SKIP.
    PUT STREAM sOutput UNFORMATTED cLinha SKIP.
    //PUT STREAM sOutput UNFORMATTED "}" SKIP.
    end.

    //PUT STREAM sOutput "~\par }}".
    INPUT STREAM sInput CLOSE.
    OUTPUT STREAM sOutput CLOSE.

    //ch-app-word:Documents:ADD(SESSION:TEMP-DIRECTORY + "/" + "head.doc"). /* Abre o arquivo */
    //ch-app-word:Documents:ADD(SESSION:TEMP-DIRECTORY + "/" + pcArqH). /* Abre o arquivo */
    ch-app-Word:Selection:EndKey(6). /* Posiciona o Word no final da pÿgina */
    ch-app-Word:Selection:InsertFile(SESSION:TEMP-DIRECTORY + "/" + pcArqH). /* Inseri arquivo body*/
    END PROCEDURE.

    PROCEDURE pi-body.

    DEF VAR i-taref AS INTEGER NO-UNDO.
    DEF VAR i AS INTEGER NO-UNDO.
    DEF VAR c-linha AS LONGCHAR NO-UNDO.
    DEF VAR i-linhas AS INTEGER NO-UNDO.
    DEF VAR l-nar AS LOG NO-UNDO.
    DEF VAR l-primeiro AS LOG NO-UNDO.
    DEF VAR l-reserva AS LOG NO-UNDO.

    FOR EACH ord-taref NO-LOCK USE-INDEX codigo
    WHERE ord-taref.nr-ord-produ = ord-manut.nr-ord-produ.
    //BREAK BY ord-taref.nr-ord-produ:
    ASSIGN l-nar = NO.
    IF ord-taref.narrativa <> "" THEN
    DO:
    ASSIGN l-nar = YES.
    CREATE ttFormulario.
    ASSIGN ttFormulario.idFormulario = ord-taref.cd-tarefa
    ttFormulario.conteudo = ord-taref.narrativa.

    /* Quebrar o texto original em linhas e armazenar na tabela temporária */
    DO i = 1 TO NUM-ENTRIES(ttFormulario.conteudo, CHR(10)):

    ASSIGN cLinha = ENTRY(i, ttFOrmulario.conteudo, CHR(10)).
    CREATE ttTexto.
    ASSIGN ttTexto.texto = cLinha + "\par"
    ttTexto.pos = i
    ttTexto.idFormulario = ttFormulario.idFormulario.
    END.
    /*
    IF ord-taref.cd-tarefa = 20 THEN
    DO:
    FOR EACH ttTexto NO-LOCK
    WHERE ttTexto.idFormulario = 20:
    MESSAGE ttTexto.texto
    VIEW-AS ALERT-BOX INFORMATION BUTTONS OK.
    END.
    END.
    */
    /*
    IF INDEX(ttFormulario.conteudo, CHR(32)) > 0 THEN
    DO:
    MESSAGE ENTRY(1,ttFormulario.conteudo,CHR(32))
    VIEW-AS ALERT-BOX INFORMATION BUTTONS OK.
    END.
    */
    /*
    FOR EACH ttTexto NO-LOCK
    WHERE ttTexto.idFormulario = 2:
    MESSAGE ttTexto.idFOrmulario ttTexto.texto
    VIEW-AS ALERT-BOX INFORMATION BUTTONS OK.
    END.
    */
    END.
    EMPTY TEMP-TABLE tt-layout.
    INPUT STREAM sInput FROM VALUE(gcDiretorio).
    REPEAT:
    CREATE tt-layout.
    IMPORT STREAM sInput UNFORMATTED tt-layout.linha.
    END.
    INPUT STREAM sInput CLOSE.

    FIND FIRST ord-esp NO-LOCK
    WHERE ord-esp.nr-ord-produ = ord-taref.nr-ord-produ
    AND ord-esp.cd-tarefa = ord-taref.cd-tarefa NO-ERROR.

    FIND FIRST mi-espec NO-LOCK
    WHERE mi-espec.tp-especial = ord-esp.tp-especial NO-ERROR.

    FOR EACH tt-layout.
    ASSIGN cLinha = tt-layout.linha.
    RUN pi-dados.
    ASSIGN tt-layout.linha = cLinha.

    ASSIGN i-count = 0
    l-reserva = NO.

    FOR EACH reservas NO-LOCK
    WHERE reservas.nr-ord-produ = ord-manut.nr-ord-produ
    AND reservas.op-codigo = ord-taref.cd-tarefa,
    FIRST ITEM OF reservas NO-LOCK.

    ASSIGN l-reserva = YES.
    i-count = i-count + 1.
    i-linhas = i-linhas + 1.
    ASSIGN cLinha = tt-layout.linha.
    RUN pi-dados-itens.
    ASSIGN tt-layout.linha = cLinha.
    END.
    ASSIGN i-count = 0.
    //Limpar layout
    IF INDEX(tt-layout.linha, "@narrativaTarefa") > 0 THEN
    DO:
    IF l-nar = YES THEN
    DO:

    RUN pi-print-editor(INPUT ord-taref.narrativa, INPUT 500).
    FOR EACH tt-editor:
    IF tt-editor.linha = 1 THEN
    DO:
    ASSIGN tt-layout.linha = REPLACE(tt-layout.linha,"@narrativaTarefa",SUBSTRING(tt-editor.conteudo,1,500)).
    END.
    ELSE DO:
    ASSIGN
    tt-layout.linha = tt-layout.linha + "\par" + " "
    tt-layout.linha = tt-layout.linha + SUBSTRING(tt-editor.conteudo,1,500).
    END.
    END.
    /*
    // ASSIGN tt-layout.linha = REPLACE(tt-layout.linha,"@mensagem",mensagem.texto-mensag).
    FOR EACH ttTexto NO-LOCK
    WHERE ttTexto.idFormulario = ord-taref.cd-tarefa
    BREAK BY ttTexto.idFormulario:
    IF FIRST-OF(ttTexto.idFormulario) THEN
    DO:
    ASSIGN tt-layout.linha = REPLACE(tt-layout.linha, "@narrativaTarefa", ttTexto.texto)
    tt-layout.linha = tt-layout.linha.
    END.
    ELSE DO:

    ASSIGN
    //tt-layout.linha = REPLACE(tt-layout.linha,CHR(32),"\par")
    //tt-layout.linha = REPLACE(tt-layout.linha,CHR(10),"\par")
    //tt-layout.linha = tt-layout.linha + "\par"
    tt-layout.linha = tt-layout.linha + ttTexto.texto.
    //cLinha = cLinha + ttTexto.texto.
    END.
    END.
    */
    END.
    END.
    IF INDEX(tt-layout.linha, "@mensagem") > 0 THEN
    DO:
    // ASSIGN tt-layout.linha = REPLACE(tt-layout.linha,"@mensagem",mensagem.texto-mensag).
    FOR EACH ttTexto NO-LOCK
    WHERE ttTexto.idFormulario = 1
    BREAK BY ttTexto.idFormulario:
    IF FIRST-OF(ttTexto.idFormulario) THEN
    DO:
    ASSIGN tt-layout.linha = REPLACE(tt-layout.linha, "@mensagem", ttTexto.texto).
    tt-layout.linha = tt-layout.linha + "\par".
    END.
    ELSE DO:

    ASSIGN
    //tt-layout.linha = REPLACE(tt-layout.linha,CHR(32),"\par")
    //tt-layout.linha = REPLACE(tt-layout.linha,CHR(10),"\par")
    //tt-layout.linha = tt-layout.linha + "\par"
    tt-layout.linha = tt-layout.linha + ttTexto.texto.

    //cLinha = cLinha + ttTexto.texto.
    END.
    END.
    END.
    END.
    FOR EACH tt-layout:
    ASSIGN i-count = i-count + 1.
    ASSIGN cLinha = tt-layout.linha.
    RUN pi-limpar.
    ASSIGN tt-layout.linha = cLinha.
    END.

    OUTPUT STREAM sOutput TO VALUE(SESSION:TEMP-DIRECTORY + "/" + pcArqB) NO-CONVERT.
    FOR EACH tt-layout:
    PUT STREAM sOutput UNFORMATTED tt-layout.linha SKIP.
    END.
    //PUT STREAM sOutput "}}":U.

    OUTPUT STREAM sOutput CLOSE.
    ch-app-Word:Selection:EndKey(6). /* Posiciona o Word no final da pÿgina */
    //ch-app-word:SELECTION:InsertBreak(2).
    ch-app-Word:Selection:InsertFile(SESSION:TEMP-DIRECTORY + "/" + pcArqB). /* Inseri arquivo body*/
    END.
    END PROCEDURE.
    PROCEDURE pi-dados.
    IF INDEX(cLinha,"@numeroTarefa") > 0 THEN DO:
    ASSIGN cLinha = REPLACE(cLinha,"@numeroTarefa",string(ord-taref.cd-tarefa)).
    END.
    IF INDEX(cLinha,"@descricaoTarefa") > 0 THEN
    ASSIGN cLinha = REPLACE(cLinha,"@descricaoTarefa",ord-taref.descricao).
    IF INDEX(cLinha,"@especialidade") > 0 THEN
    DO:
    IF AVAIL mi-espec THEN ASSIGN cLinha = REPLACE(cLinha,"@especialidade",mi-espec.tp-especial).
    ELSE ASSIGN cLinha = REPLACE(cLinha,"@especialidade","").
    END.
    IF INDEX(cLinha,"@descricaoEspecialidade") > 0 THEN
    DO:
    IF AVAIL mi-espec THEN ASSIGN cLinha = REPLACE(cLinha,"@descricaoEspecialidade",mi-espec.descricao).
    ELSE cLinha = REPLACE(cLinha,"@descricaoEspecialidade","").
    END.
    /*
    IF INDEX(cLinha,"@narrativaTarefa") > 0 THEN
    DO:
    ASSIGN cLinha = REPLACE(cLinha,"@narrativaTarefa",ord-taref.narrativa).
    END.
    */

    END PROCEDURE.

    PROCEDURE pi-dados-itens.
    IF INDEX(cLinha,"@ITEM") > 0 THEN
    DO:
    ASSIGN cLinha = REPLACE(cLinha,"@ITEM","ITEM").
    END.
    IF INDEX(cLinha,"@DESCRICAO") > 0 THEN
    DO:
    ASSIGN cLinha = REPLACE(cLinha,"@DESCRICAO","DESCRICAO").
    END.
    IF INDEX(cLinha,"@QUANTIDADE") > 0 THEN
    DO:
    ASSIGN cLinha = REPLACE(cLinha,"@QUANTIDADE","QUANTIDADE").
    END.
    IF INDEX(cLinha,"@LOCALIZACAO") > 0 THEN
    DO:
    ASSIGN cLinha = REPLACE(cLinha,"@LOCALIZACAO","LOCALIZACAO").
    END.
    IF INDEX(cLinha,"@" + string(i-count,"99") + "item") > 0 THEN DO:
    ASSIGN cLinha = REPLACE(cLinha,"@" + string(i-count,"99")+ "item",ITEM.it-codigo).
    END.
    IF INDEX(cLinha,"@" + string(i-count,"99") + "descricaoItem") > 0 THEN
    ASSIGN cLinha = REPLACE(cLinha,"@" + string(i-count,"99") + "descricaoItem",substr(ITEM.desc-item,1,60)).
    IF INDEX(cLinha,"@" + string(i-count,"99") + "quantidadeItem") > 0 THEN
    ASSIGN cLinha = REPLACE(cLinha,"@" + string(i-count,"99") + "quantidadeItem",string(reservas.quant-orig,">>9.9999")).
    IF INDEX(cLinha,"@" + string(i-count,"99") + "localizacaoItem") > 0 THEN
    ASSIGN cLinha = REPLACE(cLinha,"@" + string(i-count,"99") + "localizacaoItem",reservas.cod-localiz).

    END PROCEDURE.
    PROCEDURE pi-footer.

    INPUT STREAM sInput FROM VALUE(gcDiretorio).
    OUTPUT STREAM sOutput TO VALUE(SESSION:TEMP-DIRECTORY + "/" + pcArqF) NO-CONVERT.

    REPEAT:
    IMPORT STREAM sInput UNFORMAT cLinha.
    PUT STREAM sOutput UNFORMATTED cLinha SKIP.
    end.

    //PUT STREAM sOutput "~\par }}".
    INPUT STREAM sInput CLOSE.
    OUTPUT STREAM sOutput CLOSE.

    ch-app-Word:Selection:EndKey(6). /* Posiciona o Word no final da pÿgina */
    //ch-app-word:SELECTION:InsertBreak(2).
    ch-app-Word:Selection:InsertFile(SESSION:TEMP-DIRECTORY + "/" + pcArqF). /* Inseri arquivo body*/

    END PROCEDURE.

    PROCEDURE pi-limpar.
    IF INDEX(cLinha,"@ITEM") > 0 THEN ASSIGN cLinha = TRIM(REPLACE(cLinha,"@ITEM","")).
    IF INDEX(cLinha,"@DESCRICAO") > 0 THEN ASSIGN cLinha = TRIM(REPLACE(cLinha,"@DESCRICAO","")).
    IF INDEX(cLinha,"@QUANTIDADE") > 0 THEN ASSIGN cLinha = TRIM(REPLACE(cLinha,"@QUANTIDADE","")).
    IF INDEX(cLinha,"@LOCALIZACAO") > 0 THEN ASSIGN cLinha = TRIM(REPLACE(cLinha,"@LOCALIZACAO","")).
    DO i-count = 1 TO 44:
    IF INDEX(cLinha,"@" + string(i-count,"99") + "item -") > 0 THEN DO:
    ASSIGN cLinha = trim(REPLACE(cLinha,"@" + string(i-count,"99")+ "item -","")).
    END.
    IF INDEX(cLinha,"@" + string(i-count,"99") + "descricaoItem") > 0 THEN
    ASSIGN cLinha = trim(REPLACE(cLinha,"@" + string(i-count,"99") + "descricaoItem","")).
    IF INDEX(cLinha,"@" + string(i-count,"99") + "quantidadeItem") > 0 THEN
    ASSIGN cLinha = trim(REPLACE(cLinha,"@" + string(i-count,"99") + "quantidadeItem","")).
    IF INDEX(cLinha,"@" + string(i-count,"99") + "localizacaoItem") > 0 THEN DO:
    ASSIGN cLinha = trim(REPLACE(cLinha,"@" + string(i-count,"99") + "localizacaoItem","")).
    IF LENGTH(cLinha) = 4 AND cLinha = "\par" THEN
    DO:
    ASSIGN cLinha = REPLACE(cLinha,"\par"," ").
    END.
    IF INDEX(cLinha,"Ferramentaria") > 0 THEN
    DO:
    MESSAGE cLinha
    VIEW-AS ALERT-BOX INFORMATION BUTTONS OK.
    END.

    /*
    MESSAGE cLinha LENGTH(cLinha)
    VIEW-AS ALERT-BOX INFORMATION BUTTONS OK.
    //cLinha = REPLACE(cLinha,"\par"," ").
    */
    END.
    END.
    END PROCEDURE.
    /*
    ASSIGN c-impressora-padrao = SESSION:pRINTER-NAME.
    /* Seleciona a impressora para impressão */
    gchWord:ActivePrinter = tt-param-aux.impressora-so.
    /* Imprime o documento na impressora selecionada */
    gchWord:printout(0). /* 0 : Não mostra erros nem advertencias */
    /* Volta a impressora padrão do windows */
    gchWord:ActivePrinter = c-impressora-padrao.
    */

    PROCEDURE pi-finaliza:

    ch-app-word:ActiveDocument:SaveAs(c-arq-saida).
    ch-app-word:ActiveDocument:Close.
    //ch-app-word:VISIBLE = YES.

    ch-app-word:Quit(false).
    RELEASE OBJECT ch-app-word. /* Elimina o endere»o utilizado para o WORD na mÿquina */

    /*
    OS-DELETE VALUE(SESSION:TEMP-DIRECTORY + "/" + pcArqH) NO-ERROR.
    OS-DELETE VALUE(SESSION:TEMP-DIRECTORY + "/" + pcArqB) NO-ERROR.
    OS-DELETE VALUE(SESSION:TEMP-DIRECTORY + "/" + pcArqF) NO-ERROR.
    */
    //OS-COMMAND no-wait value(c-arq-saida).

    END PROCEDURE.

    PROCEDURE pi-imprimir.

    DEFINE VAR i AS INTEGER NO-UNDO.

    /* Adiciona um atraso */
    DO i = 1 TO 5:
    PAUSE 1.
    END.

    IF search(c-arq-saida) <> ? THEN DO:
    CREATE "Word.Application" ch-app-word.
    ch-app-word:VISIBLE = NO.
    ch-app-word:Documentos:OPEN(c-arq-saida).
    /*
    MESSAGE SESSION:pRINTER-NAME
    VIEW-AS ALERT-BOX INFORMATION BUTTONS OK.
    */
    ch-app-word:ActivePrinter = SESSION:pRINTER-NAME.
    ch-app-word:printout(0).
    ch-app-word:QUIT(FALSE).
    RELEASE OBJECT ch-app-word.
    END.
    ELSE DO:
    MESSAGE "Arquivo não encontrado: " c-arq-saida VIEW-AS ALERT-BOX ERROR.
    END.

    /*
    CREATE "Word.Application" ch-app-word.
    ch-app-word:VISIBLE = FALSE.
    ch-app-word:Documentos:OPEN(c-arq-saida).
    //ch-app-word:Documents:ADD(SESSION:TEMP-DIRECTORY + "/" + pcArqH). /* Abre o arquivo */
    MESSAGE SESSION:pRINTER-NAME
    VIEW-AS ALERT-BOX INFORMATION BUTTONS OK.

    ch-app-word:ActivePrinter = SESSION:pRINTER-NAME.
    ch-app-word:printout(0).
    ch-app-word:QUIT(FALSE).
    RELEASE OBJECT ch-app-word.
    */
    END PROCEDURE.
  3. rodolfo.rcs

    rodolfo.rcs Membro Participativo

    Marcos, bom dia.

    Segue exemplo. Neste caso, junto 3 layouts, head, body e footer em um mesmo arquivo .docx.

    /********************************************************************************
    ** Copyright DATASUL S.A. (1997)
    ** Todos os Direitos Reservados.
    **
    **
    ** Este fonte e de propriedade exclusiva da DATASUL, sua reproducao
    ** parcial ou total por qualquer meio, so podera ser feita mediante
    ** autorizacao expressa.
    *******************************************************************************/
    {include/i-prgvrs.i MI0304RP 2.00.00.053 } /*** "010053" 05/12/2024 15:21:34 ***/

    &IF "{&EMSFND_VERSION}" >= "1.00" &THEN
    {include/i-license-manager.i mi0304rp MMI}
    &ENDIF

    //{include/i_fnctrad.i}
    /*******************************************************************************
    ******
    ** Programa: MI/ESMI0304.P
    **
    ** Autor...: Datasul S/A
    **
    ** Data....: Março de 2025
    **
    ** Objetivo: Ficha de Manutencao
    ****************************************************************************** */
    /***********************************************************/
    define temp-table tt-param no-undo
    field destino as integer
    field arquivo as char format "x(35)"
    field usuario as char format "x(12)"
    field data-exec as date
    field hora-exec as integer
    field classifica as integer
    field desc-classifica as char format "x(40)"
    field modelo-rtf as char format "x(35)"
    field l-habilitaRtf as LOG
    FIELD ord-manut-ini LIKE ord-manut.nr-ord-produ
    FIELD ord-manut-fim LIKE ord-manut.nr-ord-produ
    FIELD dt-manut-ini LIKE ord-manut.dt-manut
    FIELD dt-manut-fim LIKE ord-manut.dt-manut
    FIELD sc-codigo-ini LIKE ord-manut.sc-codigo
    FIELD sc-codigo-fim LIKE ord-manut.sc-codigo
    FIELD cd-equipto-ini LIKE equipto.cd-equipto
    FIELD cd-equipto-fim LIKE equipto.cd-equipto
    FIELD cd-equipe-ini LIKE equipe.cd-equipe
    FIELD cd-equipe-fim LIKE equipe.cd-equipe
    FIELD cd-tipo-ini LIKE manut.cd-tipo
    FIELD cd-tipo-fim LIKE manut.cd-tipo
    FIELD cd-planejado-ini LIKE ord-manut.cd-planejado
    FIELD cd-planejado-fim LIKE ord-manut.cd-planejado
    FIELD cod-estabel-ini LIKE ord-manut.cod-estabel
    FIELD cod-estabel-fim LIKE ord-manut.cod-estabel.

    DEFINE TEMP-TABLE ttFormulario NO-UNDO
    FIELD idFormulario AS INTEGER
    FIELD conteudo AS CHARACTER.

    DEFINE TEMP-TABLE ttTexto NO-UNDO
    FIELD idFormulario AS INTEGER
    FIELD pos AS INTEGER
    FIELD texto AS CHARACTER.

    DEFINE TEMP-TABLE tt-layout NO-UNDO
    FIELD id AS INTEGER
    FIELD linha AS CHAR.

    {include/tt-edit.i}
    {include/pi-edit.i}

    DEF VAR ch-app-word AS COM-HANDLE NO-UNDO.
    DEF VAR gcDiretorio AS CHAR NO-UNDO.
    DEF VAR cLinha AS CHAR NO-UNDO.
    DEF VAR pcArqH AS CHAR NO-UNDO.
    DEF VAR pcArqB AS CHAR NO-UNDO.
    DEF VAR pcArqB2 AS CHAR NO-UNDO.
    DEF VAR pcArqF AS CHAR NO-UNDO.
    DEF VAR c-arq-saida AS CHAR NO-UNDO.
    DEF VAR cSeqAux AS CHAR NO-UNDO.
    DEF VAR i AS INTEGER NO-UNDO.
    DEF VAR valorDec AS DECIMAL FORMAT ">>>,>>>,>>9.9999" NO-UNDO.
    DEF VAR valorFor AS CHARACTER FORMAT "999999999".
    DEF VAR i-count AS INTEGER NO-UNDO.
    DEF VAR l-word AS LOGICAL NO-UNDO.
    DEF VAR h-acomp AS HANDLE NO-UNDO.
    DEF STREAM sInput.
    DEF STREAM sOutput.


    def temp-table tt-raw-digita
    field raw-digita as raw.

    def input parameter raw-param as raw no-undo.
    def input parameter table for tt-raw-digita.

    create tt-param.
    raw-transfer raw-param to tt-param.

    /********************************************************************************/
    /* include padrão para variáveis para o log */
    {include/i-rpvar.i}

    {utp\ut-glob.i}

    /*Define variáveis do corpo do relatório*/

    /* include padrão para output de log */
    {include/i-rpout.i &STREAM="STREAM str-rp"}

    /* include com a definição da frame de cabeçalho e rodapé */
    {include/i-rpcab.i &STREAM="str-rp"}

    /* bloco principal do programa */
    Assign c-programa = "ESMI0304"
    c-versao = "12.1.2704"
    c-revisao = ".00.001"
    c-empresa = "xxxxx"
    c-sistema = "MIP"
    c-titulo-relat = "RELATÓRIO FICHA MANUTENÇÃO".

    Run utp/ut-acomp.p Persistent Set h-acomp.
    {utp/ut-liter.i Processando *}
    Run pi-inicializar IN h-acomp (Input Return-value).


    find first param-global no-lock no-error.

    if avail param-global then
    assign c-empresa = grupo.

    assign c-programa = "MI/0304"
    c-versao = "0.00"
    c-revisao = "000".

    find first tt-param no-lock no-error.
    find first param-mi no-lock no-error.

    /* Corpo relatório*/
    ASSIGN l-word = YES.

    RUN pi-cria-word. // Criar arquivo word para configuração do layout

    // Ajusta mensagem padrão tarefas
    /*
    Técnico: _____________________________ Hora início: ___:___ Hora Término ___:___
    Observações Apontamento:
    */

    FIND FIRST mensagem NO-LOCK
    WHERE mensagem.cod-mensagem = 185 NO-ERROR.

    EMPTY TEMP-TABLE ttFormulario.
    EMPTY TEMP-TABLE ttTexto.

    CREATE ttFormulario.
    ASSIGN ttFormulario.idFormulario = 1
    ttFormulario.conteudo = mensagem.texto-mensag.

    /* Quebrar o texto original em linhas e armazenar na tabela temporária */
    DO i = 1 TO NUM-ENTRIES(ttFormulario.conteudo, CHR(10)):

    ASSIGN cLinha = ENTRY(i, ttFOrmulario.conteudo, CHR(10)).
    CREATE ttTexto.
    ASSIGN ttTexto.texto = cLinha
    ttTexto.pos = i
    ttTexto.idFormulario = 1.
    END.

    FOR EACH ord-manut NO-LOCK
    WHERE ord-manut.cod-estabel >= tt-param.cod-estabel-ini
    AND ord-manut.cod-estabel <= tt-param.cod-estabel-fim
    AND ord-manut.nr-ord-produ >= tt-param.ord-manut-ini
    AND ord-manut.nr-ord-produ <= tt-param.ord-manut-fim
    AND ord-manut.dt-manut >= tt-param.dt-manut-ini
    AND ord-manut.dt-manut <= tt-param.dt-manut-fim
    AND ord-manut.sc-codigo >= tt-param.sc-codigo-ini
    AND ord-manut.sc-codigo <= tt-param.sc-codigo-fim
    AND ord-manut.cd-equipto >= tt-param.cd-equipto-ini
    AND ord-manut.cd-equipto <= tt-param.cd-equipto-fim
    AND ord-manut.cd-equip-res >= tt-param.cd-equipe-ini
    AND ord-manut.cd-equip-res <= tt-param.cd-equipe-fim
    AND ord-manut.tp-manut >= tt-param.cd-tipo-ini
    AND ord-manut.tp-manut <= tt-param.cd-tipo-fim
    AND ord-manut.cd-planejado >= tt-param.cd-planejado-ini
    AND ord-manut.cd-planejado <= tt-param.cd-planejado-fim.

    RUN pi-acompanhar IN h-acomp (INPUT "Ordem Manutenção - " + STRING(ord-manut.nr-ord-produ)).

    find equipto
    where equipto.cd-equipto = ord-manut.cd-equipto no-lock no-error.
    FIND tag
    WHERE tag.cd-tag = ord-manut.cd-tag NO-LOCK NO-ERROR.
    FIND equipe NO-LOCK
    WHERE equipe.cd-equip = ord-manut.cd-equip-res NO-ERROR.
    IF l-word = YES THEN
    DO:
    ASSIGN
    pcArqH = "head" + STRING(ord-manut.nr-ord-prod) + ".doc"
    gcDiretorio = SEARCH("mip/layout/ordem_head.rtf")
    l-word = NO.
    RUN pi-headFirst.
    OS-DELETE VALUE(SESSION:TEMP-DIRECTORY + "/" + pcArqH) NO-ERROR.
    END.
    ELSE DO:
    //IF ch-app-word:Selection:Information(3) MOD 2 = 0 THEN
    //ch-app-word:SELECTION:InsertBreak(7).
    ch-app-word:SELECTION:InsertBreak(7).
    IF ch-app-word:Selection:Information(3) MOD 2 = 0 THEN
    ch-app-word:SELECTION:InsertBreak(7).

    ASSIGN
    pcArqH = "head" + STRING(ord-manut.nr-ord-prod) + ".doc"
    gcDiretorio = SEARCH("mip/layout/ordem_head.rtf").
    RUN pi-head.
    OS-DELETE VALUE(SESSION:TEMP-DIRECTORY + "/" + pcArqH) NO-ERROR.
    END.
    // Atualiza layout body
    ASSIGN
    pcArqB = "body" + STRING(ord-manut.nr-ord-prod) + ".doc".
    gcDiretorio = SEARCH("mip/layout/ordem_body.rtf").
    RUN pi-body.
    OS-DELETE VALUE(SESSION:TEMP-DIRECTORY + "/" + pcArqB) NO-ERROR.
    //atualiza layout footer
    ASSIGN
    pcArqF = "footer" + STRING(ord-manut.nr-ord-prod) + ".doc"
    gcDiretorio = SEARCH("mip/layout/ordem_footer.rtf").
    RUN pi-footer.
    OS-DELETE VALUE(SESSION:TEMP-DIRECTORY + "/" + pcArqF) NO-ERROR.

    END.


    //{include/i-rpcab.i}
    //{include/i-rpout.i}

    {include/i-rpclo.i &STREAM="STREAM str-rp"}

    run pi-finalizar in h-acomp.

    //{include/i-rpclo.i}
    //{include/pi-edit.i}

    RUN pi-finaliza.
    RUN pi-imprimir.

    RETURN "OK".

    PROCEDURE pi-cria-word:

    CREATE 'Word.Application':U ch-app-word. /* Cria uma aplica»’o WORD */
    ch-app-word:WindowState = 2. /* O estado dois para o Word ² minimizado */
    ch-app-word:VISIBLE = NO. /* Apenas para n’o mostrar que o word estÿ sendo utilizado em tela */
    c-arq-saida = SESSION:TEMP-DIRECTORY + "/" + "ordemMi" + STRING(TIME) + ".docx".

    END PROCEDURE.

    PROCEDURE pi-headFirst.

    INPUT STREAM sInput FROM VALUE(gcDiretorio).
    OUTPUT STREAM sOutput TO VALUE(SESSION:TEMP-DIRECTORY + "/" + pcArqH) NO-CONVERT.

    REPEAT:
    IMPORT STREAM sInput UNFORMAT cLinha.
    IF INDEX(cLinha,"@") > 0 THEN DO:
    ASSIGN cLinha = REPLACE(cLinha, "@numeroOrdem", string(ord-manut.nr-ord-produ)).
    //ASSIGN cLinha = REPLACE(cLinha, "#Teste2","TESTE 2").
    END.
    IF INDEX(cLinha,"@descricaoOrdem") > 0 THEN
    DO:
    ASSIGN cLinha = REPLACE(cLinha,"@descricaoOrdem", ord-manut.des-man-corr).
    END.
    IF INDEX(cLinha,"@equipamento") > 0 THEN DO:
    ASSIGN cLinha = REPLACE(cLinha,"@equipamento",equipto.cd-equipto).
    END.
    IF INDEX(cLinha,"@descricaoEquipamento") > 0 THEN DO:
    ASSIGN cLinha = REPLACE(cLinha,"@descricaoEquipamento",equipto.descricao).
    END.
    IF INDEX(cLinha,"@tag") > 0 THEN DO:
    ASSIGN cLinha = REPLACE(cLinha,"@tag",ord-manut.cd-tag).
    END.
    IF INDEX(cLinha,"@descricaoTag") > 0 THEN DO:
    ASSIGN cLinha = REPLACE(cLinha,"@descricaoTag",tag.descricao).
    END.
    IF INDEX(cLinha,"@manutencao") > 0 THEN DO:
    ASSIGN cLinha = REPLACE(cLinha,"@manutencao",ord-manut.cd-manut).
    END.
    IF INDEX(cLinha,"@descricaoManutencao") > 0 THEN DO:
    ASSIGN cLinha = REPLACE(cLinha,"@descricaoManutencao",tag.descricao).
    END.
    IF INDEX(cLinha,"@dataPrevistaManutencao") > 0 THEN DO:
    ASSIGN cLinha = REPLACE(cLinha,"@dataPrevistaManutencao",string(ord-manut.dt-manut,"99/99/9999")).
    END.
    IF INDEX(cLinha,"@dataInicioMaisCedo") > 0 THEN DO:
    ASSIGN cLinha = REPLACE(cLinha,"@dataInicioMaisCedo",string(ord-manut.dt-ini-cedo,"99/99/9999")).
    END.
    IF INDEX(cLinha,"@dataPrevistaTermino") > 0 THEN DO:
    ASSIGN cLinha = REPLACE(cLinha,"@dataPrevistaTermino",string(ord-manut.dt-prev,"99/99/9999")).
    END.
    IF INDEX(cLinha,"@dataInicioMaisTarde") > 0 THEN DO:
    ASSIGN cLinha = REPLACE(cLinha,"@dataInicioMaisTarde",string(ord-manut.dt-ini-tarde,"99/99/9999")).
    END.
    IF INDEX(cLinha,"@equipe") > 0 THEN DO:
    ASSIGN cLinha = REPLACE(cLinha,"@equipe",ord-manut.cd-equip-res).
    END.
    IF INDEX(cLinha,"@descricaoEquipe") > 0 THEN DO:
    ASSIGN cLinha = REPLACE(cLinha,"@descricaoEquipe",equipe.desc-equipe).
    END.
    IF INDEX(cLinha,"@planejador") > 0 THEN DO:
    ASSIGN cLinha = REPLACE(cLinha,"@planejador",ord-manut.cd-planejado).
    END.
    IF INDEX(cLinha,"@unidadeNegocio") > 0 THEN DO:
    ASSIGN cLinha = REPLACE(cLinha,"@unidadeNegocio",ord-manut.cod-unid-neg).
    END.
    /*
    IF INDEX(cLinha,"@narrativaOrdem") > 0 THEN
    DO:
    FOR EACH ttTexto NO-LOCK
    BREAK BY ttTexto.idFormulario:
    IF FIRST-OF(ttTexto.idFormulario) THEN
    DO:
    ASSIGN cLinha = REPLACE(cLinha, "@narrativaOrdem", ttTexto.texto).
    END.
    ELSE DO:
    ASSIGN
    cLinha = cLinha + "\par"
    cLinha = cLinha + "\" + strinG(ttTexto.pos) + ttTexto.texto.
    //cLinha = cLinha + ttTexto.texto.
    END.
    END.
    cLinha = REPLACE(cLinha, CHR(10), "\par").
    END.
    IF INDEX(cLinha,"@numeroDecimal") > 0 THEN
    DO:
    cLinha = REPLACE(cLinha,"@numeroDecimal",STRING(valorFor)).

    END.
    */
    //PUT STREAM soutput UNFORMATTED "{\rtf1\ansi" SKIP.
    //PUT STREAM soutput UNFORMATTED "{rtf1\ansi" SKIP.
    PUT STREAM sOutput UNFORMATTED cLinha SKIP.
    //PUT STREAM sOutput UNFORMATTED "}" SKIP.
    end.

    PUT STREAM sOutput "~\par }}".
    INPUT STREAM sInput CLOSE.
    OUTPUT STREAM sOutput CLOSE.

    //ch-app-word:Documents:ADD(SESSION:TEMP-DIRECTORY + "/" + "head.doc"). /* Abre o arquivo */
    ch-app-word:Documents:ADD(SESSION:TEMP-DIRECTORY + "/" + pcArqH). /* Abre o arquivo */

    END PROCEDURE.

    PROCEDURE pi-head.

    INPUT STREAM sInput FROM VALUE(gcDiretorio).
    OUTPUT STREAM sOutput TO VALUE(SESSION:TEMP-DIRECTORY + "/" + pcArqH) NO-CONVERT.

    REPEAT:
    IMPORT STREAM sInput UNFORMAT cLinha.
    IF INDEX(cLinha,"@") > 0 THEN DO:
    ASSIGN cLinha = REPLACE(cLinha, "@numeroOrdem", string(ord-manut.nr-ord-produ)).
    //ASSIGN cLinha = REPLACE(cLinha, "#Teste2","TESTE 2").
    END.
    IF INDEX(cLinha,"@descricaoOrdem") > 0 THEN
    DO:
    ASSIGN cLinha = REPLACE(cLinha,"@descricaoOrdem", ord-manut.des-man-corr).
    END.
    IF INDEX(cLinha,"@equipamento") > 0 THEN DO:
    ASSIGN cLinha = REPLACE(cLinha,"@equipamento",equipto.cd-equipto).
    END.
    IF INDEX(cLinha,"@descricaoEquipamento") > 0 THEN DO:
    ASSIGN cLinha = REPLACE(cLinha,"@descricaoEquipamento",equipto.descricao).
    END.
    IF INDEX(cLinha,"@tag") > 0 THEN DO:
    ASSIGN cLinha = REPLACE(cLinha,"@tag",ord-manut.cd-tag).
    END.
    IF INDEX(cLinha,"@descricaoTag") > 0 THEN DO:
    ASSIGN cLinha = REPLACE(cLinha,"@descricaoTag",tag.descricao).
    END.
    IF INDEX(cLinha,"@manutencao") > 0 THEN DO:
    ASSIGN cLinha = REPLACE(cLinha,"@manutencao",ord-manut.cd-manut).
    END.
    IF INDEX(cLinha,"@descricaoManutencao") > 0 THEN DO:
    ASSIGN cLinha = REPLACE(cLinha,"@descricaoManutencao",tag.descricao).
    END.
    IF INDEX(cLinha,"@dataPrevistaManutencao") > 0 THEN DO:
    ASSIGN cLinha = REPLACE(cLinha,"@dataPrevistaManutencao",string(ord-manut.dt-manut,"99/99/9999")).
    END.
    IF INDEX(cLinha,"@dataInicioMaisCedo") > 0 THEN DO:
    ASSIGN cLinha = REPLACE(cLinha,"@dataInicioMaisCedo",string(ord-manut.dt-ini-cedo,"99/99/9999")).
    END.
    IF INDEX(cLinha,"@dataPrevistaTermino") > 0 THEN DO:
    ASSIGN cLinha = REPLACE(cLinha,"@dataPrevistaTermino",string(ord-manut.dt-prev,"99/99/9999")).
    END.
    IF INDEX(cLinha,"@dataInicioMaisTarde") > 0 THEN DO:
    ASSIGN cLinha = REPLACE(cLinha,"@dataInicioMaisTarde",string(ord-manut.dt-ini-tarde,"99/99/9999")).
    END.
    IF INDEX(cLinha,"@equipe") > 0 THEN DO:
    ASSIGN cLinha = REPLACE(cLinha,"@equipe",ord-manut.cd-equip-res).
    END.
    IF INDEX(cLinha,"@descricaoEquipe") > 0 THEN DO:
    ASSIGN cLinha = REPLACE(cLinha,"@descricaoEquipe",equipe.desc-equipe).
    END.
    IF INDEX(cLinha,"@planejador") > 0 THEN DO:
    ASSIGN cLinha = REPLACE(cLinha,"@planejador",ord-manut.cd-planejado).
    END.
    IF INDEX(cLinha,"@unidadeNegocio") > 0 THEN DO:
    ASSIGN cLinha = REPLACE(cLinha,"@unidadeNegocio",ord-manut.cod-unid-neg).
    END.
    /*
    IF INDEX(cLinha,"@narrativaOrdem") > 0 THEN
    DO:
    FOR EACH ttTexto NO-LOCK
    BREAK BY ttTexto.idFormulario:
    IF FIRST-OF(ttTexto.idFormulario) THEN
    DO:
    ASSIGN cLinha = REPLACE(cLinha, "@narrativaOrdem", ttTexto.texto).
    END.
    ELSE DO:
    ASSIGN
    cLinha = cLinha + "\par"
    cLinha = cLinha + "\" + strinG(ttTexto.pos) + ttTexto.texto.
    //cLinha = cLinha + ttTexto.texto.
    END.
    END.
    cLinha = REPLACE(cLinha, CHR(10), "\par").
    END.
    */
    IF INDEX(cLinha,"@numeroDecimal") > 0 THEN
    DO:
    cLinha = REPLACE(cLinha,"@numeroDecimal",STRING(valorFor)).

    END.
    //PUT STREAM soutput UNFORMATTED "{\rtf1\ansi" SKIP.
    //PUT STREAM soutput UNFORMATTED "{rtf1\ansi" SKIP.
    PUT STREAM sOutput UNFORMATTED cLinha SKIP.
    //PUT STREAM sOutput UNFORMATTED "}" SKIP.
    end.

    //PUT STREAM sOutput "~\par }}".
    INPUT STREAM sInput CLOSE.
    OUTPUT STREAM sOutput CLOSE.

    //ch-app-word:Documents:ADD(SESSION:TEMP-DIRECTORY + "/" + "head.doc"). /* Abre o arquivo */
    //ch-app-word:Documents:ADD(SESSION:TEMP-DIRECTORY + "/" + pcArqH). /* Abre o arquivo */
    ch-app-Word:Selection:EndKey(6). /* Posiciona o Word no final da pÿgina */
    ch-app-Word:Selection:InsertFile(SESSION:TEMP-DIRECTORY + "/" + pcArqH). /* Inseri arquivo body*/
    END PROCEDURE.

    PROCEDURE pi-body.

    DEF VAR i-taref AS INTEGER NO-UNDO.
    DEF VAR i AS INTEGER NO-UNDO.
    DEF VAR c-linha AS LONGCHAR NO-UNDO.
    DEF VAR i-linhas AS INTEGER NO-UNDO.
    DEF VAR l-nar AS LOG NO-UNDO.
    DEF VAR l-primeiro AS LOG NO-UNDO.
    DEF VAR l-reserva AS LOG NO-UNDO.

    FOR EACH ord-taref NO-LOCK USE-INDEX codigo
    WHERE ord-taref.nr-ord-produ = ord-manut.nr-ord-produ.
    //BREAK BY ord-taref.nr-ord-produ:
    ASSIGN l-nar = NO.
    IF ord-taref.narrativa <> "" THEN
    DO:
    ASSIGN l-nar = YES.
    CREATE ttFormulario.
    ASSIGN ttFormulario.idFormulario = ord-taref.cd-tarefa
    ttFormulario.conteudo = ord-taref.narrativa.

    /* Quebrar o texto original em linhas e armazenar na tabela temporária */
    DO i = 1 TO NUM-ENTRIES(ttFormulario.conteudo, CHR(10)):

    ASSIGN cLinha = ENTRY(i, ttFOrmulario.conteudo, CHR(10)).
    CREATE ttTexto.
    ASSIGN ttTexto.texto = cLinha + "\par"
    ttTexto.pos = i
    ttTexto.idFormulario = ttFormulario.idFormulario.
    END.
    /*
    IF ord-taref.cd-tarefa = 20 THEN
    DO:
    FOR EACH ttTexto NO-LOCK
    WHERE ttTexto.idFormulario = 20:
    MESSAGE ttTexto.texto
    VIEW-AS ALERT-BOX INFORMATION BUTTONS OK.
    END.
    END.
    */
    /*
    IF INDEX(ttFormulario.conteudo, CHR(32)) > 0 THEN
    DO:
    MESSAGE ENTRY(1,ttFormulario.conteudo,CHR(32))
    VIEW-AS ALERT-BOX INFORMATION BUTTONS OK.
    END.
    */
    /*
    FOR EACH ttTexto NO-LOCK
    WHERE ttTexto.idFormulario = 2:
    MESSAGE ttTexto.idFOrmulario ttTexto.texto
    VIEW-AS ALERT-BOX INFORMATION BUTTONS OK.
    END.
    */
    END.
    EMPTY TEMP-TABLE tt-layout.
    INPUT STREAM sInput FROM VALUE(gcDiretorio).
    REPEAT:
    CREATE tt-layout.
    IMPORT STREAM sInput UNFORMATTED tt-layout.linha.
    END.
    INPUT STREAM sInput CLOSE.

    FIND FIRST ord-esp NO-LOCK
    WHERE ord-esp.nr-ord-produ = ord-taref.nr-ord-produ
    AND ord-esp.cd-tarefa = ord-taref.cd-tarefa NO-ERROR.

    FIND FIRST mi-espec NO-LOCK
    WHERE mi-espec.tp-especial = ord-esp.tp-especial NO-ERROR.

    FOR EACH tt-layout.
    ASSIGN cLinha = tt-layout.linha.
    RUN pi-dados.
    ASSIGN tt-layout.linha = cLinha.

    ASSIGN i-count = 0
    l-reserva = NO.

    FOR EACH reservas NO-LOCK
    WHERE reservas.nr-ord-produ = ord-manut.nr-ord-produ
    AND reservas.op-codigo = ord-taref.cd-tarefa,
    FIRST ITEM OF reservas NO-LOCK.

    ASSIGN l-reserva = YES.
    i-count = i-count + 1.
    i-linhas = i-linhas + 1.
    ASSIGN cLinha = tt-layout.linha.
    RUN pi-dados-itens.
    ASSIGN tt-layout.linha = cLinha.
    END.
    ASSIGN i-count = 0.
    //Limpar layout
    IF INDEX(tt-layout.linha, "@narrativaTarefa") > 0 THEN
    DO:
    IF l-nar = YES THEN
    DO:

    RUN pi-print-editor(INPUT ord-taref.narrativa, INPUT 500).
    FOR EACH tt-editor:
    IF tt-editor.linha = 1 THEN
    DO:
    ASSIGN tt-layout.linha = REPLACE(tt-layout.linha,"@narrativaTarefa",SUBSTRING(tt-editor.conteudo,1,500)).
    END.
    ELSE DO:
    ASSIGN
    tt-layout.linha = tt-layout.linha + "\par" + " "
    tt-layout.linha = tt-layout.linha + SUBSTRING(tt-editor.conteudo,1,500).
    END.
    END.
    /*
    // ASSIGN tt-layout.linha = REPLACE(tt-layout.linha,"@mensagem",mensagem.texto-mensag).
    FOR EACH ttTexto NO-LOCK
    WHERE ttTexto.idFormulario = ord-taref.cd-tarefa
    BREAK BY ttTexto.idFormulario:
    IF FIRST-OF(ttTexto.idFormulario) THEN
    DO:
    ASSIGN tt-layout.linha = REPLACE(tt-layout.linha, "@narrativaTarefa", ttTexto.texto)
    tt-layout.linha = tt-layout.linha.
    END.
    ELSE DO:

    ASSIGN
    //tt-layout.linha = REPLACE(tt-layout.linha,CHR(32),"\par")
    //tt-layout.linha = REPLACE(tt-layout.linha,CHR(10),"\par")
    //tt-layout.linha = tt-layout.linha + "\par"
    tt-layout.linha = tt-layout.linha + ttTexto.texto.
    //cLinha = cLinha + ttTexto.texto.
    END.
    END.
    */
    END.
    END.
    IF INDEX(tt-layout.linha, "@mensagem") > 0 THEN
    DO:
    // ASSIGN tt-layout.linha = REPLACE(tt-layout.linha,"@mensagem",mensagem.texto-mensag).
    FOR EACH ttTexto NO-LOCK
    WHERE ttTexto.idFormulario = 1
    BREAK BY ttTexto.idFormulario:
    IF FIRST-OF(ttTexto.idFormulario) THEN
    DO:
    ASSIGN tt-layout.linha = REPLACE(tt-layout.linha, "@mensagem", ttTexto.texto).
    tt-layout.linha = tt-layout.linha + "\par".
    END.
    ELSE DO:

    ASSIGN
    //tt-layout.linha = REPLACE(tt-layout.linha,CHR(32),"\par")
    //tt-layout.linha = REPLACE(tt-layout.linha,CHR(10),"\par")
    //tt-layout.linha = tt-layout.linha + "\par"
    tt-layout.linha = tt-layout.linha + ttTexto.texto.

    //cLinha = cLinha + ttTexto.texto.
    END.
    END.
    END.
    END.
    FOR EACH tt-layout:
    ASSIGN i-count = i-count + 1.
    ASSIGN cLinha = tt-layout.linha.
    RUN pi-limpar.
    ASSIGN tt-layout.linha = cLinha.
    END.

    OUTPUT STREAM sOutput TO VALUE(SESSION:TEMP-DIRECTORY + "/" + pcArqB) NO-CONVERT.
    FOR EACH tt-layout:
    PUT STREAM sOutput UNFORMATTED tt-layout.linha SKIP.
    END.
    //PUT STREAM sOutput "}}":U.

    OUTPUT STREAM sOutput CLOSE.
    ch-app-Word:Selection:EndKey(6). /* Posiciona o Word no final da pÿgina */
    //ch-app-word:SELECTION:InsertBreak(2).
    ch-app-Word:Selection:InsertFile(SESSION:TEMP-DIRECTORY + "/" + pcArqB). /* Inseri arquivo body*/
    END.
    END PROCEDURE.
    PROCEDURE pi-dados.
    IF INDEX(cLinha,"@numeroTarefa") > 0 THEN DO:
    ASSIGN cLinha = REPLACE(cLinha,"@numeroTarefa",string(ord-taref.cd-tarefa)).
    END.
    IF INDEX(cLinha,"@descricaoTarefa") > 0 THEN
    ASSIGN cLinha = REPLACE(cLinha,"@descricaoTarefa",ord-taref.descricao).
    IF INDEX(cLinha,"@especialidade") > 0 THEN
    DO:
    IF AVAIL mi-espec THEN ASSIGN cLinha = REPLACE(cLinha,"@especialidade",mi-espec.tp-especial).
    ELSE ASSIGN cLinha = REPLACE(cLinha,"@especialidade","").
    END.
    IF INDEX(cLinha,"@descricaoEspecialidade") > 0 THEN
    DO:
    IF AVAIL mi-espec THEN ASSIGN cLinha = REPLACE(cLinha,"@descricaoEspecialidade",mi-espec.descricao).
    ELSE cLinha = REPLACE(cLinha,"@descricaoEspecialidade","").
    END.
    /*
    IF INDEX(cLinha,"@narrativaTarefa") > 0 THEN
    DO:
    ASSIGN cLinha = REPLACE(cLinha,"@narrativaTarefa",ord-taref.narrativa).
    END.
    */

    END PROCEDURE.

    PROCEDURE pi-dados-itens.
    IF INDEX(cLinha,"@ITEM") > 0 THEN
    DO:
    ASSIGN cLinha = REPLACE(cLinha,"@ITEM","ITEM").
    END.
    IF INDEX(cLinha,"@DESCRICAO") > 0 THEN
    DO:
    ASSIGN cLinha = REPLACE(cLinha,"@DESCRICAO","DESCRICAO").
    END.
    IF INDEX(cLinha,"@QUANTIDADE") > 0 THEN
    DO:
    ASSIGN cLinha = REPLACE(cLinha,"@QUANTIDADE","QUANTIDADE").
    END.
    IF INDEX(cLinha,"@LOCALIZACAO") > 0 THEN
    DO:
    ASSIGN cLinha = REPLACE(cLinha,"@LOCALIZACAO","LOCALIZACAO").
    END.
    IF INDEX(cLinha,"@" + string(i-count,"99") + "item") > 0 THEN DO:
    ASSIGN cLinha = REPLACE(cLinha,"@" + string(i-count,"99")+ "item",ITEM.it-codigo).
    END.
    IF INDEX(cLinha,"@" + string(i-count,"99") + "descricaoItem") > 0 THEN
    ASSIGN cLinha = REPLACE(cLinha,"@" + string(i-count,"99") + "descricaoItem",substr(ITEM.desc-item,1,60)).
    IF INDEX(cLinha,"@" + string(i-count,"99") + "quantidadeItem") > 0 THEN
    ASSIGN cLinha = REPLACE(cLinha,"@" + string(i-count,"99") + "quantidadeItem",string(reservas.quant-orig,">>9.9999")).
    IF INDEX(cLinha,"@" + string(i-count,"99") + "localizacaoItem") > 0 THEN
    ASSIGN cLinha = REPLACE(cLinha,"@" + string(i-count,"99") + "localizacaoItem",reservas.cod-localiz).

    END PROCEDURE.
    PROCEDURE pi-footer.

    INPUT STREAM sInput FROM VALUE(gcDiretorio).
    OUTPUT STREAM sOutput TO VALUE(SESSION:TEMP-DIRECTORY + "/" + pcArqF) NO-CONVERT.

    REPEAT:
    IMPORT STREAM sInput UNFORMAT cLinha.
    PUT STREAM sOutput UNFORMATTED cLinha SKIP.
    end.

    //PUT STREAM sOutput "~\par }}".
    INPUT STREAM sInput CLOSE.
    OUTPUT STREAM sOutput CLOSE.

    ch-app-Word:Selection:EndKey(6). /* Posiciona o Word no final da pÿgina */
    //ch-app-word:SELECTION:InsertBreak(2).
    ch-app-Word:Selection:InsertFile(SESSION:TEMP-DIRECTORY + "/" + pcArqF). /* Inseri arquivo body*/

    END PROCEDURE.

    PROCEDURE pi-limpar.
    IF INDEX(cLinha,"@ITEM") > 0 THEN ASSIGN cLinha = TRIM(REPLACE(cLinha,"@ITEM","")).
    IF INDEX(cLinha,"@DESCRICAO") > 0 THEN ASSIGN cLinha = TRIM(REPLACE(cLinha,"@DESCRICAO","")).
    IF INDEX(cLinha,"@QUANTIDADE") > 0 THEN ASSIGN cLinha = TRIM(REPLACE(cLinha,"@QUANTIDADE","")).
    IF INDEX(cLinha,"@LOCALIZACAO") > 0 THEN ASSIGN cLinha = TRIM(REPLACE(cLinha,"@LOCALIZACAO","")).
    DO i-count = 1 TO 44:
    IF INDEX(cLinha,"@" + string(i-count,"99") + "item -") > 0 THEN DO:
    ASSIGN cLinha = trim(REPLACE(cLinha,"@" + string(i-count,"99")+ "item -","")).
    END.
    IF INDEX(cLinha,"@" + string(i-count,"99") + "descricaoItem") > 0 THEN
    ASSIGN cLinha = trim(REPLACE(cLinha,"@" + string(i-count,"99") + "descricaoItem","")).
    IF INDEX(cLinha,"@" + string(i-count,"99") + "quantidadeItem") > 0 THEN
    ASSIGN cLinha = trim(REPLACE(cLinha,"@" + string(i-count,"99") + "quantidadeItem","")).
    IF INDEX(cLinha,"@" + string(i-count,"99") + "localizacaoItem") > 0 THEN DO:
    ASSIGN cLinha = trim(REPLACE(cLinha,"@" + string(i-count,"99") + "localizacaoItem","")).
    IF LENGTH(cLinha) = 4 AND cLinha = "\par" THEN
    DO:
    ASSIGN cLinha = REPLACE(cLinha,"\par"," ").
    END.
    IF INDEX(cLinha,"Ferramentaria") > 0 THEN
    DO:
    MESSAGE cLinha
    VIEW-AS ALERT-BOX INFORMATION BUTTONS OK.
    END.

    /*
    MESSAGE cLinha LENGTH(cLinha)
    VIEW-AS ALERT-BOX INFORMATION BUTTONS OK.
    //cLinha = REPLACE(cLinha,"\par"," ").
    */
    END.
    END.
    END PROCEDURE.
    /*
    ASSIGN c-impressora-padrao = SESSION:pRINTER-NAME.
    /* Seleciona a impressora para impressão */
    gchWord:ActivePrinter = tt-param-aux.impressora-so.
    /* Imprime o documento na impressora selecionada */
    gchWord:printout(0). /* 0 : Não mostra erros nem advertencias */
    /* Volta a impressora padrão do windows */
    gchWord:ActivePrinter = c-impressora-padrao.
    */

    PROCEDURE pi-finaliza:

    ch-app-word:ActiveDocument:SaveAs(c-arq-saida).
    ch-app-word:ActiveDocument:Close.
    //ch-app-word:VISIBLE = YES.

    ch-app-word:Quit(false).
    RELEASE OBJECT ch-app-word. /* Elimina o endere»o utilizado para o WORD na mÿquina */

    /*
    OS-DELETE VALUE(SESSION:TEMP-DIRECTORY + "/" + pcArqH) NO-ERROR.
    OS-DELETE VALUE(SESSION:TEMP-DIRECTORY + "/" + pcArqB) NO-ERROR.
    OS-DELETE VALUE(SESSION:TEMP-DIRECTORY + "/" + pcArqF) NO-ERROR.
    */
    //OS-COMMAND no-wait value(c-arq-saida).

    END PROCEDURE.

    PROCEDURE pi-imprimir.

    DEFINE VAR i AS INTEGER NO-UNDO.

    /* Adiciona um atraso */
    DO i = 1 TO 5:
    PAUSE 1.
    END.

    IF search(c-arq-saida) <> ? THEN DO:
    CREATE "Word.Application" ch-app-word.
    ch-app-word:VISIBLE = NO.
    ch-app-word:Documentos:OPEN(c-arq-saida).
    /*
    MESSAGE SESSION:pRINTER-NAME
    VIEW-AS ALERT-BOX INFORMATION BUTTONS OK.
    */
    ch-app-word:ActivePrinter = SESSION:pRINTER-NAME.
    ch-app-word:printout(0).
    ch-app-word:QUIT(FALSE).
    RELEASE OBJECT ch-app-word.
    END.
    ELSE DO:
    MESSAGE "Arquivo não encontrado: " c-arq-saida VIEW-AS ALERT-BOX ERROR.
    END.

    /*
    CREATE "Word.Application" ch-app-word.
    ch-app-word:VISIBLE = FALSE.
    ch-app-word:Documentos:OPEN(c-arq-saida).
    //ch-app-word:Documents:ADD(SESSION:TEMP-DIRECTORY + "/" + pcArqH). /* Abre o arquivo */
    MESSAGE SESSION:pRINTER-NAME
    VIEW-AS ALERT-BOX INFORMATION BUTTONS OK.

    ch-app-word:ActivePrinter = SESSION:pRINTER-NAME.
    ch-app-word:printout(0).
    ch-app-word:QUIT(FALSE).
    RELEASE OBJECT ch-app-word.
    */
    END PROCEDURE.

Compartilhe esta Página