Problemas con tWord y reemplazar variables
Posted: Mon Aug 21, 2006 6:28 pm
Hola amigos :
He utilizado lo desarrollado por Jose - y posteriormente modificado o aclarado por Manuel Valdenebro. WORDMCN.PRG. Y todo parece funcionar bien. Excepto que no consigo que lo puesto entre corchetes en el documento word lo reemplace por el dato del campo del fichero y esto hace que se quede en el bucle y no salga.
Por si os puede ayudar a continuación pongo el codigo:
store Curdrive() to xdri
store xdri + ":\" + curdir(xdri) + "\" to xdir
store xdir + "EMP" + empr + "\cert" + ejer + ".doc" to fich
store xdir + "certmode.doc" to fic1
if file (fich)
if MsgYesNo("El Certificado se ha emitido anteriormente," + chr(13) +;
" ¿ Desea recacerlo ? ","Certificado existente")
erase &fich
opci11 = "S"
else
opci11 = "N"
endif
else
opci11 = "S"
endif
if opci11 = "S"
SELECT 1
use EMPRESA SHARE
OrdSetfocus("empre01")
seek empr
oWord:=TOleAuto():New( "Word.Application" )
cPlantilla := (fic1)
oDoc :=oWord:Documents:Open(cPlantilla) // abre el doc modelo
// nombre de la variable
cViejo := "[EMPRESA_APELLIDOS]"
cCampo := (FIELDGET (FIELDPOS(apellidos)))
cFich := fich
cNuevo := (cFich)->(FIELDGET (FIELDPOS(cCampo)))
IF VALTYPE (cNuevo) = "C" // tipo caracter
cNuevo := RTRIM (cNuevo)
ENDI
REEMPLACE (oDoc, cViejo, cNuevo )
oDoc := oWord:Get("ActiveDocument") // object (documento activo)
oDoc:Invoke( "SaveAs", cFich ) // graba fichero
oDoc:Invoke('Close',0) // cierra fichero
endif
clos data
oWord:=TOleAuto():New( "Word.Application" )
oWord:Documents:Open(fich)
oWord:Visible := .T.
oWord:Set( "WindowState", 1 )
oWord:End()
OleUninitialize()
RETURN (NIL)
STATIC FUNCTION REEMPLACE (oDoc, cViejo, cNuevo)
LOCAL oSelection, oTexto, oFind
oSelection := oDoc
oTexto := oSelection:Range
oFind := oTexto:Find
oFind:Text:= cViejo
oFind:Forward:=.T.
oFind:Wrap:= INT(1)
oFind:Format:=.f.
oFind:MatchCase:=.f.
oFind:Execute()
*en este bucle se queda y no sale
WHILE oFind:Found
oTexto:Text:=cNuevo
oFind:Execute()
Enddo
RETURN nil
Si podeis ayudarme os lo agradeceria mucho.
Un saludo
Carlos
He utilizado lo desarrollado por Jose - y posteriormente modificado o aclarado por Manuel Valdenebro. WORDMCN.PRG. Y todo parece funcionar bien. Excepto que no consigo que lo puesto entre corchetes en el documento word lo reemplace por el dato del campo del fichero y esto hace que se quede en el bucle y no salga.
Por si os puede ayudar a continuación pongo el codigo:
store Curdrive() to xdri
store xdri + ":\" + curdir(xdri) + "\" to xdir
store xdir + "EMP" + empr + "\cert" + ejer + ".doc" to fich
store xdir + "certmode.doc" to fic1
if file (fich)
if MsgYesNo("El Certificado se ha emitido anteriormente," + chr(13) +;
" ¿ Desea recacerlo ? ","Certificado existente")
erase &fich
opci11 = "S"
else
opci11 = "N"
endif
else
opci11 = "S"
endif
if opci11 = "S"
SELECT 1
use EMPRESA SHARE
OrdSetfocus("empre01")
seek empr
oWord:=TOleAuto():New( "Word.Application" )
cPlantilla := (fic1)
oDoc :=oWord:Documents:Open(cPlantilla) // abre el doc modelo
// nombre de la variable
cViejo := "[EMPRESA_APELLIDOS]"
cCampo := (FIELDGET (FIELDPOS(apellidos)))
cFich := fich
cNuevo := (cFich)->(FIELDGET (FIELDPOS(cCampo)))
IF VALTYPE (cNuevo) = "C" // tipo caracter
cNuevo := RTRIM (cNuevo)
ENDI
REEMPLACE (oDoc, cViejo, cNuevo )
oDoc := oWord:Get("ActiveDocument") // object (documento activo)
oDoc:Invoke( "SaveAs", cFich ) // graba fichero
oDoc:Invoke('Close',0) // cierra fichero
endif
clos data
oWord:=TOleAuto():New( "Word.Application" )
oWord:Documents:Open(fich)
oWord:Visible := .T.
oWord:Set( "WindowState", 1 )
oWord:End()
OleUninitialize()
RETURN (NIL)
STATIC FUNCTION REEMPLACE (oDoc, cViejo, cNuevo)
LOCAL oSelection, oTexto, oFind
oSelection := oDoc
oTexto := oSelection:Range
oFind := oTexto:Find
oFind:Text:= cViejo
oFind:Forward:=.T.
oFind:Wrap:= INT(1)
oFind:Format:=.f.
oFind:MatchCase:=.f.
oFind:Execute()
*en este bucle se queda y no sale
WHILE oFind:Found
oTexto:Text:=cNuevo
oFind:Execute()
Enddo
RETURN nil
Si podeis ayudarme os lo agradeceria mucho.
Un saludo
Carlos