Omerdude
Messages postés40Date d'inscriptionsamedi 2 juillet 2005StatutMembreDernière intervention17 août 2006
-
28 juin 2006 à 12:19
Omerdude
Messages postés40Date d'inscriptionsamedi 2 juillet 2005StatutMembreDernière intervention17 août 2006
-
3 juil. 2006 à 15:23
Bonjour,
Je suis en train de travailler sur une requête, et vu que c'est pas du tout mon truc à la base, j'ai un peu de mal...
Explication:
J'ai une BDD hébergée sur SQL Server 2000 d'où je dois extraire des
données à envoyer à un client qui travaille sous Oracle. Elle contient
une table parent et plusieurs tables enfants. Le format d'échange doit
être du xml bien structuré, un peu dans ce style:
<enfant 1-1 />
<enfant 1-2 />
<enfant 2-1 />
........
Or pas moyen d'arriver à ce résultat! Ma requête crée bien les noeuds
parents, sans problèmes, mais joint tous les noeuds enfants au dernier
noeud parent! Ca donne un peu ça:
<enfant 1-1 />
<enfant 1-2 />
<enfant 2-1 />
........
Ce qui est assez facheux! Je joins ma requête (vous moquez pas, je suis
pas un pro de SQL et je suis en plein bidouillage! Il se peut que
certaines erreurs soient énormes!):
SELECT
1 AS Tag,
Null AS Parent,
C.CLI_ID AS [CLIENT!1!CLI_ID!ELEMENT!IDREF],
CLI_CATEGORIE AS [CLIENT!1!CLI_CATEGORIE!ELEMENT],
CLI_RSOC1 AS [CLIENT!1!CLI_RSOC1!ELEMENT],
CLI_RSOC2 AS [CLIENT!1!CLI_RSOC2!ELEMENT],
CLI_CIVILITE AS [CLIENT!1!CLI_CIVILITE!ELEMENT],
CLI_NOM AS [CLIENT!1!CLI_NOM!ELEMENT],
CLI_PRENOM AS [CLIENT!1!CLI_PRENOM!ELEMENT],
NULL AS [ENFANT!2!CLI_ID!HIDE],
NULL AS [ENFANT!2!ENF_RANG!ELEMENT],
NULL AS [ENFANT!2!ENF_GENRE!ELEMENT],
NULL AS [ENFANT!2!ENF_NOM!ELEMENT],
NULL AS [ENFANT!2!ENF_PRENOM!ELEMENT],
NULL AS [ENFANT!2!ENF_DNAISS!ELEMENT]
FROM CLIENT C, ENFANT E
UNION
SELECT
2,
1,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL ,
E.CLI_ID,
E.ENF_RANG,
E.ENF_GENRE,
E.ENF_NOM,
E.ENF_PRENOM,
E.ENF_DNAISS
FROM CLIENT C
INNER Join ENFANT E ON E.CLI_ID=C.CLI_ID AND E.ENF_RANG != 0
FOR XML EXPLICIT
Sachant que je ne travaille pour l'instant que sur la jointure de
deux tables... déjà que ça marche pas je vais pas tout compliquer pour
la plaisir!
Merci d'avance à ceux qui sauront éclairer ma lanterne...
merDude
A voir également:
Log4j:warn no appenders could be found for logger (net.sf.jasperreports.engine.xml.jrxmldigesterfactory).
cs_Malkuth
Messages postés268Date d'inscriptionsamedi 22 février 2003StatutMembreDernière intervention24 avril 20134 3 juil. 2006 à 12:23
Salut,
en fait ce qu'il manque c'est que ta table n'est pas ordonnée
SELECT
1 AS Tag,
Null AS Parent,
C.CLI_ID AS [CLIENT!1!CLI_ID!ELEMENT!IDREF],
CLI_CATEGORIE AS [CLIENT!1!CLI_CATEGORIE!ELEMENT],
CLI_RSOC1 AS [CLIENT!1!CLI_RSOC1!ELEMENT],
CLI_RSOC2 AS [CLIENT!1!CLI_RSOC2!ELEMENT],
CLI_CIVILITE AS [CLIENT!1!CLI_CIVILITE!ELEMENT],
CLI_NOM AS [CLIENT!1!CLI_NOM!ELEMENT],
CLI_PRENOM AS [CLIENT!1!CLI_PRENOM!ELEMENT],
NULL AS [ENFANT!2!CLI_ID!HIDE],
NULL AS [ENFANT!2!ENF_RANG!ELEMENT],
NULL AS [ENFANT!2!ENF_GENRE!ELEMENT],
NULL AS [ENFANT!2!ENF_NOM!ELEMENT],
NULL AS [ENFANT!2!ENF_PRENOM!ELEMENT],
NULL AS [ENFANT!2!ENF_DNAISS!ELEMENT]
FROM CLIENT C, ENFANT E
UNION
SELECT
2,
1,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL ,
E.CLI_ID,
E.ENF_RANG,
E.ENF_GENRE,
E.ENF_NOM,
E.ENF_PRENOM,
E.ENF_DNAISS
FROM CLIENT C
INNER Join ENFANT E ON E.CLI_ID= C.CLI_ID AND E.ENF_RANG != 0
FOR XML EXPLICIT
En effet il faut imaginée que les champ renvoyer sont d'abord tous ceux du premier select puis tous ceux du second select donc tous les enregistrement du deuxiéme select sont associè au dernier enregistrement du premier select ( enlève le FOR XML EXPLICIT pour t'en faire une idée).
SELECT
1 AS Tag,
Null AS Parent,
C.CLI_ID AS [CLIENT!1!CLI_ID!ELEMENT!IDREF],
CLI_CATEGORIE AS [CLIENT!1!CLI_CATEGORIE!ELEMENT],
CLI_RSOC1 AS [CLIENT!1!CLI_RSOC1!ELEMENT],
CLI_RSOC2 AS [CLIENT!1!CLI_RSOC2!ELEMENT],
CLI_CIVILITE AS [CLIENT!1!CLI_CIVILITE!ELEMENT],
CLI_NOM AS [CLIENT!1!CLI_NOM!ELEMENT],
CLI_PRENOM AS [CLIENT!1!CLI_PRENOM!ELEMENT],
NULL AS [ENFANT!2!CLI_ID!HIDE],
NULL AS [ENFANT!2!ENF_RANG!ELEMENT],
NULL AS [ENFANT!2!ENF_GENRE!ELEMENT],
NULL AS [ENFANT!2!ENF_NOM!ELEMENT],
NULL AS [ENFANT!2!ENF_PRENOM!ELEMENT],
NULL AS [ENFANT!2!ENF_DNAISS!ELEMENT]
FROM CLIENT C, ENFANT E
UNION
SELECT
2,
1,
C.CLI_ID ,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL ,
E.CLI_ID,
E.ENF_RANG,
E.ENF_GENRE,
E.ENF_NOM,
E.ENF_PRENOM,
E.ENF_DNAISS
FROM CLIENT C
INNER Join ENFANT E ON E.CLI_ID =C.CLI_ID AND E.ENF_RANG != 0
ORDER BY [CLIENT!1!CLI_ID!ELEMENT!IDREF], [ENFANT!2!CLI_ID!HIDE] FOR XML EXPLICIT
Il y'a deux petite modif : d'abord dans le second select j' ai rajouter C.CLI_ID pour permettre de trier les enregistrements en ordonénant les champs sur la colone[CLIENT!1!CLI_ID!ELEMENT!IDREF]de cette manière les champs enfant seront placer sous les champs parents correspondants ensuite on ordonne sur la colone [ENFANT!2!CLI_ID!HIDE], pour assuré que les parent seront bien ordonnée devant leus enfant en effet tous les parents on un [ENFANT!2!CLI_ID!HIDE] égal a null et tous le enfant on un [ENFANT!2!CLI_ID!HIDE] différent de zéro.
regarde la diférence avec ta première mouture en enlevant là encore le FOR XML EXPLICIT.
Bon j'ai pas eu le temps de tester mais ca devrait marcher (en tout cas l'esprit est là : ordonné les enregistrements).
cs_skweeky
Messages postés259Date d'inscriptionmercredi 3 mai 2006StatutMembreDernière intervention11 janvier 20108 29 juin 2006 à 11:30
Je ne suis pas sûr d'avoir tout compris...
Mais çà ne serait pas plus simple comme çà :
SELECT
1 AS Tag,
Null AS Parent,
C.CLI_ID AS [CLIENT!1!CLI_ID!ELEMENT!IDREF],
CLI_CATEGORIE AS [CLIENT!1!CLI_CATEGORIE!ELEMENT],
CLI_RSOC1 AS [CLIENT!1!CLI_RSOC1!ELEMENT],
CLI_RSOC2 AS [CLIENT!1!CLI_RSOC2!ELEMENT],
CLI_CIVILITE AS [CLIENT!1!CLI_CIVILITE!ELEMENT],
CLI_NOM AS [CLIENT!1!CLI_NOM!ELEMENT],
CLI_PRENOM AS [CLIENT!1!CLI_PRENOM!ELEMENT],
E.CLI_ID AS [ENFANT!2!CLI_ID!HIDE],
E.ENF_RANG AS [ENFANT!2!ENF_RANG!ELEMENT],
E.ENF_GENRE AS [ENFANT!2!ENF_GENRE!ELEMENT],
E.ENF_NOM AS [ENFANT!2!ENF_NOM!ELEMENT],
E.ENF_PRENOM AS [ENFANT!2!ENF_PRENOM!ELEMENT],
E.ENF_DNAISS AS [ENFANT!2!ENF_DNAISS!ELEMENT]
CLIENT C
INNER Join ENFANT E ON E.CLI_ID=C.CLI_ID AND E.ENF_RANG != 0
Je ne vois pas l'interet du UNION ni ce que tu souhaites faire exactement.
Omerdude
Messages postés40Date d'inscriptionsamedi 2 juillet 2005StatutMembreDernière intervention17 août 2006 29 juin 2006 à 11:48
zBonjour,
En fait j'essaie de créer un fichier xml qui regroupe plusieurs bases. A terme, mon fichier xml devra ressembler à ça:
<CLIENT>
<CLI_ID></CLI_ID>
<CLI_CATEGORIE></CLI_CATEGORIE>
........
<ENFANT>
<ENF_RANG></ENF_RANG>
<ENF_GENRE></ENF_GENRE>
..........
</ENFANT>
<CARTE>
<CART_ID></CART_ID>
............
</CARTE>
<COORDONNEES>
<COO_ADR1></COO_ADR2>
...........
</COORDONNEES>
<NPAI>
<NPAI_ID></NPAI_ID>
............
</NPAI>
<HISTFID>
<HISTFID_ID></HISTFID_ID>
..........
</HISTFID>
</CLIENT>
C'est à dire que concrètement, on doit avoir 1 table parent et 5
tables enfants imbriquées toutes au même niveau. J'ai essayé le INNER
JOIN pour chacune des tables enfants (ce qui fait donc 5 INNER JOIN ^^)
mais ça me donne un truc du genre:
<CLIENT>
<ENFANT>
<CARTE>
<COORDONNEES>
<NPAI>
<HISTFID>
</HISTFID>
</NPAI>
</COORDONNEES>
</CARTE>
</ENFANT>
</CLIENT>
Par ailleurs, je ne sais pas trop non plus si le UNION est une
solution. Ca m'arrange parce que ça vire les doublons, mais si faut
s'en passer je ferai sans!
merDude
Omerdude
Messages postés40Date d'inscriptionsamedi 2 juillet 2005StatutMembreDernière intervention17 août 2006 3 juil. 2006 à 15:23
Franchement, merci enormément de ce coup de main!
Non seulement ça marche, mais en plus j'ai même compris pourquoi! Ca
faisait un petit moment que je me prenais la tête là dessus et j'avais
fini par ne plus faire preuve de logique. Et la, en quelques lignes,
tout redevient clair!