Autor |
Mensaje |
chaskux
Marcos Sepulveda
Aprendiz
Registrado: Septiembre 2009
Mensajes: 70
Edad: 51 Ubicación: Chile, Santiago
|
Problema Con Campo Indice Autoincremental No Reconocido
Estimados,
Creo mi primer post luego de comenzar mi proyecto de administración de condominio.
diseñe dos tablas en la aplicacion Kata Kuntur como se ve en la imagen siguiente
Donde se puede ver como están enlazadas por el id_comunidad. Luego genero el codigo para crear la BD SQLite como se ve en la siguiente imagen
veo que agrega el tipo de campo interger y el autoincrement la propieda not null y la key.
hago un simple insert a la tabla asumiendo que todo va a funcionar y me envia el error de que no puede crear por problemas con la key. probe varias formular de crear el insert... hasta que al mirar como lo reconocia gambas en su propio editor de BD veo que solo esta como integer, y solo para probar lo cambie a serial.
para mi sorpresa creo el registro en la tabla maestra sqlite_sequence y ademas reacomodo los numeros serialisandolos dentro de la tabla
quedando como se ve en la imagen
mi pregunta ahora es... como se que tipo tiene el campo?, esta mala la instruccion sql del editor?...
ya puedo seguir programando, pero me quedan esas dudas?
estoy usando
Mageia = 5
gambas = 3.6.2
componente = gb.sqlite3
|
#1 Jueves, 08 Septiembre 2016, 01:20 |
|
|
shordi
Analista Programador
Registrado: Septiembre 2009
Mensajes: 4982
Edad: 64 Ubicación: Albacete
|
Re: Problema Con Campo Indice Autoincremental No Reconocido
Citar: mi pregunta ahora es... como se que tipo tiene el campo?, esta mala la instruccion sql del editor?...
Tienes que ser consciente de que gambas no trata con ninguna base de datos "a pelo" entre tu código y la BD hay una capa de interpretación de tipos y demás peculiaridades de cada una de las BD.
gambas tiene sus propios tipos de campo y el driver, en este caso el componente gb.db.sqlite3, los traduce a los tipos propios de la BD.
La nomenclatura de primary key not null autoincrement en gambas, a la hora de definir el tipo de campo se traduce como serial. Ten en cuenta que esa nomenclatura no te valdría para Mysql, por ejemplo, pero usando serial te vale para los dos motores.
Otro asunto es la peculiaridad de SQLite como BD, tan distinta de las BD tradicionales, al punto de que en su página web titulan "SQL tal como lo entiende SQLite"... pero eso es otra historia...
Saludos.
=================== No podemos regresar
|
#2 Jueves, 08 Septiembre 2016, 08:31 |
|
|
chaskux
Marcos Sepulveda
Aprendiz
Registrado: Septiembre 2009
Mensajes: 70
Edad: 51 Ubicación: Chile, Santiago
|
Re: Problema Con Campo Indice Autoincremental No Reconocido
Concuerdo con lo que mencionas, y puesto que entiendo que gambas usa capa de abstracción para acceder a las distintas BD y así poder generar las clases que te permitan trabajar con todas ellas de manera más transparente. También entiendo que SQlite es suuuuper especial en el trato de sql estándar y sus bemoles...me quedo claro anoche.
me llama la atención el tratamiento que le dio al campo en particular y que al cambiarlo en la interfaz que tiene gambas me dejara pasar y además accediera a la tabla interna de manejo de secuencias. Ahora como dices y por el hecho de hacer traducción algo extra debe hacer con la BD..
voy a revisar más material de SQLite y herramientas para levantar un BD ya que ninguna de las que me dejo instalar mageia de sus repositorios me indico que eran autoincrement y me dieran la opción de hacerlo. también la app para diagramar no fue capaz de generar esas instrucciones.
investigare un poco más sobre este tema para dar una respuesta a lo planteado.
independiente que la aplicación la pense para trabajar alone in the dark.. .. si me encuentro con la situación de restaurar la BD tengo que ser capaz de lograr el mismo efecto.
saludos
|
#3 Jueves, 08 Septiembre 2016, 14:18 |
|
|
shordi
Analista Programador
Registrado: Septiembre 2009
Mensajes: 4982
Edad: 64 Ubicación: Albacete
|
Re: Problema Con Campo Indice Autoincremental No Reconocido
Para manejar las bd SQLite a pelo yo utilizo Sqliteman. Sin problemas y correcto. No sé si Mageia lo tiene en sus repositorios. Mint y Ubuntu sí.
Saludos
=================== No podemos regresar
|
#4 Jueves, 08 Septiembre 2016, 17:00 |
|
|
tincho
Analista Programador
Registrado: Noviembre 2014
Mensajes: 2565
Edad: 48 Ubicación:
|
Re: Problema Con Campo Indice Autoincremental No Reconocido
Para manejar las bd SQLite a pelo yo utilizo Sqliteman. Sin problemas y correcto. No sé si Mageia lo tiene en sus repositorios. Mint y Ubuntu sí.
Saludos
También esta DB Browser for SQLite que no esta nada mal, pero no logre encontrar la manera de crear vistas con el todavía, pero para todo lo demás funciona muy bien.
Saludos.
|
#5 Jueves, 08 Septiembre 2016, 21:51 |
|
|
chaskux
Marcos Sepulveda
Aprendiz
Registrado: Septiembre 2009
Mensajes: 70
Edad: 51 Ubicación: Chile, Santiago
|
Re: Problema Con Campo Indice Autoincremental No Reconocido
bueno chicos, probando y probando logre tener unas cosas claras
1.- ojo con la definición de los campos ya que no todos los tipos que uno conoce de otras lados coinciden
Sqlite datatypes
2.- Al definir una tabla con la instrucción "INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL ," definitivamente si toma solo el valor como un campo que se incrementa solo y al realizar un insert se pasa el NULL..
Este codigo muestra como creo el registro con un Null
conectar.abrirConexion()
conectar.connDb.Exec("PRAGMA foreign_keys = ON;")
Resultado = conectar.connDb.Create("Condominios")
Resultado!id_condominio = Null 'RegistroCondominio.id_condominio
Resultado!descripcion_condominio = RegistroCondominio.descripcion_condominio
Resultado!vigencia_condominio = RegistroCondominio.vigencia_condominio
Try Resultado.Update()
If Error Then
Error.Raise(mdlErrores.error0007 & " " & Error.Text)
Endif
conectar.cerrarConexion()
use una clase de transporte de datos donde definí el tipo boolean, así que entre amigos conversan ellos y se realiza la transformación
3.- Cuando consultas por un campo boolean al usar la constante "TRUE" o "FALSE" te pone una "T" o una "F" por lo que hay que poner a mano el "0""o el "1"
Esto no funciona
If vigenciaCondominio <> "" Then
strSQl &= strCon & " vigencia_condominio = '" & IIf(String.Lower(vigenciaCondominio) = "vigente", True, False) & "'"
Endif
Esto Si funciona
If vigenciaCondominio <> "" Then
strSQl &= strCon & " vigencia_condominio = '" & IIf(String.Lower(vigenciaCondominio) = "vigente", 0, 1) & "'"
Endif
en esta imagen como se ve segun SQLITEMAN y que serian los valores reales del campo
aca como se ven los valores segun gambas
al que si hacen el select con vigencia = 'T' / vigencia = T / vigencia = True no muestra nada pero si pones vigencia = 0 ..
Asi que ya tengo harto mas clara la película.... espero que esta pequeña reflexión ayude a alguien que juegue con esta BD y gambas y que ademas los #$$#$ el jugar con los registros
|
#6 Martes, 13 Septiembre 2016, 02:28 |
|
|
shordi
Analista Programador
Registrado: Septiembre 2009
Mensajes: 4982
Edad: 64 Ubicación: Albacete
|
Re: Problema Con Campo Indice Autoincremental No Reconocido
bueno chicos, probando y probando logre tener unas cosas claras
3.- Cuando consultas por un campo boolean al usar la constante "TRUE" o "FALSE" te pone una "T" o una "F" por lo que hay que poner a mano el "0""o el "1"
Esto no funciona
If vigenciaCondominio <> "" Then
strSQl &= strCon & " vigencia_condominio = '" & IIf(String.Lower(vigenciaCondominio) = "vigente", True, False) & "'"
Endif
Esto Si funciona
If vigenciaCondominio <> "" Then
strSQl &= strCon & " vigencia_condominio = '" & IIf(String.Lower(vigenciaCondominio) = "vigente", 0, 1) & "'"
Endif
...
No funciona lo primero y te ves obligado a hacer lo segundo porque no utilizas toda la potencia de los objetos de gambas.
Si en lugar de lo primero hicieras:
If vigenciaCondominio <> "" Then
miresult=miconexion.exec(strCon & " vigencia_condominio = &1", (String.Lower(vigenciaCondominio) = vigente))
Endif
Dejas en mano del driver de gambas la conversión de tipos y demás. Además de ser más rápido es más directo y cómodo.
Saludos
=================== No podemos regresar
|
#7 Martes, 13 Septiembre 2016, 09:34 |
|
|
chaskux
Marcos Sepulveda
Aprendiz
Registrado: Septiembre 2009
Mensajes: 70
Edad: 51 Ubicación: Chile, Santiago
|
Re: Problema Con Campo Indice Autoincremental No Reconocido
Pucha hombre, pero que buen dato me has tirado... recien me di cuenta que el exec permite el paso de parámetros... tengo que armar bien el código para que me tome los parámetros, ya que armo la query de forma dinámica.
|
#8 Martes, 13 Septiembre 2016, 15:24 |
|
|
chaskux
Marcos Sepulveda
Aprendiz
Registrado: Septiembre 2009
Mensajes: 70
Edad: 51 Ubicación: Chile, Santiago
|
Re: Problema Con Campo Indice Autoincremental No Reconocido
shordi, excelente... he llegado a casa derecho a probar lo queme dices y despues de darme algunas vueltas en el aire el codigo quedo asi
strSql = "select id_condominio, descripcion_condominio, vigencia_condominio from Condominios"
strCon = " where "
If CodigoCondominio <> "" Then
strSql &= strCon & " id_condominio in ( &1 )"
strCon = " and "
Endif
If descripcionCondominio <> "" Then
strSQl &= strCon & " descripcion_condominio like '%&2%'"
strCon = " and "
Endif
If vigenciaCondominio <> "" Then
strSQl &= strCon & " vigencia_condominio = &3"
Endif
Try resultado = conectar.connDb.Exec(strSql, CodigoCondominio, descripcionCondominio, String.Lower(vigenciaCondominio) = "vigente")
If Error Then
Error.Raise(mdlErrores.error0005)
Endif
al enviarle el numero del parámetro que debe rescatar, los demás los desprecia, eso estuvo bueno ya que primero pensé que tendría que hacer un tremendo ladrillo de código para determinar cual era el valido y la posición....
|
#9 Martes, 13 Septiembre 2016, 22:18 |
|
|
|