FOR XML EXPLICIT..... Lyrics?!

Résolu
Omerdude Messages postés 40 Date d'inscription samedi 2 juillet 2005 Statut Membre Dernière intervention 17 août 2006 - 28 juin 2006 à 12:19
Omerdude Messages postés 40 Date d'inscription samedi 2 juillet 2005 Statut Membre Dernière intervention 17 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:

4 réponses

cs_Malkuth Messages postés 268 Date d'inscription samedi 22 février 2003 Statut Membre Dernière intervention 24 avril 2013 4
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).
3
cs_skweeky Messages postés 259 Date d'inscription mercredi 3 mai 2006 Statut Membre Dernière intervention 11 janvier 2010 8
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.

-----------------
Christian Robert
Winwise
0
Omerdude Messages postés 40 Date d'inscription samedi 2 juillet 2005 Statut Membre Dernière intervention 17 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
0
Omerdude Messages postés 40 Date d'inscription samedi 2 juillet 2005 Statut Membre Dernière intervention 17 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!

Encore merci!!!!!!!

merDude
0
Rejoignez-nous