Ir al contenido


Foto

SQLite y Max(ID)


  • Por favor identifícate para responder
14 respuestas en este tema

#1 FGarcia

FGarcia

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 687 mensajes
  • LocationMéxico

Escrito 17 abril 2014 - 01:55

Hola!

Para los que se quedaron en casa y no fueron de vacaciones una preguntita.

Estoy usando Delphi XE2, SQLite, UniDac 5.0.2

En un query tengo esta sentencia:



delphi
  1. SELECT MAX(ID) AS max_id FROM CAPDATA;



El campo max_id me aparece como de tipo BLOB type ftMemo, sin embargo el campo ID de CAPDATA esta declarado como Integer y es la Primary Key

Como frontend para SQLite estoy usando SQLiteSpy y al ejecutar la sentencia me aparece el resultado correcto.

En delphi estoy haciendo esto:



delphi
  1. procedure TdmCnx.InsertarTotales(datos: real);
  2. var
  3.   maxId: integer;
  4. begin
  5.   //SELECT MAX(id) FROM TuTabla
  6.  
  7.   qyMaxId.Open;
  8.   maxId := qyMaxId.FieldByName('max_id').Value;
  9.  
  10. end;



el resultado de esto es:

---------------------------
Debugger Exception Notification
---------------------------
Project Project1.exe raised exception class EDatabaseError with message 'qyMaxId: Type mismatch for field 'max_id', expecting: Memo actual: LargeInt'.
---------------------------
Break  Continue  Help 
---------------------------


Aqui la pregunta ¿Es posible convertir el blob memo a integer? o como debo de tratar esto.


Saludos!!
  • 0

#2 FGarcia

FGarcia

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 687 mensajes
  • LocationMéxico

Escrito 21 abril 2014 - 05:17

¿Nadie?

¿Ningun comentario?

: : : : :
  • 0

#3 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 21 abril 2014 - 06:07

Utiliza .AsInteger en lugar de .Value.
Tampoco descartaría, si los campos son persistentes, que el error se deba a que accidentalmente hayas cambiado sus propiedades y configurarlo del tipo memo.

Saludos.
  • 0

#4 FGarcia

FGarcia

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 687 mensajes
  • LocationMéxico

Escrito 22 abril 2014 - 11:34

El uso de .AsInteger ya lo habia intentado y no, me continua marcando error.
Lo de haber cambiado accidentalmente el tipo de campo tambien lo pense e hice algunas modificaciones que no tuvieron exito.
Ahora he vuelto a retomar el tema y lo que hice fue borrar el query anterior y borrar la referencia que hacia de el en la ejecucion del programa, he ejecutado el programa sin errores, salve cambios, cerre el IDE, reinicie la maquina y volvi al proyecto. He creado un nuevo query con un nombre diferente pero la misma sentencia sql y si, efectivamente el campo se crea por defecto como ftMemo    :huh:

Cosas raras......  :(
  • 0

#5 Rolphy Reyes

Rolphy Reyes

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.092 mensajes
  • LocationRepública Dominicana

Escrito 22 abril 2014 - 11:54

Saludos.

En un select Id from CAPDATA ¿Cómo lo ve Delphi?.

Por ultimo, puedes probar lo siguiente



delphi
  1. SELECT CAST(MAX(ID) AS INTEGER) AS max_id FROM CAPDATA


  • 0

#6 FGarcia

FGarcia

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 687 mensajes
  • LocationMéxico

Escrito 22 abril 2014 - 01:01

Saludos.

En un select Id from CAPDATA ¿Cómo lo ve Delphi?.


Como AutoNumeric por lo que supongo es un LongInt.


Por ultimo, puedes probar lo siguiente



delphi
  1. SELECT CAST(MAX(ID) AS INTEGER) AS max_id FROM CAPDATA



El detalle es que max_id es ftMemo y es el que brinca el error, intente hacer un cast ahi pero me marca errores de sintaxis

Near "(": sintax error


Ya busque informacion en la documentacion de sqlite y no hay nada de informacion especial sobre la clausula AS.


  • 0

#7 FerCastro

FerCastro

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 636 mensajes
  • LocationCiudad de México

Escrito 22 abril 2014 - 02:12

Hola!

Andaba de vaca no había visto tu mensaje. Trabajo SQLite y Unidac así que quizá pudiera ayudarte.

Yo uso el max pero es sobre un integer, y bien a bien no he entendido bien que es lo que haces tu.



delphi
  1. try
  2.     With DM.qComEvento do
  3.       Begin
  4.       Close;
  5.       SQL.Text := '';
  6.       SQL.Text := 'select max(id_evento) as id_evento from evento';
  7.       Open;
  8.     End;
  9.   Except
  10.     MessageDlg('La Base de Datos no está disponible', mtError, [mbOK], 0);
  11.     exit;
  12.   end;
  13.  
  14.   nID  := DM.qComEvento.FieldByName('ID_Evento').AsInteger;



Algo así es lo que tengo (a grandes rasgos, no tengo el código exacto por si alguien quiere comenzar a decir que faltan cosas). Ahora bien, CREO que no hay manera de hacer un max sobre un blob al menos cobn SQLIte.

Saludos!
  • 0

#8 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.945 mensajes
  • LocationMéxico

Escrito 22 abril 2014 - 02:22

Se me hace amigo, que se autocrearon los campos en tu componente Query. Revisa y si es el caso bórralos.

Saludos.
  • 0

#9 FGarcia

FGarcia

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 687 mensajes
  • LocationMéxico

Escrito 22 abril 2014 - 03:04

Hola!

Andaba de vaca no había visto tu mensaje. Trabajo SQLite y Unidac así que quizá pudiera ayudarte.

Yo uso el max pero es sobre un integer, y bien a bien no he entendido bien que es lo que haces tu.



delphi
  1. try
  2.     With DM.qComEvento do
  3.       Begin
  4.       Close;
  5.       SQL.Text := '';
  6.       SQL.Text := 'select max(id_evento) as id_evento from evento';
  7.       Open;
  8.     End;
  9.   Except
  10.     MessageDlg('La Base de Datos no está disponible', mtError, [mbOK], 0);
  11.     exit;
  12.   end;
  13.  
  14.   nID  := DM.qComEvento.FieldByName('ID_Evento').AsInteger;



Algo así es lo que tengo (a grandes rasgos, no tengo el código exacto por si alguien quiere comenzar a decir que faltan cosas). Ahora bien, CREO que no hay manera de hacer un max sobre un blob al menos cobn SQLIte.

Saludos!



Pues solo hago esto dentro del editor del UniQuery (SQL statement):



delphi
  1. //Original
  2. SELECT MAX(ID) FROM CAPDATA;
  3.  
  4. //Modificado
  5. SELECT MAX(ID) AS max_id FROM CAPDATA;



ID es la clave primaria autonumerica por lo que su naturaleza es de tipo integer.

En ambas sentencias me regresa que MAX(ID) y max_id son campos de tipo BLOB = ftmemo

Y no, no se autocrean los campos (poliburro) ya intente cambiar el tipo pero no, los errores persisten.

Lo que hice fue esto:



delphi
  1. SELECT * FROM capdatos
  2. ORDER BY ID DESC
  3. LIMIT 1;



y de ahi tome el campo ID y funciona bien

No se si sea detalle de los UniDac con SQLite o yo ando queriendo inventar el hilo negro :)
  • 0

