In order for this site to work correctly we need to store a small file (called a cookie) on your computer. Most every site in the world does this, however since the 25th of May 2011, by law we have to get your permission first. Please abandon the forum if you disagree.

Para que este foro funcione correctamente es necesario guardar un pequeño fichero (llamado cookie) en su ordenador. La mayoría de los sitios de Internet lo hacen, no obstante desde el 25 de Marzo de 2011 y por ley, necesitamos de su permiso con antelación. Abandone este foro si no está conforme.

Autoincrementales en SQLITE

Foro de Xailer profesional en español
Responder
Angel
Mensajes: 135
Registrado: Mié Mar 21, 2007 1:11 pm

Autoincrementales en SQLITE

Mensaje por Angel »

¿Como puedo trabajar con autoincrementales con datasets creados a partir
de TSQLiteDataSource:Query()?
Con este codigo, recibo el error: TSQLITEDATASOURCE:NEWERROR(345)
Error XAILER/19 ImagenesClientesProveedores.ID_imagen may not be NULL:
IF(AppData:oDataSetImagenes:AddNew())
WITH OBJECT AppData:oDataSetImagenes
:DniCif:=cDnicif
:Imagen:=oBuffer
IF(!:Update())
MSGINFO("Error en el guardado de datos")
END IF
END WITH
END IF
¿Como deberí­a modificar el código para que automaticamente me asigne en
ID_Imagen el autoincremental correspondiente?
miguel-esto-sob
Mensajes: 43
Registrado: Mar Sep 18, 2007 4:55 pm

Autoincrementales en SQLITE

Mensaje por miguel-esto-sob »

Hola,
Probando el sistema de crear autoincrementales que explicó Jose Gimenez
en Madrid con el editor de SQLite sale error y te saca de Xailer, puedes
probar esto Jose.
Creo todas la columnas y a la primera la declaro como INTEGER y marco
UNIQUE a Yes, al guardar la estructura se produce el error.
Gracias de antemano.
Saludos. Miguel A. Torrellas
Avatar de Usuario
ignacio
Site Admin
Mensajes: 9459
Registrado: Lun Abr 06, 2015 8:00 pm
Ubicación: Madrid, Spain
Contactar:

Autoincrementales en SQLITE

Mensaje por ignacio »

Angel,
Para crear campos auto-incrementales hay que indicar que el campo es tipo
'INTEGER' y hacerlo clave primaria. En dicho caso el programa le preguntará
si desea hacer dicho campo auto-incremental.
Desgraciadamente ahora mismo hay un error que provoca un error de ejecución
cuando intenta crear una tabla de este tipo. Ya está arreglado. La solución
de momento consiste en crear primero la tabla sin el campo autoincremental y
luego modificarla.
Un saludo
--
Ignacio Ortiz de Zúñiga
http://www.xailer.com
"Ángel Fernández" <angel@agelso.com> escribió en el mensaje
news:473af4df$[email=1@ozsrv2.ozlan.local...]1@ozsrv2.ozlan.local...[/email]
> ¿Como puedo trabajar con autoincrementales con datasets creados a partir
> de TSQLiteDataSource:Query()?
>
> Con este codigo, recibo el error: TSQLITEDATASOURCE:NEWERROR(345)
> Error XAILER/19 ImagenesClientesProveedores.ID_imagen may not be NULL:
>
> IF(AppData:oDataSetImagenes:AddNew())
> WITH OBJECT AppData:oDataSetImagenes
> :DniCif:=cDnicif
> :Imagen:=oBuffer
> IF(!:Update())
> MSGINFO("Error en el guardado de datos")
> END IF
> END WITH
> END IF
>
> ¿Como debería modificar el código para que automaticamente me asigne en
> ID_Imagen el autoincremental correspondiente?
>
>
Ignacio Ortiz de Zúñiga
[OZ Software]
https://www.ozs.es
--
[Equipo de Xailer / Xailer team]
https://www.xailer.com
Avatar de Usuario
jfgimenez
Site Admin
Mensajes: 5718
Registrado: Lun Abr 06, 2015 8:48 pm
Contactar:

Autoincrementales en SQLITE

Mensaje por jfgimenez »

Angel y Miguel Angel,
tal y como ha indicado Ignacio, un autoincremental en SQLite es un campo
'INTEGER PRIMARY KEY'.
Pero me gustaría aclarar un cosa más que seguramente no sabreis o no habreis
caido... en SQLite, todas las tablas tienen ya un campo autoincremental
implícito, que se llama RowId o _RowId_, aunque permanece oculto y hay que
declararlo explícitamente en la consulta para obtenerlo. Este campo siempre
existe, y es un entero de 64 bits. En el caso de declarar un campo 'INTEGER
PRIMARY KEY', lo que hace es añadir ese nombre de campo como sinónimo de
RowId, al tiempo que lo hace visible por defecto.
Para que nos entendamos, una consulta del tipo:
SELECT * FROM Clientes
devuelve todos los campos 'declarados' de la tabla Clientes, mientras que:
SELECT RowId,* FROM Clientes
devuelve el campo autoincremental especial 'RowId' además de todos los
campos declarados de la tabla. Pero supongamos ahora que hay un campo
llamado IdCliente que es INTEGER PRIMARY KEY, entonces en la segunda
consulta, la columna RowId y la columna IdCliente tendrán exactamente los
mismos valores para cada registro.
--
Un saludo,
José F. Giménez
http://www.xailer.com
http://www.xailer.info
José F. Giménez
[Equipo de Xailer / Xailer team]
http://www.xailer.com
http://www.xailer.info
miguel-esto-sob
Mensajes: 43
Registrado: Mar Sep 18, 2007 4:55 pm

Autoincrementales en SQLITE

Mensaje por miguel-esto-sob »

Hola,
Gracias por responder,
Ignacio Ortiz de Zúñiga escribió:
> Angel,
>
> Para crear campos auto-incrementales hay que indicar que el campo es tipo
> 'INTEGER' y hacerlo clave primaria. En dicho caso el programa le preguntará
> si desea hacer dicho campo auto-incremental.
Así­ es como se produce el error
>
> Desgraciadamente ahora mismo hay un error que provoca un error de ejecución
> cuando intenta crear una tabla de este tipo. Ya está arreglado. La solución
> de momento consiste en crear primero la tabla sin el campo autoincremental y
> luego modificarla.
>
De esta forma, todo perfecto, sin problemas. Si el editor incluyera una
opción para poder ver la sentencia de creación de la tabla, no harí­a
falta ninguna otra herramienta para manejar SQLite. Repito gracias por
vuestro interés.
> Un saludo
>
Angel
Mensajes: 135
Registrado: Mié Mar 21, 2007 1:11 pm

Autoincrementales en SQLITE

Mensaje por Angel »

Jose F. Gimenez escribió:
> Angel y Miguel Angel,
>
> tal y como ha indicado Ignacio, un autoincremental en SQLite es un campo
> 'INTEGER PRIMARY KEY'.
>
> Pero me gustarí­a aclarar un cosa más que seguramente no sabreis o no habreis
> caido... en SQLite, todas las tablas tienen ya un campo autoincremental
> implí­cito, que se llama RowId o _RowId_, aunque permanece oculto y hay que
> declararlo explí­citamente en la consulta para obtenerlo. Este campo siempre
> existe, y es un entero de 64 bits. En el caso de declarar un campo 'INTEGER
> PRIMARY KEY', lo que hace es añadir ese nombre de campo como sinónimo de
> RowId, al tiempo que lo hace visible por defecto.
>
> Para que nos entendamos, una consulta del tipo:
>
> SELECT * FROM Clientes
>
> devuelve todos los campos 'declarados' de la tabla Clientes, mientras que:
>
> SELECT RowId,* FROM Clientes
>
> devuelve el campo autoincremental especial 'RowId' además de todos los
> campos declarados de la tabla. Pero supongamos ahora que hay un campo
> llamado IdCliente que es INTEGER PRIMARY KEY, entonces en la segunda
> consulta, la columna RowId y la columna IdCliente tendrán exactamente los
> mismos valores para cada registro.
>
Conocí­a la existencia del campo RowId, pero, me surgen varias dudas.
¿Es únicamente INTEGER PRIMARY KEY? Normalmente en otro SGBD, esto
implicarí­a UNIQUE Y NOT NULL, pero en SQLITE no se si serí­a también así­.
A partir de una sentencia INSERT, no serí­a complicación usar el campo
pues en el 'autoincremental', insertarí­a directamente NULL, ej:
Tabla: Usuarios(ID_Usuario,nombre)
INSERT INTO USUARIOS(ID_Usuario,nombre) VALUES (NULL,"Usuario1")
¿Pero como harí­a esto en un AddNew() de un TDataset? ¿Supongo que serí­a así­?
oDataset:AddNew()
oDataset:ID_Usuario:=NIL
oDataset:nombre:="Usuario1"
¿Supongo que lo mejor para mi base de datos, serí­a eliminar cualquier
campo tipo incremental? Si existe ya uno automáticamente, veo una
redundancia volver a crear otro campo cuando ya existe uno que hace la
función de éste.
Para crear las bases de datos SQLITE y editar/trabajar con ellas, estoy
actualmente utilizando una aplicación gratuita de muy buena calidad (y
en español), os dejo el enlace por si quereis probarla:
http://sqliteadmin.orbmu2k.de
Avatar de Usuario
jfgimenez
Site Admin
Mensajes: 5718
Registrado: Lun Abr 06, 2015 8:48 pm
Contactar:

