Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Servers
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 12-05-2017
EagleKingson EagleKingson is offline
Registrado
NULL
 
Registrado: abr 2015
Posts: 8
Poder: 0
EagleKingson Va por buen camino
Combinar TWordDocument con Variant

Hola a todos, soy nuevo por aquí. Ya me leí la guía de estilo y una disculpa si el título no está bien formulado, no encontré otra forma de describirlo.

Estoy trabajando con una plantilla .odt a la cual le inserto variables. Esto es muy fácil y ya lo tengo, ya exiten hilos sobre esto pero de todas formas pongo mi código, el cual fue sacado de precisamente de foro de Club Delphi.

Código Delphi [-]
procedure TFmWord.Button1Click(Sender: TObject);
var
  Word: Variant;
  Documento: Variant;
  sRutaPlantilla, sDocumento : String;

begin
  sRutaPlantilla := ExtractFilePath(Application.ExeName)+'Plantilla\Plantilla.dotx';
  sDocumento     := ExtractFilePath(Application.ExeName)+'Documento\Documento.doc';

  if not CampoCapturado(Edit1.Text) or
     not CampoCapturado(Memo1.Text) or
     not CampoCapturado(Edit3.Text) or
     not CampoCapturado(Edit4.Text) or
     not CampoCapturado(Edit5.Text) or
     not CampoCapturado(Edit6.Text) or
     not CampoCapturado(Edit7.Text) then
    exit;
    

  try
    Word := CreateOleObject('Word.Application');


    Word.Documents.Add(sRutaPlantilla);
    Documento := Word.Documents.Item(1);

    Documento.Variables.Add('Nombre',     Edit1.Text);
    Documento.Variables.Add('Direccion',  Memo1.Text);
    Documento.Variables.Add('Folio',      Edit3.Text);
    Documento.Variables.Add('Cantidad',   Edit4.Text);
    Documento.Variables.Add('Empaque',    Edit5.Text);
    Documento.Variables.Add('Volumen',    Edit6.Text);
    Documento.Variables.Add('Peso',       Edit7.Text);

    Documento.Fields.Update;
    Documento.Fields.ToggleShowCodes;

    word.ActiveDocument.SaveAs(sDocumento); //Guarda documento con nombre asignado

    Word.Visible := true;

    //Documento.Quit; Se utiliza para cerrar word en caso de no mostrar el documento
  except
    MessageDlg('Ocurrió un error al ejecutar',mtError,[mbOk],0);
  end;
end;


NOTA: la función "CampoCapturado" es solo para verificar que todos los datos estén capturados.

Mi pregunta es cómo hacer para agregar tablas desde un TQuery a este mismo documento antes de cerrarlo. En un hilo el cual no me deja poner el enlace porque me dice que no tengo permisos, pero pondré el código que ahí se encuentra:

Código Delphi [-]
procedure InsertarTabla(DataSet: TDataSet; WordDoc: TWordDocument);
var
  WordTable: Table;
  ColIndexCount, RowCount, ColCount: Integer;
  RowIndex, ColIndex: Integer;

  Marcador : OleVariant;
begin
    RowCount := DataSet.RecordCount;
    ColCount := DataSet.Fields.Count;

    Marcador := 'TABLA_XXXX';
    //busco el marcador y si existe inserto la tabla
    if WordDocument1.Bookmarks.Exists(Marcador) then
    begin
      WordTable := WordDocument1.Tables.add(WordDocument1.Bookmarks.item(Marcador).Range, RowCount + 1, ColCount);

      //aqui hago la cabecera en negrita y en gris
      ColIndexCount := 0;
      for ColIndex := 1 to DataSet.Fields.Count do
      begin
        if DataSet.Fields[ColIndex - 1].Tag = 2 then
        begin
        ColIndexCount := ColindexCount + 1;
        WordTable.Cell(1, ColIndexCount).Range.Paragraphs.Borders.Enable := 1;
        WordTable.Cell(1, ColIndexCount).Range.Font.Bold                 := 1;
        WordTable.Cell(1, ColIndexCount).Range.Text                      := DataSet.Fields[ColIndex - 1].DisplayLabel;
        WordTable.Cell(1, ColIndexCount).Range.Paragraphs.Alignment      := wdAlignParagraphCenter;
        WordTable.Cell(1, ColIndexCount).Range.Cells.Shading.BackgroundPatternColorIndex:= wdGray25;
        end;
      end;

      RowIndex := 2;
      DataSet.First;
      while not DataSet.Eof do
      begin
        ColIndexCount := 0;
        for ColIndex := 1 to DataSet.Fields.Count do
        begin
          //los campos que su tag = 2 son los que quiero que se llenen en la tabla
          if DataSet.Fields[ColIndex - 1].Tag = 2 then
          begin
            ColIndexCount := ColindexCount + 1;
            WordTable.Cell(RowIndex, ColIndexCount).Range.Paragraphs.Borders.Enable := 1;
            WordTable.Cell(RowIndex, ColIndexCount).Range.Text                      := DataSet.Fields[ColIndex - 1].AsString;
          end;
        end;
        Inc(RowIndex);
        DataSet.Next;
      end;
    end;
end;
Aquí se puede hacer usando el componente TWordDocument y usando marcadores en la plantilla. Lo que no encuentro es cómo combinar estas dos formas de trabajar el word, es decir, no se si se pueda agregar el nuevo documento al componente TWordDocument o se hace de alguna otra forma, ya que mientras no se llegue e la línea "SaveAs", el nuevo archivo aún no tiene nombre.

PD: Trabajo con D5, Win7 y SQL Server 2014. (Según yo, mi pregunta está en el foro correcto porque la duda se refiere al componente TWordDocument).

De antemano agradezco su ayuda.

Es difícil ser un novato u_u.

Última edición por EagleKingson fecha: 12-05-2017 a las 20:20:20. Razón: El código Delphi no se viualizó correctamente.
Responder Con Cita
  #2  
Antiguo 12-05-2017
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.011
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
A ver si algún compañero puede ayudarte, no conozco bien este tema.

De todas formas, quería felicitarte, qué digo, darte una medalla, por lo menos, por haber elegido un foro adecuado, poner un título descriptivo, explicar bien el problema, poner los 'tags' al código fuente, haberte leído la guía de estilo, etc.

Casi se me saltan las lágrimas de la emoción, ¡¡¡no voy a poder reñirte por nada!!!

Mientras llegas a los 10 mensajes mínimos, puedes poner enlaces "haciendo trampa", ejemplos:
ww.loquesea.com/algo.php
ttp.ww. algunsitio.es/noseque.html

Y algún moderador lo editará.
Responder Con Cita
  #3  
Antiguo 12-05-2017
EagleKingson EagleKingson is offline
Registrado
NULL
 
Registrado: abr 2015
Posts: 8
Poder: 0
EagleKingson Va por buen camino
Jajaja

Jajajaja ok ok, ya entendí el sarcasmo. Esa también fue una buena pedradada jaja..

Está bien, espero haya alguien por aquí que me puedar dar una mano. Te agradezco.
Responder Con Cita
  #4  
Antiguo 12-05-2017
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.011
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por EagleKingson Ver Mensaje
Jajajaja ok ok, ya entendí el sarcasmo. Esa también fue una buena pedradada jaja..
No, realmente es en serio, son pocos los que se molestan en hacer las cosas medianamente bien, o ni siquiera lo intentan.
¡¡¡Gracias y bienvenido a clubdelphi!!!
Responder Con Cita
  #5  
Antiguo 12-05-2017
cloayza cloayza is offline
Miembro
 
Registrado: may 2003
Ubicación: San Pedro de la Paz, Chile
Posts: 909
Poder: 22
cloayza Tiene un aura espectacularcloayza Tiene un aura espectacular
Cita:
Empezado por Casimiro Notevi Ver Mensaje
Mientras llegas a los 10 mensajes mínimos, puedes poner enlaces "haciendo trampa"...


Pense que jamás sería testigo de las enseñanza de malas prácticas...

MODERADOOOOOOOOOOOOOOR

Atienda al señor Casimiro Notevi
Responder Con Cita
  #6  
Antiguo 12-05-2017
EagleKingson EagleKingson is offline
Registrado
NULL
 
Registrado: abr 2015
Posts: 8
Poder: 0
EagleKingson Va por buen camino
Hola de nuevo, con respecto a la pregunta original. Estoy tratando de agregar mi Variant al objeto TWordDocument asi:

Código Delphi [-]
WordDocument1 := TWordDocument.Create(Application);
WordDocument1.ConnectTo(IDispatch(Word) as _Document);

pero me manda el error "Interface no soportada", me imagino que es por la versión de word que tengo. Guardé mi plantilla .dot en modo de compatibilidad 97-2003 pero el error me sigue saliendo. Tal vez alguien tenga una idea de resolverlo, gracias.
Responder Con Cita
  #7  
