Si lo que queres es armar un texto con formato, basandote en una plantilla con formato , que dicho formato se lo puedas dar con un editor de texto tipo Word (WordPad en mi caso) y luego cambiar los datos variables en tiempo de ejecucion, lo que puedes hacer es un clasico merge.
En mi caso, le paso como parametros a mi funcion, el nombre del texto que quiero tomar como base, y una query con un solo registro que contiene los campos variables
Esta es mi funcion
- Code: Select all Expand view
*************************************************
** Armar documento rtf
*************************************************
PROCEDURE Merge(oRs,cDocu)
LOCAL oWord , oDoc, cText , cDoc , i
cDoc := hb_CurDrive()+":\"+curdir()+"\"+ALLTRIM(cDocu)+".rtf"
cText := MEMOREAD(hb_CurDrive()+":\"+curdir()+"\"+ALLTRIM(cDocu)+".rtf")
IF !FILE(hb_CurDrive()+":\"+curdir()+"\"+ALLTRIM(cDocu)+".rtf")
MsgStop("El archivo base no existe"+chr(10)+cDoc,"Error")
RETURN
ENDIF
FOR i := 1 TO oRs:FCount()
cText := STRTRAN(ctext,"<"+oRs:FieldName(i)+">",ALLTRIM(oRs:Fieldget(i)))
NEXT i
memowrit( hb_CurDrive()+":\"+curdir()+"\"+ALLTRIM(cDocu)+" "+oRs:legajo+".rtf", cText )
if (oWord := WinWordObj() ) == nil
MsgAlert( "MS Word no instalado" , "Alerta" )
else
oDoc = oWord:Documents:Open(hb_CurDrive()+":\"+curdir()+"\"+ALLTRIM(cDocu)+" "+oRs:legajo+".rtf") // Legajo es un campo de mi Query
if oDoc == nil
MsgAlert("Fallo crear documento, verifique que no este en uso" , "Alerta" )
endif
endif
oDoc:Application:Visible := .t.
RETURN
En el texto .rtf las variables estan encerradas entre < >, pero vos podes usar lo que quieras.
Espero te sirva