Requête SQL basée sur paramètre et table un peu étrange

Requête SQL basée sur paramètre et table un peu étrange - SQL/NoSQL - Programmation

Marsh Posté le 26-03-2014 à 21:28:38    

:hello: Bonsoir à tous!
 
Je vais solliciter votre aide si vous le voulez bien.
Pour resituer, je ne suis pas du tout informaticienne, mais on m'a demandé de concevoir des rapports RS. On m'avait expliqué que ce serait très simple : juste quelques select basiques... Sauf que...Non :non:  
Je dois faire un rapport RS listant des fiches et faisant de beaux camemberts en fonction de certains critères et les paramètres me sont envoyés directement par l'application (ils peuvent tous être multiples.)  
 
J'ai fait beaucoup de recherches et de tâtonnements pour arriver au résultat ci-dessous, mais il subsiste un problème de taille et je ne parviens pas à le résoudre.
Voici l'une de mes requetes
 

Citation :

 @Structure_Id nvarchar(max),
  @Datedebut nvarchar(10),
  @DateFin  nvarchar(10),
  @Entite nvarchar (Max)  
   
 
AS
BEGIN
 
SELECT
  SCNaturesContentieux.Libelle
  ,STRUCTURES.NAME_FR
  ,STRUCTURE_AMONT_ID
FROM
  SCFicheContentieux
  INNER JOIN SCNaturesContentieux
    ON SCFicheContentieux.NatureContentieux_Id = SCNaturesContentieux.NaturesContentieux_Id
  INNER JOIN SCFiche
    ON SCFicheContentieux.Fiche_Id = SCFiche.Fiche_Id
 INNER JOIN SCStructureSpecifique
 ON SCStructureSpecifique.CODE_SOCIETE in (LEFT(SCFiche.NumeroFiche,4))
INNER JOIN STRUCTURES
 ON STRUCTURES.STRUCTURE_ID = SCStructureSpecifique.Structure_Id
 
where convert(nvarchar,convert(datetime,right(@Datedebut,4) + substring(@Datedebut,4,2) + left(@Datedebut,2)),112) <= convert(nvarchar,SCFiche.CreationUserDate,112)  
   and convert(nvarchar,SCFiche.CreationUserDate,112) <= convert(nvarchar,convert(datetime,right(@DateFin,4) + substring(@DateFin,4,2) + left(@DateFin,2)),112)and  
   STRUCTURES.STRUCTURE_ID in (select Number from dbo.fn_SplitInt(@Structure_Id,',') as fn_SplitInt_1)
   and SCFiche.Statut = 'E'
End


 
Mon problème est le suivant :  
Les structures-Id ont des niveaux différents (organisation mère /sociétés / Uo / Directions )  mais sont toutes dans la même table avec une colonne Structure Amount Id qui permets de savoir qui est à quel niveau.
Sauf que l'application va m'envoyer des UO (si l'utilisateur choisit une société ou bien une UO) : Dans ce cas ma requête fonctionne
Mais elle peut aussi m'envoyer des sociétés (si l'utilisateur choisit l'organisation mère) = Alors là il m'envoie ce qui est directement en dessous de l'organisation mère, mais moi je ne récupère rien du tout puisque mes fiches sont identifiées par leur UO.  
 
Je n'ai malheureusement pas la main sur les tables (j'aurai aimé pouvoir ajouter une colonne Niveau), ni sur la façon dont on m'envoie les infos.
 
Ce qu'il me faudrait c'est que lorsque l'on m'envoie des sociétés (et alors comment les repérer à part que ce sont les seules à avoir Structure_Amount_Id = 1)  
Alors je transforme mes structures ID de niveau 2 en récupérant à la place toutes les Structures ID de niveau 3.
 
Donc si quelqu'un peut m'aider là dessus, il aura mon éternelle reconnaissance.
 
Désolée également pour mon manque de vocabulaire technique et pour explication peut-être confuse.
 
 
 
 
 

Reply

Marsh Posté le 26-03-2014 à 21:28:38   

Reply

Marsh Posté le 27-03-2014 à 11:03:29    

Titeeden a écrit :

:hello: Bonsoir à tous!
 
Je vais solliciter votre aide si vous le voulez bien.
Pour resituer, je ne suis pas du tout informaticienne, mais on m'a demandé de concevoir des rapports RS. On m'avait expliqué que ce serait très simple : juste quelques select basiques... Sauf que...Non :non:


