Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 22-05-2012
Petolansa Petolansa is offline
Miembro
 
Registrado: jul 2005
Posts: 159
Poder: 19
Petolansa Va por buen camino
Consulta con 3 inner join da error que falta operador

Buenas gente, necesito su ayuda en la sgte consulta. Es una base de datos de personal, en la cual la tabla PERSONAL contiene los campos relacionados con las demás tablas HORARIO, LUGAR Y ACTIVIDAD que se detallan a continuación:

PERSONAL
PDNI (PK)
PNROLEGAJO
PAPELLIDO
PNOMBRE
PFINGRESO
PCODACTIVIDAD (FK)
PCODLUGAR (FK)
PCODHORARIO (FK)
PTELFIJO
PTELCELULAR
PGUARDIA
PESTADO
PFECHANAC
POBSERVA


HORARIO

HCODHORARIO(PK)
HTURNO
HDESCTURNO

LUGAR

LCODLUGAR(PK)
LNOMBRELUGAR
LDESCLUGAR

ACTIVIDAD

ACODACTIVIDAD(PK)
ATIPOACTIVIDAD
ADESCACTIVIDAD

Mi consulta es simple quiero mostrar en un QREPORT los campos que selcciono en el select cuando el parametro sea un DNI de otro formulario.
Es una ficha de personal.


Código SQL [-]
Select personal.pnrolegajo, personal.papellido, personal.pnombre, personal.pfingreso, personal. personal.ptelfijo, personal.ptelcelular, personal.pguardia, personal.pestado, personal.pestado, personal,pfechanac, personal.pobserva, horario.turno, horario.descturno, lugar.lnombrelugar, lugar.desclugar, actividad.tipoactividad, actividad.adescactividad
FROM personal
INNER JOIN horario ON personal.pcodhorario = horario.hcodhorario
INNER JOIN lugar ON personal.pcodlugar = lugar.pcodlugar
INNER JOIN actividad ON personal.pcodactividad=actividad. acodactividad
WHERE personal.pdni=:nrodni

EL error es el siguiente
SQL GENERAL ERROR Error de sintaxis falta operador en la expresion de consulta.
personal.pcodhorario = horario.hcodhorario

ALquien me podria dar una mano?

SAludos
Responder Con Cita
  #2  
Antiguo 22-05-2012
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 26
delphi.com.ar Va por buen camino
A simple vista, veo en el tercer join un espacio luego del alias del segundo campo mencionado que no creo sea correcto:
Cita:
actividad. acodactividad
Por otro lado... ¿Que necesidad de definir todos los alias para todos los campos si los nombres de los campos son únicos?
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #3  
Antiguo 22-05-2012
[egostar] egostar is offline
Registrado
 
Registrado: feb 2006
Posts: 6.556
Poder: 25
egostar Va camino a la fama
Hola

te hace falta un campo

Código SQL [-]
Select 
  personal.pnrolegajo, 
  personal.papellido, 
  personal.pnombre, 
  personal.pfingreso, 
  personal. 
  personal.ptelfijo, 
  personal.ptelcelular, 
  personal.pguardia, 
  personal.pestado, 
  personal.pestado, 
  personal,pfechanac, 
  personal.pobserva, 
  horario.turno, 
  horario.descturno, 
  lugar.lnombrelugar, 
  lugar.desclugar, 
  actividad.tipoactividad, 
  actividad.adescactividad

FROM personal
INNER JOIN horario ON personal.pcodhorario = horario.hcodhorario
INNER JOIN lugar ON personal.pcodlugar = lugar.pcodlugar
INNER JOIN actividad ON personal.pcodactividad=actividad. acodactividad
WHERE personal.pdni=:nrodn

Saludos
Responder Con Cita
  #4  
Antiguo 22-05-2012
Petolansa Petolansa is offline
Miembro
 
Registrado: jul 2005
Posts: 159
Poder: 19
Petolansa Va por buen camino
En primer lugar gracias a ambos. Cambie las observaciones y me sigue dando el mismo Error de sintaxis 'personal.pcodhorario=horario.hcodhorario.
Por otro lado se que si no se repiten los campos entre tablas no es necesario especificar, pero como no la tengo clara todavia con el sql lo escribo asi para no confundirme!"
Código SQL [-]
Select personal.pnrolegajo, personal.papellido, personal.pnombre, personal.pfingreso, personal.ptelfijo, personal.ptelcelular, personal.pguardia,  
       personal.pestado, personal,pfechanac, personal.pobserva, horario.turno, horario.descturno, lugar.lnombrelugar, lugar.desclugar, actividad.tipoactividad, actividad.adescactividad