#10 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 22 abril 2014 - 03:10

Pues la verdad amigo es que es raro lo que nos describes. La última que me ocurre es que se trata de un bug en UNIDac; al menos en la versión con la que trabajas.  :(
No debería ser necesario hacer esos pasos indirectos para evitar el problema. Pero mientras así ande, pues que se va a hacer.

Deberías consultar al área de soporte de UNIDac.

Saludos,
  • 0

#11 FerCastro

FerCastro

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 636 mensajes
  • LocationCiudad de México

Escrito 22 abril 2014 - 03:22

Pues la verdad amigo es que es raro lo que nos describes. La última que me ocurre es que se trata de un bug en UNIDac; al menos en la versión con la que trabajas.  :(
No debería ser necesario hacer esos pasos indirectos para evitar el problema. Pero mientras así ande, pues que se va a hacer.

Deberías consultar al área de soporte de UNIDac.

Saludos,


Hola Delphius, no creo que sea bug del Unidac, al menos no en las versiones que he trabajado.

Saludos!!


  • 0

#12 FerCastro

FerCastro

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 636 mensajes
  • LocationCiudad de México

Escrito 22 abril 2014 - 03:25

Como adición:



delphi
  1. CREATE TABLE [evento] (
  2.   [ID_Evento] INT NOT NULL,



Así es como está definido el campo en  mi tabla. Ahora bien, podrías indicarme cómo estás declarando el objeto query de unidac??

Saludos!!

skype: gersomfernando
  • 0

#13 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 22 abril 2014 - 04:51


Pues la verdad amigo es que es raro lo que nos describes. La última que me ocurre es que se trata de un bug en UNIDac; al menos en la versión con la que trabajas.  :(
No debería ser necesario hacer esos pasos indirectos para evitar el problema. Pero mientras así ande, pues que se va a hacer.

Deberías consultar al área de soporte de UNIDac.

Saludos,


Hola Delphius, no creo que sea bug del Unidac, al menos no en las versiones que he trabajado.

Saludos!!


Si no lo digo por ti, sino por FGarcia. Capaz que el tiene una versión que posee un bug.

Saludos,
  • 0

#14 FGarcia

FGarcia

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 687 mensajes
  • LocationMéxico

Escrito 23 abril 2014 - 09:52




delphi
  1. CREATE TABLE [evento] (
  2.   [ID_Evento] INT NOT NULL,



Saludos!!


Mi tabla esta declarada asi:



delphi
  1. CREATE TABLE "CAPDATOS" (
  2.   "ID" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
  3.   "EQUIPO" INTEGER NOT NULL DEFAULT 0,
  4.   "HORAFECHA" TEXT NOT NULL default CURRENT_TIMESTAMP,
  5.   "DATOS" REAL NOT NULL DEFAULT 0
  6. );



El query pues solo lo arrastro de la paleta de componentes al modulo de datos y le cambio el nombre. Automáticamente la propiedad "Connection" se engancha al UniConnection. Declaro la sentencia SQL en el UnyQuery Editor.

La versión de UniDac es 5.0.2 Pro para Delphi XE2
  • 0

#15 FGarcia

FGarcia

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 687 mensajes
  • LocationMéxico

Escrito 23 abril 2014 - 12:22

Bueno, con la asesoria del gran Jefe Mapache llegamos a esta conclusion y ya funciona todo.



delphi
  1. //Sentencia declarada en el editor 'select max(id) from capdatos;'
  2.   try
  3.     qyMaximo.Close;
  4.     qymaximo.Open;
  5.     //qymaximo.Execute;
  6.     maxId := qyMaximo.FieldByName('max(id)').AsInteger;
  7.   except
  8.     MessageDlg('Error al realizar la consulta', mtError, [mbOK],0);
  9.   end;



Habra sido la falta del close?
algun dcu no actualizado?

Ya funciona!  :D :D :D

Es mediodia y la hora del aperitivo  (b) (b)


Saludos!!


p.d. como se marca que el asunto esta resuelto?
  • 0




IP.Board spam blocked by CleanTalk.