alberto-moyano   23-10-2023, 18:31
#1
Hola gente, tengo la siguiente situación en un formulario al levantarlo en el evento Open aplico un condicional que analice una tabla de la base de datos buscando un elemento en concreto (un nombre en un campo) si lo encuentra sigue, si no lo encuentra debe crear la fila, la BBDD no son mi fuerte y no entiendo el error, este es el código que estoy utilizando, alguna idea

Gracias de antemano

Código:
  If Conn Then
    Contenido = Conn.Exec("select * from metadatos WHERE nombreArchivo = '" & FMain.rutaNAME & ".tex'")
    If Contenido.Available Then
      txtnombreArchivo.Text = Contenido["nombreArchivo"]
    Else
      Conn.Exec("INSERT INTO metadatos (nombreArchivo) VALUES ('" & FMain.rutaNAME & ".tex')")
    Endif
  Endif
Harpo   23-10-2023, 20:47
#2
No dices qué error se produce, si falla en la inserción del registro por una restricción de base de datos, en principio las sentencias parecen bien construidas.
Entiendo que "Contenido" es un Result. Yo suelo añadirle una condición más cuando compruebo resultados en esa clase, compruebo que Result.Count sea mayor que cero.

Saludos, Harpo.
alberto-moyano   23-10-2023, 21:44
#3
Hola Arpo, el error que tengo es que la consulta después del Else es violatoria, por lo que vengo leyendo está relacionado con el Id que es incremental, seguiré haciendo pruebas.

Sí cargo un campo nombreArchivo por fuera y ejecuto el formulario no obtengo errores, quiero decir el error está centrado en el INSERT.

Sls
tincho   23-10-2023, 22:41
#4
(23-10-2023, 21:44)alberto-moyano escribió: por lo que vengo leyendo está relacionado con el Id que es incremental

Si creo que vas bien encaminado por ahí.
si podes abri la base de datos (supongo que es sqlite) y copia la sentencia de creacion de la tabla "metadatos" y ponela aca en el hilo, asi podemos ver mas detalle.
si la table tiene un campo autoincremental la sentencia la tenes que poner así:
[code]
Donde null tiene que estar para que la base "sepa" que tiene que poner un nuevo id
Tambien tenes que fijarte que "FMain.rutaNAME" no exista en la base porque si es un campo de valores únicos también te salta error.

1 Saludo.
Harpo   24-10-2023, 09:41
#5
Cómo dice Tincho sería interesante ver la sentencia de creación de la tabla.
En sqlite nunca he incluido el campo autoincremental a NULL en una sentencia INSERT, la base de datos ya lo gestiona por si misma.

Si la sentencia de creación de la tabla es como esta:
Código:
CREATE TABLE Metadatos (
ID_Metadatos INTEGER PRIMARY KEY AUTOINCREMENT,
nombreArchivo TEXT UNIQUE NOT NULL );

Al intentar insertar registros con el mismo valor en el campo nombreArchivo le dará error.
Si en algún momento FMain.rutaNAME estaba vacío insertó un valor ".tex" en la tabla, si se repite la situación la segunda vez dará error por la restricción UNIQUE en el campo.

Sobre el código que utiliza le recomiendo la siguiente modificación:
Código:
   Dim sFile As String
   
   If Conn Then
      If Not FMain.rutaNAME Then Return 'Acciones a tomar si la variable está vacia.
      sFile = FMain.rutaNAME & ".tex"
      Contenido = Conn.Exec("SELECT * FROM metadatos WHERE nombreArchivo = &1", sFile)
      If Contenido.Available And Contenido.Count > 0 Then
         txtnombreArchivo.Text = Contenido["nombreArchivo"]
      Else
        Conn.Exec("INSERT INTO metadatos (nombreArchivo) VALUES (&1)", sFile)
      Endif
   Endif

Saludos, Harpo.
alberto-moyano   24-10-2023, 13:11
#6
Gracias Harpo y Tincho, ya quedo solucionado.

Terminé el software, solo me falta decidir que parte sí y que parte no, implementar de la normativa NISO para el archivo .tex de salida.

Cuando termine de implementar esto lo subo a la granja junto con un video demostrativo, el soft es MUY específico y se instalan muchas dependencias (por eso el video, para que no tengan que instalar todo lo necesario para usarlo a menos que lo deseen).

Ha sido una grata experiencia aprender Gambas a medida que hacía el desarrollo y este foro ha sido de gran ayuda.
  
Usuarios navegando en este tema: 2 invitado(s)
Powered By MyBB, © 2002-2024 MyBB Group.
Made with by Curves UI.