Autoincrementales en SQLITE

Mensaje por jfgimenez »

Ángel,
> Conocía la existencia del campo RowId, pero, me surgen varias dudas.
> ¿Es únicamente INTEGER PRIMARY KEY? Normalmente en otro SGBD, esto
> implicaría UNIQUE Y NOT NULL, pero en SQLITE no se si sería también así.
Bueno, una clave primaria siempre es UNIQUE, y al insertar un registro, si
se asigna NULL a un campo autoincremental, automáticamente tomará el valor
que le corresponda, no NULL. Por lo tanto, no hace falta indicar esos dos
'flags', ya que son implícitos en este caso.
> A partir de una sentencia INSERT, no sería complicación usar el campo pues
> en el 'autoincremental', insertaría directamente NULL, ej:
> Tabla: Usuarios(ID_Usuario,nombre)
> INSERT INTO USUARIOS(ID_Usuario,nombre) VALUES (NULL,"Usuario1")
Si no recuerdo mal, en SQLite te permite grabar NULL o un valor. Si grabas
NULL, entonces SQLite grabará el valor que corresponda, es decir, el número
más alto que tenga grabado + 1. Y si grabas otro valor, pueden ocurrir dos
cosas:
- Que el valor que indicas sea más alto que el último + 1. Entonces lo
grabará correctamente y ese será el que utilice para calcular el siguiente.
Sirve para alterar (o dejar huecos) en la numeración.
- Que el valor sea inferior al último + 1. Entonces dará un error al grabar.
> ¿Pero como haría esto en un AddNew() de un TDataset? ¿Supongo que sería
> así?
> oDataset:AddNew()
> oDataset:ID_Usuario:=NIL
> oDataset:nombre:="Usuario1"
Exactamente. Eso es lo mejor. Así dejas que sea el propio motor el que
asigne el número que le toque.
> ¿Supongo que lo mejor para mi base de datos, sería eliminar cualquier
> campo tipo incremental? Si existe ya uno automáticamente, veo una
> redundancia volver a crear otro campo cuando ya existe uno que hace la
> función de éste.
Cada cual tiene que ver sus propias necesidades, pero si te sirve de guía,
te puedo decir que yo utilizo claves primarias que no son 'integer' para no
hacerlas coincidir con RowId. Incluso si necesitas tener un campo de tipo
'entero' como clave primaria, puedes usar el tipo 'INT' en vez de 'INTEGER';
con esto se comportará correctamente como número entero, pero sin asimilarlo
a RowId.
> Para crear las bases de datos SQLITE y editar/trabajar con ellas, estoy
> actualmente utilizando una aplicación gratuita de muy buena calidad (y en
> español), os dejo el enlace por si quereis probarla:
> http://sqliteadmin.orbmu2k.de
Te aconsejo que utilices el editor de SQLite que hay en el propio IDE de
Xailer. Seguramente el que comentas es mejor, pero también es seguro que
tratará las fechas de forma distinta a Xailer, y a la postre tendrás
problemas.
--
Un saludo,
José F. Giménez
http://www.xailer.com
http://www.xailer.info
José F. Giménez
[Equipo de Xailer / Xailer team]
http://www.xailer.com
http://www.xailer.info
Responder