Antiguo 13-05-2017
EagleKingson EagleKingson is offline
Registrado
NULL
 
Registrado: abr 2015
Posts: 8
Poder: 0
EagleKingson Va por buen camino
¡He regresado! Y esta vez con la noticia de que resolví el problema. Estoy seguro que a alguien le servirá así que les comparto mi solución.

En lugar de agregar la variante word al TDocumentWord se tiene que agregar el documento (variante document), es decir, estaba cometiendo el terrible error de intentar modificar una aplicación y no un documento. Y posteriormente trabajaremos con ese TDocumentWord. Por lo que quedaría así:

Código Delphi [-]
procedure TFmWord.Button1Click(Sender: TObject);
var
Word: Variant;
Documento: Variant;
sRutaPlantilla, sDocumento : OleVariant;
begin
   sRutaPlantilla := ExtractFilePath(Application.ExeName)+'Plantilla\Plantilla.dotx';
   sDocumento     := ExtractFilePath(Application.ExeName)+'Documento\Documento.doc';
   if not CampoCapturado(Edit1.Text) or
      not CampoCapturado(Memo1.Text) or
      not CampoCapturado(Edit3.Text) or
      not CampoCapturado(Edit4.Text) or
      not CampoCapturado(Edit5.Text) or
      not CampoCapturado(Edit6.Text) or
      not CampoCapturado(Edit7.Text) then
       exit;
   try
      Word := CreateOleObject('Word.Application');
      Word.Documents.Add(sRutaPlantilla);
      Documento := Word.Documents.Item(1);

      WordDocument1 := TWordDocument.Create(Application);
      WordDocument1.ConnectTo(IDispatch(Documento) as _Document);
      WordDocument1.Variables.Add('Nombre',     Edit1.Text);
      WordDocument1.Variables.Add('Direccion',  Memo1.Text);
      WordDocument1.Variables.Add('Folio',      Edit3.Text);
      WordDocument1.Variables.Add('Cantidad',   Edit4.Text);
      WordDocument1.Variables.Add('Empaque',    Edit5.Text);
      WordDocument1.Variables.Add('Volumen',    Edit6.Text);
      WordDocument1.Variables.Add('Peso',       Edit7.Text);
      WordDocument1.Fields.Update;
      InsertarTabla(DSFind, WordDocument1); //Con eto se llena la tabla usando el TWordDocument
      WordDocument1.ActiveWindow.View.ShowFieldCodes := False; //Forza a mostrar los valores y no las variables
      WordDocument1.SaveAs(sDocumento); //Guarda documento con nombre asignado

      //Cerramos el documento y la aplicación
      WordDocument1.Close;
      Word.Quit;
      Word:= Unassigned;
   except
      MessageDlg('Ocurrió un error al ejecutar',mtError,[mbOk],0);
   end;
end;

Con esto el problema queda resuelto.

¡Saludos!
Responder Con Cita
  #8  
Antiguo 13-05-2017
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.011
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por cloayza Ver Mensaje
Pense que jamás sería testigo de las enseñanza de malas prácticas...
Realmente ese truco se lo decimos a todos los nuevos, sirve para que un moderador pueda verificar que el enlace es correcto y lo edite, dejándole bien
Responder Con Cita
  #9  
Antiguo 13-05-2017
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.011
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por EagleKingson Ver Mensaje
¡He regresado! Y esta vez con la noticia de que resolví el problema. Estoy seguro que a alguien le servirá así que les comparto mi solución.
En lugar de agregar la variante word al TDocumentWord se tiene que agregar el documento (variante document), es decir, estaba cometiendo el terrible error de intentar modificar una aplicación y no un documento. Y posteriormente trabajaremos con ese TDocumentWord. Por lo que quedaría así:
Con esto el problema queda resuelto.
¡Saludos!
Responder Con Cita
  #10  
Antiguo 13-05-2017
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Cita:
Empezado por EagleKingson Ver Mensaje
¡He regresado! Y esta vez con la noticia de que resolví el problema. Estoy seguro que a alguien le servirá así que les comparto mi solución.
Muchas gracias por publicar la solución

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #11  
Antiguo 13-05-2017
Avatar de yusnerqui
yusnerqui yusnerqui is offline
Miembro
 
Registrado: mar 2004
Ubicación: Cuba
Posts: 679
Poder: 21
yusnerqui Va por buen camino
Cita:
Empezado por EagleKingson Ver Mensaje
PD: Trabajo con D5, Win7 y SQL Server 2014. (Según yo, mi pregunta está en el foro correcto porque la duda se refiere al componente TWordDocument).

De antemano agradezco su ayuda.

Es difícil ser un novato u_u.
Ese D5 es realmente delphi 5 yo que estaba guardando en secreto que todabía sigo usando delphi 7
__________________
Lo importante no es llegar primero, sino saber llegar.

Para que puedas llegar mejor lee la Guia de Estilo

Responder Con Cita
  #12  
Antiguo 13-05-2017
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.011
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por yusnerqui Ver Mensaje
Ese D5 es realmente delphi 5 yo que estaba guardando en secreto que todabía sigo usando delphi 7
Yo llevo un tiempo usando Delphi 6.
Responder Con Cita
  #13  
Antiguo 13-05-2017
Avatar de yusnerqui
yusnerqui yusnerqui is offline
Miembro
 
Registrado: mar 2004
Ubicación: Cuba
Posts: 679
Poder: 21
yusnerqui Va por buen camino
Cita:
Empezado por Casimiro Notevi
Yo llevo un tiempo usando Delphi 6.
Debería haber un botón me gusta para poder usarlo en comentarios como ese jajajaja. saludos
__________________
Lo importante no es llegar primero, sino saber llegar.

Para que puedas llegar mejor lee la Guia de Estilo

Responder Con Cita
  #14  
Antiguo 15-05-2017
Avatar de Ñuño Martínez
Ñuño Martínez Ñuño Martínez is offline
Moderador
 
Registrado: jul 2006
Ubicación: Ciudad Catedral, Españistán
Posts: 6.000
Poder: 25
Ñuño Martínez Tiene un aura espectacularÑuño Martínez Tiene un aura espectacular
Siempre puedes dalre buena reputación (el icono entre el número y las tarjetas roja y amarilla, arriba a la derecha del mensaje).
__________________
Proyectos actuales --> Allegro 5 Pascal ¡y Delphi!|MinGRo Game Engine
Responder Con Cita
  #15  
Antiguo 15-05-2017
Avatar de yusnerqui
yusnerqui yusnerqui is offline
Miembro
 
Registrado: mar 2004
Ubicación: Cuba
Posts: 679
Poder: 21
yusnerqui Va por buen camino
Caramba, muy buena la opción de la reputación, no la conocía, eso es nuevo en el club, tambien veo algo que dice poder que no se a que se refiere, creo quee tendré que leer un poco lo que ha pasado en los últimos eemmm 10 años en el club
__________________
Lo importante no es llegar primero, sino saber llegar.

Para que puedas llegar mejor lee la Guia de Estilo

Responder Con Cita
  #16  
Antiguo 15-05-2017
EagleKingson EagleKingson is offline
Registrado
NULL
 
Registrado: abr 2015
Posts: 8
Poder: 0
EagleKingson Va por buen camino
Cita:
Empezado por yusnerqui Ver Mensaje
tambien veo algo que dice poder que no se a que se refiere
¿No serán las vidas que tienes? jaja Broma, yo tampoco sé
Responder Con Cita
  #17  
Antiguo 15-05-2017
Avatar de yusnerqui
yusnerqui yusnerqui is offline
Miembro
 
Registrado: mar 2004
Ubicación: Cuba
Posts: 679
Poder: 21
yusnerqui Va por buen camino
Cita:
Empezado por EagleKingson Ver Mensaje
¿No serán las vidas que tienes? jaja Broma, yo tampoco sé
A que me enojo y te disparo con mis 14 puntos de poder ,,,,,,, o mejor convo a un monstruo tipo dragón con 14 puntos de podre,,,,, o incluso convino mi poder con mi reputación y convoco al gran monstruo amigo roman y seguro nos explica un poco de estas novedades que hemos descubierto en el club,,,,, aunque para otros ya sean antiguedades. Por favor que no se malinterprete mi jococidad, es que vengo de jugar una partida de Yugui oh jajajaja
__________________
Lo importante no es llegar primero, sino saber llegar.

Para que puedas llegar mejor lee la Guia de Estilo

Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Asignacion a un Variant gersonmaba OOP 12 13-07-2011 05:44:40
TWordDocument lcarlos API de Windows 2 14-01-2008 19:36:20
TWordDocument luxus Servers 1 31-12-2007 22:07:06
Error con variant.dcu donake Varios 3 20-12-2005 12:27:19
Variant, de que tipo? Barzaugc Varios 2 26-08-2005 22:14:30


La franja horaria es GMT +2. Ahora son las 07:39:55.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi