Por Alberto Rodriguez
Recientemente
un cliente me pidió una forma fácil de diseñar una aplicación usando reports de
Word en vez de los nativos de Fox.
Durante un tiempo estuve mirando el mail
merge y otros procesos similares y me pareció un poco complejo de instalar y de
hacerlo funcionar. Al final me decanté por este sistema que lo que en realidad
hace es coger un documento de word y sustituir una cadena por la que tengas en
una tabla. El sistema es rápido y va bien.
El documento Word tiene este aspecto en
el que se muestra a continuación unos campos con << >>

El programa en
Fox y la rutina que realiza el cambio de la cadena por el contenido es el
siguiente:
CLOSE all
#DEFINE
_DOCUMENTO
"d:\ut\mailing.doc"
LOCAL
loWord, loDocument
*- Crea
referencia a Word
TRY
loWord = GETOBJECT(,'Word.Application')
CATCH
loWord = CREATEOBJECT('Word.Application')
ENDTRY
IF
VARTYPE(loWord) <> 'O'
ERROR 'No se ha podido crear una
referencia a WORD'
RETURN .F.
ENDIF
*---------------------------------
* Abre
el documento como ReadOnly
*---------------------------------
USE
d:\ut\mail50 IN 0 ALIAS mail50
SCAN FOR
EMPTY(email) AND RECNO() < 20
TRY
loDocument
= loWord.Documents.Open(_DOCUMENTO,,.T.)
CATCH
*-
Cierra instancia de Word
IF
VARTYPE(loWord) = 'O'
loWord.Application.Quit(0)
&& Sale sin salvar y sin preguntar
loWord = .NULL.
ENDIF
ERROR
'No se ha podido abrir el documento "' + _DOCUMENTO + '".'
ENDTRY
lfBuscaReplaCadena(loWord.Selection,
"<<nombre>>",mail50.nombre )
lfBuscaReplaCadena(loWord.Selection,
"<<direcc1>>",mail50.direcc1 )
lfBuscaReplaCadena(loWord.Selection,
"<<direcc2>>",mail50.direcc2 )
lfBuscaReplaCadena(loWord.Selection,
"<<poblacion>>",mail50.poblacion )
loWord.Visible = .t.
loWord.printout()
wait "Imprimiendo..." window at
15,40 timeout 5
loWord.documents().close(.f.)
ENDSCAN
loWord.quit(.f.)
RETURN
FUNCTION
lfBuscaReplaCadena
LPARAMETERS
poSelection, pcValueToFind, pcValueToReplace
*--------------------------------------------------------
*-
Busca una cadena y la reemplaza por otra
*-
*-
Parametros:
*- poSelection Referencia a la selección a buscar.
*- Ej. oWord.Selection
*- pcValueToFind Valor a buscar
*- pcValueToReplace Valor a reemplazar
*-
*-
Devuelve:
*- .t. Si ha podido reemplazar todo
*- .f. Si NO ha podido reemplazar
*-
*--------------------------------------------------------
LOCAL
llReturn
llReturn =
.t.
TRY
WITH poSelection.Find
.ClearFormatting
.Replacement.ClearFormatting
.Text = pcValueToFind
.Replacement.Text = pcValueToReplace
.Forward = .T.
.Wrap= 1
.Execute(,,,,,,,,,,2)
ENDWITH
CATCH TO
nError
llReturn = .f.
THIS.cDescUltError = 'Ha ocurrido un error
en el proceso de reemplazo de texto'
ENDTRY
RETURN
(llReturn)
Como puedes apreciar en el código, está hecho para hacer un envio masivo de
cartas a todos los clientes o posibles clientes de un fichero DBF.
La Estructura del fichero DBF es la siguiente:

FoxPress – Mayo de 2006
© 2006 FoxPress. All rights reserved