Algo de recursion sur une table ?

Algo de recursion sur une table ? - Algo - Programmation

Marsh Posté le 28-06-2006 à 12:38:42    

Bonjour,

 

pour illustrer mon problème, supposons que j'ai une structure où je stocke des informations concernant des programmes et des projet. Pour chaque programme, j'ai la liste des projets dans lesquels il est utilisé.

 

Bon, l'exemple est bidon, mais je l'espère assez claire...

 

bref, au final, j'ai une structure de type:

 

PROG. | PROJET
------+-------
PG0   | P0
PG1   | P1
PG2   | P1
PG2   | P2
PG3   | P2
PG3   | P3
PG4   | P3

 

On voit bien ici que les programme PG1 est utilisé dans le projet P1 avec le programme PG2. Celui-ci est de son coté utilisé en plus dans le projet P2... etc.

 

J'en viens donc au but de mon algo: j'ai un super virus qui se propage dans les programmes d'un même projet... je veux donc pouvoir identifier, à partir d'une liste de programmes infectés quels sont les programmes qui vont être touchés.

 

Par exemple, si je suppose que le programme PG4 est infecté, il va contaminer PG3 qui est dans le même projet P3, mais PG3 étant dans P2, PG2 va être aussi contaminer etc jusqu'à PG1. Bref, seul PG0 s'en sors.

 

Mon but est donc de trouver la liste des programmes infectés (PG1, 2, 3 et 4) à partir de PG4.

 

Ca parait con comme ça (et ça l'est peut-être), mais j'ai du mal à trouver une méthode efficace pour traiter ça... pour info, l'algo doit tourner sous cobol et ma strucutre est en DB2 . Je ne peux pas utiliser de requête récursive en DB2  :/

 

Mon problème est d'arriver (dans des temps de traitement raisonnable) à identifier simplement les programmes/projets par lesquels je suis déjà passé.

 

Je ne sais pas si c'est suffisement clair  mais merci d'avance pour d'éventuelles réponses...


Message édité par lennelei le 28-06-2006 à 12:39:46
Reply

Marsh Posté le 28-06-2006 à 12:38:42   

Reply

Marsh Posté le 28-06-2006 à 16:22:25    

En sql la récursivité dépend de ton SGBD mais
bon tu peux ptet faire ça en manuel
 
Voici une solution peu élégante mais qui marchera ...
 
A Adapter ... j'ai fais ça fissa ;-)
 
ex :  
matable
PROG. | PROJET
------+-------
PG0   | P0
PG1   | P1
PG2   | P1
PG2   | P2
PG3   | P2
PG3   | P3
PG4   | P3
 
insert into matemp (niv,prog, projet)
Select 0, PROG, PROJET from matable
where PROG = 'PG4'
 
matemp
 niv , prog, projet
--------------------
 0     PG4    P3
 
 
insert into matemp (niv,prog, projet)
Select 1, PROG, PROJET from matable m, matemp t
where t.projet = m.projet and t.niv  = 0
 
 
matemp
 niv , prog, projet
--------------------
 0     PG4    P3
 1     PG4    p3
 1     PG3    P3        
 
insert into matemp (niv,prog, projet)
Select 2, PROG, PROJET from matable m, matemp t
where t.prog = m.prog and t.niv  = 1
 
matemp
 niv , prog, projet
--------------------
 0     PG4    P3
 1     PG4    p3
 1     PG3    P3        
 2     PG4    P3
 2     PG3    P2
 2     PG3    P3
 
etc ...
 
Tu vois le genre ?
 
 
à la fin  
 
select distinct(prog) from matemp
   
 
 

Reply

Marsh Posté le 28-06-2006 à 18:15:16    

vttman2 a écrit :

[...]

 


à la fin

 

select distinct(prog) from matemp

 



Merci pour le proposition.

 

Pour le début, je vois bien, mais le "à la fin", tu le trouves comment ?  :)


Message édité par lennelei le 28-06-2006 à 18:15:33
Reply

Marsh Posté le 29-06-2006 à 09:56:03    

Euh la requête de la fin c'est la récolte
de tout ce que tu as récupéré précedemment
 
Par rapport à ton jeu d'essai tu veux quoi
exactement comme résultat ?

Reply

Marsh Posté le 29-06-2006 à 13:58:40    

par rapport à mon jeu d'essai, en entrant PG4, je voudrais récupérer PG1, PG2, PG3 et PG4.
 
Mon problème est que j'ai du mal à voir comment parcourir le tout, et surtout comment m'arréter ?
 
ex.: je pars de PG4, je remonte vers le projet P3 qui me renvoit vers PG3. A partir de PG3, j'obtiens P2, mais si j'avais une ligne PG4 | P2, alors une fois dans P2, je retomberais sur PG4, avec le risque de boucler indéfiniment... Or, compte tenu du fait que la volumétrie peut-être importante, je voudrais trouver un algo qui m'évite d'avoir à vérifier tout ce qui a déjà été testé pour ne pas repasser 2 fois par le même programme...

Reply

Marsh Posté le 29-06-2006 à 14:54:05    

Oui il faut introduire en + une condition  
sur la table matemp  (NOT IN)
pour pas reprendre ce qui a déjà été traité ...
et boucler ad Vitem
si on me lâche, j'essaierai de te pondre un exemple ;-)

Reply

Marsh Posté le 29-06-2006 à 15:59:37    

merci, mais ne te fatigues pas pour l'exemple ;)
 
j'esperais qu'il y'aurait une autre solution magique pour régler le problème... si je dois parcourir de tte façon toute ma table, je vais y arriver (en théorie, en pratique, cela dépendera de la volumétrie ;))

Reply

Marsh Posté le 29-06-2006 à 16:21:56    

Reply

Marsh Posté le 29-06-2006 à 18:17:58    

tiens, c'est marrant, je croyais que ce n'était possible que pour DB2 v8 :??:
 
'fin, de toute façon, j'ai DB2 V7.1.1 :x

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed