Envoi données vers base mysql - VB/VBA/VBS - Programmation
Marsh Posté le 07-01-2015 à 15:01:05
On va passer sur l'aspect "architecture bancale" quand je lis "Je voudrai le faire avec une macro et ainsi rendre l'ajout de données dans ma base plus simple pour n'importe qui. "
2 solutions :
1) lien ODBC + macro excel : Tu mets en place un lien ODBC sur ta BD Mysql, lien exploité par ta macro qui se chargera de prendre les données de ton tableau excel, les "formater" puis faire les requêtes sql pour les insérer dans Mysql.
2) Mysql étant utilisable en ligne de commande + macro : ta macro génère un fichier csv à partir de ton fichier excel puis lance en ligne de commande l'import dans la BD du ficheir csv :
http://www.mysqltutorial.org/impor [...] sql-table/
Mais dans les 2 cas, tu vas avoir des pbs pour maintenir l'intégrité de ta BD : je pense au contrôle des doublons, de trouver les clés étrangères par rapport aux données fournies... Bref, Excel n'est vraiment pas fait pour servir d'interface de saisie de données à mettre en BD. Pour ça, on fait une appli (souvent, une appli web, de nos jours)
Edit :tu peux mixer aussi la solution du lien ODBC et de l'import du fichier CSV via une requête sql
Marsh Posté le 07-01-2015 à 15:28:06
Merci Rufo pour ton aide,
En fait, la solution optimale en utilisant vb/sql,
serai de :
- Macro qui formate le fichier xlsm en csv avec séparateur ,
- Macro qui connecte la BD
- Macro qui envoie les datas sur la BD
- Macro de deconnection.
Sachant que mon Id sur la BD est auto incrémental, le risque est encore présent ?
Merci pour ton aide,
@+
Marsh Posté le 07-01-2015 à 17:40:03
Oui, enfin, pas la peine de faire 4 macros : une seule suffit pour enchaîner les 4 actions
Le pb n'est pas l'unicité des ID mais le fait que pour 2 ID différents, tu puisses trouver 2 fois la même ligne. Il est là ton pb.
Rappel : une BD, c'est pas une table qui contient ce que contenait un fichier excel avec les fonctions de requêtage C'est une bien meilleure structuration des données avec non duplication (cf la forme 3NF de Codd)
Marsh Posté le 08-01-2015 à 18:21:54
Oui, biensur, pas 4 macros, c'est juste pour mon algo
Pour les lignes, aucun souci d'avoir deux valeurs égales, car il arrive, dans ma BD, qu'il y ai deja des valeurs semblables...
Mon script traite les valeurs semblables comme des valeurs erronnées et les ignorent.
Du coup, je peux faire onfiance à cette manip ?
Merci
@+
Marsh Posté le 09-01-2015 à 09:37:59
Non. Ta BD a combien de tables ?
Marsh Posté le 09-01-2015 à 14:22:09
J'ai 1 BD avec 1 table de 6 élements.
Marsh Posté le 09-01-2015 à 15:02:43
C'est bien ce que j'imaginais : t'as simplement "recopié" la structure de ton fichier Excel dans Mysql et t'as appelé ça "faire une base de données"
Marsh Posté le 09-01-2015 à 15:11:36
En fait, j'ai une table avec tous les identifiants, id, date de mise en place, ...
Elle n'est pas utilisé pour mon calcul et sert "juste" de base technique
Ensuite, j'ai ma base data, où je stocke toutes mes datas de mesures (conso edf)
de deux façons differentes :
- manuelle (le script que je fais)
- automatique script perl à fréquence reguliere.
La base s'incrémente toute seule tous les jours, mais une à deux fois par an, je vais y rajouter environ 250 lignes
c'est pour cela que je voulais automatiser cela
Merci
Marsh Posté le 09-01-2015 à 15:30:56
Je comprends, mais tu n'utilises pas Mysql comme un BD relationnelle. Là, tu t'en sers juste comme système de stockage centralisé avec des possibilités de requêtes SQL. Mais tu peux avoir les mêmes fonctions en mettant ton fichier excel sur un serveur et utiliser les fonction de requêtage SQL sur Excel, via un connecteur ODBC. Par ailleurs, il existe des outils qui permettent de faire du SQL sur un fichier CSV.
Conclusion : à moins que tu fasses une vraie BD relationnelle, Mysql te sert à rien si t'as qu'une table dans ta BD et que t'importe "à plat" ton fichier excel".
Si ce que je te raconte est du chinois, lit cet article :
http://fr.wikipedia.org/wiki/Forme [...] me_normale
Vers la fin, t'as un exemple qui illustre les formes NF. Tu comprendras ce que signifie une BD relationnelle (Mysql est un SGBDR ).
Marsh Posté le 09-01-2015 à 15:35:57
Ok rufo, je regarde tout cela ce weekend et je reviens lundi si jamais j'ai mieux avancé
Merci pour ton aide, et bon week
Marsh Posté le 09-01-2015 à 15:48:05
Autre possibilité, passer par un serveur web
Code :
|
et envoyer tes données vers MySQL à partir de ton serveur web et des variables POST reçues.
Marsh Posté le 09-01-2015 à 17:31:45
Certes, mais ça suppose mettre en place un serveur web. Ca complique l'architecture Est-ce bien nécessaire alors qu'il y a d'autres solutions qu'il peut mettre en oeuvre avec ce qui est déjà en place.
Marsh Posté le 10-01-2015 à 00:19:30
C'est sur
Mais s'il veut garder une communication VBA vers MySQL, la communication directe par ODBC par exemple est une hérésie à mon sens. Je n'aime pas quand le client communique en direct avec une base de données de façon général...
En revanche, de ce que tu décrits, tu n'as pas besoin d'un SGBDR... Un bête fichier Excel éventuellement piloté par VBA fonctionnerait tout aussi bien.
Marsh Posté le 10-01-2015 à 23:49:35
C'est ce que je luis disais. Pour lui, un fichier excel importé dans une table d'un SGBDR = une BD. Aucun intérêt dans ce cas d'utiliser Mysql. Comme indiqué, y'a des outils qui savent faire du SQL sur du CSV
Marsh Posté le 12-01-2015 à 09:09:26
Bonjour à vous 2,
Je vous remercie pour vos remarques,
j'ai juste quelques soucis pour comprendre la partie par serveur web de antac ...
Ensuite, s'il est plus judicieux de passer un csv directement vers sql, pourquoi pas, mais cela ne craint pas de rendre l'import plus dur pour un utilisateur beta ?
Quand vous parlez des outils pour faire du csv-sql, vous pouvez m'en dire un peu plus?
des outils comme phpmyadmin?
Merci bien
@+
Marsh Posté le 12-01-2015 à 14:02:09
L'import en csv se ferait automatiquement via ta macro Mysql sait gérer le csv pour l'import.
Par rapport aux outils, non, je parles pas de phpmyadmin : lui, il gère des BD mysql.
Je pensais çe ce genre d'outils :
http://korben.info/utiliser-la-syn [...] s-csv.html
http://korben.info/textql-requetes [...] r-csv.html
Le prend pas mal, mais vu ton niveau technique qui semble assez faible, reste sur une solution "simple" comme Mysql+Macro Excel ou encore plus simple, que du Excel + un outil pour faire du requêtage SQL si tu en as le besoin.
Si on revenait à ton besoin initial : pourquoi veux-tu mettre le contenu d'un fichier Excel dans une BD Mysql ? Quel est le besoin fonctionnel ?
Marsh Posté le 12-01-2015 à 14:18:32
Merci pour les outils, je vais y regarder cet apres-midi.
J'ai commencé à travailler sur les BD en début d'année, et j'avoue que j'avais un peu de mal avec tes dires sur l'utilité de mon script et des fichiers excel.
Je commence à emmerger
En fait, voila le besoin premier :
- Enregistrer des valeurs relevées manuellement dans une BD, pour pouvoir les conserver et les inclures dans un reporting automatique (macro qui va lire une BD)
et remonte les datas (en lecture seule) pour ensuite les traiter (adition mensuelle, annuelle, analyse de resultats).
- La BD est deja utilisée par mon script en PERL qui envoie une donnée lue sur un périphérique une fois par heure.
- Elle est administrée avec phpmyadmin (par moi en admin) mais je ne veux pas que les opérateurs (utilisateur beta) ne prenne phpmyadmin pour ajouter des datas.
= besoin d'utiliser une macro
Voilà en 3 lignes mon besoin.
Je pense que l'outils excel macro + sql sera le bienvenu du coup ?
Et du coup, la BD est elle de trop pour une appli comme la mienne ?
je suis ouvert à tout, car cela me permet d'avancer pour apprendre les BD
Merci Rufo
@+
Marsh Posté le 12-01-2015 à 15:02:45
Dans l'idéal, il faudrait effectivement une appli (web, par ex), proposant une IHM pour permettre la saisie sécurisée de données par des utilisateurs dans une BD relationnelle (qui, en toute logique, devrait respecter la forme 3NF). Une API devrait aussi permettre l'insertion sécurisée (et pourquoi pas la lecture/extraction) de données par des applis ou scripts (ex : ton script Perl).
Par sécurisé, j'entends une insertion d'une donnée dans un champ par un compte identifié et respectant certains contraintes (unicité ou pas, plage de valeur, valeurs interdites, format d'une chaîne de caractères...).
Au passage, si t'as phpmyadmin, c'est que t'as déjà un serveur web
La bonne solution sera celle qui répondra au mieux à ton besoin fonctionnel et que tu seras capable de correctement mettre en oeuvre (ie que tu as les compétences pour le faire) dans le temps qui t'es imparti (ou raisonnable, genre, tu vas pas attendre 2 ans de mettre en place une solution le temps d'acquérir les compétences pour faire une appli web).
Marsh Posté le 12-01-2015 à 15:44:38
OK,
je comprends mieux ce que tu dis
J'avais effectivement pensé à une appli en php qui permet de dialoguer entre HM.
je voudrais faire l'appli qui permet de saisir les data et ensuite, les envoie à la BD (du coup, il y a respect des champs,
des types (texte, int, ...) et aussi simple d'acces un simple page web suffit.
La solution serait du coup :
un script en php qui envoie les datas sur la BD en les contrôlant et en verifiant l'intégrité des données ?
Merci Rufo
@+
Marsh Posté le 12-01-2015 à 16:33:43
oui, un tel script ok. Attention tout de même : la personne qui met des données dans la BD via ton script doit y être autorisée. Je doute que n'importe qui qui accède à ce script ait le droit de rentrer des données
-> authentification -> l'appli ne fera pas qu'un seul script php du coup (authentification, déconnexion, IHM de saisie, traitement des données saisies et faudra probablement un script de visualisation ou de consolidation/stats).
Marsh Posté le 12-01-2015 à 16:39:23
Ok,
je vais partir dans cette branche alors,
sachant que le domaine de la page web sera dans un serveur avec acces restreint, pas tout le monde pourra y acceder donc
Pour les scripts connex, deconnex, ...
je peux garder une sorte de pgm principal avec des fonctions genre connex.php, deconnex.php, ... ?
ou je mets tout dans mon pgm principal ?
Merci Rufo encore
@+
Marsh Posté le 12-01-2015 à 17:45:01
Un script par "grande" action, c'est plus propre et surtout, plus facilement maintenable
Marsh Posté le 12-01-2015 à 21:25:48
Un seul script, mais avec les données de connexion, $mdp, $nomBD, ...
On peut faire des appel de fonctions dans le script php ? avec les #include
Merci rufo
@+
Marsh Posté le 13-01-2015 à 10:04:11
Sinon (et j'aurais jamais cru dire ça un jour...), tu as Access
Marsh Posté le 13-01-2015 à 10:06:11
Access, pas mon meilleur ami, mais une solution possible pour dialoguer avec la BD
Peut-etre si je n'arrive pas à ce que je veux avec le php
mais pas dit que les pc du taf soient équipés d'access ...
Merci
@+
Marsh Posté le 13-01-2015 à 10:41:38
Access, si c'est pour un usage multi-users, c'est vraiment pas une bonne idée
Précision : Antac indiquait d'utiliser Access pour faire BD et IHM (donc laisser tomber Mysql), ce qu impliquerait de refaire ton script Perl.
Marsh Posté le 13-01-2015 à 10:43:42
Arf
OK, mais le script PERL est super chaud donc oui, pas une bonne idée lol
pour l'ihm, je l'ai deja utilisé au début (avant que l'on m'installe phpmyadmin) pour voir si ma base s'incrémenter seule
Merci
@+
Marsh Posté le 13-01-2015 à 11:59:46
rufo a écrit : Access, si c'est pour un usage multi-users, c'est vraiment pas une bonne idée |
Pas forcément BD et IHM, tu peux t'en servir que pour la BD. Si c'est pour du multiuser interne, la base peut être stockée dans un répertoire partagé...
Excel arrive à taper directement dans une table Access.
Mais bon, j'aime pas cette solution...
Perso, j'ai fait un système de génération et d'intégration de doc.
PHP (Génération du doc et renvoi par header) -> WORD (on complète le doc) et via un bouton macro on reposte le tout vers une page PHP -> PHP (Traitement du fichier postés et parcours des lignes) -> MYSQL (Modifs / Insertion des lignes).
Comme je l'ai dit, je n'aime pas le fait qu'un client ai un accès direct à une BDD... Même si le code VBA est protégé, pas besoin d'être un génie pour chopper le mot de passe pour la connexion ODBC... Alors que dans mon cas, c'est une liaison client -> serveur PHP -> serveur MySQL avec une authentification gérée côté PHP.
Marsh Posté le 13-01-2015 à 13:17:16
Il est vrai que l'on peut avoir le mot de passe facilement, même en passant avec le php
(fichier conf.php pour ma part, avec le log de connex et le mdp pour rentrer sur la base de données).
Mais on peut savoir qui se connecte à la BD avec un log avant l'insertion de datas, et un stockage des id de connex dans un champs ?
Sa peut permettre de "securiser" un peu ...
Merci
@+
Marsh Posté le 13-01-2015 à 13:27:22
conf.php ne peut être appelé directement par le navigateur ou, si tel est le cas, l'utilisateur ne verra que le "rendu" du fichier php, donc une page blanche : il ne verra donc pas les identifiants. Bien entendu, l'accès au serveur web doit être protégé.
Pour la connexion ODBC via une macro, Antac fait juste remarquer qu'il suffit d'accéder au code source la macro. Certes mais on peut le protéger par un mot de passe. Ca limite un peu les risques.
Marsh Posté le 13-01-2015 à 13:33:19
A ok, c'est vrai que je ne pensais pas à l'acces de la macro par qq d'autre
En verrouillant la page et le classeur, on doit deja limiter un peu l'acces, c'est sur...
apres, questions bête, comme dans mon script perl, mes id de connex sont dans un txt, avec excel, on peut aussi
faire des include à partir de txt ou autre ??
Merci
@+
Marsh Posté le 13-01-2015 à 13:38:49
Oui, mais un fichier txt, c'est pas top car lisible par tous
C'est pour ça qu'on parlait de faire une appli web. Là, les id de connexion sont protégés (en tout cas, mieux).
Marsh Posté le 13-01-2015 à 13:50:09
OK,
Sa s'eclaircit un peu
Je me permet de tout poser à plat, sa m'aide à avancer et pas refaire certaine erreur
Merci pour les réponses
@+
Marsh Posté le 13-01-2015 à 22:24:24
Disons que même si le VBA est protégé, il est possible assez facilement d'intercepter les échanges non cryptés et notamment les id/mots de passe utilisés pour la connexion ODBC - MySql...
Je suis toujours un peu parano dans l'âme mais encore une fois, une connexion directe du client sur une base, c'est le mal.
Marsh Posté le 14-01-2015 à 08:42:06
OUi, il faut l'être je pense, enfin un peu
DIsons que si on est carré sur un petit programme simple, le jour où l'on sort un big script
important, on sera top sur la sécu
@+
Marsh Posté le 23-02-2015 à 11:07:39
Bonour à tous,
Après quelques mois d'absence, je reviens sur mon bout de script vb pour me conecter à une BD MySQL.
J'ai trouvé des idées sur le net, mais une erreur reviens toujours, lorsque je tente de me connecter à la BD.
J'ai la partie :
Code :
|
L'erreur retournée est 'type defini par l'utilisateur non defini'.
J'ai regarder pas mal de forum, mais toutes les aides apportées, n'ont pas permis de créer la connexion
Si jamais j'ai loupé un truc, je suis preneur
MErci à tous
@+
Marsh Posté le 07-01-2015 à 14:46:30
Bonjour à tous
Tout d'abord, je vous souhate une bonne et heureuse année 2015, pleine de bonheur, réussite et programmation
Ma question est assez "simple", sauf pour moi . . .
Peut-on envoyer des données présentes dans un classeur xls vers une bdd mysql sans passer par phpmyadmin ?
j'ai lu pas mal de truc sur les forums où il faut passer par phpmyadmin, mais je ne veux pas que les personnes l'utilisent dans mon service...
Je voudrai le faire avec une macro et ainsi rendre l'ajout de données dans ma base plus simple pour n'importe qui.
Je vous remercie de votre aide,
@+
Message édité par clubber43 le 23-02-2015 à 14:31:15
---------------
Merci