FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Indice por trozos de un campo.
Posts: 139
Joined: Sun Apr 23, 2006 09:00 AM
Indice por trozos de un campo.
Posted: Wed Jun 09, 2010 08:32 PM

Hola.
¿Sabe alguien como crear índices por trozos de un campo?, por ejemplo si tengo un campo NOMBRE con el contenido "Loren ipsum dolor sic amet", montar un índice por las palabras "loren", "ipsum", "dolor", "sic", "amet", de manera que todos ellos me apunten al mismo registro o a otros registros que tengan esas palabras. Lo mismo que digo palabras digo "ren", ips", "lor"... Lo he visto en Velneo (Velázquez Visual) y los llaman "índices por palabras" o "clave alfabética ternaria".
Gracias y un saludo,
Fernando Morales
Las Palmas de Gran Canaria

Un saludo,

Fernando

Las Palmas de Gran Canaria
Posts: 1088
Joined: Fri Oct 07, 2005 03:33 PM
Re: Indice por trozos de un campo.
Posted: Wed Jun 09, 2010 09:01 PM

Hola,

bueno seguro que lo que quieres hacer es un sistema de busqueda en texto completo, para eso hay opciones en ADS (FST) que podrias utilizar, o hacerlo por tu cuenta, creando una tabla extra donde pongas cada una de las palabras y el respectivo reg donde se encuentra, lo que debes analizar es como implementar las busquedas booleanas.

Tambien existen otras opciones como ISIS que podrias utilizar, claro todo depende que deseas hacer

saludos

Marcelo

Posts: 346
Joined: Mon Oct 05, 2009 03:35 PM
Re: Indice por trozos de un campo.
Posted: Thu Jun 10, 2010 04:51 AM
hola:

si lo que necesitas es una busqueda sensitiva, yo lo hago lo siguiente...

primero que nada es indexar el campo normalmente...

Code (fw): Select all Collapse
use clientes alias clie new
index on clie->nombre tag 1 to "nombre.cdx"


yo utilizo un browse incrustado en un dialogo x
Code (fw): Select all Collapse
     SELECT CLIE    ; SET ORDER TO 1        ; DBGOTOP()
     REDEFINE BROWSE oBrw CELLED ALIAS "CLIE" COLOR GetSysColor(8), GetSysColor(5) ID 100 CURSOR oPun OF oDlg

      ADD COLUMN TO oBrw HEADER "CODE"     DATA FieldWBlock( "CODE"   , Select() ) SIZE  30 PIXELS 3DLOOK TRUE,TRUE,FALSE 
      ADD COLUMN TO oBrw HEADER "NOMBRE"  DATA FieldWBlock( "NOMBRE" , Select() ) SIZE  340 PIXELS 3DLOOK TRUE,TRUE,FALSE
 
            oBrw:nHeightHead   += 9
            oBrw:nHeightFoot   += 9
            oBrw:nHeightCell   += 2.5
            oBrw:nLineStyle    := LINES_3D
            oBrw:bKeyDown      := {|nKey| iif(nKey > 32, Busca3(CHR(nKey),oBrw), MsgBeep() )}  // Aqui está el truco

       ....
       ....
       ....

STATIC FUNCTION Busca3( nKey, oBrw )
LOCAL cVar
// esto es para buscar utilizando el keyPAD numerico
IF     CHR(nKey) = "a"      ;   cVar := "1"+SPACE(29)
ELSEIF CHR(nKey) = "b"      ;   cVar := "2"+SPACE(29)
ELSEIF CHR(nKey) = "c"      ;   cVar := "3"+SPACE(29)
ELSEIF CHR(nKey) = "d"      ;   cVar := "4"+SPACE(29)
ELSEIF CHR(nKey) = "e"      ;   cVar := "5"+SPACE(29)
ELSEIF CHR(nKey) = "f"      ;   cVar := "6"+SPACE(29)
ELSEIF CHR(nKey) = "g"      ;   cVar := "7"+SPACE(29)
ELSEIF CHR(nKey) = "h"      ;   cVar := "8"+SPACE(29)
ELSEIF CHR(nKey) = "i"      ;   cVar := "9"+SPACE(29)
ELSEIF CHR(nKey) = "`"      ;   cVar := "0"+SPACE(29)
ELSEIF CHR(nKey) = "b"      ;   cVar := "2"+SPACE(29)
ELSEIF CHR(nKey) = "n"      ;   cVar := "."+SPACE(29)
ELSEIF CHR(nKey) = "o"      ;   cVar := "/"+SPACE(29)
ELSEIF CHR(nKey) = "j"      ;   cVar := "*"+SPACE(29)
ELSEIF CHR(nKey) = "m"      ;   cVar := "-"+SPACE(29)
ELSEIF CHR(nKey) = "k"      ;   cVar := "+"+SPACE(29)
ELSE                        ;   cVar := CHR(nKey)+SPACE(29)
ENDIF
MsgGet("Busqueda Sencitiva...","Buscar por Nombre...", @cVar,,47 )
SELECT CLIE     ; SET ORDER TO 1   ; SEEK ALLTRIM(cVar) SOFTSEEK
oBrw:UpStable()
oBrw:Refresh(.t.)
RETURN NIL


El resultado es cuando presiono una letra, el browse se mueve en pantalla segun la coincidencia que encuentre...

espero que sea lo que estas buscando
SkyPe: armando.lagunas@hotmail.com

Mail: armando.lagunas@gmail.com
Posts: 592
Joined: Tue Mar 14, 2006 11:34 PM
Re: Indice por trozos de un campo.
Posted: Thu Jun 10, 2010 01:39 PM

Fernando,

Aplica un OrdWildSeek al campo 'nombre' y con eso tienes para hacer lo que necesitas.

Saludos

FWH 10.6 + xHarbour + Borland 582

Continue the discussion