Hola.
A veces realizamos búsquedas por Índice de trozos y palabras sobre campos de tipo Texto que tienen una longitud grande. Localizar visualmente dónde está el texto encontrado es muchas veces complicado.
Como en muchas aplicaciones que usamos diariamente se me ocurre la Idea de marcar el texto encontrado para facilitar la vida al usuario.
Usaremos un campo de tipo Texto enriquecido para mostrar el texto e insertaremos unas marcas HTML para destacar visualmente los trozos y palabras encontrados.
Esta es la función que obra el milagro:
FUN_TXT_MARCAR_TEXTO(CTEXTO,CTROZOS,CAÑADIR_PRE,CAÑADIR_POS)
Rem ( Marca Trozos de Texto con una cadena PRE y otra POS )
Rem ( CTEXTO: Texto original a procesar )
Rem ( CTROZOS: Cadena de texto con los Trozos a buscar )
Rem ( CAÑADIR_PRE: Texto que se añade ANTES de cada Trozo )
Rem ( CAÑADIR_POS: Texto que se añade DESPUÉS de cada Trozo )
Rem ( Ejem para poner en negrita: FUN_TXT_MARCAR_TEXTO(#CAMPO_TEXTO, "Madrid IVA", "<b>","</b>") )
Rem ( Obtenemos el Nº de Trozos de texto a buscar )
Set ( NNUM_TROZOS, countString(_CTROZOS + " ", " ") )
Set ( CTEXTO_SIN, removeAccents(toLower(_CTEXTO)) )
For ( NTROZO, 0, NTROZO < NNUM_TROZOS, 1 )
Set ( LSALIR, 0 )
Set ( CTROZO_NUM, stringSection(_CTROZOS, " ", NTROZO, 0, 0) )
Rem ( Solo comprobamos los trozos de más de 2 caracteres )
If ( len(CTROZO_NUM) > 2 )
Set ( CTROZO_NUM, removeAccents(toLower(CTROZO_NUM)) )
Set ( NINDEX, -1 )
Set ( NLONG_TROZO, len(CTROZO_NUM) )
Libre
Rem ( Recorremos las ocurrencias )
Rem ( Tenemos que buscar todos los Trozos porque puede haber algunos con acentos o mayúsculas )
For ( NOCURRENCIAS, 0, LSALIR = 0, 1 )
Set ( NINDEX, indexOfString(CTEXTO_SIN, CTROZO_NUM, (NINDEX + 1), 0) )
If ( NINDEX > -1 )
Set ( CCADENA_ANTES, mid(_CTEXTO, NINDEX, NLONG_TROZO) )
Set ( CCADENA_MARCADA, _CAÑADIR_PRE + CCADENA_ANTES + _CAÑADIR_POS )
Set ( _CTEXTO, replaceString(_CTEXTO, CCADENA_ANTES, CCADENA_MARCADA) )
Rem ( Desplazamos el INDEX saltando lo insertado para seguir buscando en el texto )
Set ( NINDEX, NINDEX + len(_CAÑADIR_PRE + CCADENA_ANTES + _CAÑADIR_POS) )
Set ( CTEXTO_SIN, removeAccents(toLower(_CTEXTO)) )
Rem ( Limitamos la búsqueda para evitar retardos )
If ( (NOCURRENCIAS > 10) | (NINDEX > 1000) )
Set ( LSALIR, 1 )
Else
Set ( LSALIR, 1 )
Set dato de retorno ( _CTEXTO )
Libre
Saludos
Paco Satué