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 :

Sequence et gestion des conflits sous ACCESS


Sujet :

Access

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 45
    Points : 39
    Points
    39
    Par défaut Sequence et gestion des conflits sous ACCESS
    Bonjour,

    Je doit reprendre un intranet existant et faire des évolutions.
    La techno est imposée: ASP et Access.

    Dans ma table Access, j'ai une table commande. Avec un Numéro de commande, clé primaire, number automatique.

    Lorsqu'une personne passe une commande, on fais un INSERT dans la table commande sans le numéro de commande (vu qu'il est positionné automatiquement).

    Je doit aujourd'hui, afficher à l'écran le Numéro de commande qui viens d'être attribué à la commande passée.

    Je me dit que je peux modifier la base et rendre ce numéro de commande unique (le laisser en clé primaire), mais enlever l'attribut automatique. Dans le process ASP, je récupère le dernier numéro, je l'incrémente de 1, je fais un INSERT avec le numéro de commande et je l'affiche à l'écran....

    Mais je me demande si c'est "pro" de faire ca, au cas ou 2 utilisateurs en meme temps demanderai un n+1 du numéro et ferais un INSERT juste apres avec le meme numéro. Ok je peux afficher un message demandant a recommancer pour le 2eme, mais existe t'il une autre methode plus "pro"?

    (J'avais pensé a mettre une sequence, et le process access irait demander le dernier numéro de sequence... le numéro de commande serais alors unique, mais j'ai pas l'impression qu'on puisse faire cela en ACCESS)

    Merci de vos conseils

  2. #2
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 365
    Points : 23 835
    Points
    23 835
    Par défaut
    Ok, ta solution est professionnelle mais tu as mis le doigt sur un des pb.

    Il faut que tu gères toi-même le conflit d'accès.

    Je l'ai fait en Access mais pas en ASP. Je te mets le code que j'ai utilisé comme indice. J'utilise une table 'Compteur' qui conserve la dernière valeur calculée (à initialiser à 0). Le résultat est dans une variable globale m_NumSequence.

    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
    45
    46
    47
     
    Public Sub CalculerNouveauNumDossier(prmCodeCompteur As Variant)
        'La création du compteur doit être fait lors de la création de la période.
     
        If Not MODE_DEBUG Then
            On Error GoTo Err_CalculerNouveauNumDossier
        End If
     
        Dim db As Database: Set db = CurrentDb
     
        'Calculer le nouveau numéro séquentiel
        Dim rCompteur As Recordset: Set rCompteur = db.OpenRecordset("Compteur", dbOpenDynaset)
        Call rCompteur.FindFirst("[CodeCompteur]=""" & prmCodeCompteur & """")
     
        Dim nouveauNumSeq As Long
        If Not rCompteur.NoMatch() Then
     
    RepriseSurVerouillage:
     
                rCompteur.Edit
                nouveauNumSeq = rCompteur![DernierNumSeq] + 1
                rCompteur![DernierNumSeq] = nouveauNumSeq
                rCompteur.Update
            Else
                Error 5: 'Clef non trouvée
        End If
     
        rCompteur.Close: Set rCompteur = Nothing
        db.Close: Set db = Nothing
     
        m_NumSequence = nouveauNumSeq
     
    Exit_CalculerNouveauNumDossier:
        Exit Sub
     
    Err_CalculerNouveauNumDossier:
        Select Case Err.Number
            Case 3046, 3158, 3186, 3187, 3188, 3202, 3218, 3260, 3330, 3624
                'Boucle tant que le compteur est vérouillé
                Resume RepriseSurVerouillage
     
            Case Else
                Call AfficherMessErrStandard(Err)
                Resume Exit_CalculerNouveauNumDossier
        End Select
     
    End Sub
    Attention, si tu récupères le num au début de la création et que ton utilisateur abandonne ou que le web coupe tu vas perdre un numéro.

    En access j'ai résolu le pb en ne numérotant qu'à la sauvegarde et en empéchant les suppressions. J'ai un boolean qui indique que la facture est supprimée mais elle n'est pas effacée du fichier donc je peux toujours expliquer d'où viens le trou.

    A+

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 45
    Points : 39
    Points
    39
    Par défaut
    Salut. Merci pour ce bout de code qui permet de gérér une sequence.

    Moi je vais laisser le numéro de commande auto. je vais rajouter une colonne Identifiant. Je vais au moment de l'insert faire un numéro unique avec la date et l'heure (et les miliseconde) + un numéro aléatoire + le nom de la personne

    J'insert la commande avec ce numéro unique. Et je recherche ensuite le numéro auto qui correspond au numéro numéro unique.

    Merci pour ton code, je vais m'en inspirer pour un autre cas

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 45
    Points : 39
    Points
    39
    Par défaut
    Sinon j'ai essayé ca aussi:

    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
    dim NumeroCommande
    dim RS
     
    Set conn = Server.CreateObject("ADODB.Connection")
    conn.Open "MaBase","",""
    Set RS = Server.CreateObject("ADODB.RecordSet")
    Const adLockOptimistic = 3
    RS.Open "Commande", conn, , adLockOptimistic, adCmdTable
    RS.AddNew
    RS("Nom") = "KEROUAC"
    RS("Prenom") = "Jack"
    RS.update
    NumeroCommande = RS("Numero_Commande")
    Response.write NumeroCommande
    RS.close
    conn.close
    Set conn=Nothing
    => Je ne vois pas affichier mon index auto. [Response.write NumeroCommande]. Arf.... C'est con, j'aime pas ca bidouillé un truc tordu.

Discussions similaires

  1. Gestion des export sous access
    Par k.p-j dans le forum VBA Access
    Réponses: 13
    Dernier message: 17/04/2012, 15h18
  2. Gestion des dates sous Access
    Par joquetino dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 20/07/2008, 23h23
  3. Gestion des index sous access
    Par new_wave dans le forum Sécurité
    Réponses: 1
    Dernier message: 12/06/2008, 18h04
  4. Gestion des congés sous access
    Par squalito dans le forum Access
    Réponses: 1
    Dernier message: 09/08/2006, 23h34

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