Mémroser les 50 derniers clients consultés

cs_globule Messages postés 327 Date d'inscription mardi 8 octobre 2002 Statut Membre Dernière intervention 6 octobre 2010 - 28 juin 2006 à 13:30
cs_globule Messages postés 327 Date d'inscription mardi 8 octobre 2002 Statut Membre Dernière intervention 6 octobre 2010 - 9 juil. 2006 à 08:44
Bonjour,<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?>


J'essaye de faire un programme qui mémorise les 50 derniers clients qui ont été consultés dans mon logiciel.
Chaque nouveau client consulté prend la place du dernier client consulté etc, et les autres sont décalés (le plus ancien client consulté sort de la base)  ...


La table ne dépasse jamais les 50 enregistrements.




Savez vous comment faire ça en requeteSQL. J'avais réussi avec access, en listant les clients triés par date et heure (j'ai un champ date dans la base). Puis je me positionnais sur le dernier enregistrement et je le mettais à jour.


Mais je n'arrive pas à adapter cette routine depuis que je suis sous MySQL. En effet dans le cadre d'un réseau je rencontre des erreurs (enregistrement modifié par un autre utilisateur).
J'en conclu qu'il faille faire ça uniquement en requête (update ...), mais je ne sais pas comment

Merci




 

7 réponses

goueg83460 Messages postés 57 Date d'inscription mercredi 23 novembre 2005 Statut Membre Dernière intervention 7 août 2009
3 juil. 2006 à 17:15
il faut que tu aille chercher la date la plus récente enregistré ou leure et ensuite tu na qua faire un champs numero allant de 1 a 50. suivant leure et la numero soit tu fait un update a la ligne suivante si elle n'est pas égale a 50 sinon tu repar a la 1er ligne. moi je ferais com sa
0
cs_globule Messages postés 327 Date d'inscription mardi 8 octobre 2002 Statut Membre Dernière intervention 6 octobre 2010
3 juil. 2006 à 19:38
Oui, mais je voudrais tout faire avec un seule requête. Car en Multi-Utilisateurs je rencontre des problèmes si j'utilise plusieurs requêtes. Mon but est d'avoir une table pre-remplie avec 50 enregistrements, j'ai un champ date, un champ heure et un champ numéro de client. Je voudrais que ça garde l'historique, uniquement en faisant des updates. Mais je ne suis pas assez fort en SQL pour réaliser ça (il faut faire des requêtes imbriqués je pense).


Je pense que ce type de requêtes a déjà été réalisé, merci a celui qui peut m’aider
0
cs_Malkuth Messages postés 268 Date d'inscription samedi 22 février 2003 Statut Membre Dernière intervention 24 avril 2013 4
8 juil. 2006 à 17:25
imaginont cette table:
TblRecent:ID,ORDER,DATA1,DATA2

Procédure pour ajouter un élément dans la queue:

UPDATE TblRecent
SET
   ORDER=ORDER+1;

DELETE FROM TblRecent
WHERE ORDER >= 50;

INSERT INTO TblRecent
   (ORDER,
   DATA1,
   DATA2,
   ...)
VALUES
   (O,
   @DATA1,
   @DATA2,
   ...);

Ca  devrait être bons mais attention c'est un code SQL Server mais les opération sont simple et devrait pas poser de problème pour être porter sur MySQL

On a donc une liste, ORDER indique l'ordre dans lequel les enregistrement on été entré, c'est plus intéréssant que de stocké la date car on peut réduire le champ a un simple Byte (tinyint SQL Server) donc plus rapide.

Pour éviter les messages d'erreur d'enregistrement je pense qu'il faut voir du coté des mécanisme de Lock et de transaction de MySQL, mais là je peut pas t'en dire plus. C'est assez peu utiliser dans des base de donnée peu solicités mais plus le nombre d'utilisateurs est important plus ces mécanismes doivent faire l'objet d'une étude attentive pour assurer la robustesse du system ce qui implique aussi une gestion des transactions abandonnées.
Bon courage
0
cs_globule Messages postés 327 Date d'inscription mardi 8 octobre 2002 Statut Membre Dernière intervention 6 octobre 2010
8 juil. 2006 à 17:27
Merci,

Mais je ne veux pas utiliser de delete. Uniquement des update (ma table est pre-remplie avec 50 eneregistrements).
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Malkuth Messages postés 268 Date d'inscription samedi 22 février 2003 Statut Membre Dernière intervention 24 avril 2013 4
8 juil. 2006 à 17:34
Alors dans ce cas en reprenant les tables d'exemples plus haut :

UPDATE TblRecent
SET
   ORDER=ORDER+1;

UPDATE TblRecent
SET
   ORDER=0,
   DATA1=@DATA1,
   DATA2=@DATA2,
   [mailto:DATA1=@DATA1 ...]
WHERE ORDER = 50

Bien attendu ca ne marchera que si la tables est prérempli avec 50 lignes dont ORDER varie de 0 a 49.
0
cs_Malkuth Messages postés 268 Date d'inscription samedi 22 février 2003 Statut Membre Dernière intervention 24 avril 2013 4
8 juil. 2006 à 19:37
Voilà un truc qui devrait t'aider pour les problème d' utilisation concurentiel des données :

LOCK TABLES TblRecent WRITE;

UPDATE TblRecent
SET
   ORDER=ORDER+1;

UPDATE TblRecent
SET
   ORDER=0,
   DATA1=@DATA1,
   DATA2=@DATA2,
   [mailto:DATA1=@DATA1 ...]
WHERE ORDER = 50;
UNLOCK TABLES;

Ainsi tu est sur que si deux utilisateur diférents effectue
la requette en même temps elle seront bien executer l'une aprés l'autre
Ce mécanisme n'est pas aussi puissant que les transactions mais si tu place les LOCKs
a des moment judicieux tu ne devrai plus avoir de problèmes avec la gestion multi-utilisateur.

J'ai récupérer les infos sur :

http://dev.mysql.com/doc/refman/5.0/fr/lock-tables.html
J'espère <que ca répond a ton problème.
0
cs_globule Messages postés 327 Date d'inscription mardi 8 octobre 2002 Statut Membre Dernière intervention 6 octobre 2010
9 juil. 2006 à 08:44
Merci je vais etudier ca
0
Rejoignez-nous