Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Ayuda con consulta (https://www.clubdelphi.com/foros/showthread.php?t=80249)

Salnhack 14-09-2012 23:29:15

dando respuesta a tu 1 pregunta probe la consulta an access y me sale el mismo error "Error en Sintanxis (Falta Operador)"

Salnhack 14-09-2012 23:41:49

este es mi codigo

Código Delphi [-]
with datamodule29.Query2 do
    Begin
     Close;
     SQl.Clear;
     SQL.Add('Select idmes from mes where mes=mes');
     ParamByName('pmes').AsString:=suiDBLookupComboBox2.Text;
     Open;
     mes:=FieldByName('idmes').AsInteger;
     Close;
     SQl.Clear;
     SQL.Add('Select * from mes where idmes=idmes');
     ParamByName('pidmes').AsInteger:=mes;
     Open;
     inicio:=FieldByName('inicio').AsString;
     fin:=FieldByName('fin').AsString;
     Close;
     SQL.Clear;
     SQL.Add('SELECT C.IDCARRO, C.NOCARRO, C.INDICECONS, SUM(DHR.KMRECORRIDO), SUM(CO.CONSUMO)');
     SQL.Add('FROM CARRO C INNER JOIN HOJARUTA HR ON HR.IDCARRO = C.IDCARRO');
     SQL.Add('INNER JOIN DESCHOJARUTA DHR ON DHR.IDHOJARUTA = HR.IDHOJARUTA');
     SQl.Add('INNER JOIN CONSUMO CO ON CO.IDCARRO = C.IDCARRO');
     SQL.Add('WHERE CO.FECHA BETWEEN :FECHA1 AND :FECHA2');
     SQL.Add('GROUP BY C.IDCARRO, C.NOCARRO, C.INDICECONS');
     SQL.Add('ORDER BY C.IDCARRO');
     ParamByName('FECHA1').AsString:=inicio;
     ParamByName('FECHA2').AsString:=fin;
     Open;
    end;

explico

en mi form hay dos combobox

en uno cargo
el año
y en el segundo los meses que trae ese año

cuando doy clic en el boton aceptar

lo primero es escoger el id del mes selecionado y asignarlo a una variable

Código Delphi [-]
Close;
     SQl.Clear;
     SQL.Add('Select idmes from mes where mes=mes');
     ParamByName('pmes').AsString:=suiDBLookupComboBox2.Text;
     Open;
     mes:=FieldByName('idmes').AsInteger;

luego paso esta variable como condicion para selecionar el rango de fecha del mes ejemplo enero del 2012 es del 01/01/2012 hasta 31/01/2012, y estos valores se lo asigno a dos variables (inicio y fin).

Código Delphi [-]
 Close;
     SQl.Clear;
     SQL.Add('Select * from mes where idmes=idmes');
     ParamByName('pidmes').AsInteger:=mes;
     Open;
     inicio:=FieldByName('inicio').AsString;
     fin:=FieldByName('fin').AsString;

luego esas dos variables la paso como parametro de condicion a la consulta que nos esta dando trabajo
Código Delphi [-]
     Close;
     SQL.Clear;
     SQL.Add('SELECT C.IDCARRO, C.NOCARRO, C.INDICECONS, SUM(DHR.KMRECORRIDO), SUM(CO.CONSUMO)');
     SQL.Add('FROM CARRO C INNER JOIN HOJARUTA HR ON HR.IDCARRO = C.IDCARRO');
     SQL.Add('INNER JOIN DESCHOJARUTA DHR ON DHR.IDHOJARUTA = HR.IDHOJARUTA');
     SQl.Add('INNER JOIN CONSUMO CO ON CO.IDCARRO = C.IDCARRO');
     SQL.Add('WHERE CO.FECHA BETWEEN :FECHA1 AND :FECHA2');
     SQL.Add('GROUP BY C.IDCARRO, C.NOCARRO, C.INDICECONS');
     SQL.Add('ORDER BY C.IDCARRO');
     ParamByName('FECHA1').AsString:=inicio;
     ParamByName('FECHA2').AsString:=fin;
     Open;

espero que con esto haberme pordido explicar bien y puedan entender mi codigo

esta consulta es para ser cargada en un qreport asociado al query !!!:-|

Casimiro Noteví 14-09-2012 23:54:17

¿Pero los campos fecha en la base de datos son del tipo texto? :confused:

Salnhack 14-09-2012 23:58:29

no son de tipo fecha

Casimiro Noteví 15-09-2012 00:41:22

Cita:

Empezado por Salnhack (Mensaje 443176)
no son de tipo fecha

¿Y entonces de qué tipo son?

roman 15-09-2012 03:43:49

Cita:

Empezado por Casimiro Notevi (Mensaje 443178)
¿Y entonces de qué tipo son?

Creo que quiso decir:

Cita:

no, son de tipo fecha
// Saludos

Casimiro Noteví 15-09-2012 10:15:58

Señor muerto, esta tarde llegamos.
Quise decir:
Señor, muerto está, tarde llegamos.

Salnhack 15-09-2012 15:08:49

disculpa mi falta de Gramática, que cuando uno escribe rapido se le van esos detalles

Casimiro Noteví 15-09-2012 15:16:02

Y si son de tipo fecha, ¿por qué usas string?
Código Delphi [-]
ParamByName('FECHA1').AsString:=inicio;
ParamByName('FECHA2').AsString:=fin;

Salnhack 15-09-2012 15:37:14

funciona igual que si lo hiciera asi

Código Delphi [-]
var inicio,fin:Datetime;

...

ParamByName('FECHA1').AsDateTime:=inicio;
ParamByName('FECHA2').AsDateTime:=fin;

...


segun he analizado el error no radica en el tipo de dato en que pase la variebles de condicion sino en la estructura y sintaxis del codigo SQL.

Porque con mi primer código la sentencia SQL no daba error, lo que no devolvia los valores requeridos y en esta que me propone hoyosfelix, tiene un error en sintaxis y por eso me da el error, he tratado de entenderla pero me resulta dificil este metodo de combinación con INNER JOIN , he estado estudiando en variso cursos online esta estructuración pero como la combinacion está tan compleja no he logrado aun decifrar donde puede estar el error en sintaxis.

espero que algunos de ustedes con mas esperiencia en este tema me pueda ayudar.

Casimiro Noteví 15-09-2012 16:00:35

Veamos, si quitamos toda la parafernalia queda esto:
Código SQL [-]
SELECT C.IDCARRO, C.NOCARRO, C.INDICECONS, SUM(DHR.KMRECORRIDO), SUM(CO.CONSUMO)
FROM CARRO C 
INNER JOIN HOJARUTA HR ON HR.IDCARRO = C.IDCARRO
INNER JOIN DESCHOJARUTA DHR ON DHR.IDHOJARUTA = HR.IDHOJARUTA
INNER JOIN CONSUMO CO ON CO.IDCARRO = C.IDCARRO
WHERE CO.FECHA BETWEEN :FECHA1 AND :FECHA2
GROUP BY C.IDCARRO, C.NOCARRO, C.INDICECONS
ORDER BY C.IDCARRO
Pruébalo en ibexpert, flamerobin, etc. en lo que uses. Pon alguna fecha fija, si quieres, sin parámetros.

Código SQL [-]
SELECT C.IDCARRO, C.NOCARRO, C.INDICECONS, SUM(DHR.KMRECORRIDO), SUM(CO.CONSUMO)
FROM CARRO C 
INNER JOIN HOJARUTA HR ON HR.IDCARRO = C.IDCARRO
INNER JOIN DESCHOJARUTA DHR ON DHR.IDHOJARUTA = HR.IDHOJARUTA
INNER JOIN CONSUMO CO ON CO.IDCARRO = C.IDCARRO
WHERE CO.FECHA BETWEEN '01.01.2012' AND '15.09.2012'
GROUP BY C.IDCARRO, C.NOCARRO, C.INDICECONS
ORDER BY C.IDCARRO

Cuando esté correcto y funcionando, entonces será el momento de pasarlo al delphi.

Salnhack 15-09-2012 17:46:55

cuando corro la consulta me sale el siguiente error
Código SQL [-]
Error en Sintaxis (Falata Operador) en la expresión de consulta'HR.IDCARRO = C.IDCARRO
INNER JOIN DESCHOJARUTA DHR ON DHR.IDHOJARUTA = HR.IDHOJARUTA
INNER JOIN CONSUMO CO ON CO.IDCARRO = C.IDCARRO'.

Casimiro Noteví 15-09-2012 17:58:32

¿Has comprobado que esos nombres de campos son correctos en sus tablas?
¿Por qué no extraes la "metada" (estructura de la base de datos) con ibexpert o el programa que uses y lo pegas aquí?

Salnhack 15-09-2012 22:34:40

En cuanto a la primera pregunta si, los campos se corresponde con los de mi tabla y en cuanto a la segunda utiliso Access y no se como extraer lo que me pides, Adjunto una captura de pantalla a ver si esto te puede ayudar

Casimiro Noteví 15-09-2012 22:39:31

Access... no sé si admite "inner join".

Por cierto, el mensaje de error no lo has "copiado y pegado", deberías de hacerlo así.

Y la imagen que has puesto en el .rar a mi me dice que está defectuosa.
Cuando estés escribiendo un mensaje, si miras un poco más abajo, verás que hay una opción para adjuntar imágenes.

Salnhack 15-09-2012 22:53:02

1 Archivos Adjunto(s)
ve a ver si la puedes ver ahora

Salnhack 15-09-2012 23:48:36

Ya resolvi el error que me daba la consulta SQL, en Access cuando se utiliza mas de una ves INNER JOIN debes agruparlos con parentisis, el codigo sql me quedaria asi

Código SQL [-]
SELECT C.IDCARRO, C.NOCARRO, C.INDICECONS, SUM(DHR.KMRECORRIDO), SUM(CO.CONSUMO)
FROM (((CARRO C  INNER JOIN HOJARUTA HR ON HR.IDCARRO = C.IDCARRO) 
INNER JOIN DESCHOJARUTA DHR ON DHR.IDHOJARUTA = HR.IDHOJARUTA) 
INNER JOIN CONSUMO CO ON CO.IDCARRO = C.IDCARRO) 
WHERE CO.FECHA BETWEEN 01/01/2012 AND 31/01/2012 
GROUP BY C.IDCARRO, C.NOCARRO, C.INDICECONS 
ORDER BY C.IDCARRO


lo he probado pero todavia me esta devolviendo mal los datos

Casimiro Noteví 16-09-2012 01:02:34

Cita:

Empezado por Salnhack (Mensaje 443226)
Ya resolvi el error que me daba la consulta SQL, en Access cuando se utiliza mas de una ves INNER JOIN debes agruparlos con parentisis

Vaya, las cosas de microsoft, haciendo las cosas diferentes a los demás :confused:

Cita:

Empezado por Salnhack (Mensaje 443226)
lo he probado pero todavia me esta devolviendo mal los datos

¿Mal?, ¿qué quieres decir?

Casimiro Noteví 16-09-2012 22:34:39

Cita:

Empezado por Salnhack (Mensaje 443226)
lo he probado pero todavia me esta devolviendo mal los datos

Código Delphi [-]
WHERE CO.FECHA BETWEEN 01/01/2012 AND 31/01/2012
Las fechas en las sql van entre comillas, aunque son fechas.
Código SQL [-]
WHERE CO.FECHA BETWEEN '01/01/2012' AND '31/01/2012'

Salnhack 17-09-2012 14:09:48

en access el parametro de fecha se pone así, sino lo reconoce como texto


La franja horaria es GMT +2. Ahora son las 13:59:57.

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