Lire et écrire dans un fichier XML: Boucle infinie [Résolu]

sheira31 7 Messages postés jeudi 9 février 2012Date d'inscription 14 février 2012 Dernière intervention - 9 févr. 2012 à 14:56 - Dernière réponse : sheira31 7 Messages postés jeudi 9 février 2012Date d'inscription 14 février 2012 Dernière intervention
- 14 févr. 2012 à 16:51
Bonjour,

Voilà quelques jours que je travaille sur la création et le remplissage d'un fichier XML en C#. Et je dois dire que là je galère un peu...

Voilà mon fichier XML:

<?xml version="1.0" encoding= "utf-8"?>
<groupe>
  
     sheira 
  
</groupe>


Et voilà le code qui me permet de créer et d'ajouter des noeuds à ce fichier XML.
try
 
{
String[] theArray  = new string[] {"utilisateur", "prenom", "fond"};
String[] r = { "agence1", "sheira", "fond1.jpg" };
 
String filename = "test2.xml";
FileStream f = new FileStream(HttpContext.Current.Server.MapPath(filename), FileMode.OpenOrCreate, FileAccess.ReadWrite);
 
if (f.Length != 0)
{
XmlDocument doc = new XmlDocument();
doc.Load(f);
XmlNode racine = doc.DocumentElement;
 
if (racine.NodeType XmlNodeType.Element && racine.Name "groupe")
{
 
// Get a list of elements whose names are Agence
XmlNodeList nodAgences = doc.GetElementsByTagName("agence");
// Since we will look for a specific agence, get the list of all prenom
XmlNodeList nodUsers = doc.GetElementsByTagName("utilisateur");
 
// Visit each agences
for(int i = 0; i < nodAgences.Count; i++)
{
 
if (((XmlElement)(nodAgences[i])).HasAttribute("nom")){
string nomAgence = ((XmlElement)(nodAgences[i])).GetAttribute("nom");
Response.Write(r[0] );
if (nomAgence == r[0]){
Response.Write("ok:agence ");							
//for(int j = 0; j < nodUsers.Count; j++){
String prenom = nodUsers[i].InnerText;
Response.Write(prenom);
if(prenom == "she")
{
Response.Write("ok:utilisateur ");
// l'utilisateur existe déjà 
string nomFond = ((XmlElement)(nodUsers[i])).GetAttribute("fond");
Response.Write(nomFond);
 
if (nomFond != "fond2.jpg"){
Response.Write("ok:changeFond ");
// On modifie le fond => je remplace le noeud complet
XmlElement user = doc.CreateElement("utilisateur");
user.InnerText = "Lina";
XmlAttribute attrFond = doc.CreateAttribute("fond");
attrFond.Value = "fond2.jpg";
user.SetAttributeNode(attrFond);
nodUsers.Item(i).ParentNode.ReplaceChild(user, nodUsers.Item(i));
}
}
else {
Response.Write("ok:changeUser ");
// je rajoute le noeud complet
XmlElement user = doc.CreateElement("utilisateur");
user.InnerText = "Lila";
XmlAttribute attrFond = doc.CreateAttribute("fond");
attrFond.Value = r[2];
user.SetAttributeNode(attrFond);
nodAgences.Item(i).AppendChild(user);
 
}
//}
}
else{
XmlElement ag = doc.CreateElement("agence");
XmlAttribute attrNom = doc.CreateAttribute("nom");
attrNom.Value = r[0];
ag.SetAttributeNode(attrNom);
 
XmlElement user = doc.CreateElement("utilisateur");
user.InnerText = "Lila";
XmlAttribute attrFond = doc.CreateAttribute("fond");
attrFond.Value = r[2];
user.SetAttributeNode(attrFond);
 
ag.AppendChild(user);
racine.InsertAfter(ag, racine.FirstChild);							
}							
}					
}
 
f.Close();
doc.Save(HttpContext.Current.Server.MapPath(filename));
}
f.Close();
}
else
{
 
XmlTextWriter xmlw = new XmlTextWriter(f, System.Text.Encoding.UTF8);
 
xmlw.Formatting = Formatting.Indented;
 
xmlw.WriteStartDocument();
xmlw.WriteStartElement("groupe");
xmlw.WriteStartElement("agence");
xmlw.WriteAttributeString("nom", r[0]);
 
xmlw.WriteStartElement("utilisateur");
xmlw.WriteAttributeString("fond", r[2]);
xmlw.WriteString(r[1]);
 
xmlw.WriteEndElement();
xmlw.WriteEndElement();
xmlw.WriteEndElement();
 
xmlw.WriteEndDocument();
 
xmlw.Flush();
//vide le buffer
 
xmlw.Close();
// Close the writer
 
f.Close();
}
 
 
}
 
 
 
