Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > MS SQL Server
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 06-09-2008
Avatar de Xianto
Xianto Xianto is offline
Miembro
 
Registrado: oct 2004
Ubicación: Nací en Neuquén (ARG), desde 2001 Spain
Posts: 151
Poder: 20
Xianto Va por buen camino
Tabla cíclica ó estructura de arbol...

Buenas... necesito crear una tabla que tiene 1 padre, hijos, nietos, etc... asi de forma recursiva... pueden ser 5 o 20 ramificaciones.

Estas tablas son conocidas como cíclicas y tenia algo de ello en algun manual... pero no tengo idea donde esta el manual, jejejejeje.

Alguien me haría el favor de recordarme como era la teoría del tema, que estoy un poco oxidado con ello ???

Gracias!
__________________
El diseño dira si tiene futuro...
Responder Con Cita
  #2  
Antiguo 07-09-2008
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Pues puedes crear una tabla que tenga:

id, id_hijo, datos_varios.

Cada elemento estará identificado por id.
Si buscas los hijos de id, buscarás los id_hijo de un cierto id.
Si buscas el padre, buscarás el id, cuyo id_hijo es este elemento.
Si buscas el nieto, buscarás los elementos cuyo id sea el id_hijo .

Si existe la posibilidad de recursividad, deberás poner algún control, para que una búsqueda no sea infinita.
Responder Con Cita
  #3  
Antiguo 08-09-2008
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.275
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Puedes buscar apuntes sobre el modelo Entidad-Relación (debe haber a montones) y leer sobre las relaciones Reflexivas.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #4  
Antiguo 11-09-2008
Avatar de jcarteagaf
[jcarteagaf] jcarteagaf is offline
Miembro Premium
 
Registrado: abr 2006
Ubicación: La Paz, Bolivia
Posts: 651
Poder: 19
jcarteagaf Va por buen camino
Tengo una tabla con la siguiente estructura:

Código SQL [-]
CREATE TABLE Arbol (
IDOPCION INT NOT NULL,
IDPADRE INT NOT NULL DEFAULT 0,
DESCRIPCION VARCHAR(50),
CONSTRAINT ArbolKey PRIMARY KEY (IDOPCION))

En esa tabla guardo la información de la estructura ciclica.

El siguiente procedimiento me devuelve la información de la tabla
Código SQL [-]
CREATE PROCEDURE Arbol_ABM_Opciones
-- =============================================
-- Author:        Juan Carlos Arteaga
-- Create date: 17/08/2008
-- Description:    Genera el Arbol de Opciones para el ABM
-- =============================================
AS
BEGIN
    SET NOCOUNT ON;

    CREATE TABLE #work (lvl int, IdOpcion int) 
    CREATE TABLE #Opciones (seq int identity, lvl int, IdOpcion int) 
 
    DECLARE @lvl int, @curr int 
    SET @lvl=1
    INSERT INTO #work (lvl, IdOpcion)
    SELECT 1,IDOPCION
    FROM Arbol
    WHERE IdPadre=0
    
    WHILE (@lvl > 0)
    BEGIN 
        IF EXISTS(SELECT * FROM #work WHERE lvl=@lvl)
        BEGIN 
            SELECT TOP 1 @curr=IdOpcion FROM #work 
            WHERE lvl=@lvl 
 
            INSERT #Opciones (lvl, IdOpcion) VALUES (@lvl, @curr) 
 
            DELETE #work 
            WHERE lvl=@lvl and IdOpcion=@curr 
 
            INSERT #work 
            SELECT @lvl+1, IdOpcion 
            FROM Arbol 
            WHERE IdPadre=@curr 
                AND IdPadre <> IdOpcion 
 
            IF (@@ROWCOUNT > 0)
                SET @lvl=@lvl+1 
        END
        ELSE 
            SET @lvl=@lvl-1 
    END 
 
    SELECT d.seq,d.IdOpcion,i.Descripcion,i.IdPadre
    FROM #Opciones d
    JOIN Arbol i ON (d.IdOpcion=i.IdOpcion) 
    ORDER BY seq 

    DROP TABLE #Work
    DROP Table #Opciones
END

Todos los nodos raiz (puedo tener mas de uno) tienen como padre el valor 0.

Ya en Delphi cargo esta estructura en un TTreeView (tvDatos) usando el siguiente procedimiento (spArbolABM es el TADOStoredProc que llama al anterior Procedimiento Almacenado):

Código Delphi [-]
Type
   // Para almacenar datos que quiero asociar a cada nodo
   PItem = ^TItem;
  TItem = record
    IdOpcion : integer;
  end;

...

var
  tnNodoActual : TTreeNode;  // Siempre apunta al nodo seleccionado

...

procedure TfrmABMMenu.Cargar_Arbol;
var
  TPrimerNodo: TTreeNode;
  i: integer;
  MyItem : PItem;

  procedure Rama(iCodigo: Integer; NodoPadre: TTreeNode);
  // Procedure recursivo que carga una rama
  var
    iCodPadre: integer;
    TNodoPadre: TTreeNode;
  begin
    if (spArbolABMIDPADRE.Value = iCodigo) then
      while (spArbolABMIDPADRE.Value = iCodigo) and (not spArbolABM.EOF) do
      begin
        inc(i);
        new(MyItem);
        MyItem.IdOpcion := spArbolABMIDOPCION.AsInteger;
        TNodoPadre := tvDatos.Items.AddChildObject(NodoPadre,
          spArbolABMDESCRIPCION.AsString,MyItem);
        iCodPadre := spArbolABMIDOPCION.Value;
        spArbolABM.Next;
        Application.ProcessMessages;
        Rama(iCodPadre, TNodoPadre);
      end;
  end;
begin
  i := 0;
  tvDatos.Items.Clear;
  spArbolABM.close;
  spArbolABM.Open;
  Screen.Cursor := crHourGlass;
  try
    if not spArbolABM.IsEmpty then
      Rama(0, nil);
  finally
    Screen.Cursor := crDefault;
    tvDatos.Selected := tvDatos.Items.GetFirstNode;
    tnNodoActual := tvDatos.Selected;
  end;
  spArbolABM.close;
end;

Espero que sea de utilidad.

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
Estructura de Tabla trex2000 Firebird e Interbase 1 28-04-2008 06:57:51
Calcular Año (condición cíclica) MaMu OOP 20 02-08-2007 00:37:08
Consulta SQL para estructura en arbol PatrickM SQL 10 16-04-2007 21:48:36
Guardar estructura en tabla JAV Conexión con bases de datos 7 19-04-2005 04:30:35
estructura de una tabla Salomon Firebird e Interbase 3 14-05-2004 15:26:46


La franja horaria es GMT +2. Ahora son las 20:21:29.


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