Harpo 03-04-2022, 08:46
Saludos!
Les traigo una pequeña demo de cómo usar una característica de SQLite: Full-Text Search (FTS5). Iba a contestar al mensaje de Gambafeliz sobre filtrar acentos y pensé que quizá ya estuviera este tema expuesto en el foro antiguo, no encontré nada al respecto. Seguramente los veteranos ya conozcan esta característica, para los neófitos será algo nuevo. Y cómo lo mejor es un ejemplo práctico aquí tienen una demo básica para empezar con el tema.

¿Qué es FTS5?
En un módulo interno de SQLite que permite realizar búsquedas "Full-Text" mediante la creación de tablas virtuales. Este tipo de búsquedas ignora acentos, mayúsculas ... se lo traga casi todo. Aquí tienen un par de enlaces:
SQLite FTS5
Full-Text Search Wikipedia

Para los que no quieran descargar la demo:
Para usar FTS5 hay que crear una tabla virtual:
[code]
La tabla contendrá los campos de texto sobre los que queremos buscar.

Después la cargamos desde una fuente de datos estándar, en este caso una vista que recoge datos de otras tablas:
[code]

Por último, podemos lanzar las consultas en formato FTS5 que tienen su particularidad:
[code]

La demo.
Antes de nada, el programa es un "hijo putativo" Angel  de una aplicación propia que utilizo para trastear con bases de datos, le he quitado lo irrelevante para el caso y limpiado, pero no tiene control de errores ni comentarios.... no debería darles ningún problema.

[Imagen: w1S9gCP.png]

En la imagen:
A la izquierda hay un GridView con información de la conexión y recoge el tamaño de la base de datos SQLite, tema relevante porque verán que esta engorda cual luchador de sumo, aunque no es un problema. Debajo un Log de lo que se va ejecutando con el tiempo empleado y el SQL ejecutado.

A la derecha empezando por arriba:
  • La primera linea contiene botones para ejecutar la demo (pasos 1 a 4), otro para borrar la tabla virtual FTS5, otro que muestra las tablas en la base de datos y el que cierra la aplicación.
  • La segunda es un Combobox que una vez completados los 4 pasos contiene sentencias SQL Full-Text de ejemplo para ver las posibilidades.
  • La tercera es TextArea donde se cargan las sentencias SQL, se pueden modificar y volver a lanzar. Todas las sentencias que ejecuta la demo pasan por aquí. A su lado hay 3 botones: ejecutar el SQL, limpiar el TextArea, limpiar el GridView. Si pulsan Enter en TextArea ejecuta la sentencia. Si hacen doble click sobre una linea del Log se vuelve a cargar el SQL aquí.
  • Por último un GridView con los resultados.
Todo, o casi todo, tiene un tooltip explicativo.

Los pasos a dar:
  1. Comprobar que nuestro SQLite tiene FTS5 habilitado, en la imagen se puede ver en la linea 8. En el LOG se ve la versión de SQLite que estamos utilizando.
  2. Crear y cargar los datos. Hubiera subido la base de datos que uso para pruebas, son datos de direcciones en España: Autonomía - Provincia - Población - Código Postal - Dirección. Pero hay una limitación de tamaño en lo que se puede subir al foro. Los datos van en un CSV con algo más de 100.000 registros, se puede limitar pero así se puede ver el rendimiento en las búsquedas. Ojo que este paso tarda sus buenos 15 minutos.
  3. Crear la tabla virtual para las búsquedas FTS5. Si pulsan el botón "Tables" verán lo que se crea en la base de datos.
  4. Cargar la tabla virtual con los datos del CSV. Estos dos últimos pasos son rápidos, no llegan a un 1 segundo a pesar de los 100.000 registros.
Una vez terminados los 4 pasos se carga el Combobox con búsquedas de prueba predefinidas, para trastear con ellas. Verán que la base de datos va engordando a medida que se ejecutan. Con el botón de "Remove" se puede borrar la tabla virtual y repetir los pasos 4 y 5.

El resultado:
[Imagen: N50ZYcB.png]

Espero que les sirva para sus proyectos, para mi es muy útil.
Un saludo.
Archivos adjuntos
.gz
FTS5_Demo.tar.gz (Tamaño: 925.02 KB Descargas: 5)
crevilla 01-04-2022, 07:09
Hola a tod@s,

Tal vez muchos ya sepan sobre este pedacito de código a continuación. A mi me tomó bastante tiempo aprender a utilizarlo bien y aquí lo posteo para cualquiera que vaya comenzando su camino y quiera aprender un poco más a usar este control tan útil.
El código sirve para popular un GridView (llamado "gridIzq") con los resultados de un query desde una base de datos. El Gridview muestra los encabezados con los nombres de cada campo del recordset. 
Código:
Try rsRecords = Connection.Exec(sQuery)
    gridIzq.header = GridView.Horizontal
    gridIzq.grid = True
    gridIzq.Rows.count = 0
    gridIzq.Columns.count = rsRecords.Fields.Count
    
    For iInc = 0 To rsRecords.Fields.Count - 1
      iJnc = 1
      Do While Mid(rsRecords.Fields[iInc].Name, iJnc, 1) <> "." 'En MySQL el formato es nombreTabla.nombreCampo, así recuperamos el nombre de campo solamente para el Título de la columna
        iJnc += 1
      Loop
      gridIzq.Columns[iInc].Text = Right(rsRecords.Fields[iInc].Name, Len(rsRecords.Fields[iInc].Name) - iJnc)
      gridIzq.Columns[iInc].Width = 10 * Len(Right(rsRecords.Fields[iInc].Name, Len(rsRecords.Fields[iInc].Name) - iJnc))
    Next
    
    gridIzq.Rows.Count = rsRecords.Count

y no olvidarse de agregar el siguiente código al evento _Data del GridView:

Código:
Public Sub gridIzq_Data(Row As Integer, Column As Integer)
  If (rsRecords <> Null) Then
    If Row >= 0 Then
      rsRecords.moveTo(Row)
      Try gridIzq.Data.Text = Str(rsRecords[Column])
    Endif
  Endif
Catch
Print Error.Text
End

Espero esto ayude a alguien. 
Saluditos, 
Yo.
gambafeliz 30-03-2022, 16:52
Hola

Estoy echo un lío. Con la manera de rellenar con un texto de varias líneas una celda final de GridView. Por favor, alguien seria tan amable de aclarar mis dudas. Gracias.

Pongo la celda final de un GridView con Width y Height = -1 de esta manera automatizo el ancho, esto parece interesante y funcional, pero ocurre lo siguiente y es lo que deseo aclarar con personas con más experiencia en este tema.

Cuando pongo a lo anterior WordWrap = True, la celda se pone mucho mas grande de lo que se esperaba pero si lo pongo a False, entonces, me ocurre que digamos, la linea tenga o no la tenga del borde, borra el texto casí al final de su base o parte inferior o al principio o parte superior. También me ocurre que queda tapado texto que normalmente lo resuelve WordWrap=True

¿Esto es normal? ¿le ocurre a todo el mundo? ¿se puede solucionar? ¿que opinión me pueden dar al respecto?

==== Solucionado ==================================

La solución es casi perfecta pero con un defecto que doy al final la solución en este texto.

1. WordWrap se debe poner en False. En la celda de Nota
2. .Rows[fila].Height = -1
3. Padding = 10
4. Columns.Width = -1

Y el defecto que queda es que la nota sobrepasa el ancho de la celda (esto se resuelve poniendo scrollBar = Both) de esta forma queda todo bien resuelto.
Páginas (571):    1 322 323 324 325 326 571   
Bienvenido, Invitado
Tienes que registrarte para poder participar en nuestro foro.
Recordarme?
Miembros: 310
Último miembro: MARQUITOS6767
Temas del foro: 1,761
Mensajes del foro: 9,153
Últimos temas
Problema con el repósito ...
Foro: Instalación
Último mensaje por: guizans, 14-04-2026, 21:38
Respuestas: 2 - Vistas: 337
UEFI y BIOS
Foro: Hardware & IoT
Último mensaje por: guizans, 13-04-2026, 21:22
Respuestas: 3 - Vistas: 2,501
Visual Studio Code con Ga...
Foro: General
Último mensaje por: guizans, 07-03-2026, 14:24
Respuestas: 2 - Vistas: 722
WebForm con mysql gridvie...
Foro: WebApp/WebForms
Último mensaje por: vjarvelo, 03-03-2026, 16:32
Respuestas: 2 - Vistas: 3,374
Sobre la proteccion del c...
Foro: General
Último mensaje por: Shordi, 19-02-2026, 11:07
Respuestas: 7 - Vistas: 1,309
Powered By MyBB, © 2002-2026 MyBB Group.
Made with by Curves UI.