Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Temas relacionados > Redes
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 15-09-2012
Avatar de D-MO
D-MO D-MO is offline
Miembro
 
Registrado: ago 2005
Ubicación: root@debian:/#
Posts: 1.042
Poder: 20
D-MO Va por buen camino
Me alegra saber que sirvió de algo las aportaciones que se hicieron. Sería bueno que detallaras un poco mas de como quedó el proceso final para que nos sirva de retroalimentación.

Saludos
Responder Con Cita
  #2  
Antiguo 15-09-2012
Avatar de elaguna
elaguna elaguna is offline
Miembro
 
Registrado: abr 2009
Ubicación: México
Posts: 51
Poder: 16
elaguna Va por buen camino
Cita:
Empezado por D-MO Ver Mensaje
Me alegra saber que sirvió de algo las aportaciones que se hicieron. Sería bueno que detallaras un poco mas de como quedó el proceso final para que nos sirva de retroalimentación.
Claro que sí, en este momento todavía estoy modificando este "busca lo que te digo", pero en un momento más lo subo y gracias de nuevo.

Eduardo Laguna
__________________
No lo intentes!. Hazlo o no lo hagas, pero no lo intentes !!! (Yoda)
Responder Con Cita
  #3  
Antiguo 15-09-2012
Avatar de D-MO
D-MO D-MO is offline
Miembro
 
Registrado: ago 2005
Ubicación: root@debian:/#
Posts: 1.042
Poder: 20
D-MO Va por buen camino
No te apures, que no hay prisa
Responder Con Cita
  #4  
Antiguo 19-09-2012
Avatar de elaguna
elaguna elaguna is offline
Miembro
 
Registrado: abr 2009
Ubicación: México
Posts: 51
Poder: 16
elaguna Va por buen camino
Solucionado (definitivamente)

Pues como quedamos, esta es la solución que implemente para las búsquedas.

1. Modifiqué mi tabla en la DB (Postgresql) para almacenar al contenido de cada documento. Mi tabla se llama "planti_corr", agregué un campo de texto e indexé la tabla por ese campo siguiendo lo indicado por mamcx y en la documentación http://www.postgresql.org/docs/9.1/s...extsearch.html

Código SQL [-]
CREATE INDEX pgcontenido_idx
  ON planti_corr
  USING gin
  (to_tsvector('spanish'::regconfig, contenido));


2. Ahora que extraer el contenido de cada documento que se vaya a dar de alta, esto lo hice en el botón de "Altas" en el formulario de registro de documentos:
  • Crear una instancia del Portapapeles de Windows
  • Crear una instancia de Word y abrir el documento
  • Seleccionar todo el contenido del documento de Word y copiarlo en el Portapapeles de Windows
  • Cerrar Word
  • Poner el contenido del Portapapeles en una variable
    • El límite de tsvector en Postgresql es de 1048575 bytes por lo que limito el tamaño del contenido de la variable a 1040000 con la función LeftBStr()
  • Envío todo a Postgres en un Query
Código Delphi [-]
var
  word : Variant;
  plantiOrig : TClipBoard;
  wnContenido : WideString;
  wnGuarda : oleVariant;

begin
  ...
  ...
  Word := CreateOleObject('Word.Application');
  Word.Visible := False;
  
  try
     Word.Documents.Open(, EmptyParam, EmptyParam, EmptyParam,
                                      EmptyParam, EmptyParam, EmptyParam, EmptyParam,
                                      EmptyParam, EmptyParam);

     Word.Selection.WholeStory;    // Seleccionar todo el contenido del documento de Word
     Word.Selection.Copy;            //  Copiar al portapapeles
     Word.ActiveDocument.Close(wnGuarda, EmptyParam, EmptyParam);
     Word.Quit;

     wnContenido := LeftBStr(plantiOrig.AsText, 1040000);    // Extrae únicamente 1040000 bytes
     plantiOrig.Clear;

     Query1.Active := False;
     Query1.SQL.Clear;
     Query1.SQL.Add('insert into planti_corr (nombre, archivo, contenido) values (:vNombre, :vArchivo, :vContenido)');
     
     Query1.ParamByName('vNombre').AsString := ;
     Query1.ParamByName('vArchivo').AsString := 
     Query1.ParamByName('vContenido').AsWideString := wnContenido;
     Query1.ExecSQL;
  Except
     Application.MessageBox('Error al cargar el archivo en la base de datos', 'Buscador', MB_OK or MB_ICONERROR);
  End;
  ...
  ...
end;

3. Ahora la búsqueda. En otro botón:
  • Tomo el texto con las palabras que desean buscar, éstas deben quedar separadas únicamente por el símbolo '&' (primerapalabra&segundapalabra&tercerapalabra); (no espacios, no comas, no puntos, no... nada) y asigno la nueva cadena a una variable, para esto utilizo la función ReplaceStr()
  • Ejecuto la consulta esta debe ser con la función "tsquery" de Postgres en el campo indexado, (que el servidor haga todo!!!)
  • ... y hago muy feliz a mi usuario !!!
Código Delphi [-]
var
  w_palabras : String;
  wpTotalReg : Integer;



begin
  ...
  ...


  w_palabras := ReplaceStr(edtFrases.Text,' ', '&');


  Query1.Close;
  Query1.SQL.Clear;
  Query1.SQL.Add('SELECT id_planti, nombre, archivo FROM planti_corr WHERE contenido @@ to_tsquery(:wqPalabras)');
  Query1.ParamByName('wqPalabras').AsString := w_Palabras;
  Query1.Open;

  wpTotalReg := Query1.RecordCount;
  ...
  ...
end;


Estas son las instrucciones básicas, obviamente hay cosas antes y después, pero concretando esta es la forma en que lo solucioné y efectivamente el tiempo de la búsqueda se redujo de algunos minutos a pocos segundos, bastante bien diría yo!!!.


Muchas gracias a todos, especialmente a mamcx y a D-MO por sus ideas (prácticamente la solución)


Saludos.


Eduardo Laguna
__________________
No lo intentes!. Hazlo o no lo hagas, pero no lo intentes !!! (Yoda)
Responder Con Cita
  #5  
Antiguo 19-09-2012
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Muchas felicidades y muchas gracias por la solución

Este hilo me parece que puede ser de ayuda para mucha gente.

// Saludos
Responder Con Cita
  #6  
Antiguo 19-09-2012
Avatar de D-MO
D-MO D-MO is offline
Miembro
 
Registrado: ago 2005
Ubicación: root@debian:/#
Posts: 1.042
Poder: 20
D-MO Va por buen camino
Cita:
Empezado por elaguna Ver Mensaje
...especialmente a mamcx y a D-MO por sus ideas (prácticamente la solución)...
Pues no, no tienes nada que agradecer

A ti te agradecemos que hayas compartido la solución.

Saludos.
Responder Con Cita
  #7  
Antiguo 19-09-2012
Avatar de elaguna
elaguna elaguna is offline
Miembro
 
Registrado: abr 2009
Ubicación: México
Posts: 51
Poder: 16
elaguna Va por buen camino
Solucionado (definitivamente)

Ups!

Sólo falto agregar la línea donde se crea el objeto para leer el contenido del portapapeles antes de abrir el documento de Word

Código Delphi [-]
var
  ...
  ...
  plantiOrig : TClipBoard;
  ...
  ...

begin
  ...
  ...
  plantiOrig := TClipBoard.Create;
  ...
  ...
__________________
No lo intentes!. Hazlo o no lo hagas, pero no lo intentes !!! (Yoda)
Responder Con Cita
  #8  
Antiguo 19-09-2012
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Por cierto, ¿por qué creas un objeto TClipboard en lugar de usar el que por defecto viene en la unidad clipbrd?

// Saludos
Responder Con Cita
Respuesta



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
adjuntar documentos de word pabloloustau Conexión con bases de datos 5 04-04-2010 01:13:04
Documentos de word zidfrid C++ Builder 2 05-09-2008 02:17:11
Formatear documentos Word abril0404 Servers 1 27-02-2008 14:23:25
documentos .dot(word) en delphi CARSOFT_AR Varios 2 11-02-2005 17:39:25
documentos word Albano Varios 0 12-01-2005 02:19:38


La franja horaria es GMT +2. Ahora son las 19:29:08.


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