Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   error en consulta sql (https://www.clubdelphi.com/foros/showthread.php?t=47480)

xterm 29-08-2007 13:38:47

error en consulta sql
 
Bueno, primero que nada presentarme, soy un NOVATO en delphi (y en cierto modo en programación, pues hace mucho que no la toco, y vengo de Gambas (V.Basic). así como hace muchos años de nuestro amigo pascal y delphi3). y una vez presentado, ahí va mi consulta.

Estoy tratando de realizar una consulta acotada (un poco larga) con lazarus (el delphi para linux, por decir algo).
El tema es que llevo una semana entera leyendo foros y buscando información en san.google, y nada, no ecuentro el error por ningún lado.
La consulta es esta:
Código Delphi [-]
     dbinfocaja.SQL.Add('select CA0,CA22,SUM(CA10) AS UNIALB,SUM(CA12) AS UNITAR,');
     dbinfocaja.SQL.Add('SUM(CA13) AS IMPTAR,');
     dbinfocaja.SQL.Add('SUM(CA4)+SUM(CA6)-SUM(CA11)-SUM(CA13)+SUM(CA15)+SUM(CA16)-SUM(CA17)-SUM(CA18)-SUM(CA19)+SUM(CA20)+SUM(CA21)-SUM(CA23) AS TOTAL,');
     dbinfocaja.SQL.Add('SUM(CA4)+SUM(CA6)+SUM(CA15)+SUM(CA16)-SUM(CA17)-SUM(CA18)-SUM(CA19)+SUM(CA20)+SUM(CA21)-SUM(CA23) AS TTOTAL,');
     dbinfocaja.SQL.Add('SUM(CA15) AS SALDOINI,SUM(CA19) AS DEUDAS,SUM(CA21) AS ENTREGAS');
     dbinfocaja.SQL.Add(' from cajas0000');
     dbinfocaja.SQL.Add(' where  CA0 between '+QuotedStr(Edit19.Text));
     dbinfocaja.SQL.Add(' and '+QuotedStr(Edit20.Text));
     dbinfocaja.SQL.Add(' and CA22='+QuotedStr(ComboBox1.Text));
     dbinfocaja.SQL.Add(' GROUP BY CA0');
     dbinfocaja.ExecSQL;
He probado a poner el group antes que el where, en cuyo caso me lanza otro error, ahora postearé ambos. El uso de between para las fechas, lo saqué de este mismo foro, y el uso de quotedstr igual, por lo que descarto que el error fuese debido a las comillas o dobles comillas.
El error que aparece en este caso es:

dbConect : Error executing query: You have an error in your SQL syntax; check de manual that corresponds to your MySQL server versión for the right syntax to use near 'GROUP BY CA0)' at line 10.

Si cambio el orden poniendo Group by antes que where, el error es este:

dbConect : Error executing query: You have an error in your SQL syntax; check de manual that corresponds to your MySQL server versión for the right syntax to use near 'where ( CA0 between '2007-08-29' and '2007-08-29' and CA22='A')' at line 8.

un saludo y gracias por vuestra ayuda.

Pd.- También he probado a poner having CA22 .... y nada, el mismo error.

aom 29-08-2007 13:43:41

Hola,
antes que nada... bienvenido al foro de Club Delphi. Te recomiendo leer la guía de estilo.

El error en la consulta parece que es por el Group By. Tienes que agrupar por todos los campos que no son sumatorios:

GROUP BY CA0,CA22

Espero que te sirva,
aom

xterm 29-08-2007 17:53:16

Muchas gracias por tu respuesta, en cuanto a agrupar los no sumatorios, es lo mismo, pues el CA22 como podrás comprobar por la última clausula del where, es exclusorio, es decir, solo existirá un tipo de CA22, el resto, los agrupará por CA0.

De todos modos gracias, en cuanto a la primera parte, ¿La guia del estilo?, que es exactamente. El problema con el que me he encontrado al programar con Lazarus, es la falta de información sobre el mismo y sus componentes que hay, exactamente para lo que estoy trabajando, al parecer no es exactamente igual que en freepascal, sino más bien como delphi, motivo por el cual, no dispongo de manuales ni nada parecido.

No obstante, voy a buscar por google a ver que es.

De nuevo gracias y un saludo.

aom 29-08-2007 18:00:22

Hola,
la guía de estilo es la guía de estilo del foro del Club Delphi. Disculpa porqué no me he explicado muy bien... tenia algo de prisa al responder.

En cuanto a la consulta, aunque tú excluyas en el where, la sintaxis del group by te obliga a agrupar por CA0,CA22 para que funcione, porqué los estás seleccionando en la cláusula SELECT. Lo has probado?

Saludos

xterm 29-08-2007 19:04:40

Aún indicándote que no hacia falta (pues la consulta en sql funciona perfectamente en mysql-browser, por ejemplo), siempre pruebo todo lo que me recomiendan, jejeje, por si las moscas, nunca se sabe. Pero desgraciadamente, el resultado ha sido el mismo.

En cuanto a la guía de estilos, voy a ver que tal.


gracias por todo y un saludo.

fjcg02 29-08-2007 22:42:35

REvisa además el formato de las fechas que usas de filtro. Prueba com " en lugar de ' o #.
Probablemente el SQL browser hace la conversión automáticamente o entiende la sintaxis.

No puedo probar porque no tengo MySQL, pero podría ser el problema.

Saludos y suerte

xterm 30-08-2007 00:06:01

Gracias, pero las fechas las indica él en el error, pues la toma de los campos tipo fecha y con el formato con que están almacenados en la tabla, es decir, con guiones, y YYYY-MM-DD.

Un saludo y gracias de todos modos.

Paoti 30-08-2007 15:57:22

descnzco si se pedue usar un BETWEEN entre campos de tipo sting, no es númerico,


comprueba eso camarada!!!!

Chris 30-08-2007 17:59:25

Cita:

Empezado por Paoti (Mensaje 227026)
descnzco si se pedue usar un BETWEEN entre campos de tipo sting, no es númerico,


comprueba eso camarada!!!!

yo creo que sí se puede utilizar between con campo string, la única condición que debes cumplir es que el campo string aparezca en el Order By... o sea, que esté como índice activo.

xterm 30-08-2007 21:07:12

Vamos a ver, en un principio tenia la consulta hecha con <= y >=, pero debido a este error, estube buscando información y econtré esa clausula (si mal no recuerdo en este mismo foro), y decidí utilizarla por si venia por ese lado el error. (que resultó no ser así).

De todos modos, si funciona con cadenas tipo string, comprobado, lo que no funciona es si coinciden ambos datos, como era mi caso, lo que al transcribir esta consulta a un gestor de Sql, me daba error el between si las fechas eran la misma, así que he vuelto al <= >=, pero de todos modos, el error continua apareciendo.

Muchas gracias a todos por vuestra ayuda.

Paoti 30-08-2007 22:54:15

bien vamos a depurar la cadena (la vas a depurar tu)


declara una variable tipo estring llamada, myCadena, dibuja en tu form un objeto TMemo


Ahora a remplazar.

en vez de utilizar:

dbinfocaja.SQL.Add(


hay lo siguiente

myCadena := 'select 'select CA0,CA22,SUM(CA10) AS UNIALB,SUM(CA12) AS UNITAR,';
myCadena := myCadena + 'SUM(CA13) AS IMPTAR,';
'etc etc
' hasta alamcenar en tu cadena toda la sentencia
'al final en vez de hacer un execsql
'guardalo en una caja de texto
CajaMemo.text := Mycadena;

copias y pegas a cadena en el motro de base de datos y vez porque no funciona, para mi que es por el campo de tipo fecha

maeyanes 30-08-2007 23:06:18

Hola!

Disculpen que meta mi cuchara... pero les recuerdo que existen los tags DELPHI y SQL para dar formato al código.

No es lo mismo:

myCadena := 'select 'select CA0,CA22,SUM(CA10) AS UNIALB,SUM(CA12) AS UNITAR,';
myCadena := myCadena + 'SUM(CA13) AS IMPTAR,';

que

Código Delphi [-]
myCadena := 'select 'select CA0,CA22,SUM(CA10) AS UNIALB,SUM(CA12) AS UNITAR,';
myCadena := myCadena + 'SUM(CA13) AS IMPTAR,';

Ahora, sobre lo que te comenta Paoti, no tienes que reemplazar todas las líneas con las instrucciónes que te dio, con poner el TMemo en la forma y hacer:

Código Delphi [-]
Memo1.Lines.Assign(dbinfocaja.SQL);

es más que suficiente...



Saludos...

Paoti 30-08-2007 23:16:53

buenos puntos


saludos

xterm 31-08-2007 09:18:09

Muchas gracias por las respuestas.
Comentaros que ya habia realizado 'mas o menos' estos pasos, pues habia puesto un showmessage de la instrucción. La diferencia radica en que con el showmessage, no podia copiar el contenido (cosa que he hecho con el campo memo), pero desgraciadamente, he obtenido el mismo resultado. La consulta funciona perfectamente.

Es una lastima, porque si la consulta está correcta, debe ser algún tipo de fallo en el sistema, o bien, lo más seguro, alguna metida de pata o mala utilización del código por desconocimiento. La verdad no se por donde más buscar.

Gracias de nuevo, y un saludo.

fjcg02 31-08-2007 10:58:39

En alguna ocasión he leido que pasa lo que te está ocurriendo.

La solución siempre pasaba por parametrizar las consultas, ya sabes,
Código Delphi [-]
...
dbinfocaja.SQL.Add(' where CA0 between :Fecha1');
dbinfocaja.SQL.Add(' and :Fecha2');
dbinfocaja.SQL.Add(' and CA22=:ValorCA22');
...

// Asignar valores de parametros
dbinfocaja.Params[0].Value:=Edit19.Text; // aqui pasar a formato fecha el valor si no funciona
dbinfocaja.Params[1].Value:=Edit20.Text;
dbinfocaja.Params[2].Value:=ComboBox1.Text;
...
// Ejecutar la consulta

Hay bastante información al respecto en el foro.

Espero que te ayude.
Suerte y saludos

xterm 03-09-2007 09:26:47

Bueno, voy a dar por zanjado el hilo, ya que al parecer, debe haber algún error en la interpretación del código por parte del componente que estoy utilizando. Puesto que he instalado los componentes ZEOS, y utilizando la misma consulta funciona a las mil maravillas.

Tal vez sea un error por mi parte a la hora de trabajar el componente query de mysql, o tal vez haya alguna limitación en el mismo, no lo se. Pero la verdad es que he probado todo lo que se me ha ocurrido, y las buenas ideas que aquí me habeis dado, y no he podido conseguir solucionarlo.

Los componentes Zeos, funcionan practicamente igual (con alguna pequeña salvedad), pero, al menos en mi caso, me han solucionado el problema.

Un saludo, y sobre todo, muchas gracias a todos.

Pd.- Mis disculpas, acabo de editar el primer post para añadirle las etiquetas según estilo, no me habia percatado (lo que tiene tener la mente en un error, jejeje), un saludo.


La franja horaria es GMT +2. Ahora son las 08:05:02.

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