Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD
PHP & SGBD Forum d'entraide sur les SGBD avec PHP. Avant de poster : FAQ BDD, toutes les FAQ PHP, cours BDD et sources BDD
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 03/11/2006, 14h37   #1
Invité régulier
 
Inscription : mars 2005
Messages : 34
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 34
Points : 5
Points : 5
Envoyer un message via ICQ à Adrien93 Envoyer un message via MSN à Adrien93
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 ?
Adrien93 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/11/2006, 16h09   #2
Membre expérimenté
 
Avatar de papyphp
 
Inscription : avril 2005
Messages : 425
Détails du profil
Informations personnelles :
Âge : 62
Localisation : Belgique

Informations professionnelles :
Secteur : Enseignement

Informations forums :
Inscription : avril 2005
Messages : 425
Points : 545
Points : 545
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+
__________________
Lu kinze d' awousse, la Vierje arandje û dusbrôle lu timp. Et ce coup ci, elle ne nous a pas ratés
papyphp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/11/2006, 16h42   #3
Invité régulier
 
Inscription : mars 2005
Messages : 34
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 34
Points : 5
Points : 5
Envoyer un message via ICQ à Adrien93 Envoyer un message via MSN à Adrien93
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.
Adrien93 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/11/2006, 01h25   #4
Membre émérite
 
Inscription : juin 2002
Messages : 1 013
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 1 013
Points : 959
Points : 959
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
francis m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/11/2006, 21h21   #5
Invité régulier
 
Inscription : mars 2005
Messages : 34
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 34
Points : 5
Points : 5
Envoyer un message via ICQ à Adrien93 Envoyer un message via MSN à Adrien93
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.
Adrien93 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/11/2006, 23h00   #6
Membre émérite
 
Inscription : juin 2002
Messages : 1 013
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 1 013
Points : 959
Points : 959
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é.
francis m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/11/2006, 23h13   #7
Membre Expert
 
Inscription : janvier 2005
Messages : 1 249
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : janvier 2005
Messages : 1 249
Points : 1 417
Points : 1 417
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()".
vg33 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/11/2006, 09h47   #8
Invité régulier
 
Inscription : mars 2005
Messages : 34
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 34
Points : 5
Points : 5
Envoyer un message via ICQ à Adrien93 Envoyer un message via MSN à Adrien93
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
Adrien93 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/11/2006, 17h44   #9
Invité régulier
 
Inscription : mars 2005
Messages : 34
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 34
Points : 5
Points : 5
Envoyer un message via ICQ à Adrien93 Envoyer un message via MSN à Adrien93
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
Adrien93 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/11/2006, 20h40   #10
Membre Expert
 
Inscription : janvier 2005
Messages : 1 249
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : janvier 2005
Messages : 1 249
Points : 1 417
Points : 1 417
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.
vg33 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/11/2006, 21h56   #11
Invité régulier
 
Inscription : mars 2005
Messages : 34
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 34
Points : 5
Points : 5
Envoyer un message via ICQ à Adrien93 Envoyer un message via MSN à Adrien93
Citation:
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.

Citation:
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.
Adrien93 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/11/2006, 22h58   #12
Membre Expert
 
Inscription : janvier 2005
Messages : 1 249
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : janvier 2005
Messages : 1 249
Points : 1 417
Points : 1 417
Je pense que tu devrais t'en sortir avec une combinaison de MAX() et <= NOW(), ou DISTINCT + <= NOW() + ORDER BY date.
vg33 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/11/2006, 09h41   #13
Invité régulier
 
Inscription : mars 2005
Messages : 34
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 34
Points : 5
Points : 5
Envoyer un message via ICQ à Adrien93 Envoyer un message via MSN à Adrien93
Pas bête !

Merci, je vais me pencher là dessus.
Adrien93 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/11/2006, 11h24   #14
Invité régulier
 
Inscription : mars 2005
Messages : 34
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 34
Points : 5
Points : 5
Envoyer un message via ICQ à Adrien93 Envoyer un message via MSN à Adrien93
Voici finalement la requête qui me permet de récupérer précisément le bon tarif :

Citation:
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 :

Citation:
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.
Adrien93 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/11/2006, 11h36   #15
Invité régulier
 
Inscription : mars 2005
Messages : 34
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 34
Points : 5
Points : 5
Envoyer un message via ICQ à Adrien93 Envoyer un message via MSN à Adrien93
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
Adrien93 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 23h14.


 
 
 
 
Partenaires

Hébergement Web