finally {
 
 
 }


J'arrive à rajouter des noeuds ou je veux.... le soucis c'est qu'il m'en rajoute tout le temps parce que je passe jamais au noeud suivant , j'ai pourtant une boucle for mais rien n'y fait...(la boucle est infinie. Je veux d'abord qui 'il vérifie que l'enregistrement n'existe dans aucun des noeuds avant de me le rajouter mais c'est pas le cas il s'arrête au premier noeud... Mes "else" sont faux parce que je n'ai pas encore vérifier tous les noeuds.

Merci d'avance pour votre aide.
Afficher la suite 

Votre réponse

12 réponses

Meilleure réponse
cs_jopop 1540 Messages postés lundi 26 mai 2003Date d'inscription 1 août 2013 Dernière intervention - 14 févr. 2012 à 14:47
3
Merci
Re, bien mangé ? ^^

Bon, déjà j'ai dit une bêtise, pour des HtmlControls il faut utiliser l'attribut onserverclick en lieu et place de onclick (qui est côté client). L'habitude de travailler avec des WebControls (où on utilise onclick côté server et onclientclick côté client), my bad.

Ensuite y'a pas mal de petits souci dans ton HTML, à la volée :
- les valeurs d'attributs doivent toujours être entre quote (cf. width= "5"),
- les noms des balises doivent être en minuscule (cf. < html >),
- tu ne peux pas avoir de contenu dans une balise tr sans balise td,
- width n'est pas un attribut de la balise tr,
etc ...

Voici un exemple fonctionnel (codé et testé par mes soins) qui est assez proche de ta demande, fonction d'écriture XML en moins ... et erreur HTML en moins ^^ :
<% @Page Language ="C#" Debug="true" %>
<% @Import Namespace="System" %>
<% @Import Namespace="System.Web" %>

<html>
    <head>
        <meta http-equiv="content-type" content="text/html; charset=windows-1252" />
        <title>OnClick on HtmlControl inline C#</title>
        <script runat="server">
            protected void ahrefBG_Click(object sender, EventArgs e) {
                HtmlAnchor anchor = (HtmlAnchor)sender;
                h1Title.InnerText = "vous avez choisi l'image : " + anchor.Attributes["desc"];
            }
        </script>
    </head>
    
    <form id="frmMain" runat="server">
    Définir un nouveau fond d'écran
,

----

,
,
,

----

,
,


</form>

</html>

Merci cs_jopop 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 89 internautes ce mois-ci

Commenter la réponse de cs_jopop
Whismeril 12096 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 15 octobre 2018 Dernière intervention - 9 févr. 2012 à 22:35
0
Merci
Bonsoir,

si tu te crees une classe (maClasse) avec comme propiétés : Utilisateur, Fond et Prenom.
ensuite tu remplis une List<maClasse> avec toutes tes données, tu géres les doublons à la saisie.

Tu peux ensuite écrire ou lire ton xml avec LinqToXml. Voir ce post.



Whismeril
Commenter la réponse de Whismeril
sheira31 7 Messages postés jeudi 9 février 2012Date d'inscription 14 février 2012 Dernière intervention - 13 févr. 2012 à 16:23
0
Merci
Merci whismeril.
Je suis arrivée à creer mes noeuds comme il faut toutefois j'aimerai maintenant utiliser cette fonction dans une page aspx. Mais je n'arrive pas a appeler ma fonction( ChooseBackGround) depuis ma fonction JS (setBackGround)? Comment cela se fait-il?

Merci d'avance pour votre aide.

Voici mon code:
<% @Page Language="C#" Debug="true" %>
<% @Import Namespace="System" %>
<% @Import Namespace="System.Xml" %>
<% @Import Namespace="System.IO" %>
<% @Import Namespace="System.Xml.XPath" %>
<script runat="server">
protected String chooseBG()
{
return "Hello";
}
 
protected void chooseBackGround(string[] r)
    {
try
        {
            //String[] r = { "agence3", "sheira", "fondK.jpg" };
 
 
            String filename = "test.xml";
 
            using (FileStream f = new FileStream(HttpContext.Current.Server.MapPath(filename), FileMode.OpenOrCreate, FileAccess.ReadWrite))
            {
                if (f.Length != 0)
                {
                    XmlDocument doc = new XmlDocument();
                    doc.Load(f);
                    XmlElement racine = doc.DocumentElement;
                    //  on vérifie d'abord que la balise groupe existe 
                    if (racine !null && racine.Name "groupe")
                    {
                        XmlNodeList noeudsAgence = racine.ChildNodes;
                        if (noeudsAgence.Count > 0)
                        {
                            // on vérifie que le noeud n'existe pas avant de le créer
                            bool agenceExist = false;
                            bool utilisateurExist = false;
                            foreach (XmlNode noeudAgence in noeudsAgence)
                            {
                                if (noeudAgence.Attributes["nom"].InnerText == r[0])
                                {
                                    agenceExist = true;
                                    foreach (XmlNode utilisateur in noeudAgence.ChildNodes)
                                    {
Response.Write (utilisateur.InnerText); 
                                        if (utilisateur.InnerText == r[1])
                                        {
                                            utilisateurExist = true;
                                            utilisateur.Attributes["fond"].Value = r[2];
                                            break;
                                        }
                                    }
                                    if (!utilisateurExist)
                                    {
                                        XmlElement user = doc.CreateElement("utilisateur");
                                        user.InnerText = r[1];
                                        XmlAttribute attrFond = doc.CreateAttribute("fond");
                                        attrFond.Value = r[2];
                                        user.SetAttributeNode(attrFond);
                                        noeudAgence.AppendChild(user);
                                    }
                                }
 
                            }
 
                            if (!agenceExist)
                            {
                                XmlElement ag = doc.CreateElement("agence");
                                XmlAttribute attrNom = doc.CreateAttribute("nom");
                                attrNom.Value = r[0];
                                ag.SetAttributeNode(attrNom);
                                XmlElement user = doc.CreateElement("utilisateur");
                                user.InnerText = r[1];
                                XmlAttribute attrFond = doc.CreateAttribute("fond");
                                attrFond.Value = r[2];
                                user.SetAttributeNode(attrFond);
                                ag.AppendChild(user);
                                racine.AppendChild(ag);
                            }
                            f.Close();
                            doc.Save(HttpContext.Current.Server.MapPath(filename));
 
                        }
                    }
 
                }
                else
                {
                    XmlDocument doc = new XmlDocument();
                    XmlDeclaration declaration = doc.CreateXmlDeclaration("1.0", "Utf-8", null);
                    doc.AppendChild(declaration);
                    XmlElement racine = doc.CreateElement("groupe");
                    XmlElement ag = doc.CreateElement("agence");
                    XmlAttribute attrNom = doc.CreateAttribute("nom");
                    attrNom.Value = r[0];
                    ag.SetAttributeNode(attrNom);
                    XmlElement user = doc.CreateElement("utilisateur");
                    user.InnerText = r[1];
                    XmlAttribute attrFond = doc.CreateAttribute("fond");
                    attrFond.Value = r[2];
                    user.SetAttributeNode(attrFond);
                    ag.AppendChild(user);
                    racine.AppendChild(ag);
                    doc.AppendChild(racine);
                    doc.Save(f);
                }
 
 
            }
        }
        catch (Exception ex)
        {
            //Todo:gestion des exceptions
        }
 
 
}
 
</script>
<HTML>
<HEAD>
<meta http-equiv="content-type" content="text/html; charset=windows-1252" />
<script language= "Javascript" type= "text/javascript" >
 
function getVar (nomVariable)
{
var infos = location.href.substring(location.href.indexOf("?")+1, location.href.length)+"&"
if (infos.indexOf("#")!=-1)
infos = infos.substring(0,infos.indexOf("#"))+"&"
var variable=0
{
nomVariable = nomVariable + "="
var taille = nomVariable.length
if (infos.indexOf(nomVariable)!=-1)
variable = infos.substring(infos.indexOf(nomVariable)+taille,infos.length).substring(0,infos.substring(infos.indexOf(nomVariable)+taille,infos.length).indexOf("&"))
}
return variable
} 
 
function setBackGround(strFond)
{
var groupe = getVar('groupe');
var nom = getVar('nom');
var data = [];
data.push(groupe, nom);
data.push(strFond);
//alert (data.join(","));
 
alert("<%= chooseBG() %>;
 
<% 
String[] r = { "agence4", "Olivier", "fondO.jpg" };
/*String agence = Request.Params["groupe"];*/
String prenom = Request.Params["nom"];
 
chooseBackGround(r);
%>
 
 
}
 
 
</script>
 
<script language= "C#" type= "text/C#" runat= "Server">
private void chooseBackgroud()
{
}
 
</script>
 
</HEAD>

Définir un nouveau fond d'écran

----

, 1.1
,
,
,

----

----

----

,
,
,


 

</HTML>
Commenter la réponse de sheira31
cs_jopop 1540 Messages postés lundi 26 mai 2003Date d'inscription 1 août 2013 Dernière intervention - 13 févr. 2012 à 16:43
0
Merci
Salut,

comme tu l'as justement écrit, tes fonctions C# sont runat server. Tu ne peux donc pas les appeler directement en JS (qui lui est côté client). Soit tu submit vers le serveur pour qu'il te fasse les modifs souhaitées, soit tu utilises une XmlHttpRequest (AJAX).

Bon dev
Commenter la réponse de cs_jopop
sheira31 7 Messages postés jeudi 9 février 2012Date d'inscription 14 février 2012 Dernière intervention - 13 févr. 2012 à 17:24
0
Merci
Merci Jopop!

Question bête peut-être mais je la pause quand même ma fonction ne peut pas être runat client?

Comment gérer le submit de la balis' , à travers le onclick? Serait-il possible de faire un
    
Commenter la réponse de sheira31
cs_jopop 1540 Messages postés lundi 26 mai 2003Date d'inscription 1 août 2013 Dernière intervention - 14 févr. 2012 à 08:37
0
Merci
Re,

la question n'est pas bête, mais comme tu te doutes ce n'est pas possible (à moins de passer en mode ActiveX, version Microsoft d'une Applet, mais je te le déconseille : demande des droits de la part de l'utilisateur).

Si tu lies ton A HREF à une fonction tu feras un aller/retour sur le serveur, donc rechargement de la page. J'ai pas trop l'habitude de travailler avec le code inline, je vais donc te faire de simples indications, tu te tentes et tu reviens ici si tu coinces :

- il te faut déjà encapsuler tes balises dans un tag form :
<form runat="server">
   <!-- tes balises de saisie et de validation -->
</form>


- il faut ensuite identifier et déclarer ta balise A HREF aussi côté serveur :
Click voir si tu oses


- enfin, ta fonction côté serveur doit respecter cette forme :
protected void ahrefChoose_Click(object sender, EventArgs e) {
   // ce que tu souhaites faire
}


Normalement le .NET doit se charger de faire le lien entre le côté client et le côté serveur grâce à des JS et des balises hidden. Mais encore une fois j'ai jamais codé tout inline, à voir.

Bon courage
Commenter la réponse de cs_jopop
sheira31 7 Messages postés jeudi 9 février 2012Date d'inscription 14 février 2012 Dernière intervention - 14 févr. 2012 à 10:57
0
Merci
Merci pour ton aide et tes explications Jopop.

J'ai essayé ce que tu m'a dit mais ça ne fonctionne pas.

1) Je ne sais pas quoi mettre comme dans le href de ma balise: je veux juste qu'il fasse ce que je lui demande de faire dans ma fonction C#

2) Voici le code que je teste, peut-être pourra tu voir un peu plus clair. Je veux juste qu'au clique sur mon image, il m’exécute ma fonction. Mais je dois dire que là ça me dépasse un peu.

<% @Page Language="C#" Debug="true" %>
<% @Import Namespace="System" %>
<% @Import Namespace="System.Web" %>
<% @Import Namespace="System.Xml" %>
<% @Import Namespace="System.IO" %>
<% @Import Namespace="System.Xml.XPath" %>
<script runat="server">
public String chooseBG()
{
return "Hello";
}

protected void ahrefChooseBackGround_Click(String fond)
    {
try
        {
            //String[] r = { "agence3", "sheira", "fondK.jpg" };
String agence = HttpContext.Current.Request.Params["groupe"];
String prenom = HttpContext.Current.Request.Params["nom"];
String[] r = new String []{ agence, prenom, fond};

            String filename = "test.xml";
            using (FileStream f = new FileStream(HttpContext.Current.Server.MapPath(filename), FileMode.OpenOrCreate, FileAccess.ReadWrite))
            {
                if (f.Length != 0)
                {
                    XmlDocument doc = new XmlDocument();
                    doc.Load(f);
                    XmlElement racine = doc.DocumentElement;
                    //  on vérifie d'abord que la balise groupe existe 
                    if (racine !null && racine.Name "groupe")
                    {
                        XmlNodeList noeudsAgence = racine.ChildNodes;
                        if (noeudsAgence.Count > 0)
                        {
                            // on vérifie que le noeud n'existe pas avant de le créer
bool agenceExist = false;
                            bool utilisateurExist = false;
                            foreach (XmlNode noeudAgence in noeudsAgence)
                            {
                                if (noeudAgence.Attributes["nom"].InnerText == r[0])
                                {
                                    agenceExist = true;
                                    foreach (XmlNode utilisateur in noeudAgence.ChildNodes)
                                    {
Response.Write (utilisateur.InnerText); 
                                        if (utilisateur.InnerText == r[1])
                                        {
                                            utilisateurExist = true;
                                            utilisateur.Attributes["fond"].Value = r[2];
                                            break;
                                        }
                                    }
                                    if (!utilisateurExist)
                                    {
                                        XmlElement user = doc.CreateElement("utilisateur");
                                        user.InnerText = r[1];
                                        XmlAttribute attrFond = doc.CreateAttribute("fond");
                                        attrFond.Value = r[2];
                                        user.SetAttributeNode(attrFond);
                                        noeudAgence.AppendChild(user);
                                    }
                                }
 
                            }
 
                            if (!agenceExist)
                            {
                                XmlElement ag = doc.CreateElement("agence");
                                XmlAttribute attrNom = doc.CreateAttribute("nom");
                                attrNom.Value = r[0];
                                ag.SetAttributeNode(attrNom);
                                XmlElement user = doc.CreateElement("utilisateur");
                                user.InnerText = r[1];
                                XmlAttribute attrFond = doc.CreateAttribute("fond");
                                attrFond.Value = r[2];
                                user.SetAttributeNode(attrFond);
                                ag.AppendChild(user);
                                racine.AppendChild(ag);
                            }
                            f.Close();
                            doc.Save(HttpContext.Current.Server.MapPath(filename));
                         }
                    }
                }
                else
                {
                    XmlDocument doc = new XmlDocument();
                    XmlDeclaration declaration = doc.CreateXmlDeclaration("1.0", "Utf-8", null);
                    doc.AppendChild(declaration);
                    XmlElement racine = doc.CreateElement("groupe");
                    XmlElement ag = doc.CreateElement("agence");
                    XmlAttribute attrNom = doc.CreateAttribute("nom");
                    attrNom.Value = r[0];
                    ag.SetAttributeNode(attrNom);
                    XmlElement user = doc.CreateElement("utilisateur");
                    user.InnerText = r[1];
                    XmlAttribute attrFond = doc.CreateAttribute("fond");
                    attrFond.Value = r[2];
                    user.SetAttributeNode(attrFond);
                    ag.AppendChild(user);
                    racine.AppendChild(ag);
                    doc.AppendChild(racine);
                    doc.Save(f);
                }
            }
        }
        catch (Exception ex)
        {
            //Todo:gestion des exceptions
        }
}

</script>
<HTML>
<HEAD>
<meta http-equiv="content-type" content="text/html; charset=windows-1252" />
<script language= "Javascript" type= "text/javascript" >

function getVar (nomVariable)
{
var infos = location.href.substring(location.href.indexOf("?")+1, location.href.length)+"&"
if (infos.indexOf("#")!=-1)
infos = infos.substring(0,infos.indexOf("#"))+"&"
var variable=0
{
nomVariable = nomVariable + "="
var taille = nomVariable.length
if (infos.indexOf(nomVariable)!=-1)
variable = infos.substring(infos.indexOf(nomVariable)+taille,infos.length).substring(0,infos.substring(infos.indexOf(nomVariable)+taille,infos.length).indexOf("&"))
}
return variable
} 

function setBackGround(strFond)
{
var groupe = getVar('groupe');
var nom = getVar('nom');
var data = [];
data.push(groupe, nom);
data.push(strFond);
//alert (data.join(","));

//alert("<%= chooseBG() %>;

<% 
String[] r = { "agence4", "Olivier", "fondO.jpg" };
/*String agence = HttpContext.Current.Request.Params["groupe"];*/
String prenom = HttpContext.Current.Request.Params["nom"];
Response.Write(prenom);
//chooseBackGround(r);
%>
}
</script>
</HEAD>

