Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   SQLite error: NEAR "ON" syntax error. (UPSERT) FMX (https://www.clubdelphi.com/foros/showthread.php?t=94294)

amadis 07-11-2019 17:49:37

SQLite error: NEAR "ON" syntax error. (UPSERT) FMX
 
Que tal compañeros,

Les cuento que estoy incursionando en aplicaciones multiplataforma FMX.

Estoy trabajando con SQLite . (Administrado con SQLiteStudio 3.2.1) Sqlite.dll version 3.24.

Intento actualizar una DB Sqlite que estará en el movil desde datos que tengo en un ClientDataSet.

Eso lo pensaba hacer de la siguiente manera:

Código SQL [-]
INSERT INTO articulos
(id, l1, l2, articulo,iva)
 values (123, 22, 33,'Artic',5)
ON CONFLICT(id)
 DO UPDATE 
SET l1= 22, l2 = 33, iva = 5
 WHERE id = 123

Pero al ejecutarlo, tanto en win32 como Android, obtengo el siguiente error

FireDac[Phys][SQLite]error: NEAR "ON" syntax error

Se me ocurre que puede ser porque por lo que vi la sentencia UPSERT Es soportada desde la version 3.24 de SQLite.

Si ejecuto lo mismo desde SqliteStudio todo funciona correctamente. (El SqliteStudio vino acompañado de la dll 3.24 de Sqlite.
He intentado acompañar mi Exe con la misma dll pero no funciona.

Y menos lo de android.

¿como saber que version Sqlite trae el android? o se puede distribuir de alguna forma el sqlite de android??

¿de que otra forma puedo hacer una actualización de un Id existente, o si no ingresar el nuevo registro

No me convence la idea de hacer una consulta por id, si resulta cero inserto o de lo contrario actualizo, por eso buscaba algo como lo que cité arriba.

Desde ya muchas gracias por su tiempo

Casimiro Notevi 07-11-2019 21:23:37

Insert or replace

http://www.conclase.net/c/sqlite/?litesen=INSERT

amadis 11-11-2019 12:52:56

Hola Casimiro,

Necesito algo mas parecido al UPSERT ya que necesito usar la clausula WHERE, no sólo para el ID, como en el ejemplo sino para preguntar además fecha y hora del registro para ver si hay que actualizarlo o no (en caso de que exista) o insertarlo si no está.

Y con Insert or Replace no se permite Where.

amadis 11-11-2019 13:14:21

Creo que solución sería algo como intentar un Update ( si corresponde where fecha < :parametro).
Y si fracasa (no existe el registro) insertarlo

Casimiro Notevi 11-11-2019 15:44:51

Un insert que fallará si ya existe y entonces haces update.
Código Delphi [-]
try
  insert into ...   ;  // Si ya existe el id, fallará.
except
  update ... where id=123;  
end;

mamcx 11-11-2019 16:10:57

Cita:

Empezado por amadis (Mensaje 534339)
Se me ocurre que puede ser porque por lo que vi la sentencia UPSERT Es soportada desde la version 3.24 de SQLite.

Debes compilar sqlite3 para no usar la version que tengas por defecto.

Parece que para firedac:

https://stackoverflow.com/questions/...firedac-sqlite

amadis 11-11-2019 16:18:24

Chequearé eso de compilar con la ultima versión que parece muy interesante.

Por ahora la solución era tan simple que no me daba cuenta de hacer lo que sugirió Casimiro


La franja horaria es GMT +2. Ahora son las 05:01:13.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi