Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Doble consulta a la misma tabla usando el mismo ado.query (https://www.clubdelphi.com/foros/showthread.php?t=95862)

steelha 07-09-2022 21:19:48

Doble consulta a la misma tabla usando el mismo ado.query
 
Buenas, como lo dice el titulo necesito hacer dos bucles con consultas casi similares pero utilizando el mismo ado.query. En caso de no poderse me lo dejan saber y creo un nuevo query pero eso cargaria mucho el programa . ok tengo la tabla menu con un id, caption, etc, idmenup este ultimo hace referencia al id del cual es hijo. Esto para convertir los datos en un memo y poder utilizar el menu desde texto del increible y asombroso semidios Neftali.

Primero creo el select * from menu where idmenup = 0 (Opciones principales del menu), y luego con el id cambio el sql a Select * from menu where idmenup = idobtenido. el problema radica en cuando vuelvo a realizar el primer sql empiezo desde el principio y no en la row que deberia quedar. Ya he visto muchos puntos sobre bookmark pero siempre esta en 0. Si tienen alguna forma o idea de como resolver esto se lo agradecere.

Casimiro Noteví 07-09-2022 21:25:49

Mejor describe la tabla con sus campos y di lo que quieres hacer.

duilioisola 07-09-2022 21:54:54

Creo que quedaría así:

Código:

MENU
id
idmenup
descripcion

ID  IDMENUP DESCRIPCION
 1    0    PRINCIPAL
 2    1    SUBMENU PRINCIPAL 1
 3    1    SUBMENU PRINCIPAL 2
 4    1    SUBMENU PRINCIPAL 3
 5    0    SECUNDARIO
 6    5    SUBMENU SECUNDARIO 1
 7    5    SUBMENU SECUNDARIO 2
 8    5    SUBMENU SECUNDARIO 3

Código SQL [-]
/*
Alias m  = Menu
Alias sm = SubMenu
*/
select m.id, m.titulo, sm.id, sm.titulo
from menu m
join menu sm on sm.idmenup = m.id
where
m.idmenup = 0
Devolvería:
Código:

ID  DESCRIPCION ID  DESCRIPCION
 1  PRINCIPAL    2  SUBMENU PRINCIPAL 1
 1  PRINCIPAL    3  SUBMENU PRINCIPAL 2
 1  PRINCIPAL    4  SUBMENU PRINCIPAL 3
 5  SECUNDARIO  6  SUBMENU SECUNDARIO 1
 5  SECUNDARIO  7  SUBMENU SECUNDARIO 2
 5  SECUNDARIO  8  SUBMENU SECUNDARIO 3


mamcx 07-09-2022 22:57:55

Si tienes un motor moderno, se puede hacer con un CTE:

https://learnsql.com/blog/do-it-in-s...ree-traversal/
https://learnsql.com/blog/query-parent-child-tree/

duilioisola 08-09-2022 08:47:35

Gracias a mamcx quisiera modificar mi respuesta.
Esto lo he probado en Firebird 2.5

Código:

MENU
id
idmenup
orden        -- Orden de los items de menu
usuario      -- Usuario para definir diferentes menus/ordenaciones por usuario
descripcion

Indexado por (usuario, idmenup)

ID  IDMENUP  ORDEN  USUARIO  DESCRIPCION
 1    0        1      1    PRINCIPAL
 2    1        1      1    SUBMENU PRINCIPAL 1
 3    1        2      1    SUBMENU PRINCIPAL 2
 4    1        3      1    SUBMENU PRINCIPAL 3
 5    0        2      1    SECUNDARIO
 6    5        1      1    SUBMENU SECUNDARIO 1
 7    5        2      1    SUBMENU SECUNDARIO 2
 8    5        3      1    SUBMENU SECUNDARIO 3

Código SQL [-]
WITH RECURSIVE menu_tree
as (
    -- Menu ROOT es el que tiene "IDMENUP = 0"
    select idmenup, id, orden, usuario, descripcion
    from menu
    where
    idmenup = 0
    UNION ALL
    -- CHILD se relacionan con el padre por "PADRE.IDMENUP = ID"
    select ch.idmenup, ch.id, ch.orden, ch.usuario, ch.descripcion
    from menu ch
    join menu_tree mt on ch.idmenup = mt.id and ch.usuario = mt.usuario)
select *
from menu_tree
where
usuario = 1
order by idmenup, orden

steelha 08-09-2022 16:09:16

Gracias duilioisola
 
Gracias duilioisola, as dado en el clavo de lo que queria ahora probare a ver si me funciona. Perdon por no colocar la configuracion de la tabla.
dbo.Menu
Código SQL [-]
Idmenu  int  Unchecked
Mmenu  char(25)  Checked
Mcaption  char(25)  Checked
Mdescripcion  char(50)  Checked
Mlink  nchar(30)  Checked
Mestado  bit  Checked
Mvisible  bit  Checked
Midmenup  int  Checked
Morden  int  Checked
Mhotkey  nchar(10)  Checked

Donde mmenu es el id y midmenup es el id al que pertenece cuando es una opcion o submenu. Deberia ser 1 to N pero se me complicaria ya que el ejemplo de Neftali aparte de darlo como un texto organizado Menu/submenu en mi tabla lo podras crear sin ningun orden. o agregar opciones despues. implementare tu respuesta y te dejo saber.


La franja horaria es GMT +2. Ahora son las 11:45:11.

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