|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Invité de passage
![]() Inscription : mars 2011 Messages : 7 ![]() |
Bonjour,
Après quelques recherches dans la FAQ et le forum, je ne trouve pas spécialement de réponse à ma question. Tout d'abord Je ne suis pas un grand spécialiste de SQL, mais j'essaie de m'adapter. Les faits : Pour l'instant c'est l'étude rien a été fait. Je vais avoir besoin dans une base (à ma disposition SQL SERVER 7 ou 2000) d'afficher chaque enregistrement d'une table et d'enregistrer les modifications. Tous les enregistrements vont devoir être traités. Plusieurs utilisateurs (une petite dizaine) vont avoir chaque enregistrement remonter automatiquement (php ou asp) J'envisageais de mettre un statut sur chaque enregistrement (du style a traiter,traité) mais comment s'assurer que 1 utilisateur n'aura pas le même enregistrement qu'un autre. Je pensais tout d'abord lors du SELECT (sur le 1er élément "à traiter" faire un UPDATE pour passer son statut "en cours") mais j'ai peur que le temps de faire la modification sur le statut "en cours", ce même enregistrement remonte pour 1 autre utilisateur. Ne sachant comment aborder ce problème de façon sécurisé je me tourne vers vous afin de m'orienter. Merci par avance. NicoDD. |
|
|
00
|
|
|
#2 |
|
Membre Expert
![]() Développeur java, access, sql server Inscription : octobre 2005 Messages : 851 ![]() |
Lors d'une "demande pour un enregistrement" de l'application,
tu peux envoyer à SQL Server le nom d'utilisateur (qu'on suppose unique !) de l'application. En plus d'une colonne "statut", tu peux ajouter une colonne "Attribution" et y placer le nom de l'utilisateur ayant "réclamé" un enregistrement. récupération : Code :
SELECT * FROM maTable WHERE STATUS = 'en cours' AND Attribution = 'Wladimir'
__________________
D'abord qu'il marche. Ensuite qu'il soit rapide. Enfin qu'il soit agréable à utiliser. First, make it work. Then, make it fast. Finally, make it user-friendly. Erst, mach', dass es funktioniert. Dann, mach', dass es schnell geht, Zum Schluss mach' es benutzerfreundlich. |
|
|
00
|
|
|
#3 |
|
Invité de passage
![]() Inscription : mars 2011 Messages : 7 ![]() |
Merci pour ta réponse....
Donc si j'ai bien compris : 1: je fait un SELECT sur le premier enregistrement disponible (statut en cours) puis fait un UPDATE de attribution (qui sera sans données au départ) avec pour données le nom unique de l'utilisateur. 2. je récupère cet enregistrement et l'affiche à l'utilisateur concerné. Si échec en 2. car un autre utilisateur a fait une demande attribution en même temps sur le même enregistrement je recommence 1. Ai-je bien tout compris ? Merci. |
|
|
00
|
|
|
#4 |
|
Membre Expert
![]() Développeur java, access, sql server Inscription : octobre 2005 Messages : 851 ![]() |
Il n'y aura pas d'échec ...
![]() Il faut utiliser la baguette magique de la transaction
__________________
D'abord qu'il marche. Ensuite qu'il soit rapide. Enfin qu'il soit agréable à utiliser. First, make it work. Then, make it fast. Finally, make it user-friendly. Erst, mach', dass es funktioniert. Dann, mach', dass es schnell geht, Zum Schluss mach' es benutzerfreundlich. |
|
|
00
|
|
|
#5 | |
|
Invité de passage
![]() Inscription : mars 2011 Messages : 7 ![]() |
Citation:
Si tu peux m'éclairer..... Merci. Nico |
|
|
|
00
|
|
|
#6 | ||||||
|
Membre Expert
![]() Développeur java, access, sql server Inscription : octobre 2005 Messages : 851 ![]() |
C'est probablement encore plus simple.
On suppose que chaque enregistrement est numéroté par un compteur (clé primaire recommandée). Donc une application cliente va envoyer directement la requête suivante : Code :
Après, on fait : Code :
Code :
__________________
D'abord qu'il marche. Ensuite qu'il soit rapide. Enfin qu'il soit agréable à utiliser. First, make it work. Then, make it fast. Finally, make it user-friendly. Erst, mach', dass es funktioniert. Dann, mach', dass es schnell geht, Zum Schluss mach' es benutzerfreundlich. |
||||||
|
|
00
|
|
|
#7 |
|
Invité de passage
![]() Inscription : mars 2011 Messages : 7 ![]() |
Merci....
|
|
|
00
|
|
|
#8 | ||
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
Bonjour
Sinon vous pouvez utiliser la clause OUTPUT, pour mettre à jour les lignes et récuperer les lignes mises a jour en une seule reuqte : Code SQL :
Vous pourriez alors vous passer de la colonne Attribution Par contre, pensez peut être à mettre en place un mécanisme afin que si un utilisateur commence a mettre a jour, part prendre un café, se casse la jambe à la cafet et ne valide jamais ses modifications, le statut revienne à 'à traiter' au bout d'un moment... |
||
|
|
00
|
|
|
#9 | |
|
Membre Expert
![]() Développeur java, access, sql server Inscription : octobre 2005 Messages : 851 ![]() |
Citation:
OUTPUT n'existe pas encore
__________________
D'abord qu'il marche. Ensuite qu'il soit rapide. Enfin qu'il soit agréable à utiliser. First, make it work. Then, make it fast. Finally, make it user-friendly. Erst, mach', dass es funktioniert. Dann, mach', dass es schnell geht, Zum Schluss mach' es benutzerfreundlich. |
|
|
|
00
|
|
|
#10 |
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
oups
j'avais raté ce détail en effet... |
|
|
00
|
|
|
#11 |
|
Invité de passage
![]() Inscription : mars 2011 Messages : 7 ![]() |
Merci pour vos remarques complémentaires.....
J'ai effectivement prévu un mécanisme pour remettre le statut "A traiter"..... Pour éviter qu'il se casse la jambe, j'interdirais le café.... Merci encore |
|
|
00
|
|
|
#12 | |
|
Invité de passage
![]() Inscription : mars 2011 Messages : 7 ![]() |
Encore une petite question :
puis-je récupérer les champs de l'enregistrement que je viens de modifier avec cette seule requete ou dois je passer par un Code :
SELECT id,nom, prenom FROM maTable WHERE attribution ='hector' AND statut='en cours'. Citation:
|
|
|
|
00
|
|
|
#13 |
|
Membre Expert
![]() Développeur java, access, sql server Inscription : octobre 2005 Messages : 851 ![]() |
Le message d'erreur est un peu étrange.
Peux-tu poster la vraie structure de la table avec la vraie requête SELECT ... ?
__________________
D'abord qu'il marche. Ensuite qu'il soit rapide. Enfin qu'il soit agréable à utiliser. First, make it work. Then, make it fast. Finally, make it user-friendly. Erst, mach', dass es funktioniert. Dann, mach', dass es schnell geht, Zum Schluss mach' es benutzerfreundlich. |
|
|
00
|
|
|
#14 |
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
je pense que ce message d'erreur vient de son application et n'est pas en rapport avec une requete, mais avec une mauvaise utilisation des classes qu'il utilise pour discuter avec la BDD
et pour répondre à la question, oui, tu dois refaire un SELECT. En fait la clause OUTPUT aurait pu te permettre de récupérer les lignes mises à jour par la commande UPDATE, mais comme l'a fait remarquer Népomucène, ta version de SQL server est trop ancienne... |
|
|
00
|
|
|
#15 | ||||||
|
Invité de passage
![]() Inscription : mars 2011 Messages : 7 ![]() |
Aperçu de la Structure de la Table :
Citation:
Code :
Si j'essai via asp d'accéder à sID j'ai le message cité plus haut : Impossible de trouver l'objet dans la collection correspondant au nom ou à la référence ordinale demandé. J'ai également essayer de modifier comme cela : Code :
Mais bon si : Citation:
Merci |
||||||
|
|
00
|
|
|
#16 | |||||
|
Membre Expert
![]() Développeur java, access, sql server Inscription : octobre 2005 Messages : 851 ![]() |
Citation:
La 1ère pour l'UPDATE la 2ème avec SELECT Dans le code que tu postes : Code :
par ailleurs : Code :
Or, ta requête "SELECT MIN(sId),sId FROM maTable" renvoie plusieurs valeur (en plus, il y a un problème de GROUP BY!). C'est peut-être l'origine du message d'erreur précédent
__________________
D'abord qu'il marche. Ensuite qu'il soit rapide. Enfin qu'il soit agréable à utiliser. First, make it work. Then, make it fast. Finally, make it user-friendly. Erst, mach', dass es funktioniert. Dann, mach', dass es schnell geht, Zum Schluss mach' es benutzerfreundlich. |
|||||
|
|
00
|
|
|
#17 | ||
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
Je n'avais pas fait gaffe que tu ne prenais qu'une ligne à chaque fois.( MIN() )
Il y a peut etre une solution plus simple, tu peux effectivement faire un update et récuperer les valeurs en même temps : Code SQL :
et tu mets ca dans une procédure stockée avec les parametres @sID et @sNom en OUTPUT, que tu récupère dans ton appli. |
||
|
|
00
|
|
|
#18 | |
|
Membre Expert
![]() Développeur java, access, sql server Inscription : octobre 2005 Messages : 851 ![]() |
Citation:
J'ai préféré ne pas l'embarquer dans une procédure stockée, qui est certes toujours préférable, mais beaucoup moins accessible au débutant (surtout avec des paramètres OUTPUT)
__________________
D'abord qu'il marche. Ensuite qu'il soit rapide. Enfin qu'il soit agréable à utiliser. First, make it work. Then, make it fast. Finally, make it user-friendly. Erst, mach', dass es funktioniert. Dann, mach', dass es schnell geht, Zum Schluss mach' es benutzerfreundlich. |
|
|
|
00
|
|
|
#19 | ||
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
C'est l'occasion d'apprendre
les parametres output, c'est juste un mot a rajouter ! et en plus c'est facile, ce mot, c'est OUTPUT Bon cela dit c'est vrai que pour l'appeler depuis son appli, ca risque de changer la méthode... mais il a dit qu'il était débutant en SQL, pas en php ou asp... et des exemples pour faire çà, ça se trouve facilement... bref, sinon, il y a toujours moyen de faire un Code SQL :
Après l'UPDATE |
||
|
|
00
|
|
|
#20 | ||||
|
Membre Expert
![]() |
Citation:
Citation:
Si c'est le cas rien de plus facile en mettant ceci en CommandText devotre Sqlcommand: Code :
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir. |
||||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com