PDA

Ver la Versión Completa : Modelo de carta en word


Jorge Taveras
13-02-2005, 05:58:45
Buenas tengan.... quiesiera tener varios modelos de cartas en word o algún otro medio sugerido con ustedes y poder generar una de ellas enviandole de una tabla(db) el nombre de la persona que va a recibir la carta, la fecha (fecha del dia) y quien la remite (db).

El modelo seria +/- asi.

Señor:
(nombre enviado por parametro desde una tabla) Fecha
(Enviada por parametro)

gracias por recibir esta carta
queda de uste, atentamente
(jorge taveras ...enviada por parametro).

la idea es que el usuario pueda manipular la carta y hacerle las correciones que quiera, pero que al final , desde un formulario de clientes (por ejemplo)
y apuntando a un cliente en particular , exista un botón que diga carta de bienvenida y le envie el nombre, la fecha y el remitente a un formato pre-hecho y lo imprima.... gracias anticipadas.... compañeros foristas....

Lepe
13-02-2005, 11:08:46
Tiene que ser obligatoriamente en Word?

Podrías usar un simple qrExprMemo, dentro de un QuickReport


Estimado {NombreCliente}:

bla bla

el QuickReport lo enlazas a una consulta segun todos los datos que vayas a necesitar en la carta, como ves, el nombre del campo que necesitas lo escribes entre llaves, y se sustituye por el dato de tu consulta.

Puedes tener varios modelos predefinidos y cargar en tiempo de ejecución el que quieras.

En fin, ya dirás si esto es viable.

