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
    Nouveau Candidat au Club
    Comparaison de deux tables - mise à jour des colonnes différentes
    Bonjour,

    Habitué de coder en Php et MySqL, entre autres, pour un magasin qui souhaite gérer ses stocks, j'ai une demande assez précise.

    Les stocks sont enregistrés dans un fichier excel, sous forme CSV, colonnes séparées par des ;
    Ce fichier ne comporte en général que 20-30 lignes max. Et un fichier par catégorie est envoyé à la fois, jamais de mise à jour de cette table (environ 200 lignes).

    La personne souhaiterait que je lui fasse un système d'upload de ce fichier et qu'il alimente une table précise.
    Jusque là, c'est Ok, form d'envoi du fichier et requête $sql Load Data... ok. Ma table est alimentée.
    Ce procédé est utilisé depuis 10 ans.

    Là où ça se corse, c'est que cette table comporte divers catégories d'articles, un index sur l'id de chaque ligne.
    Et que lors d'une mise à jour des données CSV, la table "origine" se copie sur une table "cache", et les données envoyées sont enregistrées sur la table "origine".

    Et là, il faudrait que la table, appelée 'origine', soit comparée à la table 'cache', que la maj ne concerne que ce qui est différent, et, soyons fous, que la colonne mise à jour soit indiquée (sur le site par un affichage de la donnée de la colonne mise à jour en vert.
    Il souhaiterait même garder un historique de chaque mise à jour, dans une table qui pourrait être à part ou dans une colonne de la table "origine".

    Peut-être un exemple concret ? J'ai vu ce procédé sur un site de listings "kingofsat" qui se met à jour et lorsqu'une donnée d'un élément est modifié, celui-ci est affiché en rouge et un message est aussi posté sur l'acceuil de ce site.

    Il souhaiterait donc plus ou moins le même système dans l'interface de gestion (boite a outils). Et ainsi pouvoir voir l'évolution de ses articles, ce qui a changé, les variantes de vente etc.

    Est-ce possible ?

    L'idée des deux tables comparées à laquelle je pense est-elle bonne ?

    Merci d'avoir lu ma demande,

  2. #2
    Rédacteur

    Citation Envoyé par jackoli Voir le message
    ...
    Et là, il faudrait que la table, appelée 'origine', soit comparée à la table 'cache', que la maj ne concerne que ce qui est différent, et, soyons fous, que la colonne mise à jour soit indiquée (sur le site par un affichage de la donnée de la colonne mise à jour en vert.
    Ce serait simple à faire si MySQL implémentait l'ordre SQL normalisé MERGE existant dans la norme SQL datant de 2003, disponible par exemple dans Microsoft SQL Server... Mais MySQL à vingt ans de retard...

    Citation Envoyé par jackoli Voir le message
    ...
    Il souhaiterait même garder un historique de chaque mise à jour, dans une table qui pourrait être à part ou dans une colonne de la table "origine".
    Ce serait simple à faire si MySQL implémentait les tables temporelles... existant dans la norme SQL datant de 2011, disponible par exemple dans Microsoft SQL Server...

    A +
    Cette signature n'a pas pu être affichée car elle comporte des erreurs.

  3. #3
    Nouveau Candidat au Club
    Ok, je ne suis pas plus avancé donc, a part faire des formulaires pour écrire soi même ce qui est changé, pas d'autre moyen
    En général, je ne me sers que des requetes "basiques" insert, update, ...
    Merci

  4. #4
    Modérateur

    Bonjour,

    Les stocks sont enregistrés dans un fichier excel, sous forme CSV, colonnes séparées par des ;
    Ce fichier ne comporte en général que 20-30 lignes max. Et un fichier par catégorie est envoyé à la fois, jamais de mise à jour de cette table (environ 200 lignes).
    1) Doit-on comprendre que votre client souhaite passer d'une gestion de stock faite avec Excel vers une faite avec une base de données MySQL ?

    2) Vous écrivez "jamais de mise à jour de cette table". Pourtant, le stock varie, non ?

    La personne souhaiterait que je lui fasse un système d'upload de ce fichier et qu'il alimente une table précise.
    Jusque là, c'est Ok, form d'envoi du fichier et requête $sql Load Data... ok. Ma table est alimentée.
    Ce procédé est utilisé depuis 10 ans.
    3) D'une manière générale, toujours faire l'import de données dans une nouvelle table ou dans une table dédiée à l'import et qui est écrasée à chaque fois. Ça évite d'enregistrer n'importe quoi dans la BDD.
    C'est ensuite du code SQL qui doit placer les données importées aux bons endroits dans la BDD qui, j'espère, est correctement modélisée, donc les données sont éclatées en plusieurs tables.

    Là où ça se corse, c'est que cette table comporte divers catégories d'articles, un index sur l'id de chaque ligne.
    4) Donc, normalement, vous avez une table pour les catégories, une pour les articles. Et puisqu'il s'agit de gérer un stock, vous avez aussi une à plusieurs tables table pour le stock.
    Précisez-nous votre modèle de données parce que là on ne peut faire que des suppositions.

    Et que lors d'une mise à jour des données CSV, la table "origine" se copie sur une table "cache", et les données envoyées sont enregistrées sur la table "origine".
    C'est là que ça commence à devenir flou !

    Pour pouvoir vous répondre efficacement sur la suite, donnez-nous votre modèle de données.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  5. #5
    Rédacteur

    Bonjour.

    Même à défaut d'avoir les élements suivants :
    - Un SGBD qui permet de le faire
    - Un modèle de donnée bien conçut

    => Il y a moyen de s'en sortir côté développement et facilement.

    Voici une piste qui peut être explorée : vous pouvez le faire au niveau applicatif si vous mappez vos données sur des objets comme on le fait classiquement aujourd'hui (par pitié ne me dites pas que vous faite du PHP 2 procédural ^^ ) :
    - soit parce qu'on stock des ressources JSON/XML ou autres sous forme de documents dans certaines conceptions modernes orientées documents/ressources et non relationnelles
    - soit parce que votre application est bien découpée et vous avez une couche DAO qui fait le mapping entre vos entités objets dans votre code et vos données
    - soit parce que vous utilisez un ORM comme Hibernate en Java (je crois qu'il existe Doctrine en php)

    Dans tout les cas vous pouvez utiliser la puissance de votre langage objet s'il possède par exemple une API d'introspection/reflection pour comparer chaque attribut de vos objets métiers et sauvegarder les différences datées dans un nouvel objet qui fera une entrée dans votre modèle de données avec une table adéquat par exemple.

    Exemple de framework qui permet de le faire quelque soit le support de stockage (SQL, NoSQL ou autre) : https://github.com/vo-lifecycle/vo-l...jpa-repository (je met directement un exemple avec JPA mais le détecteur peut être utilisé avec autre chose, une couche DAO faite à la main avec des requêtes SQL par exemple). Vous pouvez ré-implémenter ceci avec n'importe quel langage objet qui supporte la reflection (Java, PHP, C#, C++, etc).

    Voici l'api de reflection php native : http://php.net/manual/en/book.reflection.php (il existe peut être des surcouches dans les frameworks actuels de php).

    Cordialement,
    Idriss

  6. #6
    Expert éminent sénior
    Salut à tous.

    Je ne vois pas trop où se trouve la difficulté pour effectuer une comparaison entre les données issues d'un fichier Excel (.csv) et l'existant dans une base de données.
    Comme l'indique CinePhil, vous devez en premier charger votre fichier Excel dans une table de travail.
    Ensuite, déterminer les différences et faire la mise à jour dans les tables existantes avec ce résultat.
    Au moment de la mise à jour, vous pouvez marquer vos lignes afin de connaitre celle qui ont changé.

    Pour le reste, je n'ai pas bien compris ce que vous cherchez à faire, surtout que nous n'avons pas le descriptif de votre base de données, un jeu d'essai et le résultat que vous attendez.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

###raw>template_hook.ano_emploi###