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

Langage Perl Discussion :

Passer à l'itération suivante si valeur null


Sujet :

Langage Perl

  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    326
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2013
    Messages : 326
    Points : 156
    Points
    156
    Par défaut Passer à l'itération suivante si valeur null
    Bonjour bonjour,

    Mon problème est le suivant, j'effectue des requêtes sur des indicateurs qui sont sur des équipements.
    Si la requête du premier indicateur d'un équipement me renvoi "" je passe alors à l'itération suivante.

    Voici le code est espérant être assez clair.

    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
    EXTERNE: for (my $i = 0 ; $i < scalar(@tableDate) ; $i++) {
    	$sql = 'SELECT SUM(valeur) AS succattach FROM '.$tableDate[$i].' WHERE date_heure BETWEEN \''.$lundi.'\' AND \''.$dimanche.'\' AND ID_indicateur = '.$indicateursE[$j].'';
    	my $reqSA = $dbh->prepare($sql);
    	$reqSA->execute(); $j++;
    	while (@val = $reqSA->fetchrow_array())	{
                    if(defined $val[0]){
    		        print "\nle champs existe\n";
    		        if ($val[0] eq ''){
    			print "\nle champs est vide\n";
    		        }
    		        else {
    			       print "\nle champs n'est pas vide\n";
    		        }
    	        }
    	        else{
    		      print "\nle champs n'existe pas\n";
    		      next EXTERNE;
    	        }
    	        $succAttach = $val[0]; 
            }
    Dans le cas classique on doit avoir quelque chose dans ce genre :

    le champs existe

    le champs n'est pas vide
    Dans le cas où la valeur de la requête = ""
    On doit avoir ça

    le champs n'existe pas

    le champs n'existe pas

    le champs n'existe pas
    Et on doit passer à la l'itération suivante.

    Sauf que ça ne passe pas à l'itération suivante...

    Pour info :
    Dans ma base, la requête me renvoi null
    $val[0] me renvoi "" (vide, sans les doubles quotes)

    Une idée ?

    Merci d'avance

  2. #2
    Membre chevronné Avatar de dmganges
    Homme Profil pro
    Retraité. Ne recherche pas un emploi.
    Inscrit en
    Septembre 2011
    Messages
    1 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Retraité. Ne recherche pas un emploi.
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2011
    Messages : 1 392
    Points : 2 044
    Points
    2 044
    Par défaut
    Bonjour,

    L'étiquette est-elle vraiment nécessaire ?

    As-tu essayé :
    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
    for (my $i = 0 ; $i < scalar(@tableDate) ; $i++) {
    	$sql = 'SELECT SUM(valeur) AS succattach FROM '.$tableDate[$i].' WHERE date_heure BETWEEN \''.$lundi.'\' AND \''.$dimanche.'\' AND ID_indicateur = '.$indicateursE[$j].'';
    	my $reqSA = $dbh->prepare($sql);
    	$reqSA->execute(); $j++;
    	while (@val = $reqSA->fetchrow_array())	{
    		if(defined $val[0]){
    			print "\nle champs existe\n";
    			if ($val[0] eq ''){
    				print "\nle champs est vide\n";
    			}
    			else {
    				print "\nle champs n'est pas vide\n";
    			}
    		}
    		else{
    			print "\nle champs n'existe pas\n";
    			next;
    		}
    		$succAttach = $val[0]; 
    	}
    }
    Mais il est vrai que cela ne change rien à la logique...
    Et ce que tu colles devrait fonctionner de la même façon !

    [EDIT 17:23]
    J'ai rencontré des pb avec les étiquettes... je ne me souviens plus...
    Essaie aussi :
    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
     
    EXTERNE:
    for (my $i = 0 ; $i < scalar(@tableDate) ; $i++) {
    	$sql = 'SELECT SUM(valeur) AS succattach FROM '.$tableDate[$i].' WHERE date_heure BETWEEN \''.$lundi.'\' AND \''.$dimanche.'\' AND ID_indicateur = '.$indicateursE[$j].'';
    	my $reqSA = $dbh->prepare($sql);
    	$reqSA->execute(); $j++;
    	while (@val = $reqSA->fetchrow_array())	{
    		if(defined $val[0]){
    			print "\nle champs existe\n";
    			if ($val[0] eq ''){
    				print "\nle champs est vide\n";
    			}
    			else {
    				print "\nle champs n'est pas vide\n";
    			}
    		}
    		else{
    			print "\nle champs n'existe pas\n";
    			next EXTERNE;
    		}
    		$succAttach = $val[0]; 
    	}
    }

  3. #3
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    A première vue, si, avec ou sans étiquette, ça change le fonctionnement du programme.

    Sans étiquette, le next fait passer l'exécution à l'itération suivante de la boucle while, alors qu'avec l'étiquette EXTERNE, on passe à l'itération suivante de la boucle for. Sauf bien sûr si la présence d'un champ $val[0] non défini indique la fin des résultats de la requête SQL, auquel cas, ça revient sans doute au même.

    Reste à savoir ce qui est recherché. J'imaginerais que l'on voudrait dans le cas de figure passer à l'itération suivante de la boucle while. Mais ça, c'est à Ciols de la dire.

    @Ciols: pourrais-tu donner un exemple des résultats retournés par le requête SQL?

  4. #4
    Membre chevronné Avatar de dmganges
    Homme Profil pro
    Retraité. Ne recherche pas un emploi.
    Inscrit en
    Septembre 2011
    Messages
    1 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Retraité. Ne recherche pas un emploi.
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2011
    Messages : 1 392
    Points : 2 044
    Points
    2 044
    Par défaut
    Citation Envoyé par Lolo78
    Sans étiquette, le next fait passer l'exécution à l'itération suivante de la boucle while, alors qu'avec l'étiquette EXTERNE, on passe à l'itération suivante de la boucle for.
    OUI ! Je me suis complètement planté

    [Edit 19:25] Suppression d'une question et d'une proposition idiote

  5. #5
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Deux remarques sur l'exemple de code fournit :
    - on peut se passer de l'indice $i en bouclant directement sur la table @tableDate :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    foreach my $date (@tableDate) {
      ...
    }
    - on peut se passer de l'étiquette et du next en modifiant la condition du while :
    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
    foreach my $date (@tableDate) {
      $sql = 'SELECT SUM(valeur) AS succattach FROM '.$tableDate[$i].' WHERE date_heure BETWEEN \''.$lundi.'\' AND \''.$dimanche.'\' AND ID_indicateur = '.$indicateursE[$j].'';
      my $reqSA = $dbh->prepare($sql);
      $reqSA->execute();
      $j++;
      while (@val = $reqSA->fetchrow_array() and defined $val[0]) { # ATTENTION, utiliser "and" et pas "&&" ou bien ajouter des parenthèses
        print "\nle champs existe\n";
        if ($val[0] eq ''){
          print "\nle champs est vide\n";
        }
        else {
          print "\nle champs n'est pas vide\n";
        }
        $succAttach = $val[0];
      }
    }
    Attention à bien utiliser l'opérateur "and" et pas "&&", ou bien à mettre des parenthèses autour de l'affectation afin de modifier l'ordre des opérations.
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  6. #6
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    326
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2013
    Messages : 326
    Points : 156
    Points
    156
    Par défaut
    Me voilà de retour ! Tout d'abord merci pour vos réponses plus complètes les unes que les autres !

    Je vais analyser et tester ce que vous m'avez fourni et je vous tiens au courant des résultats !

    @LoLo78 : Un résultat de la requête ? L'affichage de celle-ci ? Ou alors le résultat qu'elle renvoie ? Si c'est le résultat, la forme qu'il est sensé avoir est du type int : 549730 par exemple.

  7. #7
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    326
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2013
    Messages : 326
    Points : 156
    Points
    156
    Par défaut
    Tout marche nickel !

    Merci beaucoup !

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

Discussions similaires

  1. Passer à l'itération suivante
    Par radouane_bne dans le forum MATLAB
    Réponses: 5
    Dernier message: 06/04/2013, 05h59
  2. Passer à l'itération suivante d'une boucle for
    Par kariboubou dans le forum MATLAB
    Réponses: 2
    Dernier message: 12/05/2011, 14h23
  3. Réponses: 1
    Dernier message: 30/01/2008, 19h41
  4. Arret des itérations suivant une valeur arbitraire
    Par laroche1 dans le forum MATLAB
    Réponses: 10
    Dernier message: 21/12/2007, 11h05
  5. Passer une valeur Null dans un argument de procédure
    Par preempalver dans le forum VBA Access
    Réponses: 5
    Dernier message: 30/12/2003, 20h52

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