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

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    décembre 2004
    Messages
    281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : décembre 2004
    Messages : 281
    Points : 96
    Points
    96

    Par défaut Traiter un get recu d'une query de form multiple array

    Bonjour,

    J'ai en nodejs et Typescript un get de forme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [["exposant.raisonSociale","=","Alexandre"],"and",["etat","=","Terminé"]]
    Comment je peux traiter ? décomposer genre avoir un tabelau en découpant par ici "and" ?

    Merci

  2. #2
    Expert confirmé Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    juin 2010
    Messages
    2 551
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : juin 2010
    Messages : 2 551
    Points : 5 312
    Points
    5 312

    Par défaut

    Curieux format, je me demande à quel besoin c’est censé répondre.

    Ta question est un peu vague. Ton but est-il de transformer le tableau en une autre structure ? Ou de récupérer une info en particulier ? Ou de parcourir le tableau et d’appliquer un traitement en fonction des valeurs rencontrées ?

    Pour commencer, je partirais sur une boucle for..of avec une détection de type légère :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    for (let item of tableauRecu) {
      if ("and" === item) {
         ...
      }
      else if (item instanceof Array) {
        ...
      }
     
    }
    Ce "and" me laisse penser qu’il pourrait aussi y avoir des "or" (et pourquoi pas des "not"), ce qui pourrait amener à des situations ambigües où l’usage des parenthèses deviendrait une nécessité. Dans ce cas, le format serait une sorte de micro-langage, et il faudrait mettre en œuvre un interpréteur.

    Par curiosité, d’où provient ce tableau ?
    La FAQ JavaScript – Les cours JavaScript
    Un article du MDN n’a pas de version française ? Je peux peut-être le traduire, envoyez-moi un MP

    La touche F12 : l’outil indispensable à tout développeur JavaScript !

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    décembre 2004
    Messages
    281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : décembre 2004
    Messages : 281
    Points : 96
    Points
    96

    Par défaut

    Citation Envoyé par Watilin Voir le message
    Par curiosité, d’où provient ce tableau ?
    Cel viens en fait de l'outil DevExtreme exemple : https://js.devexpress.com/Demos/Widg...Angular/Light/

    quand je filtre il envoi les données en GET et l'url de GET émis est du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    &take=10&filter=[%22exposant.raisonSociale%22,%22=%22,%22Alexandre%22]
    C'est principalement pour les données en DataGrid gérer le filtre et retourner le résultat en donnant à Mysql (requête) les bon paramètres ...

    Merci

  4. #4
    Expert confirmé Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    juin 2010
    Messages
    2 551
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : juin 2010
    Messages : 2 551
    Points : 5 312
    Points
    5 312

    Par défaut

    D’accord.

    Du coup, quel est ton objectif ? De quelle façon veux-tu traiter ce tableau ?
    La FAQ JavaScript – Les cours JavaScript
    Un article du MDN n’a pas de version française ? Je peux peut-être le traduire, envoyez-moi un MP

    La touche F12 : l’outil indispensable à tout développeur JavaScript !

  5. #5
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    décembre 2004
    Messages
    281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : décembre 2004
    Messages : 281
    Points : 96
    Points
    96

    Par défaut

    Bonsoir,

    Je crois j'ai trouver une solution peut être :

    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
    filter = JSON.parse(filter);
     
                filter  = [...filter];
     
                const filterSplitFirst = filter.toString().split(',and,');
     
                filterSplitFirst.forEach(element => {
                    const filterSplitSecond = element.replace(/,/g, '').split('=');
     
                    const q = filterSplitSecond[0];
                    const operator = '=';
                    const search = filterSplitSecond[1];
     
                    query.andWhere(q + ' ' + operator + ' :search', { search });
                });
    Es-ce la bonne solution ?

  6. #6
    Expert confirmé Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    juin 2010
    Messages
    2 551
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : juin 2010
    Messages : 2 551
    Points : 5 312
    Points
    5 312

    Par défaut

    Citation Envoyé par Paul75 Voir le message
    Es-ce la bonne solution ?
    Pour être honnête, je trouve que les passages avec split manquent d’élégance. C’est peut-être plus court en lignes de code, mais d’un point de vue algorithmique, c’est plus complexe :
    • toString sérialise le tableau en chaîne ;
    • derrière, split convertit cette chaîne en un nouveau tableau,
    • pendant ce temps, le tableau original est toujours en mémoire car il y a toujours la variable filter qui pointe dessus.

    Donc cette façon de faire est gourmande à la fois en temps et en mémoire.

    Il est possible de tout faire en une seule boucle. Voici comment je ferais :

    Pour commencer, tu n’as pas besoin de ... car la structure est déjà un tableau. Tu peux itérer directement dessus avec une boucle for..of comme dans mon exemple, ou avec la méthode forEach comme tu as fait.

    Ensuite, ignore simplement les items "and" quand tu les rencontres dans ta boucle.

    Enfin, je n’utiliserais pas split donc les sous-tableaux garderaient leur forme, donc pas besoin de replace. Tu pourrais donc accéder directement à element[0] et element[2], en supposant que les infos se présentent toujours sous la forme [ "machin", "=", "truc" ].

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    JSON.parse(filter).forEach((element) => {
      if ("and" === element) return;
     
      const q = element[0];
      const operator = '=';
      const search = element[2];
     
      console.log(`q = ${q}`);
      console.log(`operator = ${operator}`);
      console.log(`search = ${search}`);
     
      query.andWhere(`${q} ${operator} :search`, { search });
    });
    La FAQ JavaScript – Les cours JavaScript
    Un article du MDN n’a pas de version française ? Je peux peut-être le traduire, envoyez-moi un MP

    La touche F12 : l’outil indispensable à tout développeur JavaScript !

  7. #7
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    décembre 2004
    Messages
    281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : décembre 2004
    Messages : 281
    Points : 96
    Points
    96

    Par défaut

    Bonsoir,

    Je comprend ta démarche sauf que avec ton code plus logique dans le code me dort pas du tout ce qu'il faut.

    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
    JSON.parse(filter).forEach((element) => {
                    console.log('element => ' + element);
     
                    if ('and' === element) { return; }
     
                    const q = element[0];
                    const operator = '=';
                    const search = element[2];
     
                    console.log(`q = ${q}`);
                    console.log(`operator = ${operator}`);
                    console.log(`search = ${search}`);
     
                    query.andWhere(`${q} ${operator} :search`, { search });
                });
    Ici le filter = ["exposant.raisonSociale","=","Alexandre"]

    cela me donne en sortie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    element => exposant.raisonSociale
    q = e
    operator = =
    search = p
    element => =
    q = =
    operator = =
    search = undefined
    element => Alexandre
    q = A
    operator = =
    search = e
    Si je fait ne variable pour afficher la valeur de JSON.parse(filter), j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    parsedFilter => exposant.raisonSociale,=,Alexandre
    Merci

  8. #8
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    décembre 2004
    Messages
    281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : décembre 2004
    Messages : 281
    Points : 96
    Points
    96

    Par défaut

    Bonjour,

    En fait non c'est plus compliqué : je peux aussi avoir au maximum ce cas la :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [[["exposant.raisonSociale","=","RAISON 2"],"or",["exposant.raisonSociale","=","EXP2"]],"and",[["etat","=","Affecté"],"or",["etat","=","En Cours"]]]

    Merci

  9. #9
    Expert confirmé Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    juin 2010
    Messages
    2 551
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : juin 2010
    Messages : 2 551
    Points : 5 312
    Points
    5 312

    Par défaut

    Je vois, c’est une structure récursive. Et à quoi devrait ressembler la requête finale avec ce filtre ?
    La FAQ JavaScript – Les cours JavaScript
    Un article du MDN n’a pas de version française ? Je peux peut-être le traduire, envoyez-moi un MP

    La touche F12 : l’outil indispensable à tout développeur JavaScript !

  10. #10
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    décembre 2004
    Messages
    281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : décembre 2004
    Messages : 281
    Points : 96
    Points
    96

    Par défaut

    Bonsoir,

    la requête doit être, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE (`exposant`.`raison_sociale`='Paul' OR `exposant`.`raison_sociale`='Alexandre') AND (`reservations`.`etat`='Nouveau' OR `reservations`.`etat`='Affecté')
    J'arrive a le faire quand je choisi ce format mais surement pas êcrit comme tu l'aurait fait, pas optimisé. Mais je galéré à le faire, je fait :
    Attention la valeur du filtre envoyé est comme cela maintenant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    exposant.raisonSociale,=,Paul Est Le Meilleur|and|etat,=,Affecté,or,etat,=,Nouveau
    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
    const filterSplitAnd = filter.toString().split('|and|');
     
                console.log('TAILLE TABLEAU => ' + filterSplitAnd.length);
     
                filterSplitAnd.forEach(elementAnd => {
                    query.andWhere(new Brackets(sqb => {
                        console.log('elementAnd => ' + elementAnd);
                        const filterSplitOr = elementAnd.toString().split(',or,');
     
                        filterSplitOr.forEach(elementOr => {
                            console.log('elementOr => ' + elementOr);
                            const elementEgal = elementOr.toString().split(',=,');
     
                            const q = elementEgal[0];
                            const operator = '=';
                            const search = elementEgal[1];
     
                            console.log('      q => ' + q);
                            console.log('      operator => ' + operator);
                            console.log('      search => ' + search);
     
                            let prefix = '';
     
                            if ( q.indexOf('.') === -1) {
                                prefix = 'reservations.';
                            }
                            sqb.orWhere(`${prefix}${q}${operator}'${search}'`);
                        });
                    }));
                });
    Merci

  11. #11
    Rédacteur/Modérateur
    Avatar de jreaux62
    Homme Profil pro
    Webdesigner
    Inscrit en
    août 2008
    Messages
    13 590
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : Arts - Culture

    Informations forums :
    Inscription : août 2008
    Messages : 13 590
    Points : 27 599
    Points
    27 599

    Par défaut

    Bonjour,

    Ta première formulation était finalement plus claire et "parlante" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [[["exposant.raisonSociale","=","RAISON 2"],"or",["exposant.raisonSociale","=","EXP2"]],"and",[["etat","=","Affecté"],"or",["etat","=","En Cours"]]]
    Les crochets symbolisant l'emplacement des parenthèses.
    Une fois indenté, c'est plus flagrant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    [
    	[
    		["exposant.raisonSociale","=","RAISON 2"],
    		"or",
    		["exposant.raisonSociale","=","EXP2"]
    	],
    	"and",
    	[
    		["etat","=","Affecté"],
    		"or",
    		["etat","=","En Cours"]
    	]
    ]
    On voit qu'à chaque niveau, on a un groupe de 3 éléments (elt[0],elt[1],elt[2]):
    • soit l'élément central (elt[1]) est "and" ou "or" -> on a une structure avec des parenthèses ( [arr1] and/or [arr2] )
    • soit l'élément central (elt[1]) est "=" ou "!=" ou (?) (autre chose que "and" ou "or") -> on concatène les 3

    J'ai le cerveau un peu mou en ce moment.
    Mais pour un spécialiste, ça ne devrait pas trop posé de problème.
    "Si tu suis le chemin qui s'appelle « plus tard », tu arriveras à la place qui s'appelle « jamais »."
    François Camille Prévot (1910-1996), instituteur puis Directeur d'école et... mon grand-père.
    "Pose ta question, tu seras idiot une seconde. Ne la pose pas, tu seras idiot toute ta vie."
    Albert Einstein (1879-1955).
    Mes tutos DVP
    Gestion-Affichage de Nouvelles
    Affichage en tableau HTML
    Fonctions de redimensionnement d'images

  12. #12
    Rédacteur/Modérateur
    Avatar de jreaux62
    Homme Profil pro
    Webdesigner
    Inscrit en
    août 2008
    Messages
    13 590
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : Arts - Culture

    Informations forums :
    Inscription : août 2008
    Messages : 13 590
    Points : 27 599
    Points
    27 599

    Par défaut

    Sans chercher midi à 14h.... avec quelques regex *
    ....et sans AUCUNE manipulation d'array compliquée ou récursive ou autre :

    Code JavaScript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    function get_filter_sqlwhere( filter )
    {
    	// 1- on convertit en chaine de caractères
    	var sqlwhere = JSON.stringify( filter );
     
    	// 2- on remplace les groupes, puis les caractères [ ] " et ,
    	sqlwhere = sqlwhere.replace(/\[\"([^\"\.]*)\",\"([^\"]*)\",\"([^\"]*)\"\]/gi, '`$1`$2\'$3\'' );
    	sqlwhere = sqlwhere.replace(/\[\"([^\"\.]*)(\.)([^\"\.]*)\",\"([^\"]*)\",\"([^\"]*)\"\]/gi, '`$1`$2`$3`$4\'$5\'' );
    	sqlwhere = sqlwhere.replace(/\[/gi,'(');
    	sqlwhere = sqlwhere.replace(/\]/gi,')');
    	sqlwhere = sqlwhere.replace(/\"/gi,' ');
    	sqlwhere = sqlwhere.replace(/,/gi,'');
     
    	return ' WHERE ' + sqlwhere;
    }

    Code JavaScript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    var filter = [[["exposant.raisonSociale","=","RAISON 2"],"or",["exposant.raisonSociale","=","EXP2"]],"and",[["etat","=","Affecté"],"or",["etat","=","En Cours"]]];
    console.log ( filter );
    console.log ( JSON.stringify( filter ) ); // converti en chaine
     
    var sqlWHERE = get_filter_sqlwhere( filter );
    console.log ( sqlWHERE );

    On obtient la chaine :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
     WHERE ((`exposant`.`raisonSociale`='RAISON 2' or `exposant`.`raisonSociale`='EXP2') and (`etat`='Affecté' or `etat`='En Cours'))

    Je me trompe, ou c'est ce qu'on veut obtenir ?


    * Je n'ai pas la maitrise suffisante en regex, du coup j'ai fait plusieurs passes (mais ça doit pouvoir s'optimiser).
    "Si tu suis le chemin qui s'appelle « plus tard », tu arriveras à la place qui s'appelle « jamais »."
    François Camille Prévot (1910-1996), instituteur puis Directeur d'école et... mon grand-père.
    "Pose ta question, tu seras idiot une seconde. Ne la pose pas, tu seras idiot toute ta vie."
    Albert Einstein (1879-1955).
    Mes tutos DVP
    Gestion-Affichage de Nouvelles
    Affichage en tableau HTML
    Fonctions de redimensionnement d'images

  13. #13
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    décembre 2004
    Messages
    281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : décembre 2004
    Messages : 281
    Points : 96
    Points
    96

    Par défaut

    Bonjour,

    Moi cela me sort comme string :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    exposant.raisonSociale=Paul Est Le Meilleurorexposant.raisonSociale=Alexandreandetat=Nouveauoretat=Affecté
    sans les ( )

    Merci

  14. #14
    Rédacteur/Modérateur
    Avatar de jreaux62
    Homme Profil pro
    Webdesigner
    Inscrit en
    août 2008
    Messages
    13 590
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : Arts - Culture

    Informations forums :
    Inscription : août 2008
    Messages : 13 590
    Points : 27 599
    Points
    27 599

    Par défaut

    1- J'ai mis à jour mon précédent message.

    2- ATTENTION : je pars de la structure de l'objet, tel que donné dans ton 1er message :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [[["exposant.raisonSociale","=","RAISON 2"],"or",["exposant.raisonSociale","=","EXP2"]],"and",[["etat","=","Affecté"],"or",["etat","=","En Cours"]]];
    Évidemment, ça ne fonctionne pas avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    exposant.raisonSociale,=,Paul Est Le Meilleur|and|etat,=,Affecté,or,etat,=,Nouveau
    "Si tu suis le chemin qui s'appelle « plus tard », tu arriveras à la place qui s'appelle « jamais »."
    François Camille Prévot (1910-1996), instituteur puis Directeur d'école et... mon grand-père.
    "Pose ta question, tu seras idiot une seconde. Ne la pose pas, tu seras idiot toute ta vie."
    Albert Einstein (1879-1955).
    Mes tutos DVP
    Gestion-Affichage de Nouvelles
    Affichage en tableau HTML
    Fonctions de redimensionnement d'images

  15. #15
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    décembre 2004
    Messages
    281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : décembre 2004
    Messages : 281
    Points : 96
    Points
    96

    Par défaut

    Bizarrement cela fait pareil ....
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sqlWHERE =>  exposant.raisonSociale=Paul Est Le Meilleurorexposant.raisonSociale=Alexandre

  16. #16
    Rédacteur/Modérateur
    Avatar de jreaux62
    Homme Profil pro
    Webdesigner
    Inscrit en
    août 2008
    Messages
    13 590
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : Arts - Culture

    Informations forums :
    Inscription : août 2008
    Messages : 13 590
    Points : 27 599
    Points
    27 599

    Par défaut

    Montre ton objet filter (PAS JSON.parse(filter) ! )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    console.log ( JSON.stringify( filter ) ); // converti en chaine
     
    var sqlWHERE = get_filter_sqlwhere( filter );
    console.log ( sqlWHERE );
    Montre un copier-coller de la console.
    "Si tu suis le chemin qui s'appelle « plus tard », tu arriveras à la place qui s'appelle « jamais »."
    François Camille Prévot (1910-1996), instituteur puis Directeur d'école et... mon grand-père.
    "Pose ta question, tu seras idiot une seconde. Ne la pose pas, tu seras idiot toute ta vie."
    Albert Einstein (1879-1955).
    Mes tutos DVP
    Gestion-Affichage de Nouvelles
    Affichage en tableau HTML
    Fonctions de redimensionnement d'images

  17. #17
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    décembre 2004
    Messages
    281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : décembre 2004
    Messages : 281
    Points : 96
    Points
    96

    Par défaut

    Bonjour,

    Le filter c'est si je le passe avec JSON.parse depuis Angular : j'ai :
    [[["exposant.raisonSociale","=","Paul Est Le Meilleur"],"or",["exposant.raisonSociale","=","Alexandre"]],"and",[["etat","=","Affecté"],"or",["etat","=","Nouveau"]]]

    Et le resultat de get_filter_sqlwhere :
    sqlWHERE => (((\ exposant.raisonSociale\ \ =\ \ Paul Est Le Meilleur\ )\ or\ (\ exposant.raisonSociale\ \ =\ \ Alexandre\ ))\ and\ ((\ etat\ \ =\ \ Affecté\ )\ or\ (\ etat\ \ =\ \ Nouveau\ )))

    Par contre si je passe pas depuis Anguar la chaine avec JSON mais juste le string filter, le filter est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    exposant.raisonSociale,=,Paul Est Le Meilleur,or,exposant.raisonSociale,=,Alexandre,and,etat,=,Nouveau,or,etat,=,Affecté
    Merci

  18. #18
    Rédacteur/Modérateur
    Avatar de jreaux62
    Homme Profil pro
    Webdesigner
    Inscrit en
    août 2008
    Messages
    13 590
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : Arts - Culture

    Informations forums :
    Inscription : août 2008
    Messages : 13 590
    Points : 27 599
    Points
    27 599

    Par défaut

    OK.
    C'est sous cette forme qu'il faut soumettre filter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [[["exposant.raisonSociale","=","Paul Est Le Meilleur"],"or",["exposant.raisonSociale","=","Alexandre"]],"and",[["etat","=","Affecté"],"or",["etat","=","Nouveau"]]]

    La fonction récursive est :
    Code JavaScript : 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
    function get_filter_sqlwhere_recursive( arr, add_where=true )
    {
    	var sqlAndOr = ['and','or'];
    	var sqlwhere = '(';
    	if( Array.isArray(arr) )
    	{
    		arr.forEach( function(elts, index) 
    		{
    			if( Array.isArray(elts) )
    			{
    				if( sqlAndOr.indexOf(elts[1])>-1 ) // and | or
    				{
    					sqlwhere += get_filter_sqlwhere_recursive( elts, false ); // récursivité
    				} else {
    					sqlwhere += elts[0].replace(/([^\. ]+)/gi,'`$1`') + elts[1] + '\''+elts[2]+'\'';
    				}
    			} else {
    					sqlwhere += ') '+elts.toUpperCase()+' ('; // AND | OR
    			}
    		});
    	}
    	sqlwhere += ')';
     
    	if( add_where ){ sqlwhere = ' WHERE '+sqlwhere; }
    	return sqlwhere;
    }

    Code JavaScript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    var filter = [[["exposant.raisonSociale","=","Paul Est Le Meilleur"],"or",["exposant.raisonSociale","=","Alexandre"]],"and",[["etat","=","Affecté"],"or",["etat","=","Nouveau"]]];
    //console.log ( filter );
     
    var sqlWHERE = get_filter_sqlwhere_recursive( filter );
    console.log ( 'sqlWHERE : '+ sqlWHERE );
    J'obtiens :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    sqlWHERE :  WHERE ((`exposant`.`raisonSociale`='Paul Est Le Meilleur') OR (`exposant`.`raisonSociale`='Alexandre')) AND ((`etat`='Affecté') OR (`etat`='Nouveau'))
    "Si tu suis le chemin qui s'appelle « plus tard », tu arriveras à la place qui s'appelle « jamais »."
    François Camille Prévot (1910-1996), instituteur puis Directeur d'école et... mon grand-père.
    "Pose ta question, tu seras idiot une seconde. Ne la pose pas, tu seras idiot toute ta vie."
    Albert Einstein (1879-1955).
    Mes tutos DVP
    Gestion-Affichage de Nouvelles
    Affichage en tableau HTML
    Fonctions de redimensionnement d'images

  19. #19
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    décembre 2004
    Messages
    281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : décembre 2004
    Messages : 281
    Points : 96
    Points
    96

    Par défaut

    Bonjour,

    etrange : j'ai bien cela en filter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [[["exposant.raisonSociale","=","Paul Est Le Meilleur"],"or",["exposant.raisonSociale","=","Alexandre"]],"and",[["etat","=","Nouveau"],"or",["etat","=","Affecté"]]]
    et j'ai le retour : sqlWHERE => WHERE ()

    Encore merci

  20. #20
    Rédacteur/Modérateur
    Avatar de jreaux62
    Homme Profil pro
    Webdesigner
    Inscrit en
    août 2008
    Messages
    13 590
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : Arts - Culture

    Informations forums :
    Inscription : août 2008
    Messages : 13 590
    Points : 27 599
    Points
    27 599

    Par défaut

    Bon....

    Peux-tu nous montrer ce que renvoie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    console.log ( typeof filter );
    Ca devrait être : object.

    Si c'est string, alors ce n'est pas bon.
    Il faut faire d'abord :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    filter = JSON.parse( filter );
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    var filter = [[["exposant.raisonSociale","=","Paul Est Le Meilleur"],"or",["exposant.raisonSociale","=","Alexandre"]],"and",[["etat","=","Affecté"],"or",["etat","=","Nouveau"]]];
    // PAS de '...' autour : c'est un objet (object)
    console.log ( 'filter : '+ filter );
    console.log ( typeof filter ); // object
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    var filter = '[[["exposant.raisonSociale","=","Paul Est Le Meilleur"],"or",["exposant.raisonSociale","=","Alexandre"]],"and",[["etat","=","Affecté"],"or",["etat","=","Nouveau"]]]'; 
    // REMARQUER les '...' autour : c'est une chaine (string)
    console.log ( 'filter : '+ filter );
    console.log ( typeof filter ); // string
     
    // on PARSE : on obtient un objet JSON
    filter = JSON.parse( filter );
    console.log ( 'filter : '+ filter );
    console.log ( typeof filter ); // object
    N.B. si avec ça, tu ne t'en sors pas,.... je suis a bout d'arguments...
    "Si tu suis le chemin qui s'appelle « plus tard », tu arriveras à la place qui s'appelle « jamais »."
    François Camille Prévot (1910-1996), instituteur puis Directeur d'école et... mon grand-père.
    "Pose ta question, tu seras idiot une seconde. Ne la pose pas, tu seras idiot toute ta vie."
    Albert Einstein (1879-1955).
    Mes tutos DVP
    Gestion-Affichage de Nouvelles
    Affichage en tableau HTML
    Fonctions de redimensionnement d'images

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 10
    Dernier message: 12/07/2006, 12h42
  2. [VB6]Traiter des enregistrements recuperer par une recherche
    Par tamerlan dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 27/03/2006, 12h06
  3. Ecrire le résultat d'une query dans un fichier txt
    Par jbaers dans le forum Bases de données
    Réponses: 2
    Dernier message: 11/11/2005, 02h49
  4. Problème avec RegEx et une Query string
    Par Erakis dans le forum Langage
    Réponses: 6
    Dernier message: 08/11/2005, 16h48
  5. [JDBC] SQL Exception lors d'une Query !
    Par Castagnems dans le forum JDBC
    Réponses: 5
    Dernier message: 30/04/2004, 13h00

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