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

SGBD Perl Discussion :

Unitialized value in concatenation


Sujet :

SGBD 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 Unitialized value in concatenation
    Bonjour,

    J'ai des erreurs que je n'arrive pas à corriger mais je pense qu'il n'y en a qu'une qui fait que ça bloque.

    Use of uninitialized value in concatenation (.) or string at ./test.pl line 205.
    Use of uninitialized value in concatenation (.) or string at ./test.pl line 206.
    Use of uninitialized value in addition (+) at ./test.pl line 236.
    Voici le code en rapport avec cette erreur :
    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
     
    my $succAttach = 0;
    my $unsuccAttach = 0;
    my $cc7a15 = 0;
    my $succPdp = 0;
    my $attPdp = 0;
    my $cc27a32 = 0;
    my $attServ = 0;
    my $unsuccServ = 0;
     
            for (my $j = 0 ; $j < scalar(@tableResEricsson) ; $j++)
            {
                    my $sAE = $dbh->prepare('SELECT SUM(valeur) as succattach FROM '.$tableResEricsson[$j].'_SGSN_'.$tableSem[$i].'_A2014 WHERE date_heure BETWEEN (\''.$tableLun[$i].'\' AND \''.$tableDim[$i].'\') AND ID_indicateur = '.$indicateursEricsson[$cpt].'') or print "erreur de prep SQL !!!!!!\n";
                    $res = $sAE->execute() or die "Could not execute SQL statement... maybe invalid ?";
                    my $succAtt; $cpt++;
                    while (my @succAtt = $sAE->fetchrow_array()) { $succAttach = $succAtt[0]; print("\n".$succAtt[0]."\n");} //ligne 205
                    print("SUCCATTACH ====> ".$succAttach); //ligne 206
     
     $succAttachEricsson += $succAttach; //ligne 236
    Si vous avez une idée de comment faire pour rémdier au problème je suis preneur... Mes requêtes sont justes (du moins en principe).

  2. #2
    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 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    Pour les lignes 206 et 236 c'est probablement parce que la variable $succAttach n'est pas définie.

    Et c'est sans doute dû au fait que l'élément $succAtt[0] du tableau @succAtt, sans doute parce que ta requête SQL te renvoie dans certains cas des valeurs vides.

    Les bouts de code fragmentaires que tu donnes ne permettent pas d'en dire beaucoup plus. La seule bonne manière d'éviter ce warning est de tester si les valeurs renvoyées sont définies (avec la fonction defined) et d'adapter ton code à cette situation quand ce n'est pas le cas. Un truc de ce genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if (defined $succAtt[0] ) {
        # ton code actuel
    } else {
        # code de gestion de ce cas particulier
    }

  3. #3
    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 d'abord merci pour ta réponse, elle m'a permit d'éclaicir le problème.

    L'erreur était dûe aux la requêtes :
    - SELECT ... WHERE (date_heure BETWEEN date1 AND date2)
    et non
    - SELECT ... WHERE date_heure BETWEEN (date1 AND date2)

    Un autre problème se pose. Chaque table correspond à un équipement et chaque équipement n'a pas été mis en prod en même temps ce qui fait que pour une semaine donnée certaines tables n'existent pas.

    Y'a t'il un moyen plus "simple" que de le faire cas par cas cad :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if ($semaine < 10 && $annee == 2014 && $nomEquip == equip1)
    {
           // valeurs = 0
    }
    J'espère avoir été assez clair ^^'

  4. #4
    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 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par ciols Voir le message
    J'espère avoir été assez clair ^^'
    Euh... pas vraiment...

    J'ai du mal à comprendre comment certaines tables n'existent pas pour une certaine semaine. Tu as des tables différentes pour chaque semaine? Ou tu veux dire qu'il n'y a pas d'enregistrement dans certaines tables pour une semaine donnée?

  5. #5
    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
    Alors pour faire simple. J'ai une table/équipement/semaine.

    J'ai besoin de calculer une valeur chaque semaine en prenant en compte toutes les tables de tous les équipements sur chaque semaine. Voici un exemple :

    J'ai des équipements (a,b,c) qui possèdent des tables depuis S01 jusqu'à S26 (semaine courante -1), d'autres (c,d) qui ont des tables de S10 -> S26, d'autres (e,f) encore de S01 -> 12...

    Du coup jusqu'à la semaine de S01 à S12 il me faut a, b, c, e ,f + S10 S11 S12 de c et d et ainsi de suite

  6. #6
    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 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    Il faut juste vérifier la présence d'enregistrement pour chaque semaine que tu traites, ou vérifier que la variable dans laquelle tu récupères les données est bien définie, avec le type de code que je t'ai déjà montré:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if (defined $succAtt[0] ) {
        # ton code actuel
    } else {
        # code de gestion de ce cas particulier
    }

  7. #7
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Un point de détail sur la lisibilité de ton code : tu écris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    my $sAE = $dbh->prepare('SELECT SUM(valeur) as succattach FROM '.$tableResEricsson[$j].'_SGSN_'.$tableSem[$i].'_A2014 WHERE date_heure BETWEEN (\''.$tableLun[$i].'\' AND \''.$tableDim[$i].'\') AND ID_indicateur = '.$indicateursEricsson[$cpt].'') or print "erreur de prep SQL !!!!!!\n";
    $res = $sAE->execute() or die "Could not execute SQL statement... maybe invalid ?";
    Ce code est très peu lisible, tu pourrais nettement améliorer les chose en écrivant plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    my $tableName = $tableResEricsson[$j] . '_SGSN_' . $tableSem[$i] . '_A2014';
    my $sAE = $dbh->prepare( "SELECT SUM(valeur) as succattach FROM $tableName WHERE (date_heure BETWEEN ? AND ?) AND ID_indicateur = ?" ) 
        or print "erreur de prep SQL !!!!!!\n";
    $res = $sAE->execute( $tableLun[$i], $tableDim[$i], $indicateursEricsson[$cpt] )
        or die "Could not execute SQL statement... maybe invalid ?";
    La requête est plus lisible, sa structure plus évidente (ce qui peut aider pour les erreurs de syntaxe SQL comme ici), les insertions de scalaires sont plus robustes (aucun risque d'injection, même si cela ne semble pas une préoccupation dans ton cas) et la gestion d'erreur est directement lisible plutôt que d'être cachée au bout d'une ligne trop longue (ce qui d'ailleurs amène à s'interroger sur l'intérêt de mettre un "or print" pour le prepare() alors qu'un échec fera forcément échouer le execute() et donc va mourir avec un message d'erreur à la mauvaise ligne).

    --
    Jedaï

  8. #8
    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
    Merci beaucoup pour ces différents conseils. Je vous tiens au courant de l'avancée.

    EDIT : J'ai une erreur qui concerne les tables qui n'existent pas en base.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    my $tabName = $tableResCisco[$j].'_SGSN_'.$tableSem[$i].'_A2014';
     
    		if (defined $tabName)
    		{
                              // execution normale
                    }
    J'ai pas mis de else parce que si la table n'existe pas on fait rien et on passe à l'équipement suivant.

    Cependant ça ne marche pas, le debug me dit juste que la table n'existe pas.

    Une idée ?

  9. #9
    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 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    Une fois que tu as fait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my $tabName = $tableResCisco[$j].'_SGSN_'.$tableSem[$i].'_A2014';
    la variable $tabName est définie dans le programme Perl.

    Ce qu'il faut faire, c'est vérifier si la table existe dans la base.

  10. #10
    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
    Pour vérifier que la table existe j'ai rentré toutes les tables dans un @ et j'utilise ce bout de code pour vérifier si chaque table est bien en base.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    my $tt = $tableResCisco[$j].'_SGSN_'.$tableSem[$i].'_A2014';
    		my $found = grep $_ eq $tt, @tablesData;
    		my $tabName;
     
    		if ($found)
    		{
    			$tabName = $tableResCisco[$j].'_SGSN_'.$tableSem[$i].'_A2014';	
    		}
    		else
    		{
    			print "La table n'est pas dans la base";
    		}
    J'ai fais les tests avec des prints etc ça marche nickel.

    Merci à vous deux pour votre aide !

    Bonne fin de journée

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

Discussions similaires

  1. Use of uninitialized value in concatenation (.) or string
    Par pontarose dans le forum Langage
    Réponses: 2
    Dernier message: 28/10/2011, 13h26
  2. Use of uninitialized value in concatenation
    Par dubis dans le forum Programmation et administration système
    Réponses: 11
    Dernier message: 26/10/2011, 18h13
  3. Une erreur de "uninitialized value in concatenation" que je ne comprends pas.
    Par venturic dans le forum Programmation et administration système
    Réponses: 8
    Dernier message: 28/01/2011, 15h49
  4. Use of uninitialized value in concatenation
    Par Jasmine80 dans le forum Langage
    Réponses: 3
    Dernier message: 23/06/2008, 13h19
  5. Réponses: 8
    Dernier message: 07/09/2007, 08h42

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