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 :

sqlite3-winrt js requête dans une boucle


Sujet :

JavaScript

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2014
    Messages : 15
    Points : 9
    Points
    9
    Par défaut sqlite3-winrt js requête dans une boucle
    Bonjour à tous,

    dans mon application je cherche à exécuter une requête dans une boucle comme ci:

    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
    function testbc(){
     
        allalim = document.getElementById('retour').value;
        var taille = allalim.length;
        var nb = 0;
     
        console.log('1 : debut testbc');
     
        var dbPath = Windows.Storage.ApplicationData.current.localFolder.path + '\\aliments.sqlite'
        SQLite3JS.openAsync(dbPath)
        .then(function (db) {
            while (nb < 1) {
                var alim = allalim.substring(0, (taille - 1));
                return db.eachAsync('SELECT Nom, ID, COUNT (*) as compteur FROM aliments WHERE Nom LIKE ?', [alim + '%'], function (row) {
                    var id = row.ID
                    var nom = row.Nom
                    nb = row.compteur
     
                    console.log('2 : id = ' + id + ' nom = ' + nom + ' et nb = ' + nb);
     
                    var retour = 'id = ' + id + ' nom = ' + nom + ' et nb = ' + nb;
     
                    console.log('3 : retour = ' + retour);
     
                    document.getElementById('retour').value = retour;
                    taille = taille - 1;
                })
            };
            //.then(function () {
            db.close()
            //})
        })
    }
    le but est de récupérer la chaîne qui se trouve dans le champ texte 'retour' et de trouver une correspondance dans ma bdd. Pour ça je regarde si la chaîne complète s'y trouve. Si ce n'est pas le cas, je retire le dernier caractère de la chaîne et je recommence. et ainsi de suite.

    Le problème est que dans tout les cas la boucle n'est exécutée qu'une fois. Même si nb = 0.

    Quelqu’un a-t-il une idée pour me sortir de cette impasse?
    Merci

    PS:

    Pour info...


    La console JavaScript est attachée et accepte des commandes.
    HTML1300: Une navigation s’est produite.
    Fichier*: default.html
    copy file: aliments
    1 : debut testbc
    SQLite3 version: 3.8.2 (2013-12-06 14:53:30 27392118af4c38c5203a04b8013e1afdb1cebd0d)
    2 : id = null nom = null et nb = 0
    3 : retour = id = null nom = null et nb = 0

  2. #2
    Expert éminent
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Points : 9 127
    Points
    9 127
    Par défaut
    il faut cherche dans la doc ou les forum consacré à winrt
    ce n'est pas propre à js mais à la lib que tu utilise

    A+JYT

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2014
    Messages : 15
    Points : 9
    Points
    9
    Par défaut
    Déjà fais mais aucune info à ce sujet

  4. #4
    Expert éminent
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Points : 9 127
    Points
    9 127
    Par défaut
    je ne sais pas comment fonctionne SQLite3JS mais si j'en crois les noms de méthode les appel sont asynchrone (eachAsync)
    je pense donc que ta boucle se termine avant que nb soit mis a jour.

    je procèderais comme suit

    soit f() une fonction qui fait l'appel à db.eachAsync
    le callback de cet appel vérifie le résultat de la requete.
    si le résultat est ok on s'arrête sinon on rappel la fonction f()

    quelque chose comme (écrit à vu de nez plus pour le principe)
    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
     
    function f() {
         var alim = allalim.substring(0, (taille - 1));
         var result = db.eachAsync('SELECT Nom, ID, COUNT (*) as compteur FROM aliments WHERE Nom LIKE ?', [alim + '%'], function (row) {
                    var id = row.ID
                    var nom = row.Nom
                    nb = row.compteur
     
                    console.log('2 : id = ' + id + ' nom = ' + nom + ' et nb = ' + nb);
     
                    var retour = 'id = ' + id + ' nom = ' + nom + ' et nb = ' + nb;
     
                    console.log('3 : retour = ' + retour);
     
                    document.getElementById('retour').value = retour;
                    taille = taille - 1;
                    //Si nb est inférieur à 1 on boucle.
                    if (nb < 1) {
                       f();
                    }
                })
        return result;
     }
    en fait on boucle par récursivité indirecte. f() appelle eachAsync qui appelera la callback

    A+JYT

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2014
    Messages : 15
    Points : 9
    Points
    9
    Par défaut
    Ok merci je vais essayer çà mais à quel moment tu ferme la db? dans la fonction où après la boucle?

    EDIT: où dois-je mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var dbPath = Windows.Storage.ApplicationData.current.localFolder.path + '\\aliments.sqlite'
            SQLite3JS.openAsync(dbPath)

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 132
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 132
    Points : 1 418
    Points
    1 418
    Par défaut
    Bonjour,

    Je viens de regarde cette discission et ai noté un point important dans le script initial en ligne 14.

    Même dans une boucle, dès lors que tu fais return ... tu sors de ta fonction (donc la boucle est interrompue).

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2014
    Messages : 15
    Points : 9
    Points
    9
    Par défaut
    Ha ha ça explique bien des choses. Mais alors comment puis-je faire étant donner que ce return est obligatoire car il fait partie de l'accès à la bdd?

Discussions similaires

  1. [MySQL] Deux requêtes dans une boucle
    Par stefanelle dans le forum PHP & Base de données
    Réponses: 10
    Dernier message: 25/02/2009, 10h41
  2. [MySQL] Résultat de requête dans une boucle
    Par pcboy dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 09/01/2009, 16h55
  3. Comment éviter des requêtes dans une boucle
    Par dam28800 dans le forum Langage
    Réponses: 43
    Dernier message: 04/12/2008, 16h53
  4. Requête dans une boucle.
    Par flamby6969 dans le forum VBA Access
    Réponses: 11
    Dernier message: 27/11/2007, 15h49
  5. Problème de requête dans une boucle avec ADOQuery
    Par Ekik dans le forum Bases de données
    Réponses: 8
    Dernier message: 14/05/2007, 16h07

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