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 :

Continuer une numérotation


Sujet :

Access

  1. #1
    Membre régulier
    Inscrit en
    Octobre 2006
    Messages
    171
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 171
    Points : 122
    Points
    122
    Par défaut Continuer une numérotation
    Bonjour,
    Je numérote des documents suivant la série suivante:
    01/2007,02/2007,03/2007 et ainsi de suite.
    Pour aider la saisie des documents suivants je voudrais afficher une zone de liste qui fasse apparaitre:
    04/2007,05/2007,06/2007,07/2007,.....,13/2007 (une série de 10 numéros).
    Cette série doit être évolutive c'est à dire que lorsque 04/2007 est choisi ce numéro n'apparait plus mais le 14/2007 apparait.

    Un numéro (par exemple 06/2007) peut être choisi avant les autres, dès lors il doit disparaitre de la liste qui deviendrai par exemple
    04/2007,05/2007,07/2007,.....14/2007.

    Il s'agit bien entendu d'une BDD multi-utilisateur en réseau qui peuvent accomplir la même action.

    Pouvez vous m'aider?
    Merci.

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 335
    Points : 23 793
    Points
    23 793
    Par défaut
    Salut, bon le pb c'est qu'avec une liste de 10 et plusieurs utilisateurs rien n'empêche 2 utilisateurs de choisir le même numéro.

    Donc pourquoi offrir le choix et ne pas simplement calculé le num suivant disponible ?

    Personnelement je calcule le nouveau numéro seulement quand j'ai un vrai nouvel enr dans ma table c'est à dire que l'utilisateur a saisie au moins un champ sinon le compteur n'est pas incrémenté pour éviter les trous. J'utilise une table de compteur qui mémorise la dernière valeur calculée.

    ex de 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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
     
    Public Sub CalculerNouveauNumDossier(prmClefPeriode As Long, prmTypeFacturation 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
        Dim ClefTypeFacturation As Long
        Dim CodeTypeFacturation As String
     
        Select Case VarType(prmTypeFacturation)
            Case vbString
                ClefTypeFacturation = LireClefTypeFacturation((prmTypeFacturation))
                CodeTypeFacturation = prmTypeFacturation
            Case vbLong, vbInteger, vbDouble
                ClefTypeFacturation = prmTypeFacturation
                CodeTypeFacturation = LireCodeTypeFacturation((prmTypeFacturation))
            Case Else
                Error 5
        End Select
     
        'Lire l'année du compteur
        Dim Annee As Integer
        Dim rPeriode As Recordset: Set rPeriode = db.OpenRecordset("Periode", dbOpenDynaset)
        Call rPeriode.FindFirst("[Clef]=" & prmClefPeriode)
     
        If Not rPeriode.NoMatch Then
                Annee = Year(rPeriode![DateDebut])
            Else
                Error 3709: 'Clef non trouvée
        End If
     
        rPeriode.Close: Set rPeriode = Nothing
     
        m_Annee = Annee
     
        'Lire le code court
        Dim rTypeFacturation As Recordset: Set rTypeFacturation = db.OpenRecordset("TypeFacturation", dbOpenDynaset)
        rTypeFacturation.FindFirst ("[Clef]=" & ClefTypeFacturation)
     
        If Not rTypeFacturation.NoMatch Then
                m_Code = rTypeFacturation![CodeCourt]
            Else
                Error 3709: 'Clef non trouvée
        End If
     
        rTypeFacturation.Close: Set rTypeFacturation = Nothing
     
        'Calculer le nouveau numéro séquentiel
        Dim rCompteur As Recordset: Set rCompteur = db.OpenRecordset("Compteur", dbOpenDynaset)
        Call rCompteur.FindFirst("[ClefTypeFacturation]=" & ClefTypeFacturation & " and [Annee]=" & Annee)
     
        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
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  3. #3
    Expert éminent

    Avatar de Maxence HUBICHE
    Homme Profil pro
    Développeur SQLServer/Access
    Inscrit en
    Juin 2002
    Messages
    3 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur SQLServer/Access

    Informations forums :
    Inscription : Juin 2002
    Messages : 3 842
    Points : 9 197
    Points
    9 197
    Par défaut
    Manque d'informations....

    2007, c'est l'année en cours ?
    Que se passe-t-il à 100 ?
    Quelle est la base de départ ?
    Que se passe-t-il si plusieurs utilisateurs travaillent avec le même n° en même temps ?

    Bon, un élément de réflexion en attendant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Function SerieNumerique(IDDepart as long, Annee as long) as string
    Dim i as long
    Dim s as String 
    for i = 1 to 10
        s=s & ";" & IDDepart + i & "/" & Annee 
    next
    SerieNumerique =mid(s,2)
    End Function
    Après chaque MAJ, tu redéfinis la propriété contenu (RowSource) de ta liste en fonction du résultat de la fonction.
    Bien sûr, à chaque fois, il faut lui redonner l'ID de départ et l'année.
    Mais, bien sûr, il est possible d'imaginer une variante qui va chercher la plus grande valeur présente dans la table, et qui s'en sert comme point de départ...

    Enfin, bon, ce ne sont que quelques idées.


  4. #4
    Membre régulier
    Inscrit en
    Octobre 2006
    Messages
    171
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 171
    Points : 122
    Points
    122
    Par défaut
    Merci pour vos réponses


    Voici mes réponses à vos questions.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Donc pourquoi offrir le choix et ne pas simplement calculé le num suivant disponible ?
    - il s'agit d'une saisie après analyse d'une situation, voir la dernière réponse.

    2007, c'est l'année en cours ?
    - Oui

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Que se passe-t-il à 100 ?
    - On continue mais pourquoi cette question? Le max par année sera 999.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Quelle est la base de départ ?
    - 1, pour chaque année on recommence la numérotation.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Que se passe-t-il si plusieurs utilisateurs travaillent avec le même n° en même temps ?
    - Bonne question, mais en principe cela ne doit pas arriver. En effet, ce programme servira à un suivi de chantierS. Pour être plus explicite il s'agit de l'établissement de plan de prévention.
    Donc dans un premier temps on va sur le terrain mais on a choisi déjà son numéro d'enregistrement de chantier sur un registre papier.
    Ensuite, en final, on passe à la rédaction du plan à l'aide de l'outil informatique.
    On peut être trois ou quatre à faire ce travail en même temps.

    Voilà, peut être ces réponses vous permettrons de m'apporter plus d'exemples

  5. #5
    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 crées une table ajout avec un champ nommé plus dans lequel tu entres
    1,2...10 et tu lances cette requête
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT TOP 10 Format(Val(Left([monchiffre],InStr([monchiffre],"/")-1))+[plus],"000") & "/" & Year(Date()) AS Expr1
    FROM matable, ajout
    GROUP BY Format(Val(Left([monchiffre],InStr([monchiffre],"/")-1))+[plus],"000") & "/" & Year(Date()), Val(Left([monchiffre],InStr([monchiffre],"/")-1))+[plus]
    HAVING (((Format(Val(Left([monchiffre],InStr([monchiffre],"/")-1))+[plus],"000") & "/" & Year(Date())) Not In (select monchiffre from matable;)))
    ORDER BY Val(Left([monchiffre],InStr([monchiffre],"/")-1))+[plus];
    nb mon chiffre est ta clef 001/2007 et suppose un format 000/2007
    Elle est pas belle la vie ?

  6. #6
    Expert éminent

    Avatar de Maxence HUBICHE
    Homme Profil pro
    Développeur SQLServer/Access
    Inscrit en
    Juin 2002
    Messages
    3 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur SQLServer/Access

    Informations forums :
    Inscription : Juin 2002
    Messages : 3 842
    Points : 9 197
    Points
    9 197
    Par défaut
    Citation Envoyé par Stargate SG1
    Que se passe-t-il à 100 ?
    - On continue mais pourquoi cette question? Le max par année sera 999.
    Parce que le format va être important, puisqu'il ne sera pas de 00/0000 mais de 000/0000, sinon, tu perds l'ordre de tri sur des chaines
    Citation Envoyé par Stargate SG1
    [
    Quelle est la base de départ ?
    - 1, pour chaque année on recommence la numérotation.
    OK, ce n'est pas la réponse que j'attendais, mais, au vu des autres réponses, j'ai compris...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Function SerieNumerique(Annee as long) as string
    Dim i as long
    Dim s as String 
    Dim IDDepart as Variant
     
    IDDepart=nz(dMax("[ChampClef]","[Table]","VAL(RIGHT([ChampClef],4))=" & Anne),0)
    
    for i = 1 to 10
        s=s & ";" & IDDepart + i & "/" & Annee 
    next
    SerieNumerique =mid(s,2)
    End Function


    Sauf grosse bourde, ca ne doit pas être trop mal !

    PS :
    Pense à remplacer ChampClef et Table par les bons noms.
    Ensuite, affecte la propriété contenu de ton champ en fonction du résultat de la fonction

Discussions similaires

  1. Réponses: 1
    Dernier message: 08/10/2013, 16h14
  2. Réponses: 3
    Dernier message: 28/12/2007, 10h53
  3. Comment écrire une numérotation dans la marge ?
    Par lucterius dans le forum Word
    Réponses: 2
    Dernier message: 07/09/2007, 11h57
  4. attendre un evenement pour continuer une boucle
    Par dederfred dans le forum Flash
    Réponses: 2
    Dernier message: 20/01/2007, 20h01
  5. [Formulaire continu] une ligne sur deux en gris
    Par genius99 dans le forum IHM
    Réponses: 7
    Dernier message: 30/10/2005, 18h52

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