FROM personal
INNER JOIN horario ON personal.pcodhorario = horario.hcodhorario
INNER JOIN lugar ON personal.pcodlugar = lugar.pcodlugar
INNER JOIN actividad ON personal.pcodactividad=actividad.acodactividad
WHERE personal.pdni=:nrodni

QUe podrá ser?

Gracias Gente!

Última edición por Casimiro Notevi fecha: 22-05-2012 a las 23:29:48.
Responder Con Cita
  #5  
Antiguo 22-05-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.039
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Para no confundirte debes nombrar alias distintos a los nombres de las tablas, de la forma en que lo haces es muy fácil equivocarse, ejemplo:
Código SQL [-]
Select per.pnrolegajo, per.papellido, per.pnombre, per.pfingreso, per.ptelfijo, per.ptelcelular, per.pguardia, per.pestado, per,pfechanac, per.pobserva, 
       hor.turno, hor.descturno, 
       lug.lnombrelugar, lug.desclugar, 
       act.tipoactividad, act.adescactividad
FROM personal per
INNER JOIN horario hor ON per.pcodhorario = hor.hcodhorario
INNER JOIN lugar lug ON per.pcodlugar = lug.pcodlugar
INNER JOIN act ON per.pcodactividad=act.acodactividad
WHERE per.pdni=:nrodni
Responder Con Cita
  #6  
Antiguo 23-05-2012
Petolansa Petolansa is offline
Miembro
 
Registrado: jul 2005
Posts: 159
Poder: 19
Petolansa Va por buen camino
Bien si voy a empezar a utilizar alias entonces. gracias por el consejo
Por otro lado me sigue dando el error, ahora al reformular la sentencia me tira Error de sintaxis 'per.pcodhorario=hor.hcodhorario
o sea el error sigue siendo el mismo,que sera? Las tablas son correspondientes en mismo tipo de campo y longitud. estan relacionadas.
Hay un indice en la tabla personal que es por dni y otro por apellido.
Responder Con Cita
  #7  
Antiguo 23-05-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.039
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Tendrás que verificar si es correcto el nombre de los campos. Ahí no podemos hacer nosotros nada, salvo que nos pases la estructura de la base de datos con esas tablas.
Responder Con Cita
  #8  
Antiguo 23-05-2012
MartinS MartinS is offline
Miembro
NULL
 
Registrado: nov 2011
Ubicación: Villa Cacique - Argentina
Posts: 283
Poder: 13
MartinS Va por buen camino
Código SQL [-]
Select personal.pnrolegajo, personal.papellido, personal.pnombre, personal.pfingreso, personal.ptelfijo, personal.ptelcelular, personal.pguardia,  
       personal.pestado, personal,pfechanac, personal.pobserva, horario.turno, horario.descturno, lugar.lnombrelugar, lugar.desclugar, actividad.tipoactividad, actividad.adescactividad
FROM personal
INNER JOIN horario ON personal.pcodhorario = horario.hcodhorario
INNER JOIN lugar ON personal.pcodlugar = lugar.pcodlugar
INNER JOIN actividad ON personal.pcodactividad=actividad.acodactividad
WHERE personal.pdni=:nrodni

Aqui te estan faltando campos dentro del select (personal.pcodhorario, horario.hcodhorario,personal.pcodlugar y actividad,acodactividad), o no?
Responder Con Cita
  #9  
Antiguo 23-05-2012
Petolansa Petolansa is offline
Miembro
 
Registrado: jul 2005
Posts: 159
Poder: 19
Petolansa Va por buen camino
Gente vuelvo, gracias por la ultima observación agregue los campos y me sigue dando el mismo error, crei que era por el orden de asignación o sea que tendrían que estar invertidos los campos del otro lado del igual pero lo probé y naranjas.

PERSONAL

PNROLEGAJO NUMERO
PAPELLIDO TEXTO
PNOMBRE TEXTO
PFINGRESO FECHA
PCODACTIVIDAD NUMERO
PCODLUGAR NUMERO
PCODHORARIO NUMERO
PTELFIJO NUMERO
PTELCELULAR NUMERO
PGUARDIA LOGICO
PESTADO LOGICO
PFECHANAC FECHA
POBSERVA TEXTO


HORARIO

HCODHORARIO NUMERO
HTURNO TEXTO
HDESCTURNO TEXTO

LUGAR

LCODLUGAR NUMERO
LNOMBRELUGAR TEXTO
LDESCLUGAR TEXTO

ACTIVIDAD

ACODACTIVIDAD NUMERO
ATIPOACTIVIDAD TEXTO
ADESCACTIVIDAD TEXTO


Los campos numéricos son ENTEROS sin decimales

Les pido disculpas que no nombre el motor de base de datos es access y el entorno es D7

Se que access no es lo mejor pero agarre todo asi!

Sino escucho recomendaciones.

Gracias gente!
Responder Con Cita
  #10  
Antiguo 23-05-2012
MartinS MartinS is offline
Miembro
NULL
 
Registrado: nov 2011
Ubicación: Villa Cacique - Argentina
Posts: 283
Poder: 13
MartinS Va por buen camino
Y si probas asi:

Código SQL [-]
Select * From Personal,Horario,Lugar,Actividad
Where Personal.PcodHorario = Horario.HCodHorario and
         Personal.PCodLugar = Lugar.LCodLugar and
         Personal.PCodActividad = Actividad.ACodActividad and
         Personal.PDni = :NroDni

Ojo!!! No se si anda, ademas fijate bien los nombres de los campos porque en el inner join pusiste que un campo de la tabla lugar era PCodLugar y la estructura de las tablas que adjuntaste en el mensaje anterior ese campo lo nombras como LCodLugar, Revisa bien los nombres de los campos.-

Saludos.-
Responder Con Cita
  #11  
Antiguo 23-05-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.039
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Y de paso, una pregunta, ¿el mensaje de error exactamente es el que has indicado antes, en español, o lo has traducido para ponerlo aquí?
Responder Con Cita
  #12  
Antiguo 24-05-2012
Avatar de olbeup
olbeup olbeup is offline
Miembro
 
Registrado: jul 2005
Ubicación: Santiago de la Ribera (España)
Posts: 685
Poder: 19
olbeup Va camino a la fama
Hola Petolansa,

El problema que te esta pasando no es más ni menos que los paréntesis, MSACCESS es raro ya por naturaleza y a la hora de trabajar con más de un INNER JOIN, necesita paréntesis, ¿el porque?, no lo se, pero así es como trabaja este motor de base de datos.

Cuando pones más de un INNER JOIN tienes que utilizar tantos paréntesis cómo INNER JOIN pongas, el primer paréntesis se coloca después del FROM y cerrando cómo INNER JOIN tengas excepto el último, es aquí tu caso.

Código SQL [-]
SELECT
    P.PNROLEGAJO
    ,P.PAPELLIDO
    ,P.PNOMBRE
    ,P.PFINGRESO
    ,P.PTELFIJO
    ,P.PTELCELULAR
    ,P.PGUARDIA
    ,P.PESTADO
    ,P.PFECHANAC
    ,P.POBSERVA
    ,H.TURNO
    ,H.DESCTURNO
    ,L.LNOMBRELUGAR
    ,L.DESCLUGAR
    ,A.TIPOACTIVIDAD
    ,A.ADESCACTIVIDAD
  FROM ((PERSONAL AS P
    INNER JOIN HORARIO AS H
      ON P.PCODHORARIO = H.HCODHORARIO)
    INNER JOIN LUGAR AS L
      ON P.PCODLUGAR = L.PCODLUGAR)
    INNER JOIN ACTIVIDAD AS A
      ON P.PCODACTIVIDAD = A.ACODACTIVIDAD
  WHERE P.PDNI=:NRODNI
¿Cuantos paréntesis hay?, pues 2, ¿Cuantos INNER JOIN hay?, pues 3.
Los paréntesis se colocan cuando hay más de un INNER JOIN y cerrando los paréntesis en cada INNER JOIN excepto el último.

Espero que se me haya entendido para los futuros INNER JOIN

Cómo dice Casimiro Notevi, es mucho mejor utilizar ALIAS en tus base de datos para evitar errores que te puedan llevar a muchos dolores de cabeza.

Un saludo
__________________
Al hacer una consulta SQL, haz que los demás te entiendan y disfruten de ella, será tú reflejo de tú saber.

Última edición por olbeup fecha: 24-05-2012 a las 09:03:44.
Responder Con Cita
  #13  
Antiguo 24-05-2012
Petolansa Petolansa is offline
Miembro
 
Registrado: jul 2005
Posts: 159
Poder: 19
Petolansa Va por buen camino
Smile

Casimiro, en español si, asi aparecia el error.
Olbeup gracias, la verdad que si, la vez que utilize sql fue con sql server y no utiliza parentesis. AHora ya lo se y es indispensable para tenerlo en cuent!a!
Ahora bien, La consulta que estoy realizando se encuentra dentro dequery dentro de un qreport, ya que es para que muestre la ficha personal del agente. Puedo agregar los campos en el query, lo puedo activar o desactivar si errores.


EL formulario del que lo llamo tiene el siguiente codigo.

Código Delphi [-]
procedure TForm2.Button2Click(Sender: TObject);
begin
 try
    if qrfichapersonal.Query1.Active  then close;
    qrfichapersonal:=tqrfichapersonal.Create(self);
    qrfichapersonal.Query1.Params.ParamByName('nrodni').Value := strtofloat(dbtext1.Caption);
//el parametro nrodni lo declaro de tipo float 
//el dbtext1 es un dbtext que se muestra en el form2 simple que tiene el campo de dni del agente,  que son dbedits asociados a la tabla personal conectados a un dbnavigator para mostrar los agentes.
    quickreport10.Query1.Open;
    quickreport10.PreviewModal;
finally
    quickreport10.Free;
    end;

En el qrfichapersonal tengo dbtext asociados al query1 que es el que realiza la consulta que hago con el select que armamos entre todos

Código SQL [-]
SELECT
     P.PNROLEGAJO
    ,P.PAPELLIDO
    ,P.PNOMBRE
    ,P.PFINGRESO
    ,P.PTELFIJO
    ,P.PTELCELULAR
    ,P.PGUARDIA
    ,P.PESTADO
    ,P.PFECHANAC
    ,P.POBSERVA
    ,P.PCODLUGAR
    ,H.HTURNO
    ,H.HDESCTURNO
    ,L.LNOMBRELUGAR
    ,L.LDESCLUGAR
    ,A.ATIPOACTIVIDAD
    ,A.ADESCACTIVIDAD
  FROM ((PERSONAL AS P
    INNER JOIN HORARIO AS H
      ON P.PCODHORARIO = H.HCODHORARIO)
    INNER JOIN LUGAR AS L
      ON P.PCODLUGAR = L.LCODLUGAR)
    INNER JOIN ACTIVIDAD AS A
      ON P.PCODACTIVIDAD = A.ACODACTIVIDAD
  WHERE P.PDNI=:NRODNI

EL problema es que no muestran nada los campos, que se puede estar escapando?

Gracias gente.
Responder Con Cita
  #14  
Antiguo 25-05-2012
MartinS MartinS is offline
Miembro
NULL
 
Registrado: nov 2011
Ubicación: Villa Cacique - Argentina
Posts: 283
Poder: 13
MartinS Va por buen camino
Antes que nada
Código Delphi [-]
    // Cambia
    qrfichapersonal.Query1.Params.ParamByName('nrodni').Value := strtofloat(dbtext1.Caption);
    // por
    qrfichapersonal.Query1.Params.ParamByName('nrodni').Value := strtoInt(dbtext1.Caption); // Creo que decias que NroDNI era entero

Deberias comprobar si la consulta arroja algun resultado en algun DbGrid o similar para ver si realmente hace lo que queres que haga. Otro punto importante es darle al QReport el Dataset, en tu caso Query1.
Algo mas sencillo a mi entender es que en vez de dar como parametro el contenido de una etiqueta deberias darle el valor del campo que estas buscando por ejemplo:

Código Delphi [-]
     // Suponiendo que Query2 es de una consulta de los clientes/Personal/Etc.-
    qrfichapersonal.Query1.Params.ParamByName('nrodni').Value := Query2.FieldByName('NroDoc').AsInteger;
Responder Con Cita
  #15  
Antiguo 29-05-2012
Petolansa Petolansa is offline
Miembro
 
Registrado: jul 2005
Posts: 159
Poder: 19
Petolansa Va por buen camino
Wink

Gracias a todos gente, ahi logre imprimir el qreport con la consulta. El codigo me quedo asi, reemplaze asignarle el text de un dbedit por el valor del campo de una tabla. Tambien cabie el tipo de variable de float a integer.

Código Delphi [-]
procedure TForm2.Button2Click(Sender: TObject);
begin
try
   if quickreport10.Query1.Active  then close;
    quickreport10:=tquickreport10.Create(self);
    quickreport10.Query1.Params.ParamByName('nrodni').Value := form2.Table1.FieldByName('pdni').Value ;
    strtoint(dbedit6.Text);
    quickreport10.Query1.Open;
    quickreport10.PreviewModal;
finally
    quickreport10.Free;
    end;
end;
end.
SAludos!
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Consulta que da Error : falta operador aanil SQL 2 04-06-2010 08:36:51
falta operador characo Conexión con bases de datos 4 30-03-2010 17:06:18
Consulta con inner join juanjo123 MySQL 3 11-02-2010 22:34:16
Consulta con el operador AND aanil SQL 4 23-01-2010 21:30:39
Problemas con Inner Join y operador AS enecumene Firebird e Interbase 9 03-06-2008 18:40:03


La franja horaria es GMT +2. Ahora son las 07:17:23.


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
Copyright 1996-2007 Club Delphi