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

PHP & Base de données Discussion :

[Conception] Modif différée ou utilisation différée d'une donnée dans une table


Sujet :

PHP & Base de données

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 34
    Points : 13
    Points
    13
    Par défaut [Conception] Modif différée ou utilisation différée d'une donnée dans une table
    Bonjour,

    Je retourne depuis quelques heures le problème dans tous les sens, mais je ne voie pas comment réaliser ce qu'il me faut.

    J'utilise une table dans laquelle, entre autre, on trouve des tarifs. L'idée étant d'avoir une page de modification (que j'ai en partie) avec un champ dans lequel on précise la date à laquelle les modifications doivent être prises en compte.

    Ca me paraît pas très évident à faire. Par exemple le 30 octobre 2006 un tarif est modifé et prend effet le 10 Novembre. Il ne faudra pas qu'en utilisant la table via un site, on voit le nouveau tarif avant le 10 Novembre.

    Une idée ?

  2. #2
    Membre confirmé Avatar de papyphp
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    438
    Détails du profil
    Informations personnelles :
    Âge : 74
    Localisation : Belgique

    Informations professionnelles :
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 438
    Points : 587
    Points
    587
    Par défaut
    Bonjour,

    Tu pourrais :
    créer un table des modifs qui contient l'id de l'enregistrement à modifier, la date de modification et la modification à effectuer.
    Tu enregistres dans cette table les modifications de tarif
    tu crées une tâche cron qui tout les matins va balayer cette table, faire les modifs du jour et effacer l'enregistrement de la table des modifs

    ou alors

    modifier la table des tarifs en ajoutant deux colonnes : nouveau_tarif, a_partir_du
    créer une tâche cron qui balaie la table tout les matin et qui fait les mises à jour

    il y a certainement d'autres moyens.

    A+

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 34
    Points : 13
    Points
    13
    Par défaut
    Merci pour ta réponse.

    J'avais également songé à un spooler, un peu comme une imprimante, avec un fichier des requêtes à faire, ou juste des données à modifier et puis un cron.

    Si quelqu'un a d'autres idées.

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 012
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 012
    Points : 1 093
    Points
    1 093
    Par défaut
    même sans cron, tu peux le faire : tu crées une table des tarifs, comprenant les champs id_produit, tarif, a_partir_de

    la page de modifications rajoute simplement une ligne

    le désavantage, c'est que ta table peut rapidement augmenter si tu changes souvent tes tarifs.
    l'avantage, c'est que tu mémorises les tarifs antérieurs, tu gardes un historique complet.

    cela t'obligera peut-être d'avoir deux tables : celle décrite précédemment, et celle contenant toutes les caractéristiques du produit, et comprenant également le champ id_produit.

    Avec les jointures, la recherche restera rapide (pour plus de détails sur les jointures, voir par exemple ftp://ftp2.developpez.be/developps/php/mysql.pdf

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 34
    Points : 13
    Points
    13
    Par défaut
    Oui effectivement ça pourrait être une solution, mais je pense que ça me compliquerait la tâche pour développer le front-end d'administration de la table, en rajoutant notamment des contrôles sur la date pour ne pas afficher les historiques lors de l'édition par exemple.

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 012
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 012
    Points : 1 093
    Points
    1 093
    Par défaut
    je n'ai pas creusé la question

    et effectivement, il est peut-être difficile de faire des conditions dans ta requêtes prenant la totalité de tes produits et uniquement la dernière date valable.

    si ce n'est pas possible, tu peux rajouter un champ jusqu_a dans la table des tarifs. dans ton formulaire d'enregistrement des tarifs, tu peux remplir ce champ lorsque tu crées un nouveau tarif

    une autre possibilité est de faire ta requete avec jointure avec un where sur la date du jour, comprenant ainsi tout l'historique mais pas le futur, et lors de l'édition, tu ne prends en compte que le dernier tarif.

    cela ne doit pas être bien compliqué.

  7. #7
    Membre expérimenté

    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 278
    Points : 1 639
    Points
    1 639
    Par défaut
    Je vote pour la solution de francis m, qui me semble la plus simple et la plus "atomique"
    Tu peux aussi supprimer l'ancien tarif la première fois que tu utilises le nouveau, ou le déplacer dans une table 'archives'. Il ne te reste alors que 2 tarifs maximum dans la même table principale. Tu dois t'en sortir avec un simple "WHERE date_validite > NOW()".

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 34
    Points : 13
    Points
    13
    Par défaut
    En effet dans le fonctionnement ça me paraît plus simple globalement. Je vais me pencher sur cette solution.

    Je n'ai pas recensé le besoin d'historioriser les tarifs. Donc en effet, il va falloir que je regarde la manière de supprimer l'ancien enregistrement à la première utilisation du nouveau, ce qui ne doit pas être très sorcier.

    Merci à vous

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 34
    Points : 13
    Points
    13
    Par défaut
    Bon en y travaillant, j'ai découvert un cas possible et facheux.

    Supposons que j'ai deux ou trois ou quatre ... modifications tarifaires pour un même produit.

    Si je sélectionne le tarif dont la date_validite > NOW() j'aurais plus d'un résultat, sachant que je peux pas prévoir la durée de validité d'un tarif à l'avance, je n'ai pas prévu ce champ.

    Ainsi pour l'édition des tarifs je n'affiche que ceux qui sont < NOW(). Du coups j'enlève bien les tarifs du futur.

    Je but maintenant sur ce nouveau problème. J'avais bien pensé à soustraire NOW() aux autres dates trouvées et prendre le tarif où la différence est la plus petite. Mais ça me paraît un peu usine à gaz à développer.

    Peut-être avec le recul auriez-vous une vision plus éclaircie sur ce problème ?

    Merci

  10. #10
    Membre expérimenté

    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 278
    Points : 1 639
    Points
    1 639
    Par défaut
    C'est ce que je te suggérais dans mon précédent post.
    A la première utilisation d'un tarif, tu supprimes le précédent. Le problème ne se pose donc plus, car tu n'as toujours qu'un seul tarif valable en bdd.
    Autre possibilité : tu as une table tarifs_futurs. En début de journée (tâche cron ou à la première requête), tu bascules les tarifs devenus valables vers la table principale. Ainsi, à part une fois par jour, les requêtes se font sur une seule table avec un seul tarif par id => ultra rapide.

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 34
    Points : 13
    Points
    13
    Par défaut
    C'est ce que je te suggérais dans mon précédent post.
    A la première utilisation d'un tarif, tu supprimes le précédent. Le problème ne se pose donc plus, car tu n'as toujours qu'un seul tarif valable en bdd.
    Bah non justement :s Si toutefois deux ou trois tarifs futurs sont saisis, ça ne colle plus. Ca m'a déprimé en le découvrant lol.

    Autre possibilité : tu as une table tarifs_futurs. En début de journée (tâche cron ou à la première requête), tu bascules les tarifs devenus valables vers la table principale. Ainsi, à part une fois par jour, les requêtes se font sur une seule table avec un seul tarif par id => ultra rapide.
    On en reviendrait quasiment à mon idée initiale d'une sorte de spooler avec un client qui irait scanner la base et voir s'il faut basculer ou non sur les nouveaux tarifs. Grrrr ça m'ennui j'ai développé toute la journée autour de l'idée précédente.

  12. #12
    Membre expérimenté

    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 278
    Points : 1 639
    Points
    1 639
    Par défaut
    Je pense que tu devrais t'en sortir avec une combinaison de MAX() et <= NOW(), ou DISTINCT + <= NOW() + ORDER BY date.

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 34
    Points : 13
    Points
    13
    Par défaut
    Pas bête !

    Merci, je vais me pencher là dessus.

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 34
    Points : 13
    Points
    13
    Par défaut
    Voici finalement la requête qui me permet de récupérer précisément le bon tarif :

    SELECT *
    FROM `X`
    WHERE prefix = '01'
    AND date_validite = (
    SELECT MAX( date_validite )
    FROM X
    WHERE prefix = '01'
    AND date_validite <= NOW( ) )
    Cependant, pour m'éviter de faire une requête par préfixe concerné et surcharger la base, je fais UNE requête qui récupère tout et je travail ensuite sur une variable tableau, beaucoup plus rapide à manipuler.

    J'ai donc, tout naturellement adapter la requête ci-dessus comme suit :

    SELECT *
    FROM `X`
    WHERE date_validite = (
    SELECT MAX( date_validite )
    FROM X
    WHERE date_validite <= NOW())
    Sauf que là je me heurte à un problème. Quand le tarif a une date de validité à NOW(), il apparaît bien en résultat. Parcontre dès lors que je le supprime et que normalement c'est le tarif précédent qui devrait être affiché, et bien la requête me renvoi rien. Enfin tout daté à NOW(), rien pour le futur donc ça c'est OK, mais en dépit de date_validite = NOW() visiblement j'ai pas le tarif d'avant.

    Je ne comprend pas.

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 34
    Points : 13
    Points
    13
    Par défaut
    Ah bien oui c'est normal puisqu'en fait la requête imbriquée me renvoi la date_validite <= à aujourd'hui. Etant donné que les autres lignes sont initialisées à aujourd'hui, il zappe les date_validite d'avant.

    C'est ennuyeux. Je continue à me creuser la tête sur la requête, si quelqu'un a une idée

Discussions similaires

  1. [Toutes versions] coller les données d'une plage d'une cellule dans une cellule d'une autre feuille[VBA]
    Par arthson dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 24/01/2012, 17h37
  2. portée d'une variable dans une fonction dans une méthode
    Par laurentg2003 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 29/06/2009, 19h05
  3. [POO] dans une classe, appeler une fonction dans une méthode
    Par arnaudperfect dans le forum Langage
    Réponses: 3
    Dernier message: 26/08/2007, 23h04
  4. Envoyer une formulaire dans une page dans une Frame
    Par zooffy dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 29/06/2007, 10h13
  5. Recherche une valeur d'une cellule dans une colonne d'une autre feuille
    Par kourria dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/06/2007, 13h48

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