Neftali [Germán.Estévez]
14-02-2005, 10:43:37
Yo lo he hecho alguna vez utilizando la propia MailMerge (Combinar correspondencia) del Word; Utilizanba un fichero de texto para los datos y luego desde el programa Delphi llamaba a la función MailMerge. Otra opción más sencilla (aque día no lo sabía... ;)) es utilizar BookMarks(Marcadores) en el fichero de Word y luego sustituirlos; Ésta es más manual, pero da menos problemas...
Existe un componente en el propio ClubDelphi que lo hace. Descargate TWordParaTorpes 1.0 (http://www.clubdelphi.com/componentes/index.php?op=mydown&did=17&ext=/file.zip) hace lo que quieres. Échale un vistazo a la Demo que hay en el directorio demo_db (...te vas a llevar una gran alegría:D:D:D).

VRO
16-02-2005, 09:40:17
Bien yo he hecho algo similar, he creado un recibo de agua, para ello tengo una tabla creada en un documento de word (tabla.doc) que la creo desde delphi con un componente TWordDocument, que contiene los datos que quiero rellenar el el documento recibo. Después tengo otro documento en word que una plantilla de recibo sin los datos , claro, acontinuacion creo en word una macro de una combinacion de correspondencia (Mail Merge), esta macro tiene su propio codigo en Visual Basic que podemos transcribir a codigo delphi (en este caso el codigo es muy similar y facil de transcribir) y creo en Delphi una funcion con el codigo trnascrito.

De esta forma automáticamente te pasa los datos al recibo, en tu caso a la carta.

Espero que te sirva.

rafita
16-02-2005, 10:32:42
Hola Jorge, como te dice Neftali tienes varias formas: componente TWordParaTorpes, MailMerge, sustituir marcadores,....

Te envío un trozo de código que he utilizado recientemente con el método de sustituir marcadores:
* Necesitas un documento-plantilla con los marcadores a sustituir
* Lo abres desde Delphi como "sólo lectura"
* Sustituyes los marcadores por campos de una consulta, campos de tu formulario, variables,... lo que necesites
* La sustitución no elimina el marcador, por tanto si pulsas varias veces en el botón que genera el informe, los datos aparecerán duplicados en el documento de word.
* Utilizo el procedimiento SustituirMarcador para no repetir todas las veces ese trozo de código
* Si no existe un nombre de marcador no pasa nada porque comprueba previamente su existencia. De esta forma reutilizo el mismo procedimiento para un montón de documentos aunque no todos tengan los mismos marcadores.


procedure TFEntradaVehiculos.GenerarDocumentoWord;
var Fichero, Marcador, Contenido, SoloLectura, SalvarCambios, FormatoOriginal, Ruta : OleVariant;
MiDocumento : _document;

procedure SustituirMarcador;
begin
if MiDocumento.Bookmarks.Exists(Marcador) then MiDocumento.Bookmarks.Item(Marcador).Range.InsertBefore(Contenido);
end;

begin
// Conexión con Word
try
MiWord.Connect;
except
ShowMessage('WordXP no está instalado en este equipo');
Abort;
end;
// selección del documento base
if Combo1.Text='Comunicación Inicio Procedimiento' then
Fichero:='y:\Inspeccion\Comunicación Inicio Marca.doc'
else
if Combo1.Text='Diligencia' then
Fichero:='y:\Inspeccion\Diligencia Citación Marca.doc'
else
if Combo1.Text='Acta de Conformidad' then
Fichero:='y:\Inspeccion\ACTA ConfOTMarca.doc';

// abrir el documento seleccionado con los parámetros necesarios
SoloLectura:=True;
MiDocumento:=MiWord.Documents.Open(Fichero, EmptyParam, SoloLectura,
EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam,
EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam);

// comienzan las sustituciones de los marcadores.
Marcador:='MN_Expediente1';
Contenido:=Edit1.Text;
SustituirMarcador;
Marcador:='MN_Expediente2';
SustituirMarcador;
Marcador:='MSujeto_pasivo1';
Contenido:=Edit6.Text;
SustituirMarcador;
Marcador:='MCIFNIF1';
Contenido:=Edit7.Text;
SustituirMarcador;
Marcador:='MNotificacion_Inicio1';
Contenido:=FechaLiteral(Edit35.Text);
SustituirMarcador;
Marcador:='MFecha_Diligencia1';
Contenido:=FechaLiteral(Edit36.Text);
SustituirMarcador;

// maximizamos la ventana de Word y desconectamos
MiWord.WindowState:=wdWindowStateMaximize;
MiWord.ActiveWindow.WindowState:=wdWindowStateMaximize;
MiWord.PrintPreview;
MiWord.Visible:=True;
SalvarCambios:=wdDoNotSaveChanges;
FormatoOriginal:=unAssigned;
Ruta:=unAssigned;
try
MiWord.Disconnect;
except
on e:Exception do
begin
ShowMessage('Se ha producido el error '+e.Message);
MiWord.Disconnect;
end;
end;

He recortado el código dejando solamente lo básico para que funcione.

En el foro Server encontre una dirección proporcionada por Neftalí donde explica mediante ejemplo la comunicación Delphi-Word.

http://www.djpate.freeserve.co.uk/Automation.htm

Un saludo

Jorge Taveras
18-02-2005, 05:21:17
Estimados amigos, disculpen la tardanza es que he estado trabajando con un par de cosas que jamas habia usado. La aportación de todos fué muy buena... Tomé el modelo que rafita puso el codigo, citando a neftali.. ( por cierto se te fueron 3 parámetros de más). Con este ejemplo no tuve la necesidad de bajara el twordparatorpes, sí utilicé twordapplication. Lo que no he logrado es reemplazar los marcadores. Utilizo corchetes con un espacio en blanco y luego el nombre del marcador... realmente no sé que estoy haciendo mal ... les ruego me den otra ayudita... aqui esta mi carta

señor o señora:

{ MN_Nombre }

Expedinte { MN_Expediente }



placeme saludartle

adios

y este es el codigo que lo enlaza
Marcador:='MN_Nombre';
Contenido:=trimright(vfnomPaciente);
SustituirMarcador;
Marcador:='MN_Expediente';
Contenido:=trimright(vfexpediente);
SustituirMarcador;

rafita
18-02-2005, 14:34:32
Hola Jorge, vamos por partes:

* Los parámetros que sobran dependen de la versión de Wod, en mi caso utilizo WordXP y son correctos. Supongo que tu estarás utilizando Word 2000.
Esto me recuerda que si vas a distribuir tu aplicación, tus usuarios debe tener la misma versión de Office que tu has cargado con Delphi.

* En el tema de los marcadores creo que estas intentando utilizar palabras escritas dentro de tu documento.
Los marcadores (o bookmarks) son códigos especiales que utiliza Word.
Se crean mediante Insertar --> Marcador. Aparece una ventana donde pones el nombre (único en todo el documento), también verás todos los marcadores definidos, pudiendo verlos por nombre o por posición.
En las opciones de Word puedes seleccionar para que estén visibles:
Herramientas --> Opciones --> Ver --> Mostrar --> Marcador,
pero no verás el nombre sino un simbolo como una I (i latina mayúscula).
Señor/Señora:
I
No te hacen falta corchetes ni nada.

* Me parece que lo que te ha llevado a confusión es mi forma de nombrarlo: comenzando por la letra M (M_Nombre1), es solo una manía mía.

Saludos y suerte.

Jorge Taveras
18-02-2005, 20:41:48
Rafita, gracias por todo. Ya me funciona... La verdad es que se de WORD lo menos posible. Desconocía lo de los marcadores... Por ultimo me gustaría saber que componentes usas para wordxp.. Tengo delphi 6 y utilice el objeto twordapplication. con afecto, jorge .

rafita
21-02-2005, 08:56:12
Yo también huyo de Word todo lo posible, pero a veces no queda más remedio que pasar por el aro.

Rafita, gracias por todo. Ya me funciona... La verdad es que se de WORD lo menos posible. Desconocía lo de los marcadores... Por ultimo me gustaría saber que componentes usas para wordxp.. Tengo delphi 6 y utilice el objeto twordapplication. con afecto, jorge . El único componente que utilizo el TWordApplication, del resto no tengo ni idea de para qué sirven.
¿Cómo lo he cargado para XP? En el momento de la instalación de Delphi te pregunta que componentes de Office deseas cargar y tú eliges la versión, puesto que sólo te permite una (supongo que es por algún tema de licencias).

Alguien me dijo que cambiando en las USES del programa el nombre de la unidad: WordXP por Word97 o Word2000 (y adaptando el número de parámetros) haría que mi aplicación funcionase para esas versiones, pero no he hecho pruebas.

Saludos.

Carmelo Cash
24-11-2007, 01:42:22
Hola. Como verán este tema se trató hace mucho, pero yo recién me topo con este problema.
Después de ver la opciones me decidí por implementar la sugerencia de LEPE.

Entoces pongo en un form un "RichEdit" donde escribo

Estimado señor {Cliente}
Ud debe....bla bla bla

Luego en el QuickReport coloco un QRExprMemo.

Luego paso las líneas
QRExprMemo.lines:=RichEdit.lines

y Listo. Sale perfecto. ... pero...

Pero usé un RichEdit para poder almacenar los documentos dandoles distintos tipos de fuentes, por ejemplo que el nombre del cliente salga en negrita.

El problema es que al pasar al QRExprMemo del quickreport el formato del texto se pierde. entonces...

usé en quickreport un QRRichtext

e hice QRRichtext.ParentRichEdit:=QRRichtext.

y salierón todos los tipos de fonts , con los colores.. una belleza... pero...

Pero en vez de salir el nombre del cliente sale (literamente) {Cliente}.

Resumiendo...

Hay alguna forma de pasarle al QRExprMemo del quickreport el formato del texto que tiene el RichEdit?
O...
Se podrá lograr que el QRRichtext tome los datos entre llaves? {Cliente} y que aparezca Pepe (en negrita)

Bueno. Gracias por la paciencia.:)