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

JavaScript Discussion :

[Débutante][API] Statistiques à partir d'une API


Sujet :

JavaScript

  1. #1
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 126
    Points : 55
    Points
    55
    Par défaut [Débutante][API] Statistiques à partir d'une API
    Bonjour,

    J'ai déjà posté à ce sujet mais j'ai un nouveau problème bien spécifique donc j'ouvre un nouveau fil.
    Pour ceux qui n'aurait pas vu mon premier post, je suis en stage de première année de BTS et il n'y pas de développeur dans la boite donc je ne peux pas avoir de réponse à mes questions autrement qu'en venant vous les poser.

    Donc voilà, on me demande de mettre au point un petit programme qui permette d'extraire des stats simples de l'API eBay. En gros pour le moment, je me contente d'afficher une liste des derniers produits vendus avec leurs prix et la date de vente. Il faut maintenant que j'ajoute un petit tableau qui affiche le nombre de fois qu'un produit a été vendu et à quel prix moyen.

    Je ne connais pas trop le JavaScript et je galère un peu.

    Mon code est composé de deux fichiers, le premier est un formulaire où l'on renseigne les mots clés pour la recherche du produit et depuis quelle date :

    Code html : 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
    <body>
     
    		<div class="container">
     
    			<h1>Rechercher Produits EBay</h1>
     
    			<form method="POST" action="MySample.php">
    				<div class="form-group">
    					<label class="text-primary">Produit recherché : </label>
    					<input class="form-control" type="text" name="product">
    				</div>
    				<div class="form-group">
    					<label class="text-primary">Depuis cette date : </label>
    					<input type="date" class="form-control" name="dateChoose">
    				</div>
    				<input type="submit" class="btn btn-primary" name="rechercher" value="Rechercher">
    			</form>
     
     
    		</div>
     
     
     
     
    	</body>
    Et le deuxième sert à l'appel de l'API et au traitement des données JSON :
    Code html : 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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    <body>
     
    		<div class="container">
     
     
     
    			<h1>eBay Search Results</h1>
     
    			<div id="results"></div>
     
    		</div>
     
     
     
     
     
    		<script>
     
                            // Parse the response and build an HTML table to display search results
                            function _cb_findCompletedItems(root) {
                              var items = root.findCompletedItemsResponse[0].searchResult[0].item || [];
                              let dateChoose = new Date(<?= json_encode($dateChoose)?>);
                              console.log(dateChoose);
     
                              var somme = 0;
     
                              for (var i = 0; i < items.length; ++i) {
                                  var item          = items[i];
                                  var price                 = item.sellingStatus[0].convertedCurrentPrice[0].__value__;
                                  let date          = new Date(endTime);
     
                                  while(date > dateChoose){
                                      var salesNumber = items.length;
                                      var somme += price;
                                                    
                                  } 
                                  var moyenne = somme/salesNumber;
     
                              }
     
                              var table = [];
                              table.push(
                                                    '<table><tr class="active><th>Nombre de vente</th><th>Moyenne de prix</th></tr>'+
                                                    '<tr><td>'+ salesNumber +'</td><td>' + moyenne+ '</td></tr></table>');
                              
                              var html = [];
                              html.push('<table width="100%" border="0" cellspacing="0" cellpadding="3 class="table table-bordered table-striped table-condensed"><tr><th>Photo</th><th>Label</th><th>Date de vente</th><th>Prix de vente</th></tr>');
                              
                              for (var i = 0; i < items.length; ++i) {
                                var item            = items[i];
                                var title           = item.title;
                                var pic             = item.galleryURL;
                                var viewitem        = item.viewItemURL;
                                var price           = item.sellingStatus[0].convertedCurrentPrice[0].__value__;
                                var endTime         = item.listingInfo[0].endTime;
                                let date            = new Date(endTime);
                            
                                                        
                                if (null != title && null != viewitem) {
                                  html.push('<tr><td><img src="' + pic + '" border="0">' + '</td>' + 
                                  '<td><a href="' + viewitem + '" target="_blank">' + title + '</a></td>'
                                  +'<td>'+ date + ' </td><td>'+price+'€</td></tr>');
                                }
                              }
                              html.push('</table>');
                              document.getElementById("results").innerHTML = html.join("");
                            }  // End _cb_findCompletedItems() function
     
                            // Create a JavaScript array of the item filters you want to use in your request
                            var filterarray = [
                              /*{"name":"MaxPrice", 
                               "value":"25", 
                               "paramName":"Currency", 
                               "paramValue":"USD"},
                              {"name":"FreeShippingOnly", 
                               "value":"true", 
                               "paramName":"", 
                               "paramValue":""},
                              {"name":"ListingType", 
                               "value":["AuctionWithBIN", "FixedPrice", "StoreInventory"], 
                               "paramName":"", 
                               "paramValue":""},*/
                               {
                                    "name" : "SoldItemsOnly",
                                    "value" : "true",
                                    "paramName" : '',
                                    "paramValue" : ''
                               },
                              ];
     
     
                            // Define global variable for the URL filter
                            var urlfilter = "";
     
                            // Generates an indexed URL snippet from the array of item filters
                            function  buildURLArray() {
                              // Iterate through each filter in the array
                              for(var i=0; i<filterarray.length; i++) {
                                //Index each item filter in filterarray
                                var itemfilter = filterarray[i];
                                // Iterate through each parameter in each item filter
                                for(var index in itemfilter) {
                                  // Check to see if the paramter has a value (some don't)
                                  if (itemfilter[index] !== "") {
                                    if (itemfilter[index] instanceof Array) {
                                      for(var r=0; r<itemfilter[index].length; r++) {
                                      var value = itemfilter[index][r];
                                      urlfilter += "&itemFilter\(" + i + "\)." + index + "\(" + r + "\)=" + value ;
                                      }
                                    } 
                                    else {
                                      urlfilter += "&itemFilter\(" + i + "\)." + index + "=" + itemfilter[index];
                                    }
                                  }
                                }
                              }
                            }  // End buildURLArray() function
     
                            // Execute the function to build the URL filter
                            buildURLArray(filterarray);
     
                            var product = <?php echo json_encode($product); ?>;
     
                            // Construct the request
                            // Replace MyAppID with your Production AppID
                            var url = "http://svcs.ebay.com/services/search/FindingService/v1";
                                url += "?OPERATION-NAME=findCompletedItems";
                                url += "&SERVICE-VERSION=1.0.0";
                                url += "&SECURITY-APPNAME=Lemarcha-projetTo-PRD-f2ccbdebc-1b934df9";
                                url += "&GLOBAL-ID=EBAY-FR";
                                url += "&RESPONSE-DATA-FORMAT=JSON";
                                url += "&callback=_cb_findCompletedItems";
                                url += "&REST-PAYLOAD";
                                url += "&keywords="+encodeURI(product);;
                                url += "&paginationInput.entriesPerPage=25";
                                url += urlfilter;
                                //url += "&itemFilter(0).name=SoldItemsOnly";
                                    //url += "&itemFilter(0).value=true";
                                //url += "&sortOrder=PricePlusShippingLowest";
     
     
                            // Submit the request 
                            s=document.createElement('script'); // create script element
                            s.src= url;
                            document.body.appendChild(s);
     
                            // Display the request as a clickable link for testing
                            document.write("<a href=\"" + url + "\">" + url + "</a>");
     
                            
     
     
                       
                    </script>
     
    	</body>

    Le code fonctionne très bien pour afficher la liste des produits avec image, label, date de vente et prix si on enlève les lignes 22 à 45
    Mais pour ces fameuses lignes j'ai du très mal m'y prendre car j'ai l'erreur suivante :
    SyntaxError: unexpected token: '+='
    Pouvez vous m'aider svp ?

  2. #2
    Expert confirmé Avatar de psychadelic
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    2 529
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 2 529
    Points : 4 740
    Points
    4 740
    Par défaut
    Pour ton post précédent, je me suis quand même posé la question de savoir si ma réponse était juste et si cela t'avait aidée ou non, ou si tu avait carrément abandonné toute idée de résolution...

    Donc, à défaut d'une réponse de courtoisie, tu devrai mettre ce sujet comme "résolu".

    * - * - *

    Ton message d'erreur ne vaut rien s'il n'est pas accompagné d'un minimum d'information, ici il faut a minima indiquer le no de ligne ou l'erreur c'est produite.

    mais bon, j'ai quand même trouvé, c'est
    Ligne 34 : var somme += price; .

    qui est présente dans une boucle while
    ligne 32 while(date > dateChoose){ .
    et qui au passage peut être infinie parce que ni date ou dateChoose ne sont changés à l’intérieur de cette boucle

    qui est elle- même présente a l'intérieur d'une boucle for :
    Ligne 27 : for (var i = 0; i < items.length; ++i) { .

    mais on retrouve une autre déclaration qui précede tout cela ,
    en ligne 25 var somme = 0; .

    avec ton code, l’interpréteur va crée 2 variables distinctes ayant toutes deux le même nom.
    _ la première en ligne 25 à une portée globale sur l'ensemble de ta fonction _cb_findCompletedItems()
    _ la seconde en ligne 34 à une portée limité à l'intérieur de la boucle (ligne 32).
    et qui est autant de fois crée qu'il y a d'itérations dans cette boucle sans fin.
    et c'est la même chose pour l'autre variable salesNumber

    le problème de l'affectation en ligne 34 est qu'il est relatif à une variable qu'il est en train de créer, et qui n'a donc pas de valeur.
    https://developer.mozilla.org/fr/doc...structions/var

    si on devait traduire var somme += price; en Français, ce la signifie :
    créer une variable en lui donnant pour nom somme en lui donnant pour valeur elle-même (ce qui n'a bien sur aucun sens), additionné de la valeur contenu dans la variable price.
    «La pluralité des voix n'est pas une preuve, pour les vérités malaisées à découvrir, tant il est bien plus vraisemblable qu'un homme seul les ait rencontrées que tout un peuple.» [ René Descartes ] - Discours de la méthode

  3. #3
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 126
    Points : 55
    Points
    55
    Par défaut
    Salut psychadelic.

    Je me suis excusée sur l'autre post, c'est un oubli lamentable de ma part ! Et j'ai mis le sujet en résolu.

    Merci pour ta réponse, je vais tester ça.

  4. #4
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 126
    Points : 55
    Points
    55
    Par défaut
    Bon me revoilà, effectivement c'était une erreur toute bête, j'avais déclaré deux fois ma variable

    Bon ça c'est réglé et après quelques modifs j'ai bien mon nombre total d'articles mais je n'arrive pas à obtenir la moyenne de prix.

    Et j'ai un problème avec mon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Tant que les dates de vente sont différentes de la date choisie
    .

    Je pense que c'est cette boucle qui me génère le message d'erreur suivant :
    allocation size overflow MySample.php:62:11
    Une solution pour que j'arrive à faire ce calcul ?

    Après je vais essayer d'arrêter de vous embêter ^^

    Je remets la portion de code à jour pour que vous y voyez plus clair :

    Code html : 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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    <body>
     
    		<div class="container">
     
    			<h1>Statistique sur cet objet</h1>
     
    			<div id="stats"></div>
     
    			<h1>eBay Search Results</h1>
     
    			<div id="results"></div>
     
    		</div>
     
     
     
     
     
    		<script>
     
                            // Parse the response and build an HTML table to display search results
                            function _cb_findCompletedItems(root) {
                              var items = root.findCompletedItemsResponse[0].searchResult[0].item || [];
                              let dateChoose = new Date(<?= json_encode($dateChoose)?>);
                              console.log(dateChoose);
                              var somme = 0;
                              for (var i = 0; i < items.length; ++i) {
                                  var item = items[i];
                                  var price = item.sellingStatus[0].convertedCurrentPrice[0].__value__;
                                  var endTime = item.listingInfo[0].endTime;
                                  let date = new Date(endTime);
                                  var salesNumber = items.length;
     
                                  while(date != dateChoose){
     
                                      
                                      somme += price;
                                                    
                                  } 
                                  var moyenne = somme/salesNumber;
     
                                  document.getElementById("stats").textContent = 'Nombre de vente : '+ salesNumber +' pour un prix moyen de ' + moyenne+ '€.';
     
                              }

  5. #5
    Expert confirmé Avatar de psychadelic
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    2 529
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 2 529
    Points : 4 740
    Points
    4 740
    Par défaut
    Citation Envoyé par psychadelic Voir le message
    qui est présente dans une boucle while
    ligne 32 while(date > dateChoose){ .
    et qui au passage peut être infinie parce que ni date ou dateChoose ne sont changés à l’intérieur de cette boucle.
    une boucle infinie finit toujours par un " allocation size overflow "
    «La pluralité des voix n'est pas une preuve, pour les vérités malaisées à découvrir, tant il est bien plus vraisemblable qu'un homme seul les ait rencontrées que tout un peuple.» [ René Descartes ] - Discours de la méthode

  6. #6
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 126
    Points : 55
    Points
    55
    Par défaut
    Oui j'avais relu ton message précédent et c'est bien ce que je pensais.

    J'ai fais quelques modif, cette fois je n'ai pas de boucle infinie, et mon système de date fonctionne pour récupérer le nombre de produits vendus depuis une date saisie. Même si il y a beaucoup plus de produits trouvé avec ma requête.

    Mais j'ai un soucis que je n'arrive pas à régler, je n'arrive pas à calculer la moyenne de prix. Quand je n'ai qu'un seul produit de trouvé j'ai bien un prix, mais dès qu'il y en a plus d'un, à la place du prix j'ai droit à NaN€.
    Donc je me suis renseigné, cela signifie not a number, mais je ne vois pas comment calculer mon prix autrement.
    C'est sûrement parce que je les récupère à partir d'un tableau...

    Tu peux m'aider à régler ça ?

    Après j'arrête de t'embêter pendant quelques jours

    Je remets le début de ma fonction à jour :

    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    function _cb_findCompletedItems(root) {
     
    			  var items = root.findCompletedItemsResponse[0].searchResult[0].item || [];
     
    			  let dateChoose = new Date(<?= json_encode($dateChoose)?>);
    			  var day = dateChoose.getDate();
    			  var month = dateChoose.getMonth();
    			  dateChoose = '' + month + day;
    			  dateChoose = parseInt(dateChoose);
     
    			  console.log('dateChoose = ' + dateChoose);
     
    			  var somme = 0;
     
    			  var salesNumber = 0;
     
    			  for (var i = 0; i < items.length; ++i) {
     
    			      var item = items[i];
     
    			      var price = item.sellingStatus[0].convertedCurrentPrice[0].__value__;
     
    			      var endTime = item.listingInfo[0].endTime;
    			      let date = new Date(endTime);
    			      var day = date.getDate();
    			      var month = date.getMonth();
    			      date = '' + month + day;
    			      date = parseInt(date);
     
    			      console.log('date = ' + date);
     
    			      somme += price;
     
    			      salesNumber = i+1;
     
    			      var moyenne = somme/salesNumber;
     
    			      if(date < dateChoose){
     
     
    			      	salesNumber = i + 1;
     
    			      	moyenne = somme/salesNumber;
     
    			      	console.log("J\'ai été stoppé");
     
    			      	document.getElementById("stats").textContent = 'Nombre de vente : '+ salesNumber +' pour un prix moyen de ' + moyenne+ '€.';
     
    			      	break;
     
     
    			      } 
     
    			      document.getElementById('stats').textContent = 'Nombre de vente : '+ salesNumber +' pour un prix moyen de ' + moyenne+ '€.';
     
    			  }
    Merci d'avance

  7. #7
    Expert confirmé Avatar de psychadelic
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    2 529
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 2 529
    Points : 4 740
    Points
    4 740
    Par défaut
    normal, les valeurs sont en string.

    var price = item.sellingStatus[0].convertedCurrentPrice[0].__value__; = un string.

    le remplacer par :
    var price = parseFloat( item.sellingStatus[0].convertedCurrentPrice[0].__value__ ); .

    serait sans doute utile...
    «La pluralité des voix n'est pas une preuve, pour les vérités malaisées à découvrir, tant il est bien plus vraisemblable qu'un homme seul les ait rencontrées que tout un peuple.» [ René Descartes ] - Discours de la méthode

  8. #8
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 126
    Points : 55
    Points
    55
    Par défaut
    Ah mais oui évidemment !

    Merci beaucoup !

    Mon code fonctionne j'ai l'impression, il faut que je fasse d'autres tests mais je suis sur la bonne voie grâce à toi !

    Après il faudra que j'y intègre un appel à l'AWS amazon pour récupérer le prix de vente moyen !

    Merci encore et bon weekend !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 05/06/2009, 10h14
  2. lancer jboss a partir d'une api java
    Par d_hazem dans le forum Wildfly/JBoss
    Réponses: 7
    Dernier message: 04/02/2009, 18h08
  3. Réponses: 2
    Dernier message: 03/09/2008, 21h04
  4. [DTD] Cherche une API JAVA pour parser une DTD
    Par nice dans le forum Format d'échange (XML, JSON...)
    Réponses: 13
    Dernier message: 15/06/2006, 16h00
  5. Appeler une API sans liaison avec une DLL
    Par mat.M dans le forum x86 32-bits / 64-bits
    Réponses: 10
    Dernier message: 13/07/2004, 02h22

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