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

Access Discussion :

Gestion manuelle d'un identifiant et accès concurrents


Sujet :

Access

  1. #1
    Membre à l'essai

    Profil pro
    Inscrit en
    Mai 2004
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 26
    Points : 21
    Points
    21
    Par défaut Gestion manuelle d'un identifiant et accès concurrents
    Bonjour,

    j'ai déjà commencé à parler de mon pb sur le post suivant :
    http://www.developpez.net/forums/viewtopic.php?t=387474
    mais comme je m'éloigne du sujet initial, continuons sur ce post si vous le voulez bien

    Dc voilà, on me demande de mettre des numéros d'identifications à des bons de commande.
    Ceux-ci doivent avoir cette structure : AA-Num
    Par exemple, pr le premier bon de commande de l'année 2005 : 05-01
    et le deuxième bon de commande l'année 2010 : 10-02

    Personnellement, je ne me vois pas définir cet identifiant comme clé primaire de ma table BON_CMDE, celle-ci sera gérée par un numéro-auto..
    Seulement , lors de l'édition d'un bon de commande, je serai amenée à prendre le dernier numéro de ma table et à l'incrémenter pr obtenir le numéro du nouveau bon de commande..
    Ma question est donc la suivante : comment gérer le fait que 2 utilisateurs (ou plus) peuvent faire cette manip en même tps?
    (Ma base est sur le réseau.. et mes tables sont liées)

    On m'a parlé de faire des "transactions".. Comment les mettre en place?

    Merci d'avance pr votre aide

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 2 579
    Points
    2 579
    Par défaut
    Ca s'éloigne pas du tout du sujet sur ton autre topic, je te trouve bien difficile.

    Néanmoins avant de trop poser de questions qui ont déjà des réponses, fais un tour lis ces deux articles :

    http://sqlpro.developpez.com/cours/clefs/
    http://sqlpro.developpez.com/cours/sqlaz/techniques/#L1 (la partie transaction)

    C'est très bien expliqué et comprehensible. Quand tu auras ça en tête tu pourras passer à l'application sur Access.

  3. #3
    Expert confirmé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 419
    Points : 4 297
    Points
    4 297
    Par défaut
    do
    je commence ma transaction begin trans
    j'ajoute l'enregistement clef an +maxdom(numfact,facture,where left clef 2 = an)+1
    je compte le nombre de numéro identique à clef généré
    si =1 alors
    commit
    exit do
    sinon
    rollback
    j'attends un peu for x=1 to int(rand()*10000)
    loop

  4. #4
    Membre à l'essai

    Profil pro
    Inscrit en
    Mai 2004
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 26
    Points : 21
    Points
    21
    Par défaut
    Merci à vous deux pr vos conseils!

    > vmolines : je vais lire les articles cet après midi..

    > random : merci pr l'algo, ça me donne déjà 1 petit aperçu du fonctionnement!

    Je reviendrais peut-être poser des questions si je rencontre des problèmes..

    Merci encore!

  5. #5
    Membre averti

    Profil pro
    Inscrit en
    Mai 2004
    Messages
    236
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 236
    Points : 310
    Points
    310
    Par défaut
    Il y a un très bon exemple sur l'aide en ligne de microsoft pour utiliser les transactions :

    http://msdn.microsoft.com/library/de...egintransx.asp

  6. #6
    Membre à l'essai

    Profil pro
    Inscrit en
    Mai 2004
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 26
    Points : 21
    Points
    21
    Par défaut
    Bonjour,

    vmolines, j'ai lu tes articles.. Cela correspond effectivement à ce que je veux faire, mais je ne vois pas comment implémenter en VB ...
    Parce que les lignes BEGIN TRANSACTION , ROLLBACK, etc.. ne sont pas "reconnues" par Visual..
    Où mettre ce code? Comment?

    Merci d'avance

  7. #7
    Expert confirmé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 419
    Points : 4 297
    Points
    4 297
    Par défaut
    rollback est une fonction dao
    ajoute dao à tes réfs

  8. #8
    Expert confirmé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 419
    Points : 4 297
    Points
    4 297
    Par défaut
    rollback est une fonction dao
    ajoute dao à tes réfs

  9. #9
    Membre à l'essai

    Profil pro
    Inscrit en
    Mai 2004
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 26
    Points : 21
    Points
    21
    Par défaut
    La référence DAO est bien cochée..
    J'utilise beaucoup les recordset sans aucun problème..

    Dc tu me confirmes que cette syntaxe ne pose pas de pb dans VB :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    BEGIN TRANSACTION PLACE_AVION
     
    UPDATE T_VOL
    SET    VOL_PLACES_LIBRES = VOL_PLACES_LIBRES - 5
    WHERE  VOL_ID = 2
     
    INSERT INTO T_CLIENT_VOL VALUES (77, 2, 5)
     
    if (SELECT VOL_PLACES_LIBRES
        FROM T_VOL WHERE VOL_ID = 2) < 0
    then
       ROLLBACK TRANSACTION PLACE_AVION
    else
       COMMIT TRANSACTION PLACE_AVION
    ???

    Parce que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if (SELECT VOL_PLACES_LIBRES
        FROM T_VOL WHERE VOL_ID = 2) < 0
    ça me paraît 1 peu brut !

  10. #10
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 2 579
    Points
    2 579
    Par défaut
    Maintenant que tu as compris les subtilités de ton besoin et le mécanisme (c'est le plus important), il te faut appliquer à access comme tu dis.

    Access est à la fois un SGBD (Jet) et un langage de prog évènementiel (VBA). Pour piloter ton SGBD et utiliser ses mécanismes, tu peux donc utiliser les fonctions VBA qui est regoupé dans la librairie DAO (Data Access Object).

    Pour savoir quelles fonctions utiliser dans VBA (DAO), je te conseille de parcourir l'index de l'aide access qui est très bien fait (enfin pour access97 surtout, après ). Pour se faire cherche "transaction", tu auras déjà des éléments de la théorie propre à Access.

    Sache que DAO permet de tout faire sur ta base de données : sélections, modifications de données, modification de structure, consultation de structure, transactions, ...

  11. #11
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 2 579
    Points
    2 579
    Par défaut
    En effet le code que tu montres est conceptuellement faux car il mêle des instructions SQL pures et code VBA.

    Continue à utiliser VBA (DAO) dans l'esprit de tes recordsets, mais apprend maintenant à manipuler d'autres aspects de ta base avec DAO.

    N'hésite pas à revenir sur l'article d'SQLPro et à demander des précisions sur des éléments qui te bloquent.

    Si tu travailles bien (et on pourra t'aider pour ça), tu pourras même publier ton code source sur le site pour la gestion de clefs en environnement multi utilisateurs.

    Bonne chance

  12. #12
    Membre averti

    Profil pro
    Inscrit en
    Mai 2004
    Messages
    236
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 236
    Points : 310
    Points
    310
    Par défaut
    voici un petit exemple d'utilisation de transactions

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub Test() 
        Dim wks As DAO.Workspace 
        Dim dbs As DAO.Database 
        Set wks = DBEngine.CreateWorkspace("azertyuio", "admin", "", dbUseJet) 
        Set dbs = wks.OpenDatabase(CurrentDb.Name) 
        wks.BeginTrans 
        dbs.Execute "Insert into Table1(ChampTexte) values('un test')" 
        wks.Rollback 
    End Sub

  13. #13
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 2 579
    Points
    2 579
    Par défaut
    Pas très judicieux un exemple de transaction avec un seul ordre SQL quel gachis

    Enfin c'est l'intention qui compte :p

  14. #14
    Membre à l'essai

    Profil pro
    Inscrit en
    Mai 2004
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 26
    Points : 21
    Points
    21
    Par défaut
    Merci beaucoup à tous les 2 pr votre aide

    J'ai fait 1 recherche dans l'aide Access, et je suis tombée sur ça :
    Les transactions ne sont pas prises en charge sur des tables attachées.
    Qu'est ce que la notion de table attachée?
    Mes tables sont liées, cela posera-t-il un pb avec l'utilisation des transactions?
    En fait, ma base est scindée en 2 : la base en elle-même qui contient mes tables et qui est située sur un serveur, et les bases "clientes" qui sont situées sur les postes des utilisateurs et qui ne contiennent que les formulaires et états, les tables étant liées à celles de la base serveur..
    Je veux donc utiliser les transactions sur les bases "clientes", cela vous paraît-il correct?

  15. #15
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 2 579
    Points
    2 579
    Par défaut
    Ca m'étonne, tu as trouvé ça dans quel chapitre (ou quel index) ?

    edit : je suis quasi sûr que les transactions marchent très bien sur les tables liées/attachées.

  16. #16
    Membre à l'essai

    Profil pro
    Inscrit en
    Mai 2004
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 26
    Points : 21
    Points
    21
    Par défaut
    Bin je suis pas allée bien loin : j'ai fait touche F1, et tapé "transaction" dans l'index de l'aide de Visual Basic; et je suis tombée sur ça :

    Instruction SELECT...INTO
    Utilisé pour initialiser et conclure destransactions explicites.

    Syntaxe
    Initialiser une nouvelle transaction.

    BEGIN TRANSACTION

    Conclure une transaction en validant tout le travail effectué pendant la transaction.

    COMMIT [TRANSACTION | WORK]

    Conclure une transaction enannulant (rolling back) tout le travail effectué pendant la transaction.

    ROLLBACK [TRANSACTION | WORK]

    Notes
    Les transactions ne démarrent pas automatiquement. Pour démarrer une transaction, vous devez le faire explicitement à l'aide de BEGIN TRANSACTION.

    Les transactions acceptent cinq niveaux d'imbrication. Pour démarrer une transaction imbriquée, utilisez BEGIN TRANSACTION dans le contexte d'une transaction existante.

    Les transactions ne sont pas prises en charge sur des tables attachées.
    Ca me paraît bizarre aussi.. Ce genre de technique n'a pas beaucoup d'intérêt dans une appli mono-utilisateur..

    Bon je vais essayer qd même, j'ai rien à perdre de toute façon!
    Je vous tiens au courant!

  17. #17
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 2 579
    Points
    2 579
    Par défaut
    Ce qui est bizarre c'est que ce ne sont pas les fonction DAO de gestion des transactions. Or je pense que dans ton cas, c'est mieux d'utiliser DAO plutot que des instructions SQL dans une requête.

  18. #18
    Membre à l'essai

    Profil pro
    Inscrit en
    Mai 2004
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 26
    Points : 21
    Points
    21
    Par défaut
    Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    Public Function AttribueNouvCle(NumDdeA As Integer)
        Dim wks As DAO.Workspace
        Dim db As DAO.Database
        Dim rs As DAO.Recordset
        Dim Req As String
        Dim NouvNum As Integer
     
        Req = "SELECT MAX(NumCmdeY) AS MaxN FROM DDE_ACHAT"
        Set wks = DBEngine.CreateWorkspace("Verrou", "admin", "", dbUseJet)
        Set db = wks.OpenDatabase(CurrentDb.Name)
        wks.BeginTrans
        Set rs = db.OpenRecordset(Req)
     
        If Not rs.EOF Then
            NouvNum = rs.Fields("MaxN") + 1
        End If
        rs.Close
     
        db.Execute "UPDATE DDE_ACHAT SET NumCmdeY=" & NouvNum & " WHERE NumDde=" & NumDdeA
     
        Req = "SELECT COUNT(NumDde) AS Nb FROM DDE_ACHAT WHERE NumCmdeY=" & NouvNum
     
        Set rs = db.OpenRecordset(Req)
     
        If rs.EOF Then
            ' enregistrement n'a pas eu lieu..
            wks.Rollback
            AttribueNouvCle (NumDdeA)
        Else
            If rs.Fields("Nb") > 1 Then
                ' 2 enregistrements ont le même numéro => conflit, on annule et on recommence
                wks.Rollback
                AttribueNouvCle (NumDdeA)
            Else
                ' enregistrement correct, les données sont cohérentes
                wks.CommitTrans
            End If
        End If
        rs.Close
     
        wks.Close
     
     
    End Function
    Je l'ai testé sur une appli mono-utilisateur (dc pas de tables liées), ça a l'air de fonctionner..
    Cet après midi, je testerai avec des tables liées.. Qd à savoir ce qui se passera si 2 utilisateurs créent 1 dde d'achat en même tps, il faudra attendre 1 peu car je suis seule dans le bureau!
    Je vous tiendrai au courant!

    Dans un premier temps, mon code vous paraît-il correct ?

    Merci pr votre aide

  19. #19
    Expert confirmé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 419
    Points : 4 297
    Points
    4 297
    Par défaut
    tu as très peu de chance d'observer le résultat avec deux personnes
    en manuel
    pour faire ca
    utiliser deux appareils en réseau sur la même base ou deux instances d'accès avec le même programme

    lancer sur chacun une
    série longue de reqête ajout (1 000 000) avec des entiers longs ou des currency
    avec dmax+1
    s'assurer de la désyncronisation avec une boucle aléatoire
    for x=1 to int(rand()*100)
    next y
    compter les doublons
    reprendre le programme avec begin trans
    ces conflits sont comme les éclipses difficiles à observer

  20. #20
    Membre à l'essai

    Profil pro
    Inscrit en
    Mai 2004
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 26
    Points : 21
    Points
    21
    Par défaut
    Help!
    Je suis tjs en mono-poste, et j'ai l'erreur suivante :
    Impossible d'ouvrir plus de tables
    sur la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set wks = DBEngine.CreateWorkspace("Verrou", "adminfoyer", "", dbUseJet)
    D'où cela peut-il venir?

Discussions similaires

  1. Gestion des accès concurrent
    Par nicoaix dans le forum Access
    Réponses: 3
    Dernier message: 06/07/2006, 15h54
  2. Gestion des accès concurrents à une table
    Par kodo dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 20/06/2006, 14h05
  3. [Hibernate] Gestion d'acces concurrents
    Par K-Kaï dans le forum Hibernate
    Réponses: 9
    Dernier message: 01/06/2006, 16h08
  4. [Oracle][Agent intélligent]Gestion acces concurrent a une BD
    Par oussam dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 10/03/2006, 11h41
  5. gestion accès concurrent? possible quand on ouvre un fichier
    Par af_airone dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 21/11/2005, 10h02

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