Muy buenas tardes.
Hace un tiempo atr谩s, logre poder actualizar una plantilla Word, con datos variables y funciono muy bien.
He buscado en el foro algo que se ajuste a lo que necesito, pero no doy.
Pues ahora a esta misma plantilla, necesito incorporar 2 cosas:
- Un codigo QR, generado por dos datos variables (nFicha + cRut).
- Firma del profesional medico que se encuentra en BMP.
Actualmente lo que hace esta funci贸n, es abrir el archivo plantilla Word, reemplazar los campos variables que vienen de una dbf, grabar archivo en disco y al finalizar, imprimir una copia de este documento.
Hoy requiero, despu茅s de poder incorporar el QR y Firma, dar la opci贸n de Imprimir directo o Exportar a PDF.
Necesito resolverlo con urgencia.
Saludos
Antonio
C贸digo Funcionando Actualmente de la Funci贸n:
Function Genera_Examen_Altura(nFicha,cTAte,dfec,cNom,cRut,nEdad,cNaci,cOtos,cVis,cPes,cAlt,cPart,cPul,cFres,cEle,cGli,cEva,cHem,cUre,cOri)
聽 聽Local oWord, oSel, oDoc,cOrigen,cDestino,cFile,cSave, Nom1,rut1,naci1,cFilep,cSavep,cDestinop
聽 聽local oActiveDoc,aArrReplace, n
聽 聽 聽IF MsgYesNo( "Desea Generar ARCHIVOS EXAMENES ALTURA / PRE-OCU ?","Ingrese Opci贸n")
聽 聽 聽 聽 聽 聽 聽 聽 Do Case
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 Case Tip_Ate1=="A"
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 If (Empty(cNom).or.Empty(cRut).or.Empty(nEdad).or.Empty(cNaci).or.Empty(cOtos).or.Empty(cVis).or.Empty(cPes) .or. Empty(cAlt).or. Empty(cPart) .or. Empty(cPul).or.Empty(cFres).or.Empty(cEva).or.Empty(cEle).or.Empty(cGli))
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽Tone(3000)
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽MsgInfo("Revise, Faltan Relacionados a Examen de Altura")
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽Return .F.
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 Endif
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 MsgInfo( "Atenci贸n: " 聽+ CRLF +;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 "En estos momentos Ud.Generar谩 e Imprimir谩" + CRLF +;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 "Un Informe de Examen de Altura, por lo que" + CRLF +;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 "Esperar hasta que se muestre un aviso con" + CRLF +;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 "El Nombre del Informe Generado, en ese momento" 聽+ CRLF +;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 "El Proceso habra terminado.")
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 Case Tip_Ate1=="P"
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 If (Empty(cNom).or.Empty(cRut).or.Empty(nEdad).or.Empty(cNaci).or.Empty(cOtos).or.Empty(cVis).or.Empty(cPes);
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 .or. Empty(cAlt).or. Empty(cPart) .or. Empty(cPul).or.Empty(cFres).or.Empty(cEva).or.Empty(cEle).or.Empty(cGli).or. Empty(cHem).or.Empty(cUre).or.Empty(cOri))
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽Tone(3000)
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽MsgInfo("Revise, Faltan Datos Relacionados a Examen de Altura o Pre-Ocupacional")
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽Return .F.
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 Endif
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 MsgInfo( "Atenci贸n: " 聽+ CRLF +;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 "En estos momentos Ud.Generar谩 e Imprimir谩" + CRLF +;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 "Un Informe de Examen de Altura y un Pre-Ocupacional" + CRLF +;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 "Esperar hasta que se muestre 2 avisos con El Nombre" + CRLF +;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 "de los Informes Generados, en ese momento El Proceso" 聽+ CRLF +;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 "habra terminado.")
聽 聽 聽 聽 聽 聽 聽 聽 聽EndCase
聽 聽 聽 聽 聽 聽 聽 聽 cNom:= AnsiToOem(cNom)
聽 聽 聽 聽 聽 聽 聽 聽 nEva:= aScan(aEvaMed, 聽 { | array | array[1] == cEva} )
聽 聽 聽 聽 聽 聽 聽 聽 cEva=aEvaMed[nEva ][2] 聽 // 聽<--- Obtener Nombre del dato del arreglo
聽 聽 聽 聽 聽 聽 聽 聽 cEle:= AnsiToOem(cEle)
聽 聽 聽 聽 聽 聽 聽 聽 cGli:= AnsiToOem(cGli)
聽 聽 聽 聽 聽 聽 聽 聽 cOrigen 聽:= 聽hb_CurDrive()+":\"+curdir()+"\Examenes\Doc_Bases\"
聽 聽 聽 聽 聽 聽 cDestinoa := hb_CurDrive()+":\"+curdir()+"\Examenes\Altura\"
聽 聽 聽 聽 聽 聽 cDestinop := hb_CurDrive()+":\"+curdir()+"\Examenes\Pre-Ocu\"
聽 聽 聽 聽 聽 聽 cFile := "AlturaBase.docx"
聽 聽 聽 聽 聽 聽 cSave := "Altura-"+alltrim(Str(nFicha,10))+"-"+cNom+".doc"
聽 聽 聽 聽 聽 聽 聽 聽 cFilep := "PreocuBase.docx"
聽 聽 聽 聽 聽 聽 cSavep := "Pre-"+alltrim(Str(nFicha,10))+"-"+cNom+".doc"
聽 聽 聽 聽 聽 聽 聽 聽 If lDocAbierto(cOrigen + cFile) 聽 聽 聽//variable que contiene path , nombre, y ext. del fichero modelo o plantilla
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 MsgStop("Documento " + cFile + " est谩 abierto.","Alto")
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 Return .f.
聽 聽 聽 聽 聽 聽 endif
聽 聽 聽 聽 聽 聽 聽 聽 */
聽 聽 聽 聽 聽 聽 TRY
聽 聽 聽 聽 聽 聽 聽 聽 聽oWord := win_oleCreateObject( "Word.Application")
聽 聽 聽 聽 聽 聽 聽CATCH
聽 聽 聽 聽 聽 聽 聽 聽 聽MsgInfo("Word no est谩 instalado en esta PC. No se puede continuar")
聽 聽 聽 聽 聽 聽 聽 聽 聽Return NIL
聽 聽 聽 聽 聽 聽 聽END
聽 聽 聽 聽 聽 聽 聽TRY
聽 聽 聽 聽 聽 聽 聽 聽 聽oDoc := oWord:Documents:Open(cOrigen + cFile)
聽 聽 聽 聽 聽 聽 聽CATCH
聽 聽 聽 聽 聽 聽 聽 聽 聽MsgInfo("No se puede abrir el archivo plantilla " + cOrigen + cFile)
聽 聽 聽 聽 聽 聽 聽 聽 聽oWord:Quit()
聽 聽 聽 聽 聽 聽 聽 聽 聽Return NIL
聽 聽 聽 聽 聽 聽 聽END
聽 聽 聽 聽 聽 聽 聽oDoc:Select()
聽 聽 聽 聽 聽 聽 聽oSel = oWord:Selection
聽 聽 聽 聽 聽 聽 聽aArrReplace := { { "[nombrepaciente]", AllTrim(cNom) } ,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 { "[rut]" 聽 聽 聽 聽 聽 , AllTrim(cRut) } ,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 { "[edad]" 聽 聽 聽 聽 聽, AllTrim(Str(nEdad,3)) } ,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ "[naciona]" 聽 聽 聽 , AllTrim(cNaci) },;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ "[otos]" 聽 聽 聽 聽 聽, AllTrim(cOtos) },;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ "[visi]" 聽 聽 聽 聽 聽, AllTrim(cVis) },;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ "[pes]" 聽 聽 聽 聽 聽 聽 聽 , AllTrim(cPes) },;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ "[alt]" 聽 聽 聽 聽 聽 聽 聽 , AllTrim(cAlt) },;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ "[par]" 聽 聽 聽 聽 聽 聽 聽 , AllTrim(cPart) },;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ "[pul]" 聽 聽 聽 聽 聽 聽 聽 , AllTrim(cPul) },;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ "[fr]" 聽 聽 聽 聽 聽 聽 聽 聽, AllTrim(cFres) },;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ "[eva]" 聽 聽 聽 聽 聽 聽 聽 , AllTrim(cEva) },;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ "[ekg]" 聽 聽 聽 聽 聽 聽 聽 , AllTrim(cEle) },;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ "[gli]" 聽 聽 聽 聽 聽 聽 聽 , AllTrim(cGli) },;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ "[fate]" 聽 聽 聽 聽 聽, Dtoc(dfec) } }
聽 聽 聽 聽 聽 聽 聽For n:=1 to Len(aArrReplace)
聽 聽 聽 聽 聽 聽 聽 聽 聽Reemplaza_Text_F2( oSel, aArrReplace[n][1], aArrReplace[n][2] )
聽 聽 聽 聽 聽 聽 聽Next n
聽 聽 聽 聽 聽 聽 聽 聽 oWord:ActiveDocument:SaveAs(cDestinoa + cSave)
聽 聽 聽 聽 聽// 聽 聽 oWord:ActiveDocument:PrintOut() 聽 聽 // Habilitar Imprime Dcoumento
聽 聽 聽 聽 聽 聽 oWord:ActiveDocument:Close()
聽 聽 聽 聽 聽 聽 聽SysRefresh()
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 MsgInfo(" Examen de Altura Generado "+cSave)
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 ** Si Existe Pre-Ocupacional
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 If cTAte = "P"
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 If lDocAbierto(cOrigen + cFilep ) 聽 聽 聽//variable que contiene path , nombre, y ext. del fichero modelo o plantilla
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 MsgStop("Documento " + cFilep + " est谩 abierto.","Alto")
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 Return .f.
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 endif
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 TRY
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽oWord := win_oleCreateObject( "Word.Application")
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 CATCH
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽MsgInfo("Word no est谩 instalado en esta PC. No se puede continuar")
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽Return NIL
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 END
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 TRY
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 oDoc := oWord:Documents:Open(cOrigen + cFilep )
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 CATCH
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 MsgInfo("No se puede abrir el archivo plantilla " + cOrigen + cFilep)
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 oWord:Quit()
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 Return NIL
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 END
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽* 聽oWord:=.T. 聽 // Para Mostrar
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 oDoc:Select()
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 oSel = oWord:Selection
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 // Crear Matriz de reemplazos
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 aArrReplace := { { "[nombrepaciente]", AllTrim(cNom) } ,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ "[rut]" 聽 聽 聽 聽 聽 , AllTrim(cRut) } ,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ "[edad]" 聽 聽 聽 聽 聽, AllTrim(Str(nEdad,3)) } ,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ "[naciona]" 聽 聽 聽 , AllTrim(cNaci) },;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ "[pes]" 聽 聽 聽 聽 聽 聽 聽 , AllTrim(cPes) },;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ "[alt]" 聽 聽 聽 聽 聽 聽 聽 , AllTrim(cAlt) },;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ "[par]" 聽 聽 聽 聽 聽 聽 聽 , AllTrim(cPart) },;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ "[ekg]" 聽 聽 聽 聽 聽 聽 聽 , AllTrim(cEle) },;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ "[eva]" 聽 聽 聽 聽 聽 聽 聽 , AllTrim(cEva) },;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ "[gli]" 聽 聽 聽 聽 聽 聽 聽 , AllTrim(cGli) },;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ "[hem]" 聽 聽 聽 聽 聽 聽 聽 , AllTrim(cHem) },;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ "[ure]" 聽 聽 聽 聽 聽 聽 聽 , AllTrim(cUre) },;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ "[ori]" 聽 聽 聽 聽 聽 聽 聽 , AllTrim(cOri) },;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ "[fate]" 聽 聽 聽 聽 聽, Dtoc(dfec) } }
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 For n:=1 to Len(aArrReplace)
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 Reemplaza_Text_F2( oSel, aArrReplace[n][1], aArrReplace[n][2] )
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 Next n
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 oWord:ActiveDocument:SaveAs(cDestinop + cSavep)
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 // 聽oWord:ActiveDocument:PrintOut() 聽 聽 // Habilitar Para Imprimir
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 oWord:ActiveDocument:Close()
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 SysRefresh()
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 MsgInfo(" Examen de Pre-Ocupacional Generado "+cSavep)
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 Endif
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 ** Fin Pre-Ocupa
聽 聽 聽 聽 聽Endif
Return nil
//---------------------------------------------------//
Static Function Reemplaza_Text_F2( oSel, cSrc, cRpl)
聽 聽 Local wdCollapseEnd:=0
聽 聽 LOCAL oRng := oSel:Content
聽 聽 IF AT( cSrc, oRng:Text ) = 0
聽 聽 聽 聽 RETURN .F.
聽 聽 ENDIF
聽 聽 WHILE oRng:Execute( cSrc )
聽 聽 聽 聽 oRng:Text = cRpl
聽 聽 聽 聽 oRng:Collapse( wdCollapseEnd )
聽 聽 ENDDO
RETURN .T.
// Para Consultar si Archivo Plantilla esta Abierto
Function lDocAbierto(cDocName)
聽 聽 聽 聽 Local FO_EXCLUSIVE := 16
聽 聽 聽 聽 local lOpen:=.f., nHand
聽 聽 聽 聽 聽 If ( nHand := FOPEN(cDocName, FO_EXCLUSIVE ) ) = -1
聽 聽 聽 聽 聽 聽 聽lOpen := .t.
聽 聽 聽 聽 聽 Else
聽 聽 聽 聽 聽 聽 聽FCLOSE( nHand )
聽 聽 聽 聽 聽 Endif
聽 聽 聽 聽 Return lOpen