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
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-wordocuments:ADD(SESSION:TEMP-DIRECTORY + "/" + "head.doc"). /* Abre o arquivo */ ch-app-wordocuments: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-wordocuments:ADD(SESSION:TEMP-DIRECTORY + "/" + "head.doc"). /* Abre o arquivo */ //ch-app-wordocuments: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 = SESSIONRINTER-NAME. /* Seleciona a impressora para impressão */ gchWord:ActivePrinter = tt-param-aux.impressora-so. /* Imprime o documento na impressora selecionada */ gchWordrintout(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-wordocumentos:OPEN(c-arq-saida). /* MESSAGE SESSIONRINTER-NAME VIEW-AS ALERT-BOX INFORMATION BUTTONS OK. */ ch-app-word:ActivePrinter = SESSIONRINTER-NAME. ch-app-wordrintout(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-wordocumentos:OPEN(c-arq-saida). //ch-app-wordocuments:ADD(SESSION:TEMP-DIRECTORY + "/" + pcArqH). /* Abre o arquivo */ MESSAGE SESSIONRINTER-NAME VIEW-AS ALERT-BOX INFORMATION BUTTONS OK. ch-app-word:ActivePrinter = SESSIONRINTER-NAME. ch-app-wordrintout(0). ch-app-word:QUIT(FALSE). RELEASE OBJECT ch-app-word. */ END PROCEDURE.
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-wordocuments:ADD(SESSION:TEMP-DIRECTORY + "/" + "head.doc"). /* Abre o arquivo */ ch-app-wordocuments: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-wordocuments:ADD(SESSION:TEMP-DIRECTORY + "/" + "head.doc"). /* Abre o arquivo */ //ch-app-wordocuments: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 = SESSIONRINTER-NAME. /* Seleciona a impressora para impressão */ gchWord:ActivePrinter = tt-param-aux.impressora-so. /* Imprime o documento na impressora selecionada */ gchWordrintout(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-wordocumentos:OPEN(c-arq-saida). /* MESSAGE SESSIONRINTER-NAME VIEW-AS ALERT-BOX INFORMATION BUTTONS OK. */ ch-app-word:ActivePrinter = SESSIONRINTER-NAME. ch-app-wordrintout(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-wordocumentos:OPEN(c-arq-saida). //ch-app-wordocuments:ADD(SESSION:TEMP-DIRECTORY + "/" + pcArqH). /* Abre o arquivo */ MESSAGE SESSIONRINTER-NAME VIEW-AS ALERT-BOX INFORMATION BUTTONS OK. ch-app-word:ActivePrinter = SESSIONRINTER-NAME. ch-app-wordrintout(0). ch-app-word:QUIT(FALSE). RELEASE OBJECT ch-app-word. */ END PROCEDURE.