Requête SQL basée sur paramètre et table un peu étrange - SQL/NoSQL - Programmation
Marsh Posté le 27-03-2014 à 11:03:29
Titeeden a écrit : Bonsoir à tous! |
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
Titeeden a écrit : |
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
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
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 ...
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
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" )
Marsh Posté le 26-03-2014 à 21:28:38
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
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
@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.