Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1644 connectés 

 


 Mot :   Pseudo :  
 
 Page :   1  2  3  4  5  6  7
Auteur Sujet :

[Résolu] Export données en perl

n°2226714
clubber43
Posté le 30-04-2014 à 09:29:26  profilanswer
 

Reprise du message précédent :
Hello  :)  
 
Je retravaille (un peu) sur le script d'export et j'ameliiore encore un peu le travail . . .  
 
Je voudrais mettre en place l'archivage des données vers une BDD mysql dont je dispose de l'adresse IP, user et mot de passe.
Et-il possible de mettre en place la partie connexion et export vers BDD dans le script de départ? ou si je dois créer un autre script ?
 
Je posterais ce soir le bout de code de connexions pour voir si cela correspond bein à la logique.
 
Merci
 
@+

mood
Publicité
Posté le 30-04-2014 à 09:29:26  profilanswer
 

n°2226740
gilou
Modérateur
Modzilla
Posté le 30-04-2014 à 11:50:21  profilanswer
 

:hello:  
Pour causer à une BDD en Perl, on emploie le module DBI.
Et une des multiples docs sur l'emploi de DBI: http://oreilly.com/catalog/perldbi/chapter/ch04.html  
 
A+,


Message édité par gilou le 30-04-2014 à 11:50:38

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2226748
clubber43
Posté le 30-04-2014 à 12:41:27  profilanswer
 

En fait, j'ai trouvé un peu daide sur le dbi, mais je dois installer le module DBI sur le poste.
Ensuite, le but est de metre en place ce script dans un serveur pour le faire tourner en H24/24.
 
Le serveur doit du coup avoir un module PERL, DBI pour fonctionner ?  
 
Merci
 
 
@+

n°2226752
gilou
Modérateur
Modzilla
Posté le 30-04-2014 à 13:57:01  profilanswer
 

La machine sur laquelle tourne l’exécutable perl doit avoir accès au bons modules dans son environnement pour pouvoir les trouver lors de l’exécution d'un script.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2226753
clubber43
Posté le 30-04-2014 à 13:58:08  profilanswer
 

Ok, donc je dois mettre les mêmes modules de mon PC de developpement sur mon mini serveur.
 
Merci pour l'aide.
 
 
@+

n°2227148
clubber43
Posté le 05-05-2014 à 10:04:22  profilanswer
 

Salut Gilou,  
Après avoir pas mal étudier le cours sur le DBI, j'ai 2-3 qestions en suspens . . .  
 
D'abord, dans tous les scripts de connexions aux BDD, il est toujours marqué  

Code :
  1. "dbi:Oracle:

du coup, pour ma connexion à la base, je dois remplacer le code Oracle par MySQL ?  
 
Ensuite,  lors de mes connexions entre BDD et script, je dois :  
 
Ouvrir ma session sur le compteur,
Ouvrir une session BDD,  
"coller" les valeurs de mon export,  
fermer la connexion BDD,
fermer la session compteur.
 
si je suis la même logique que pour les precedents scripts?  
 
J'ai ce morceau de code qui compile, il me reste à le mettre en place dans le script que l'on a vu ensemble, et a le tester à temps réel.
 

Code :
  1. #!/usr/bin/perl
  2. use warnings;
  3. use strict;
  4. use DBI;      # Charge le module DBI
  5. # Paramètres de connection à la base de données
  6. my $bd  = 'Energie_STE';
  7. my $serveur = '127.0.0.0'; # @dresses IP
  8. my $identifiant = 'root';      # identifiant 
  9. my $motdepasse = 'admin';
  10. my $port = '3306';  #Port par défaut
  11. # Connection à la base de données mysql
  12. print "Connexion a la base de donnees $bd\n";
  13. my $dbh = DBI->connect( "DBI:mysql:database=$bd;host=$serveur;port=$port", 
  14.     $identifiant, $motdepasse, { 
  15. RaiseError => 1,
  16.     } 
  17. ) or die "Connection impossible a la base de donnees $bd !\n $! \n $@\n$DBI::errstr";


 

Code :
  1. # Insertion des données
  2. my $requete_sql_compteur = <<"SQL";
  3.   INSERT INTO rcompteur ( id_compteur, emplacement, batiment, niveau,adresse_IP)
  4.   VALUES ( X, X, X, X, X);
  5. SQL
  6. # Deconnection de la base de donnees
  7. $dbh->disconnect();


 
Merci  
 
@+

n°2227158
clubber43
Posté le 05-05-2014 à 11:32:13  profilanswer
 

Juste une question, dans le fichier adresses_ip.txt, de format :
192.168.1.1;
192.168.1.2;
192.168.1.3;
 
