Mémroser les 50 derniers clients consultés

Messages postés
327
Date d'inscription
mardi 8 octobre 2002
Statut
Membre
Dernière intervention
6 octobre 2010
- - Dernière réponse : 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




 
Afficher la suite 

7 réponses

Messages postés
57
Date d'inscription
mercredi 23 novembre 2005
Statut
Membre
Dernière intervention
28 janvier 2008
0
Merci
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
Commenter la réponse de goueg83460
Messages postés
327
Date d'inscription
mardi 8 octobre 2002
Statut
Membre
Dernière intervention
6 octobre 2010
0
Merci
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
Commenter la réponse de cs_globule
Messages postés
278
Date d'inscription
samedi 22 février 2003
Statut
Membre
Dernière intervention
24 avril 2013
2
0
Merci
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
Commenter la réponse de cs_Malkuth
Messages postés
327
Date d'inscription
mardi 8 octobre 2002
Statut
Membre
Dernière intervention
6 octobre 2010
0
Merci
Merci,

Mais je ne veux pas utiliser de delete. Uniquement des update (ma table est pre-remplie avec 50 eneregistrements).
Commenter la réponse de cs_globule
Messages postés
278
Date d'inscription
samedi 22 février 2003
Statut
Membre
Dernière intervention
24 avril 2013
2
0
Merci
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.
Commenter la réponse de cs_Malkuth
Messages postés
278
Date d'inscription
samedi 22 février 2003
Statut
Membre
Dernière intervention
24 avril 2013
2
0
Merci
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.
Commenter la réponse de cs_Malkuth
Messages postés
327
Date d'inscription
mardi 8 octobre 2002
Statut
Membre
Dernière intervention
6 octobre 2010
0
Merci
Merci je vais etudier ca
Commenter la réponse de cs_globule