IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

XQUERY/SGBD XML Discussion :

problème d'incrémentation de variable [Débutant(e)]


Sujet :

XQUERY/SGBD XML

  1. #1
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2012
    Messages : 5
    Points : 4
    Points
    4
    Par défaut problème d'incrémentation de variable
    Salut à tous
    voici ma requête (la partie qui pose le problème est en rouge):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    declare variable $Qc as xs:integer := 0;
    declare variable $Pc as xs:integer := 0; 
      
     for $c in doc('project.xml')/project/classe[@nom="classe1"]
     let $n := count(doc('project.xml')/project/classe[@nom="classe1"]/methodes/methode)
     return 
     
     <LCOM>{for $i in (1 to $n)
            for $j in (1 to $n)
            let $r:= $n
      let $mi := $c/methodes/methode[$i]
      let $mii := $c/methodes/methode[$j]
      
      where ($i != $j) 
      return
      
      if ($mi/attributs_utilises/attribut/@nom = $mii/attributs_utilises/attribut/@nom)
                   then  let $Qc := $Qc + 1
                         return <Qc> {$Qc} </Qc>
                   else  let $Pc := $Pc + 1 
                         return <Pc> {$Pc} </Pc> }
                  </LCOM>
    voici les résultats obtenues:
    MXQuery 0.6.0
    <?xml version='1.0' encoding='UTF-8' ?>
    <LCOM><Pc>1</Pc><Pc>1</Pc><Pc>1</Pc><Pc>1</Pc><Qc>1</Qc><Qc>1</Qc><Pc>1</Pc><Qc>1</Qc><Qc>1</Qc><Pc>1</Pc><Qc>1</Qc><Qc>1</Qc></LCOM>
    mais j'ai besoin de la somme totale des valeurs de Pc et Qc
    Merci de m'aider.

  2. #2
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    Les variables dans xquery sont en quelque sorte invariables, oui..., donc toute aproache resemble à compteur d'une itération dans un programme procédural serait inviable.

    Je peux vous mettre à l'attention d'existence de mot clé de xquery "at" qui peut vous aider largement pour faire à ce but - google le. Pourtant, dans ce cas ci, c'est un peu plus compliqué - c'est vrai - et c'est insufficent. Le problème provient de vouloir résulter quelque chose en comptant les termes d'un produit cartésien en respectant de certain schéma de compter lié à l'ordre documentaire. Cela devient pas tout à fait evident.

    Voici une façon cardinale de le faire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    for $c in doc('project.xml')/project/classe[@nom="classe1"]
    let $seqQc:=(
        for $g1 at $num1 in $c/methodes/methode
        for $g2 at $num2 in $c/methodes/methode
        where ($g2 != $g1) and
            ($g1/attributs_utilises/attribut/@nom != $g2/attributs_utilises/attribut/@nom)
        return
        concat($num1,'-',$num2)
    )
    let $seqPc:=(
        for $g1 at $num1 in $c/methodes/methode
        for $g2 at $num2 in $c/methodes/methode
        where ($g2 != $g1) and
            ($g1/attributs_utilises/attribut/@nom = $g2/attributs_utilises/attribut/@nom)
        return
        concat($num1,'-',$num2)
    )
     
    return 
    <LCOM>
    {
    for $g1 at $num1 in $c/methodes/methode
    for $g2 at $num2 in $c/methodes/methode
    where $g2 != $g1
    return
    if ($g1/attributs_utilises/attribut/@nom != $g2/attributs_utilises/attribut/@nom)
    then 
        <Qc>{index-of($seqQc, concat($num1,'-',$num2))}</Qc>
    else
        <Pc>{index-of($seqPc, concat($num1,'-',$num2))}</Pc>
    }
    </LCOM>

  3. #3
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2012
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    Merci, je suis debutante avec xquery et la requête est un petit peu compliquée pour moi. Serait il possible d'ajouter des commentaires ?

  4. #4
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    C'est un peu compliqué de l'expliquer et parfois un court commentaire ne suffit pas, hélas! Si le code ne parle pas de lui-même, ça signifie parfois ceux qui lirent ne sont pas prêts à résoudre certain problème. Mais je vais essayer quand même.

    Si on fait un produit cartésien, le façon de le faire implique un certain ordre qu'on a pour compter.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        for $g1 at $num1 in $c/methodes/methode
        for $g2 at $num2 in $c/methodes/methode
    C'est une matrice nxn et on compte linéairement comme (0,0), (0,1), ..., (0, n-1), (1,0), (1,1), ...(n-1, n-1). C'est déjà une façon parmi les autres et c'est pas une façon dictée par la nature. Cette séquence donne une indice cardinale naturelle (1,2,..., n**2).

    Malheureusement, on a besoin en fait deux séquences et deux façons de compter qui donnent chacune d'elles les deux types selon des critères exclusives l'un de l'autre, par exemple (0,0), (0,3),... pour une, et (0,1), (0,2),... pour l'autre. Ces séquences sont établies comme $seqPc et $seqQc, une fois pour tous pour être plus efficace, avec une notation equivalente 0-0, 0-3,... et 0-1, 0-2,... Pourtant chaque terme garde un caractère unique, distinct parmi les autres et vous pouvez garder la liberté de l'écrire d'une autre façon tant qu'elle est unique pour chaque terme individuellement.

    Avec ces deux séquences établies, il suffit de trouver un terme qui satisfait un critère pour ranger parmi les Pc's ou les Qc's et on cherche l'indice dans la séquence $seqPc ou $seqQc... etc.

    Je crains que ce ne soit pas tout à fait claire en fin de compte... et tant pis.

Discussions similaires

  1. [XL-2003] Problème d'incrémentation de variable
    Par Sanegone67 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 16/08/2011, 14h11
  2. Problème d'incrémentation de variable!
    Par vgiant dans le forum C
    Réponses: 7
    Dernier message: 04/05/2009, 17h57
  3. problème d'incrémentation de variable
    Par kayenne77 dans le forum Débuter
    Réponses: 2
    Dernier message: 09/03/2009, 22h54
  4. [XSL]Problème de portée des variables
    Par djulesp dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 17/09/2004, 10h34
  5. [débutant][xsl]incrémenter une variable
    Par guitalca dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 01/04/2003, 15h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo