Hola, C. Navarro.
Uso FWH FWH18.04 y Windows 10.
El RTF lo genera el propio FWH. El procedimiento es el siguiente:
Creo un plantilla con LibreOffice en la que únicamente aparece el logotipo, la dirección y poco más y la guardo en formato RTF. A partir de ahí se empieza a introducir texto en el propio archivo RTF creado y se guarda. Básicamente el procedimiento es el siguiente:
Code: Select all
Function creainforme(nRecnoDoc, cnumero, cnombre, obrwregdoc)
local ctextbase, cplantilla, ctxtfile, cbase
Local cRaiz:="\COMPARTIDO\REGSAT\WINSAT\DOCUMENTAL"
Local cnum, cnom, CarpetaSAT, nlibro, libro, fecha, dfecha,clasedoc,cClasedoc
Local aFiles, aDir, apunte
Local cFolder
local cFile:=strzero(nRecnoDoc,8)+".RTF"
local cFichero:="\COMPARTIDO\REGSAT\WINSAT\RTFINT\"+strzero(nRecnoDoc,8)+".RTF"
nlibro = REG->NUM_LIB
dFecha = REG->FECHA
clasedoc =REG->CLASE_DOC
cNum:=Cnumero
cNom:=cnombre
CarpetaSAT:=alltrim(cnum)+"-"+alltrim(cnom)
libro:=strzero(nlibro,6)
fecha:=strzero(day(dfecha),2)+strzero(month(dfecha),2)+str(year(dfecha),4)
apunte:=libro+"-"+fecha+"-"+alltrim(clasedoc)
cFolder:=cRaiz+"\"+CarpetaSAT+"\"+Libro+"\"+fecha+"\"+Clasedoc+"\"
IF FILE("\COMPARTIDO\REGSAT\WINSAT\RTFINT\"+strzero(nRecnoDoc,8)+".RTF") .AND. FILE("\COMPARTIDO\REGSAT\WINSAT\RTFINT\"+cfichero)
MsgAlert("Ya existe el fichero."+CRLF+;
"Puede modificarlo en edición", "Archivo ya existe")
endif
ctextbase:= MEMOREAD("\COMPARTIDO\REGSAT\WINSAT\plantillas\informe.rtf") //ESTA ES LA PLANTILLA RTF
IF !FILE("\COMPARTIDO\REGSAT\WINSAT\plantillas\informe.rtf")
MsgStop("El archivo base no existe","Error")
RETURN nil
ENDIF
cFichero:=strzero(nRecnoDoc,8)+".RTF"
memoread("\COMPARTIDO\REGSAT\WINSAT\plantillas\informe.rtf")
cTxtFile:=MemoRead("\COMPARTIDO\REGSAT\WINSAT\plantillas\informe.rtf")
memowrit("\COMPARTIDO\REGSAT\WINSAT\RTFINT\"+cfichero, cTxtFile,.f. )
memowrit("\COMPARTIDO\REGSAT\WINSAT\DOCUMENTAL\"+CarpetaSAT+"\"+"DIARIO"+"\"+apunte+"\"+"i"+cfichero, cTxtFile,.f. )
if reg->(flock())
reg->fecha_ni:=date()
reg->fileint:=Cfichero
reg->(dbunlock())
oBrwregdoc:refresh()
endif
Msginfo("Se ha creado fichero "+cfichero)
obrwregdoc:refresh()
//opendoc(nRecnoDoc, cFichero, oBrwregdoc)
RETURN nil
Como verás lo que hago es que ,tomando como plantilla un documento RTF en blanco (únicamente con el logotipo y la dirección), creo el RTF renombrándolo con el numero del recno() en la subcarpeta de la empresa que también se crea, lo abro, se introduce el texto y se guarda. Ni siguiera utilizo campos MEMO porque muchas veces el texto es muy extenso y además incluye tablas. Además, no tengo confianza con _ MEMO para _.
Luego con la siguiente función creo los PDF, pero el resultado no es un reflejo muy fiel al fichero RTF creado:
Code: Select all
Function infotopdf (nRecnoDoc, cnumero, cnombre, obrwregdoc)
local oWnd, oBar
local cRtf, cPdf, lOpen, cFile
local cFichero, ctextbase, cplantilla, ctxtfile, cbase
Local cRaiz:="\COMPARTIDO\REGSAT\WINSAT\DOCUMENTAL"
Local cnum, cnom, CarpetaSAT, nlibro, libro, fecha, dfecha,clasedoc,cClasedoc
Local aFiles, aDir
Local cFolder, apunte
LOCAL hDLL := LoadLibrary( "Riched20.dll" )
cFile:=strzero(nRecnoDoc,8)+".RTF"
cFichero:="\COMPARTIDO\REGSAT\WINSAT\RTFINT\"+strzero(nRecnoDoc,8)+".RTF"
IF !FILE("\COMPARTIDO\REGSAT\WINSAT\RTFINT\"+strzero(nRecnoDoc,8)+".RTF")
//MsgNoYes( "El archivo existe. Se va a eliminar el existente y crear uno nuevo. ¿Desea continuar?","Aviso")
MsgAlert("No existe el fichero"+cfichero)
return .f.
endif
nlibro = REG->NUM_LIB
dFecha = REG->FECHA
clasedoc =REG->CLASE_DOC
cNum:=Cnumero
cNom:=cnombre
CarpetaSAT:=alltrim(cnum)+"-"+alltrim(cnom)
libro:=strzero(nlibro,6)
fecha:=strzero(day(dfecha),2)+strzero(month(dfecha),2)+str(year(dfecha),4)
apunte:=libro+"-"+fecha+"-"+alltrim(clasedoc)
cFolder:=cRaiz+"\"+CarpetaSAT+"\"+Libro+"\"+fecha+"\"+Clasedoc+"\"+cfile
cRtf:="\COMPARTIDO\REGSAT\WINSAT\DOCUMENTAL\"+CarpetaSAT+"\"+"DIARIO"+"\"+apunte+"\"+"i"+cfile
DEFINE WINDOW oWnd TITLE "PDF"
DEFINE BUTTONBAR oBar OF oWnd SIZE 100,32 2010
DEFINE BUTTON OF oBar PROMPT "Generar PDF" ;
ACTION RTFTOPDF(cRtf, cPdf, lOpen )
ACTIVATE WINDOW oWnd CENTERED
return nil