<form runat="server">
Définir un nouveau fond d'écran

----

,
,
,
,

----

----

----

,
,
,


</form>

</HTML>

   
Commenter la réponse de sheira31
cs_jopop 1540 Messages postés lundi 26 mai 2003Date d'inscription 1 août 2013 Dernière intervention - 14 févr. 2012 à 11:53
0
Merci
Re vite fait,

je vais pas tarder à aller manger, donc juste une petite chose avant de regarder ton code de plus près : tes fonctions dans tes A HREF sont des références, elles ne prennent pas de paramètre ni même de parenthèses :
<!-- il faut écrire comac -->
Click voir si tu oses
<!-- et pas comac -->
Click voir si tu oses

D'ailleurs si tu as lu le proto d'un EventHandler que j'ai donné plus haut tu vois que cette fonction prend 2 paramètres : l'objet qui appelle la fonction et un ensemble d'arguments structurés dans un EventArgs, rien à voir avec un string ;)

A+
Commenter la réponse de cs_jopop
sheira31 7 Messages postés jeudi 9 février 2012Date d'inscription 14 février 2012 Dernière intervention - 14 févr. 2012 à 12:10
0
Merci
J'ai modifié les paramètres de ma procédure comme tu me l'as précisé
et modifier mes a href, j'ai même créer un bouton pour voir si ça ne fonctionnerai pas mieux, mais rien n'y fait.

<td  width=5  height =5></td>


Encore merci pour ton aide, bonne appétit. A+
Commenter la réponse de sheira31
sheira31 7 Messages postés jeudi 9 février 2012Date d'inscription 14 février 2012 Dernière intervention - 14 févr. 2012 à 14:24
0
Merci
J'ai un peu avancer:

en faisant ça, ça fonctionnne
<tr width=25>
<td  width=5  height =5>



</td>
<td  width=5  height =5>



</td>
<td  width=5  height =5>



</td>
<td  width=5  height =5>



</td>
</tr>


Par contre est-ce qu'il y a un moyen que je récupère la valeur de
ImageUrl= "../images/fond1.jpg"
dans ma fonction ahrefChooseBackGround_Click, j'en ai besoin pour connaître le nom de l'image ??

Merci pour votre aide.
Commenter la réponse de sheira31
cs_jopop 1540 Messages postés lundi 26 mai 2003Date d'inscription 1 août 2013 Dernière intervention - 14 févr. 2012 à 14:50
0
Merci
Oui, plutôt que d'utiliser un A HREF avec l'attribut onserverclick tu peux effectivement utiliser la version WebControl, et donc l'attribut onclick.

Pour ce qui est de récupérer une donnée spécifique de là où l'utilisateur click je t'ai mis ça dans mon code plus haut : Tu cast le sender dans son type d'origine et tu récupères ce que tu souhaites. J'ai poussé le vice encore plus loin en créant carrément un nouvel attribut que j'ai appelé desc.

Bon finalisation
Commenter la réponse de cs_jopop
sheira31 7 Messages postés jeudi 9 février 2012Date d'inscription 14 février 2012 Dernière intervention - 14 févr. 2012 à 16:51
0
Merci
Merci beaucoup Jopop ça fonctionne!
Commenter la réponse de sheira31

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.