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

WinDev Discussion :

Base multi utilisateurs, accès exclusif à un enregistrement


Sujet :

WinDev

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2004
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 30
    Points : 12
    Points
    12
    Par défaut Base multi utilisateurs, accès exclusif à un enregistrement
    Bonjour à tous

    En quelques mots, voici mon besoin :

    J'ai une table contenant une liste de tâches "à traiter".
    J'ai une 20aine d'utilisateurs accèdant simultanément à cette liste et devant traiter l'ensemble des tâches.
    Chaque utilisateur ne doit traiter qu'une tâche à la fois.
    Une même tâche ne doit pas être traitée simultanément par plusieurs utilisateurs.
    Une tâche une fois traitée va, soit être marquée comme "effectuée" et ne sera donc plus accessible aux utilisateurs, soit être marquée comme "à retraiter" ultérieurement.
    Une tâche marquée comme "à retraiter" doit l'être après que l'ensemble des tâches "à traiter" soient traitées

    Pour donner une image qui parlera à tout le monde, imaginez un tas de papier à traiter.
    Chaque utilisateur prend le premier papier, celui en haut de la pile, et le traite.
    En fonction des règles métiers en vigueur, soit il le classe, soit il le met sous la pile afin qu'il soit retraité ultérieurement.
    Cela jusqu'à ce que l'ensemble des papiers soient classés.

    Je n'ai aucune idée de la méthode à utiliser pour arriver à mes fins ... si une bonne âme pouvait me donner un coup de main !
    A ce stade de la réflexion, je n'ai pas ou peu de contraintes sur la structure de la table devant accueillir les données.

  2. #2
    Membre éprouvé Avatar de wimbish
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 416
    Points : 1 073
    Points
    1 073
    Par défaut
    Bonjour,
    Utilise le blocage d'enregistrement : Fonction Hbloque() ou les option des fonction Hlit.

    Pour chaque utilisateur qui tente de lire un enregistrement, tu vérifie que ce dernier n'est pas bloqué (donc traité par quelqu'un d'autre)

  3. #3
    Membre émérite
    Homme Profil pro
    Développeur et responsable micros/réseaux
    Inscrit en
    Octobre 2010
    Messages
    1 286
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur et responsable micros/réseaux
    Secteur : Bâtiment

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 286
    Points : 2 562
    Points
    2 562
    Par défaut
    Bonjour,

    en fait imagines ta table papier, tu mets 2 colonnes de plus que les données : Traitee, AReTraiter.
    Tu fais une requête sur les lignes qui ont une valeur 0 dans les 2 colonnes.

    Si tu as des lignes, tu les affiches.

    Si tu n'en as pas, tu fais une 2e requête avec colonne AReTraiter = 1.

    Si tu n'en as pas, aucun papier dans la pile !

    Il faudra gèrer un timer qui te permet de rafraichir le tableau de papiers en attente si l'écran est affiché depuis longtemps et que le rythme de remplissage est assez rapide.

    à bientôt et bon courage,

    Nicolas

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2004
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 30
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par wimbish Voir le message
    Bonjour,
    Utilise le blocage d'enregistrement : Fonction Hbloque() ou les option des fonction Hlit.

    Pour chaque utilisateur qui tente de lire un enregistrement, tu vérifie que ce dernier n'est pas bloqué (donc traité par quelqu'un d'autre)


    Merci pour ta réponse !

    Donc l'idée serait de procéder comme suit :

    - Créer une table des tâches à effectuer comprenant un champs utilisateur & une date de traitement.

    - A chaque demande d'un utilisateur, lui mettre à disposition le premier enregistrement ayant la plus petite date de traitement et n'étant pas affecté à un utilisateur

    - Affecter à l'utilisateur la tâche ainsi retournée tout en la bloquant en lecture/ecriture

    - En fin de traitement, supprimer l'affectation de la tâche à l'utilisateur et soit de modifier la date de traitement à la date/heure/microseconde actuelle (ce qui aura pour effet de le faire passer après les autres, plus anciens) soit le supprimer de la table

    Est ce que le procédé semble correct ?

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2004
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 30
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par Nicolas_Jeanneau Voir le message
    Bonjour,

    en fait imagines ta table papier, tu mets 2 colonnes de plus que les données : Traitee, AReTraiter.
    Tu fais une requête sur les lignes qui ont une valeur 0 dans les 2 colonnes.

    Si tu as des lignes, tu les affiches.

    Si tu n'en as pas, tu fais une 2e requête avec colonne AReTraiter = 1.

    Si tu n'en as pas, aucun papier dans la pile !

    Il faudra gèrer un timer qui te permet de rafraichir le tableau de papiers en attente si l'écran est affiché depuis longtemps et que le rythme de remplissage est assez rapide.

    à bientôt et bon courage,

    Nicolas
    Merci pour ta réponse. S'agissant de la gestion des ficher à traiter et/ou à retraiter, je n'ai pas trop de soucis et je pense que mon idée de poser ula date de traitement sur chaque fiche (cf mon post ci dessus) doit répondre au besoin.
    C'est surtout la gestion de l'accès exclusif et de la selection de la tâche qui me pose problème...

  6. #6
    Membre éprouvé Avatar de wimbish
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 416
    Points : 1 073
    Points
    1 073
    Par défaut
    Ta méthode me semble bonne.
    Attention cependant, si tu sélectionne l'enregistrement ayant la plus petite date de traitement, les dates vides serons traitées en premier (ok) mais quand toutes aurons été traitées, tu retraiteras des taches déjà traitées.
    Je te conseil donc de ne rechercher que les enregistrements ayant des dates vides.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2004
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 30
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par wimbish Voir le message
    Ta méthode me semble bonne.
    Attention cependant, si tu sélectionne l'enregistrement ayant la plus petite date de traitement, les dates vides serons traitées en premier (ok) mais quand toutes aurons été traitées, tu retraiteras des taches déjà traitées.
    Je te conseil donc de ne rechercher que les enregistrements ayant des dates vides.
    Oui, c'est exactement ce que je souhaites !
    Tant qu'une tâche n'est pas classée (cad supprimée en somme), elle reste à traiter ... cf mon exemple de la pile de papier

    Donc je valide le procédé, il faut maintenant que je trouve comment faire cela proprement sous windev, et ça c'est pas gagné, je ne maitrise que peu le bouzin

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2004
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 30
    Points : 12
    Points
    12
    Par défaut
    D'ailleurs, sous Windev avec une base hyperfile classic, quelle est la meilleure méthode pour selectionner l'enregistrement d'une table correspondant aux deux critères cités plus haut (plus petite date de traitement, ou null le cas écdhéant, et pas affecté à un utilisateur), tout en le bloquant en lecture/ecriture ?
    En sql, c'est simple comme bonjour, mais je seche un peu avec les hlitrecherche, hlitrecherchepremier et tutti quanti ...

  9. #9
    Membre émérite
    Homme Profil pro
    Développeur et responsable micros/réseaux
    Inscrit en
    Octobre 2010
    Messages
    1 286
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur et responsable micros/réseaux
    Secteur : Bâtiment

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 286
    Points : 2 562
    Points
    2 562
    Par défaut
    je ferais un test sur l'ID d'enregistrement pour trouver le plus petit et donc le plus ancien. Ensuite tu fais une requête pas un hlitrecherche, c'est nettement plus simple.

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2004
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 30
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par Nicolas_Jeanneau Voir le message
    je ferais un test sur l'ID d'enregistrement pour trouver le plus petit et donc le plus ancien. Ensuite tu fais une requête pas un hlitrecherche, c'est nettement plus simple.
    Sur l'ID ca marche pas dans le cas d'une tâche à retraiter : son ID sera plus petit que d'autres tâches, mais il devra être retraité après.

    Mais en revanche je peux adapter ta proposition à la date de traitement, ainsi si je comprends bien :
    1/ je cherche le 1er dossier ayant la plus petite date de traitement (si aucun n'a encore été traité, il me sort la 1ere ligne avec une date nulle)
    2/ je vérifie qu'il n'est pas affecté à un autre utilisateur
    3/ je l'affecte à l'utilisateur qui vient d'en faire la demande, tout en le bloquant en lecture/ecriture.

    Cela étant, dans ce procédé, je redoute les accès concurrents et le risque d'affecter en simultané une même tâche à 2 utilisateurs ...

    y'a pas moyen de faire tout cela en une seule requête ?

    Ou alors il faut utiliser des transactions ?

  11. #11
    Membre émérite
    Homme Profil pro
    Développeur et responsable micros/réseaux
    Inscrit en
    Octobre 2010
    Messages
    1 286
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur et responsable micros/réseaux
    Secteur : Bâtiment

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 286
    Points : 2 562
    Points
    2 562
    Par défaut
    Si c'est l'utilisateur qui prend une tâche, la question de blocage devrait se faire toute seule si tu utilises la fonction Hbloque.

    Concernant la recherche, je ferais un tri sur Date,ID en effet.

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2004
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 30
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par Nicolas_Jeanneau Voir le message
    Si c'est l'utilisateur qui prend une tâche, la question de blocage devrait se faire toute seule si tu utilises la fonction Hbloque.

    Concernant la recherche, je ferais un tri sur Date,ID en effet.
    Donc :
    1/ on cherche un enregistrement ayant la plus petite date de traitement
    2/ on vérifie qu'il n'est pas affecté à un autre utilisateur
    3/ on le bloque et on l'affecte à l'utilisateur

    C'est bien ça ?

    Mais alors, durant les étapes 1/ et 2/ on risque bien des accès concurrents avec 2 utilisateurs pointant sur le même enregistrement ?
    Comment tu palies ce risque ?

  13. #13
    Membre éprouvé Avatar de wimbish
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 416
    Points : 1 073
    Points
    1 073
    Par défaut
    Bonjour,
    C'est ta fonction de lecture qui doit gérer le blocage.
    SI HLit(LeFichier,hNumEnrEnCours,hBlocageLectureEcriture) ALORS
    //Traitement et l'enregistrement devient bloqué
    SINON
    // l'enregistrement est déjà bloqué, il faut en lire un autre.
    FIN

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2004
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 30
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par wimbish Voir le message
    Bonjour,
    C'est ta fonction de lecture qui doit gérer le blocage.
    SI HLit(LeFichier,hNumEnrEnCours,hBlocageLectureEcriture) ALORS
    //Traitement et l'enregistrement devient bloqué
    SINON
    // l'enregistrement est déjà bloqué, il faut en lire un autre.
    FIN
    Parfait ! je suis passé à côté de la smiplicité et n'ai pas vu que tout pouvait être géré par cette fonction ...

    Question complémentaire : quel est l'interet de gerer l'enregistrement bloqué ? puisqu'il est bloqué, il n'est pas accessible, donc Windev va nous positionner sur le suivant automatiqeument non ?


    Merci à vous pour votre aide (et patience !)

  15. #15
    Membre émérite
    Homme Profil pro
    Développeur et responsable micros/réseaux
    Inscrit en
    Octobre 2010
    Messages
    1 286
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur et responsable micros/réseaux
    Secteur : Bâtiment

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 286
    Points : 2 562
    Points
    2 562
    Par défaut
    ah non il ne fait pas ça ! Il t'indique que tu ne peux pas le modifier car il est bloquer, que tu peux parfois pas le lire non plus etc ...

    Pour passer au suivant, il faut utiliser les fonctions H.

  16. #16
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2004
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 30
    Points : 12
    Points
    12
    Par défaut
    Bon, après quelques galères sur la gestion des enregistrements bloqués, voila où j'en suis :

    HSurErreur("Campagnes_Dossiers", hErrBlocage, "CampagneDossierSuivant")
    HLitPremier(Campagnes_Dossiers,DateIntegration,hBlocageLectureEcriture)

    traitement à effectuer par l'utilisateur

    Campagnes_Dossiers.DateIntegration = DateSys() + HeureSys()
    HModifie(Campagnes_Dossiers,hNumEnrEnCours)
    La procédure de gestion des erreurs étant :

    PROCEDURE CampagneDossierSuivant()

    HLitSuivant(Campagnes_Dossiers,DateIntegration,hBlocageLectureEcriture)
    Après quelques tests en multi utilisateurs, cela semble fonctionner.

    Vous en pensez quoi ?

  17. #17
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2004
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 30
    Points : 12
    Points
    12
    Par défaut
    Bon, j'ai crié victoire trop vite. Cela fonctionne en mode multi utilisateurs ....aléatoirement !

    Après de multiples essais, j'en suis là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    HSurErreur(Campagnes_Dossiers,hErrBlocage,"")
    
    HLitPremier(Campagnes_Dossiers,DateIntegration,hBlocageLectureEcriture)
    
    TANTQUE HEnDehors()
    	HLitSuivant(Campagnes_Dossiers,DateIntegration,hBlocageLectureEcriture)
    FIN
    
    Traitement de la tâche par l'utilisateur
    
    Campagnes_Dossiers.DateIntegration = DateSys() + HeureSys()
    HModifie(Campagnes_Dossiers,hNumEnrEnCours,hBlocageLectureEcriture)
    Je test avec plusieurs interfaces ouvertes en appelant une tâche alternativement de l'une puis de l'autre, et inévitablement cela finit par planter avec le message suivant :

    Erreur à la ligne 6 du traitement Clic sur BTN_Bouton3.
    Vous avez appelé la fonction HLitSuivant.
    Une erreur de blocage est survenue sur la fonction 'HLitPremier' précédente et n'a pas été traitée.
    Fonction appelée à la ligne 3 du traitement 'Clic sur BTN_Bouton3'.
    Je comprends bien le message mais je ne vois pas quoi modifier pour que cela ne se reproduise pas ...

  18. #18
    Membre éprouvé Avatar de wimbish
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 416
    Points : 1 073
    Points
    1 073
    Par défaut
    Bonjour,
    la procédure appelée par fonction HsurErreur doit renvoyer une constante (cf Aide)

  19. #19
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2004
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 30
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par wimbish Voir le message
    Bonjour,
    la procédure appelée par fonction HsurErreur doit renvoyer une constante (cf Aide)
    oui, j'ai testé avec opAnnuler, même résultat...

  20. #20
    Membre émérite
    Homme Profil pro
    Développeur et responsable micros/réseaux
    Inscrit en
    Octobre 2010
    Messages
    1 286
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur et responsable micros/réseaux
    Secteur : Bâtiment

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 286
    Points : 2 562
    Points
    2 562
    Par défaut
    Si tu es passé avec une boucle Tantque il te faut tester le retour de HerreurBlocage en même temps que Hendehors :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Tantque pas hendehors(Campagnes_Dossiers) et HErreurBlocage(Campagnes_Dossiers)
         hlitsuivant(Campagnes_Dossiers, DateIntegration, hBlocageLectureEcriture)
    FIN
    à voir

Discussions similaires

  1. [AC-2003] Accès mode exclusif sur base multi-utilisateur
    Par hyppo74 dans le forum IHM
    Réponses: 4
    Dernier message: 05/09/2013, 19h11
  2. Base multi utilisateurs
    Par chabagrou dans le forum Sécurité
    Réponses: 5
    Dernier message: 27/02/2007, 17h16
  3. base multi-utilisateurs et droits différents
    Par spacergirly dans le forum Sécurité
    Réponses: 5
    Dernier message: 12/02/2007, 15h11
  4. Base multi utilisateur
    Par Daniel MOREAU dans le forum Access
    Réponses: 2
    Dernier message: 10/05/2006, 15h00
  5. verrouillage des données / base Multi utilisateurs
    Par DI DODO dans le forum Access
    Réponses: 1
    Dernier message: 27/03/2006, 15h34

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