Si je rajoute une info de type :
192.168.1.1;exemple1;
192.168.1.2;exemple2;
192.168.1.3;exemple3;
 
Est-il possible de les lire la valeur de "exemple" dans une boucle différentes sachant que l'on lit déja la valeur de l'adresse IP dans la boucle suivante :
 

Code :
  1. sub make_servers_list ($)
  2. #sub qui retourne l'adresse IP du serveur a interroger
  3. {
  4.    my @servers;
  5. my @names;
  6.    my $fh;
  7.     if (open($fh, "<", shift))
  8. {
  9.       @servers = grep {s/^\s*(.*)\s*;\s*/$1/} <$fh>;
  10.       close $fh;
  11.    }
  12.   return @servers;
  13. }


 
Sans biensur modifier le reste du script de lecture des adresses IP.
 
En cherchant sur le net, j'ai trouvé des fonctions du type  

Code :
  1. push @{$tab['col1']}, $1;


mais rien n'aboutit comme je le souhaiterais :)
Si jamais il existe d'autre méthode ou d'autre fonction de lecture des valeurs.
 
merci  
 
@+


---------------
Merci
n°2227172
gilou
Modérateur
Modzilla
Posté le 05-05-2014 à 13:57:01  profilanswer
 

Non, la le code avec grep marchait parce que tu n'avais qu'une valeur par ligne, si tu change le format du fichier en entrée, il faut changer ton code de lecture de ces données et il faudra faire une vraie boucle de lecture ligne à ligne.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2227173
gilou
Modérateur
Modzilla
Posté le 05-05-2014 à 14:03:15  profilanswer
 

clubber43 a écrit :

Salut Gilou,
Après avoir pas mal étudier le cours sur le DBI, j'ai 2-3 qestions en suspens . . .

 

D'abord, dans tous les scripts de connexions aux BDD, il est toujours marqué

Code :
  1. "dbi:Oracle:

du coup, pour ma connexion à la base, je dois remplacer le code Oracle par MySQL ?

Ben pourquoi poser la question, puisque tu donnes la réponse dans la suite?
>> my $dbh = DBI->connect( "DBI:mysql:database=$bd;host=$serveur;port=$port", ...

 

La logique c'est:
Ouvrir ma session sur le compteur,
Récupérer les infos sur le compteur
Ouvrir une session BDD,  
"coller" les valeurs de mon export, ( ou un log d'erreur ?)
fermer la connexion BDD,
fermer la session compteur.

 

A+


Message édité par gilou le 05-05-2014 à 14:06:22

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2227177
clubber43
Posté le 05-05-2014 à 15:03:25  profilanswer
 


Oui, c'est vrai.
Je regarde tout ça et je reviens dans la soirée, j'ai bien avancé le script.
 
Merci quand même  :)  


---------------
Merci
mood
Publicité
Posté le 05-05-2014 à 15:03:25  profilanswer
 

n°2229046
clubber43
Posté le 26-05-2014 à 10:23:00  profilanswer
 

Hello :)  
 
J'ai retravaillé le script ce weekend pour la lecture des variables à exporter en plus (exemple1, exemple2, ...)
En créant un nouvelle boucle avec un nouveau fichier.
Du coup, je l'ai intégré au script maisj'ai un souci dans la boucle de sub_session.
Il ne me reconnait pas la variable $adress
 

Code :
  1. sub session ()
  2. # Sub session appelée dans le main
  3. # Il gere : requete + dialogue_reseau + lecture_données + décodage_donnée + affichage + export_csv
  4. # A appeler dans le fichier main du script
  5. {
  6.  #Chemin d'acces aux adresses des IP Serveur, à modifier au besoin
  7.  my @servers = make_servers_list('D:/adresses_ip.txt');
  8.  my @adress = make_adress_list('D:/nom_serveur.txt');
  9.  my %params = make_params_list();
  10.  foreach (@servers)
  11.  {
  12.   my $connection = start_connection($_);
  13.   next unless ($connection);
  14.   my %values = get_values($connection, %params);
  15.   # log_write(%values);
  16.   end_connection($connection);
  17.   #print Dumper(%values),"\n"; #impression en console des valeurs et des en tetes
  18.  #Chemin d'acces au fichier d'enregistrement, à modifier au besoin
  19.  open(my $fichier, ">>", 'D:/energie.csv' ) || die ('Impossible de créer le fichier "D:/energie.csv"' );
  20.   #boucle d'impression des valeurs dans le fichier
  21.   foreach (keys %values)
  22.    {
  23.    printf($fichier "%d;",$values{$_});
  24.    }
  25.   #boucle d'impression des valeurs TimeStamp et adresse IP en cours
  26.   printf($fichier "$time;" );
  27.   printf($fichier $_ );
  28.   printf($adress $_ );
  29.   # Saut de ligne à la fin de chaque boucle
  30.   printf($fichier "\n" );
  31.  close($fichier);
  32.  # Fermeture et sauvegarde fichier csv
  33.  ########################
  34.  undef $connection;
  35.  
  36.  }
  37. }


et definition de la fonction :  
 

Code :
  1. sub make_adress_list ($)
  2. #sub qui retourne lle nom du serveur a interroger
  3. {
  4.    my @adress;
  5.    my $fh2;
  6.     if (open($fh2, "<", shift))
  7. {
  8.       @adress = grep {s/^\s*(.*)\s*;\s*/$1/} <$fh2>;
  9.       close $fh2;
  10.    }
  11.   return @adress;
  12. }


 
Merci
 
@+


---------------
Merci
n°2229129
gilou
Modérateur
Modzilla
Posté le 26-05-2014 à 16:17:17  profilanswer
 

C'est ceci qui ne passe pas?  
printf($adress $_ );
Ben c'est normal puisqu'il n'est défini de variable $adress nulle part auparavant. Et j'en vois d'ailleurs pas trop l'intérêt puisque nulle part le code n'utilise une telle variable.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2229133
clubber43
Posté le 26-05-2014 à 16:30:33  profilanswer
 


     Oui, effectivement,  
Je croyais avoir initialisé ma variable avant de l'utiliser.
 
     En fait, le but est de lire un fichier et d'exporter la valeur de la variable en même temps que les valeur de puissance.
Du coup, je regardais pour lire dans un fichier txt et pour l'incorporer dans le fichier csv.
 
     Ensuite, pour la connexion à ma Bdd, je bute toujours sur l'installation du module DBI, je ne peux pas me connecter à la base CPAN.
peut-etre un souci de pare-feu ou de proxi  :( mais sa, c'est une autre histoire.
 
Merci
@+
 

n°2229135
gilou
Modérateur
Modzilla
Posté le 26-05-2014 à 16:54:31  profilanswer
 

> je ne peux pas me connecter à la base CPAN
avec le perl d'active state?
il suffit pourtant de lancer ppm
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2229199
clubber43
Posté le 27-05-2014 à 08:25:53  profilanswer
 

En passant par le cpan (avec la fenetre de commande) je suis bloqué au niveau du proxi je pense car impossible de telecharger.
Et du coup, je pensais refaire les reglages du proxi car le réseau doit bloquer le telechargement.
 
[cpp]
cpan[1]> install dbi
Catching error: "Proxy mus
.net' is not at C:\\Perl64
pm line 392, <IN> line 1.
        CPAN::shell() call
        App::Cpan::_proces
n.pm line 364
        App::Cpan::run('Ap
←[32mFetching with LWP:
http://ppm.activestate.com
←[32mLWP failed with code[
10060)]←[0m
←[31mWarning: no success d
t.gz.tmp4140'. Giving up o
←[32mFetching with LWP:
http://cpan.perl.org/autho
←[32mLWP failed with code[
]←[0m
←[31mWarning: no success d
t.gz.tmp4140'. Giving up o
←[31mWarning: no success d
t.gz.tmp4140'. Giving up o
←[32mNo external ftp comma
 
←[32mFetching with LWP:
http://ppm.activestate.com
←[32mLWP failed with code[
10060)]←[0m
←[31mWarning: no success d
t.gz.tmp4140'. Giving up o
←[32mFetching with LWP:
http://cpan.perl.org/autho
←[32mLWP failed with code[
]←[0m
←[31mWarning: no success d
t.gz.tmp4140'. Giving up o
←[31mWarning: no success d
t.gz.tmp4140'. Giving up o
←[32mNo external ftp comma
 
←[31mPlease check, if the
(http://ppm.activestate.co
urllist can be edited. E.g
 
←[31mCould not fetch autho
←[32mLockfile removed.←[0m
[fixed]
 
je suis sur un PC de developpement au taf.
 
Merci  
@+


Message édité par clubber43 le 27-05-2014 à 08:26:15
n°2229200
clubber43
Posté le 27-05-2014 à 09:03:11  profilanswer
 

Apres,  
Est il possible d installer le module DBI sans passer par internent ou en telechargeant un fichier et en le placant dans un repertoir PERL ?  
 
 
@+

n°2229214
gilou
Modérateur
Modzilla
Posté le 27-05-2014 à 12:29:34  profilanswer
 

Mais pourquoi passes tu par cpan et non par ppm?
> Est il possible d installer le module DBI sans passer par internent ou en telechargeant un fichier et en le placant dans un repertoir PERL ?  
Pas toujours (c'est souvent un ou plusieurs répertoires, et il faut tenir compte des dépendances, de la compatibilité des fichiers C compilés le cas échéant...)
A+,


Message édité par gilou le 27-05-2014 à 12:42:55

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2229217
clubber43
Posté le 27-05-2014 à 13:06:48  profilanswer
 

En passant par la cmd, lorsque je tape ppm, une fenetre s'ouvre et  
j'ai la fenetre ppm qui s'ouvre. Quand je faits une recherche de DBI, il y a un module d'installer, 1.623.
 
tous les champs apparaissent en jaune.
 
@+

n°2229230
clubber43
Posté le 27-05-2014 à 14:18:35  profilanswer
 

Question à 1.52€, mais utile,  
en C++, quand on créé des fichiers ou des sauvergarde;
 
On peut marquer dans le chemin soit :  

Code :
  1. D: /chemin/de/sauvegarde


Code :
  1. D:../sauvegarde


 
Pour enregistrer le fichier à un emplacement défini.
 
En perl, on peut faire la même chose, pour simplifier le portage du script d'un pc à un autre ?
 
@+

Message cité 1 fois
Message édité par clubber43 le 27-05-2014 à 14:19:02

---------------
Merci
n°2229238
gilou
Modérateur
Modzilla
Posté le 27-05-2014 à 14:50:17  profilanswer
 

clubber43 a écrit :

En passant par la cmd, lorsque je tape ppm, une fenetre s'ouvre et  
j'ai la fenetre ppm qui s'ouvre. Quand je faits une recherche de DBI, il y a un module d'installer, 1.623.
 
tous les champs apparaissent en jaune.
 
@+

Donc tu as bien DBI d'installé.
Si tu utilises MySQL, vérifies aussi que son module driver pour DBI est installé, c'est DBD::mysql
 
A+,
 


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2229239
gilou
Modérateur
Modzilla
Posté le 27-05-2014 à 14:53:05  profilanswer
 

clubber43 a écrit :

Question à 1.52€, mais utile,  
en C++, quand on créé des fichiers ou des sauvergarde;
 
On peut marquer dans le chemin soit :  

Code :
  1. D: /chemin/de/sauvegarde


Code :
  1. D:../sauvegarde


 
Pour enregistrer le fichier à un emplacement défini.
 
En perl, on peut faire la même chose, pour simplifier le portage du script d'un pc à un autre ?
 
@+

aucun des deux chemins que tu donnes en exemple n'est valable en C++
Par contre, 'D:/chemin/de/sauvegarde' et '../sauvegarde' ont des chances de marcher
 
A+,


Message édité par gilou le 27-05-2014 à 14:56:58

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2229266
clubber43
Posté le 27-05-2014 à 16:06:52  profilanswer
 

Là, par contre ça coince, pas de DBD::mysql  d'installé sur ppm.
Il est necessaire de le mettre pour faire mes requetes et export vers ma base mysql => logique que sa ne marche pas donc  ;)  
 
Mais pour l'installer, comment je fait, avec la commande cpan ou toujours avec ppm ?  
 
merci
@+


---------------
Merci
n°2229267
clubber43
Posté le 27-05-2014 à 16:07:48  profilanswer
 

Pour les chemins de sauvegarde, c'est OK.
J'ai bien regarde mes projets de cpp et j'ai compris comment faire;
 
Merci
@+


---------------
Merci
n°2229270
gilou
Modérateur
Modzilla
Posté le 27-05-2014 à 16:38:54  profilanswer
 

clubber43 a écrit :

Là, par contre ça coince, pas de DBD::mysql  d'installé sur ppm.
Il est necessaire de le mettre pour faire mes requetes et export vers ma base mysql => logique que sa ne marche pas donc  ;)  
 
Mais pour l'installer, comment je fait, avec la commande cpan ou toujours avec ppm ?  
 
merci
@+

toujours avec ppm
Il est dans la liste des modules dispo pour l'installation (en gris et non en jaune)
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2229316
clubber43
Posté le 28-05-2014 à 08:23:34  profilanswer
 

J'ai bien regarde sur le ppm, mais en bas de la page, il y a de marqué :
 
273 packages, 273 listed / 273 instaled 0 to install, 0 to remove.
 
Et pas de trace de DBD:: mysqldedans.
 
La version de ppm est 4.17
et ActivePerl version est 5.16.3.1603.
 
merci
@+


---------------
Merci
n°2229327
clubber43
Posté le 28-05-2014 à 09:45:05  profilanswer
 

J'ai enfin avancé sur le script et k'ai telecharge PerlEdit pour mes debuggage et compilation car j'ai un souci sur la compil
du script de connexion et d'export des données vers la bdd Sql.  
 
j'ai mis une partie du code en enlevant les connexions miodbus (elles sont OK) j'ai un souci au niveau de la boucle d'insertion des données
dans la bdd.
 
Faut il mettre des { } après les SQL ou non, car j'ai compilé plusieurs soultions et ien ne fonctionne, j'ai oujours l erreur des accolades de remontée dans
la liste des erreurs.
 
 

Code :
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use autodie;
  5. use IO::Socket;
  6. use IO::Select;
  7. use Errno qw(EINPROGRESS);
  8. use Data::Dumper;
  9. use DBI;
  10. ######################################## Ensemble des fonctions de connexion DBI-BDD######################################## Ensemble des fonctions d'export des valeurs
  11. sub start_connection_sql($) {
  12. print "Content-type: text/htmlnn";
  13. ## mysql user database name
  14. my $db ="energie_ste";
  15. ## mysql database user name
  16. my $user = "xxxxxxx";
  17. ## mysql database password
  18. my $pass = "xxxxxxx";
  19. ## user hostname : @ IP
  20. my $host="172.17.1.200";
  21. ## SQL query
  22. my $query = "show tables";
  23. my $dbh = DBI->connect("DBI:mysql:$db:$host", $user, $pass);
  24. my $sqlQuery  = $dbh->prepare($query) or die "Can't prepare $query: $dbh->errstrn";
  25. }
  26. ######################################## Ensemble des fonction de connexion MODBUS
  27. sub session ()
  28. # Sub session appelée dans le main
  29. # Il gere : requete + dialogue_reseau + lecture_données + décodage_donnée + affichage + export_csv
  30. # A appeler dans le fichier main du script
  31. {
  32.   start_connection_sql($_);
  33.   #Chemin d'acces aux adresses des IP Serveur, à modifier au besoin
  34.   my @servers = make_servers_list('D:/adresses_ip.txt');
  35.   my %params = make_params_list();
  36.   foreach (@servers)
  37.   {
  38.    my $connection = start_connection($_);
  39.    next unless ($connection);
  40.    my %values = get_values($connection, %params);
  41.    # log_write(%values);
  42.    end_connection($connection);
  43.    #print Dumper(%values),"n"; #impression en console des valeurs et des en tetes
  44.   #Chemin d'acces au fichier d'enregistrement, à modifier au besoin
  45.   open(my $fichier, ">>", 'D:/energie.csv' ) || die ('Impossible de créer le fichier "D:/energie.csv"' );
  46.  
  47.   #boucle d'impression des valeurs dans le fichier
  48.    foreach (keys %values)
  49.     {
  50.     # Insertion des données
  51.     #my $requete_sql_puissances = <<"SQL";
  52.     INSERT INTO puissance( id_compteur, puissance_p, puissance_q, puissance_s, dephasage)
  53.     VALUES ($values{$_});
  54.     SQL
  55.     {
  56.     INSERT INTO puissance(temps)
  57.     VALUES ("$time);
  58.     SQL
  59.     }
  60. }
  61.      
  62.  
  63.   close($fichier); 
  64.   # Fermeture et sauvegarde fichier csv
  65.   ########################
  66.   undef $connection;
  67.     }
  68. }
  69. $dbh->disconnect();
  70. # Fonction main
  71. session();
  72. #test de fin de connexion et d'ecriture fichier
  73. #print("n Fin script n" );
  74. #print("n Fin export n" );


 
Merci Gilou
@+


---------------
Merci
n°2229421
gilou
Modérateur
Modzilla
Posté le 28-05-2014 à 17:49:51  profilanswer
 

fonctions d'export des valeurs
sub start_connection_sql($) {
    print "Content-type: text/htmlnn";
    ## mysql user database name
    my $db ="energie_ste";
    ## mysql database user name
    my $user = "xxxxxxx";
    ## mysql database password
    my $pass = "xxxxxxx";
    ## user hostname : @ IP
    my $host="172.17.1.200";
    my $dbh;  
    $dbh = DBI->connect("DBI:mysql:$db:$host", $user, $pass) or die "Unable to connect: $DBI::errstr\n";
    return $dbh;
}
 
....
my $dbh = start_connection_sql($_);
 
et plus loin, ça devrait être un truc dans ce genre:
    my $query = "INSERT INTO puissance( id_compteur, puissance_p, puissance_q, puissance_s, dephasage) VALUES (";
    foreach (keys %values) {
        $query .= $values{$_}.", ";
    }
    chop; chop;   # pour virer le  ", " final;
    $query .= " )";
    my $sqlQuery  = $dbh->prepare($query) or die "Can't prepare $query: $dbh->errstrn";
    $sqlQuery->execute();
    $query = "INSERT INTO puissance(temps) VALUES (".$time." )";
    $sqlQuery  = $dbh->prepare($query) or die "Can't prepare $query: $dbh->errstrn";
    $sqlQuery->execute();
 
A+,


Message édité par gilou le 28-05-2014 à 17:53:13

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2229688
clubber43
Posté le 02-06-2014 à 08:10:22  profilanswer
 

Merci Gilou,  
Il me manque encore quelques automatismes pour le perl, mais je commence à comprendre le fonctionnalités
Et les variables @, $, . . .
 
Merci pour le coup de main, je teste sa ce matin.
 
@+
Merci

n°2229699
clubber43
Posté le 02-06-2014 à 10:39:10  profilanswer
 

Re-Hello :)
 
Après avoir essaye le code, j'ai ces erreurs qui apparaissent dans le compilateur (PerlEdit 1.09)
Juste une question, lors de la déclaration des $query, $sqlquery, ... est-ce obligatoire de mettre le my $query  ?
Parsque du coup, il ne me prend pas la déclaration. En mettant # devant les déclarations, tout compile.
 
[. . . ]
sub start_connection_sql($)  
{  
    print "Content-type: text/htmlnn";  
     
## mysql user database name  
    my $db ="***";  
     
## mysql database user name  
    my $user = "***";  
     
## mysql database password  
    my $pass = "***";  
     
## user hostname : @ IP  
    my $host="***";  
     
    my $dbh;  
     
 $dbh = DBI->connect("DBI:mysql:$db:$host", $user, $pass) or die "Unable to connect: $DBI::errstr\n";
    return $dbh;  
}  
 [ . . . ]  
 
 
sub session ()  
    {
   
  #Chemin d'acces aux adresses des IP Serveur, à modifier au besoin
  my @servers = make_servers_list('C:/adresses_ip.txt');  
  my %params = make_params_list();
 
 
  foreach (@servers)
 
  {
   my $connection = start_connection($_);
   my $connection_sql = start_connection_sql($_);
   next unless ($connection);
   my %values = get_values($connection, %params);
 
   # log_write(%values);
   end_connection($connection);
 
 
  foreach (@servers)
 
   {
   
   my $query = "INSERT INTO puissance( id_compteur, puissance_p, puissance_q, puissance_s, dephasage) VALUES (";
      foreach (keys %values)  
    {  
           $query .= $values{$_}.", ";  
       }  
 
     
    chop; chop;   # pour virer le  "," final; $query .= " )";  
 
 $sqlQuery  = $dbh->prepare($query) or die "Can't prepare $query: $dbh->errstrn";  <== Global symbol "$dbh" requieres explicit name
 $sqlQuery->execute();  <== Global symbol "$sqlquery" requieres explicit name
 
 $query = "INSERT INTO puissance(temps) VALUES (".$time." )"; <== Global symbol ".$time." " requieres explicit name
 
 
 $sqlQuery  = $dbh->prepare($query) or die "Can't prepare $query: $dbh->errstrn"; <== Global symbol "$dbh" requieres explicit name
 
 $sqlQuery->execute();  <== Global symbol "$sqlquery" requieres explicit name
   
 
   }
  }
    }
 
# Fonction main
session();
 
#test de fin de connexion et d'ecriture des valeurs
print("\n Fin d export \n" );
 
[/cpp]
 
 
@+
Merci


---------------
Merci
n°2229735
gilou
Modérateur
Modzilla
Posté le 02-06-2014 à 14:04:31  profilanswer
 

Si tu lis mon code, j'avais écrit
my $dbh = start_connection_sql($_);  
et toi tu as écrit a la place
my $connection_sql = start_connection_sql($_);  
normal qu'il y ait problème.
 
my ça déclare que la variable qu'on définit est locale a la procédure en cours. Ca évite tout un tas d'effets de bord imprévu et permet d'avoir du code propre sans variables globales a effet de bord.
Son emploi (de my) est rendu (volontairement) obligatoire par le "use strict;" en tête de programme.
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2229736
clubber43
Posté le 02-06-2014 à 14:06:56  profilanswer
 

A ok,  
Autant pour moi, j'ai mal recopier le script.
 
Pour le my, j'avais un doute dessus, mais j'ai compris.
 
Merci pour l explication Gilou :)
 
 
@+
Merci


---------------
Merci
n°2229741
clubber43
Posté le 02-06-2014 à 14:36:28  profilanswer
 

Donc, si en travaillant sans le

Code :
  1. use strict

,  
On s'expose à des dérives des variables non déclarées dans le script ?
Et a avoir des variables avec des valeurs bizard
 
Parcontre, dans la boucle de :
 j'ai l'erreur
 
Lorsque que je met en commentaire #use strict

Code :
  1. $query = "INSERT . . . . (".$time." )"; <== Name "main::time" used only once: possible typo


 
ou alors j'ai :
avec use strict sans commentaires

Code :
  1. $query = "INSERT . . . . (".$time." )"; <== Global symbol '$time" requires explicit package name


Je pense avoir fait une erreur dans la déclaration de .$time.  
Pourtant, j'export bien le bon champ et la bonne valeur lors de l'export en CSV.
 
 
@+
Merci
 
 
 
 


---------------
Merci
n°2229766
gilou
Modérateur
Modzilla
Posté le 02-06-2014 à 16:11:35  profilanswer
 

Ben tu la définis ou ta variable $time?
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2229768
clubber43
Posté le 02-06-2014 à 16:26:33  profilanswer
 

J'ai bien mis la declaration au-dessus de la boucle, car avant j'appelais la fonction avant ma declaration de fonction.
 
Voila la fin de programme.
 

Code :
  1. . . .
  2. # création de la variable timestamp pour les horodatages :
  3. my ($sec, $min, $heure, $jour, $mois,$annee, undef, undef, undef) = localtime();
  4. {
  5. $mois += 1 and $annee += 1900;
  6. $jour = sprintf("%0d",$jour);
  7. $mois = sprintf("%0d",$mois);
  8. my $time = "$annee-$mois-$jour $heure";
  9. #print $time,"n";
  10. }
  11. sub session ()
  12.     {
  13.  #Chemin d'acces aux adresses des IP Serveur, à modifier au besoin
  14.  my @servers = make_servers_list('C:/adresses_ip.txt');
  15.  my %params = make_params_list();
  16.  foreach (@servers)
  17.  {
  18.   my $connection = start_connection($_);
  19.   my $dbh = start_connection_sql($_);
  20.   next unless ($connection);
  21.   my %values = get_values($connection, %params);
  22.   # log_write(%values);
  23.   end_connection($connection);
  24.  foreach (@servers)
  25.   {
  26.   my $query = "INSERT INTO puissance( ID_Compteur, Puissance_P, Puissance_Q, Puissance_S, Dephasage) VALUES (";
  27.      foreach (keys %values)
  28.    {
  29.           $query .= $values{$_}.", ";
  30.       }
  31.    
  32.     chop; chop;   # pour virer le  "," final; $query .= " )";
  33. $sqlQuery  = $dbh->prepare($query) or die "Can't prepare $query: $dbh->errstrn";
  34. $sqlQuery->execute();
  35. $query = "INSERT INTO puissance(Date VALUES (".$time." )";
  36. $sqlQuery  = $dbh->prepare($query) or die "Can't prepare $query: $dbh->errstrn";
  37. $sqlQuery->execute();
  38.   }
  39.  }
  40.     }
  41. # Fonction main
  42. print("n ouverture session n";);
  43. session();
  44. #test de fin de connexion et d'ecriture des valeurs
  45. print("n Fin session n";);


Merci
@+


Message édité par clubber43 le 02-06-2014 à 16:27:10

---------------
Merci
n°2229775
gilou
Modérateur
Modzilla
Posté le 02-06-2014 à 17:41:19  profilanswer
 

Donc $time est local au bloc
{
$mois += 1 and $annee += 1900;
$jour = sprintf("%0d",$jour);
$mois = sprintf("%0d",$mois);
my $time = "$annee-$mois-$jour $heure";
#print $time,"n";
}
et n'est pas connu en dehors
 
Pour le voir en dehors, utiliser une routine qui retourne sa valeur ou autre.
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2229838
clubber43
Posté le 03-06-2014 à 08:35:54  profilanswer
 

Salut Gilou,  
J'ai refais le script pour la subroutine de time :
 
# création de la variable timestamp pour les horodatages :
 

Code :
  1. sub get_time()
  2. {my ($sec, $min, $heure, $jour, $mois,$annee, undef, undef, undef) = localtime();
  3. $mois += 1 and $annee += 1900;
  4. $jour = sprintf("%0d",$jour);
  5. $mois = sprintf("%0d",$mois);
  6. my $time = "$annee-$mois-$jour $heure";
  7. return ($time);
  8. }


 
Que j'appelle dans session() avec  
 

Code :
  1. sub session ()
  2.     {
  3.  . . .
  4.  my $time = get_time();
  5.                            . . .
  6.                            $query = "INSERT INTO puissance(Date VALUES (".$time.")";
  7.                           Par contre, j'ai juste un doute sur l'export de la variable time. Est-ce que cela va fonctionner ?
  8.     }


 
 
Merci
@+


---------------
Merci
n°2229842
clubber43
Posté le 03-06-2014 à 09:06:49  profilanswer
 

C'est bon, l'erreur est trouvée, et le script compile.
 
Lors du lancement du script par contre, j'ai des ereurs qui apparaissent.
 

Code :
  1. Content-type: text/htmlnnDBD::mysql::st execute failed: You have an error in you r SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1 at F:/export_data_sql_V3.pl line 304.


 

Code :
  1. DBD::mysql::st execute failed: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'VALUES (2014-6-3-8-41 )' at line 1 at F:/export_data_sql_V3.pl line 310.


 
Je commence à regarder d'ou cela peut provenir.
 
Merci Gilou
@+
 


---------------
Merci
n°2229856
gilou
Modérateur
Modzilla
Posté le 03-06-2014 à 12:08:04  profilanswer
 

Dans ton script, imprime la valeur de $query avant de la filer à $dbh->prepare adin d'avoir le contenu complet de la string de query afin de débugger le SQL.
EDIT: c'est clair a lire le message: tu passes a VALUES une chaine, 2014-6-3-8-41, sans quotes autour.
$query = "INSERT INTO puissance(Date VALUES ('".$time."')";
ça devrait le faire, non?
A+,


Message édité par gilou le 03-06-2014 à 12:21:33

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2229860
clubber43
Posté le 03-06-2014 à 13:27:12  profilanswer
 

OK,  
Pour les quotes, je vois le truc.
J'ai mis un print pour chaque $query et mis en commentaire els lignes prepare,  execute . . .  
 
Et j'obtient cela.
Il memanque juste une info et je pense que cela doit faire bugger la requete, car on exporte que 4 valeurs pour les 5 champs de la bdd :
 Il me manque l'info de ID_Compteur qui est l'adresse IP du serveur interrogé, qui est contenu dans le parametre de connexion modbus.
 
On l'avait mis à partir de

Code :
  1. printf($fichier $_ );

dans le script precedent qui exportait vers le CSV.
 
 

Code :
  1. ##### ouverture session #####
  2. Content-type: text/htmlnn
  3. INSERT INTO Puissance( ID_Compteur, Puissance_P, Puissa
  4. nce_Q, Puissance_S, Dephasage) VALUES (104396930, 113147420, 959, 28353140,  )IN
  5. SERT INTO Puissance(Date VALUES ('13:20/3/6/2014'))
  6. INSERT INTO Puissance( ID_Com
  7. pteur, Puissance_P, Puissance_Q, Puissance_S, Dephasage) VALUES (104396930, 1131
  8. 47420, 959, 28353140,  )INSERT INTO Puissance(Date VALUES ('13:20/3/6/2014'))
  9. INSERT INTO Puissance( ID_Compteur, Puissance_P, Puissance_Q, Puissance_S, Dephasag
  10. e) VALUES (104396930, 113147420, 959, 28353140,  )INSERT INTO Puissance(Date VAL
  11. UES ('13:20/3/6/2014'))
  12. Content-type: text/htmlnnContent-type: text/htmlnn
  13. ##### Fin session #####
  14. Press Enter to continue


 
Du coup, je vais y rajouter la valeur de l'adresse IP du serveur interrogé et sa marchera un peu plus ^^
 
Merci
@+


---------------
Merci
n°2229874
clubber43
Posté le 03-06-2014 à 15:18:02  profilanswer
 

Je viens de voir que al valeur de dephasage n'est pas a sa place dans la $query.
Cela ne me derange pas, j'ai fais la modif sur le script
 
Parcontre, je ne vois pas pourquoi, mes exports vers la bdd ne marche pas, si les requetes son bonnes ?  
Vu que les valeurs de ma $query sont bien les bonnes aussi.
 
Merci
@+


Message édité par clubber43 le 03-06-2014 à 16:15:21

---------------
Merci
n°2229903
gilou
Modérateur
Modzilla
Posté le 03-06-2014 à 17:49:56  profilanswer
 

Il faut que tu regardes les codes de retour de ton appel a $sqlQuery->execute
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
mood
Publicité
Posté le   profilanswer
 

 Page :   1  2  3  4  5  6  7

Aller à :
Ajouter une réponse
 

Sujets relatifs
Copier données en ligne par colonneComment génerer un fichier csv à partir d'une base de données?
perl + xml[Perl] Créer un graph RRD avec RRDTool::OO
[Résolu][Perl] XML::DOM Comment avoir une belle indentation?Programmation Java lecture base de données
[VBA-Excel] Comment appeler un fichier pour récupérer des données ?extraction de donnees
Récupération données d'un site PHPRécupérer des données d'un fichier xml
Plus de sujets relatifs à : [Résolu] Export données en perl


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR