Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Consulta Inner Join (https://www.clubdelphi.com/foros/showthread.php?t=78018)

amerika111 13-03-2012 18:35:07

Consulta Inner Join
 
hola, buenas tardes.. rebisando el funcionamiento de los inner joins.. me encontre con un enredo ....
la consulta es la siguiente:

select u.id,u.usr as usuario,
u.nom+' '+ u.ape_pat+' '+ u.ape_mat as 'Nombre Completo',
CASE u.estado
when 1 then 'Activo'
when 2 then 'Suspendido'
end as 'Estado',
p.descr,
tp.descr ,
ua.dir_cliente,
ua.ult_act
from fusu_usr_per up
inner join fusu_per p on up.id_per=p.id
inner join fusu_usr u on up.id_usr=u.id
inner join fusu_tper tp on p.id_tper=tp.id
inner join fusu_usr_acc ua on up.id_usr=ua.id_usr
where ua.id=(Select Top 1 id from fusu_usr_acc where id_usr=ua.id_usr order by ult_act desc)
order by u.id

conlo que se obtiene el siguiente resultado;
id usuario nombre completo estado descr descr dir_cliente ult_act
1,peri,ernesto glez,activo,permiso 2334,permiso acceso,123.123.23.1,23/09/2010
1,peri,ernesto glez,activo,permiso 344,permiso global,123.123.23.1,23/09/2010
1,peri,ernesto glez,activo,permiso 333,permiso acceso,123.123.23.1,23/09/2010
2,odin,carlos gomez,activo,permiso2334,permiso global,123.233.2.1,2/06/2012
2,odin,carlos gomez, activo,permiso333,permiso acceso,123.233.2.1,2/06/2012

y lo que sucede que el mismo usuario se repite tantos permisos tenga:

no habra una manera de que solo se vea una vez el usuario y solo se repitan los permisos

id usuario nombre completo estado descr descr dir_cliente ult_act
1,peri,ernesto glez,activo,permiso 2334,permiso acceso,123.123.23.1,23/09/2010
permiso 344,permiso global
permiso 333,permiso acceso
2,odin,carlos gomez,activo,permiso2334,permiso global,123.233.2.1,2/06/2012
permiso333,permiso acceso

ElDioni 13-03-2012 18:47:17

Hola,

me cuesta mucho ver la consulta o lo que que da como resultado, usa las etiquetas para formatear los distintos tipos de párrafos.

Saludos.

amerika111 13-03-2012 18:56:20

Cita:

Empezado por ElDioni (Mensaje 427538)
Hola,

me cuesta mucho ver la consulta o lo que que da como resultado, usa las etiquetas para formatear los distintos tipos de párrafos.

Saludos.


Código SQL [-]
select u.id,u.usr as usuario,
       u.nom+' '+ u.ape_pat+' '+ u.ape_mat as 'Nombre Completo',
       CASE u.estado 
           when 1 then 'Activo' 
            when 2 then 'Suspendido' 
           end as 'Estado',
             p.descr,
       tp.descr ,
       ua.dir_cliente,
       ua.ult_act
 from fusu_usr_per up 
        inner join fusu_per p on up.id_per=p.id 
        inner join fusu_usr u on up.id_usr=u.id 
        inner join fusu_tper tp on p.id_tper=tp.id 
 inner join fusu_usr_acc ua on up.id_usr=ua.id_usr
 where ua.id=(Select Top 1 id from fusu_usr_acc where id_usr=ua.id_usr order by ult_act desc)
        order by u.id

teniendo como resultado:

imagen adjunta:

amerika111 14-03-2012 00:16:46

1 Archivos Adjunto(s)
creo que la imagen no se ve muy bien
adjunto txt..

ecfisa 14-03-2012 00:28:58

Hola amerika111.

Si deseas que tus datos respeten la tabulación podés prepararlos en el bloc de notas, copiarlo y pegarlo entre las etiquetas [code] [/code] , quedando de esta forma:
Código:

...
2 admin  NULL  Suspendido  Permiso de Acceso        Permisos globales      147.15.54.36  2010-09-01 15:43:02.523
2 admin  NULL  Suspendido  Permiso de Administrador  Permisos globales      147.15.54.36  2010-09-01 15:43:02.523
...

Un saludo. :)

Edito: O también claro, adjuntar el .txt ;)

ElDioni 14-03-2012 18:10:55

Hola,

¿donde quieres mostrar los datos?, en un grid, en un report, en listbox..., lo digo para saber por donde tirar.

Saludos.

amerika111 15-03-2012 04:13:38

en un gridview

amerika111 18-03-2012 23:59:06

aun no he encontrado una solucion, estos casos no se repiten frecuentemente???

ElDioni 20-03-2012 11:48:53

Hola,

no se que componente es el gridview, ¿un DbGrid?, de todas formas, se me ocurre que tendrás que hacer dos consultas, una con los usuarios (solo los usuarios) y otra, que es la que ya tienes, con los permisos por usuario, una vez tengas esto lo tendrás que montar en dos DbGrids, uno con el listado de usuarios y otro en donde aparecerán los permisos de cada usuario conforme se vaya pinchando en el usuario correspondiente. No se si entiendes la idea que te propongo.

Saludos.

amerika111 21-03-2012 05:40:16

el gridview es un datagrid o dbgrid.. y si creo que si te entiendo lo que me comentas...

no habra manera de meterlo en algun procedimiento almacendo y mientras recorre la consulta del inner join vaya guardando como variable el usuario, y mientras siga siendo el mismo usuario despliege solo los permisos y si no desplegaria al usuario siguiente y asi.. detalle esta en que no se como construir el procedimiento..:(:(:(:confused::rolleyes:

ElDioni 21-03-2012 10:03:28

Hola,

en una ocasión vi un ejemplo de unos grids que dependía uno del otro, uno de los grids está oculto y aparece cuando haces click en un registro del grid que se está viendo. Quiero decir que tu verías el grid de los usuarios y al hacer click o al ir moviendote por los registros podrías ir enseñando el grid oculto con los permisos correspondientes, como si fuera un desplegable del grid principal. Lo podrías hacer de la siguiente forma.

Código Delphi [-]
procedure TFrmMenuArt.DBGridUsuariosCellClick(Column: TColumn);
begin
if QueryUsuarios.IsEmpty then
  begin
    DbGridPermisos.Visible:=False;
  end
else
  begin
    QueryPermisos.close;
    QueryPermisos.SQL.Text:='SELECT * FROM permisos WHERE usuario='+QueryUsuarios.FieldByName('Usuario').AsString;
    QueryPermisos.Open;
    DbGridPermisos.Top:=DBGridUsuarios.Top+(QueryUsuarios.RecNo*18)+18;
    DbGridPermisos.Visible:=true;
  end;
end;
No se que te parece el asunto, ya me contarás.

Saludos.

amerika111 22-03-2012 01:29:04

eso tambien funcionaria pero como ya cuento con una forma en que se consulta al usuario y se desglosan sus respectivos permisos.. lo que intento hacer seria mas bien como un tipo reporte esto lo intento desplegar en un grid y despues se va a exportar a excel..

ElDioni 22-03-2012 10:43:35

Hola,

entiendo que tu lo que tienes montado es un formulario con un grid para mostrar los datos, si es así no se me ocurre como dentro del mismo grid puedes mostrar los datos maestros, que sería el usuario, y los datos detalle, que serías los permisos, o eso o te estoy entendiendo mal, ¿como recorres la consulta?, ¿podrías subir una captura?.

Saludos.

amerika111 11-04-2012 03:17:18

1 Archivos Adjunto(s)
Hola que tal... adjunto un archivo.zip para ver mejor el resultado que se espera..

archivo usuarios:es como se pretende quede en el grid y de ahi se exporte a excel
archivo archivo1: es como se obtiene actualmente en el grid y exportacion a excel

no se si haya alguna manera de que no se repitan los usuarios tantas veces tengan permisos, si no que nada mas muestre una vez al usuario
y con sus respectivos permisos..

Caral 11-04-2012 04:03:17

Hola
No se si entiendo bien.
Archivo1: muestra lo que contiene el dbgrid, osea, lo que muestra la consulta sql actualmente.
Usuarios: es como pretendes que se muestre en el dbgrid, osea, que la consulta sql genere.

Me da la impresión que quieres que el usuario no se repita, solo lo necesario.
Código SQL [-]
select DISTINCT u.usr as usuario, u.id,
       u.nom+' '+ u.ape_pat+' '+ u.ape_mat as 'Nombre Completo',
       CASE u.estado 
           when 1 then 'Activo' 
            when 2 then 'Suspendido' 
           end as 'Estado',
             p.descr,
       tp.descr ,
       ua.dir_cliente,
       ua.ult_act
 from fusu_usr_per up 
        inner join fusu_per p on up.id_per=p.id 
        inner join fusu_usr u on up.id_usr=u.id 
        inner join fusu_tper tp on p.id_tper=tp.id 
 inner join fusu_usr_acc ua on up.id_usr=ua.id_usr
 where ua.id=(Select Top 1 id from fusu_usr_acc where id_usr=ua.id_usr order by ult_act desc)
        order by u.id

O podría ser:

Código SQL [-]
select LAST(u.usr) as usuario, u.id,
       u.nom+' '+ u.ape_pat+' '+ u.ape_mat as 'Nombre Completo',
       CASE u.estado 
           when 1 then 'Activo' 
            when 2 then 'Suspendido' 
           end as 'Estado',
             p.descr,
       tp.descr ,
       ua.dir_cliente,
       ua.ult_act
 from fusu_usr_per up 
        inner join fusu_per p on up.id_per=p.id 
        inner join fusu_usr u on up.id_usr=u.id 
        inner join fusu_tper tp on p.id_tper=tp.id 
 inner join fusu_usr_acc ua on up.id_usr=ua.id_usr
 where ua.id=(Select Top 1 id from fusu_usr_acc where id_usr=ua.id_usr order by ult_act desc)
        order by u.id

No llevo el hilo del asunto, solo es una apreciación.
Saludos

AzidRain 11-04-2012 23:00:23

Caral, DISTINC no funciona a menos que las filas sean idénticas, el cual no es el caso por loq eu el resultado será el mismo. Creo que amerika nos tendría que poner en forma de enuncia que es l que necesita obtener de su base de datos. Es decir informacion sobre que contiene cada tabla y que resultado se busca obtener, ej: "Mostrar todos los permisos de cada usuario", y luego con esos nombres tan crípticos pues se complica la cosa. Muy seguramente asi te los encontraste pero se puede mejorar.

oscarac 12-04-2012 00:15:26

concuerdo con AzidRain, Amerika deberia darnos mas informacion sobre el tema

amerika111 12-04-2012 19:12:47

1 Archivos Adjunto(s)
lo que trato de realizar es un tipo reporte de todos los usuarios con sus respectivos permisos y fecha del su ultimo acceso esto presentado un grid este lo lleno con una consulta, que es la que coloque en la parte de arriba.

adjunto mas detalle sobre las tablas que se usan en la consulta.

AzidRain 12-04-2012 21:46:22

Lo que deseas hacer nunca lo vas a conseguir tomando los datos de una consulta pues aunque no lo explicaste, tenemos una tabla de usuarios y otras 2 que contienen los permisos de cada usuario, por loq ue tenemos que la tabla de usuarios tiene una relacion 1-n con las otras 2. Por lo tanto mediante una consulta si podras traerte todos los permisos del usuario pero como se realiza un join, siempre va a aparecer el nombre y clave del usuario. El resultado quet e está devolviendo el query es el correcto y que se esperaría que devolviera. Tu problema realmente es de presentación de los datos, pero no nos has puesto un ejemplo de como te gustaria que se vieran los datos, la idea que te dio un compañero de montar dos grids, uno para los usuarios y otro para los permisos es la solución más común para tablas que tienen este tipo de relación, pero insisto, seria mejor que explicaras de ser posible con un ejemplo, como quieres mostrar los datos. De entrada te advierto que un grid ligado a una consulta (binding) no puede hacer nada más que mostrar el resultado de la misma tal cual, por lo que si quieres otro tipo de presentación de los datos tendrás que usar un grid sin binding y llenarlo según necesites.

amerika111 12-04-2012 22:00:12

hola gracias por la respuesta... el resultado lo coloque adjunto en un zip como dos coments atras un archivo1, y otro archivo llamado usuarios.

los dos son datos de grids nada mas que exportados a excel.


La franja horaria es GMT +2. Ahora son las 14:55:34.

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