Technique classique en informatique pour faire faire un travail à qq'un. Quand la personne te dit des trucs du genre "c'est pas compliqué", "ça va être rapide", "c'est simple, c'est comme l'autre projet"... tu peux être sûr que c'est faux et que si tu acceptes, tu vas te faire avoir :D
 
 

Titeeden a écrit :


Mon problème est le suivant :  
Les structures-Id ont des niveaux différents (organisation mère /sociétés / Uo / Directions )  mais sont toutes dans la même table avec une colonne Structure Amount Id qui permets de savoir qui est à quel niveau.
Sauf que l'application va m'envoyer des UO (si l'utilisateur choisit une société ou bien une UO) : Dans ce cas ma requête fonctionne
Mais elle peut aussi m'envoyer des sociétés (si l'utilisateur choisit l'organisation mère) = Alors là il m'envoie ce qui est directement en dessous de l'organisation mère, mais moi je ne récupère rien du tout puisque mes fiches sont identifiées par leur UO.  
 
Je n'ai malheureusement pas la main sur les tables (j'aurai aimé pouvoir ajouter une colonne Niveau), ni sur la façon dont on m'envoie les infos.
 
Ce qu'il me faudrait c'est que lorsque l'on m'envoie des sociétés (et alors comment les repérer à part que ce sont les seules à avoir Structure_Amount_Id = 1)  
Alors je transforme mes structures ID de niveau 2 en récupérant à la place toutes les Structures ID de niveau 3.
 
Donc si quelqu'un peut m'aider là dessus, il aura mon éternelle reconnaissance.
 
Désolée également pour mon manque de vocabulaire technique et pour explication peut-être confuse.


De ce que je comprends, ta structure des sociétés et autres entités sont modélisées via une arborescence. En BD, y'a 2 façons de faire : avec l'ID du "parent" auquel il est rattaché, auquel cas, il faut faire des requêtes récursives pour calculer l'arbo et connaître le niveau de chaque "enfant". L'autre façon est la représentation intervallaire : dans ce cas, le parent a 2 champs (bornes droite et gauche) qui contiennent les ID min et max de tous ses enfants. Donc, en 1 requête SQL, il est facile de récupérer tous les enfants.
 
Si tu nous donnes pas le MCD ou le MLD de ta BD (champs de chaque table et relations entre elles), on va pas pouvoir trop t'aider :/


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 27-03-2014 à 15:34:53    

Hello Rufo , Merci pour ta réponse.
 
 
J'ai préparé un. mpd mais je ne sais pas si je peux le transformer en un format + lisible et partageable ici.
 
Mais en gros dans ma table  
Structures  

  • Structures ID
  • Libelle
  • Structure Amount_ID


J'ai donc Organisation mère ID = 1 et structure-Amount_ID = null
Sociétés 2,3,4,5,6 ont pour Amount-Id 1  
En dessous des UO qui ont pour amount ID 2,3,4,5 ou 6
etc jusqu'au niveau Directions
 
Donc ça ressemble à la première méthode que tu as décrite

Citation :

En BD, y'a 2 façons de faire : avec l'ID du "parent" auquel il est rattaché, auquel cas, il faut faire des requêtes récursives pour calculer l'arbo et connaître le niveau de chaque "enfant".


 
Je vais donc aller faire quelques recherches sur les requêtes récursives ^^ On m'a aussi parlé de la possiblité de créer des vues ...
 [:alexmagnus]  
 
 
 
 
 
 
 

Reply

Marsh Posté le 27-03-2014 à 16:07:16    

Ben tu pourras pas couper aux requêtes récursives. je pense que tu devrais faire une procédure stockée pour calculer cette arbo à partir d'un ID (et que ça te récupère tous les ID enfants, avec leur niveau dans l'arbo).
Les vues pourront faire appel à cette procédure stockée. Perso, j'ai déjà implémenté en PHP cette façon de représenter une arbo d'éléments dans mes 2 softs Astres et Icare (cf ma signature). Si j'avais à faire le travail demandé, je l'aurais sûrement fait en PHP afin d'exporter les données dans un fichier CSV qui serait ensuite injecté dans un fichier Excel qui se chargerait de faire les graphiques ;)


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 01-04-2014 à 15:06:09    

Sans avoir lu tout les pavés, à tout hasard les requêtes hiérarchique ne ferait pas l'affaire ? (ça crée une pseudo colonne de "level" )

Reply

Sujets relatifs:

Leave a Replay

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