Incrémentation

Résolu
Moundir76 Messages postés 281 Date d'inscription dimanche 3 octobre 2010 Statut Membre Dernière intervention 16 mai 2014 - 2 sept. 2013 à 15:23
Moundir76 Messages postés 281 Date d'inscription dimanche 3 octobre 2010 Statut Membre Dernière intervention 16 mai 2014 - 4 sept. 2013 à 12:37
Bonjour,

J'ai un numéro qui doit en permanence incrémenter comme un id_AI, sauf que la c'est a moi de gérer cet AI.

Exemple :

J'ajoute au fur et a mesure dans ma base de données tout en gardant toujours le prefixe A:
A000
A001
A002
A003
.......
.......
AA000
AA001
AA002
......
......
AB000
AB001



Ces numéros, je les enregistre au fur et a mesure dans ma BDD, et a chaque fois que je veux le suivant je requete pour avoir le plus grand. Et je sépare les lettres des chiffres.

Ex : Select....... => A166, j'extrais 166 et je fais 166+1.

Pour l'instant aucun souci car je n'ai pas dépassé 999 pour le moment...


Avez vous une idée pour automatiser ce processus de manière fiable ?

Cordialement



--

10 réponses

cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
2 sept. 2013 à 17:36
Salut
je n'ai pas trop compris la méthode d'incrimentation
A000 -> A999
Z000 ->Z999
ensuite ?
AA000 ->AA999
AB000 ->AB999
ZA000 ->ZA999
ZZ000 ->ZZ999

donc tu as 26 * 1000 + 26 * 26 * 1000 = 702000
pour un début
Dim str, word As String
        Dim num As Int64
        str = "ABC001"
        num = Convert.ToInt64(str.Substring(str.Length - 3, 3))
        word = str.Substring(0, str.Length - 3).ToCharArray
        If num < 999 Then
            num += 1
            str = word & num.ToString.PadLeft(3, "0"c)
        Else
            num = 0
            'ici il manque 
        End If
1
Moundir76 Messages postés 281 Date d'inscription dimanche 3 octobre 2010 Statut Membre Dernière intervention 16 mai 2014
3 sept. 2013 à 08:27
Salut ShayW,

Désolé, comme j'ai dit a Zemerlo, je n'ai pas été assez clair,

Voici la méthode d'incrémentation. L'essentiel est de garder un A comme préfixe :


A000 -> A999
AA000->AA999
AB000->AB999
AC000->AC999


Merci pour ton code je vais essayer d'adapter cela !
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
3 sept. 2013 à 09:28
ton ex n'est pas clair
après A999 on a B000 ? jusqu'à Z999 ?
donc quand on va arriver Z999 ,il faut ajouter une nouvel lettre A et l'autre Z est remis à A AA000 ?
0
Moundir76 Messages postés 281 Date d'inscription dimanche 3 octobre 2010 Statut Membre Dernière intervention 16 mai 2014
3 sept. 2013 à 09:39
L'essentiel est de garder le préfixe A.

Ainsi on a toujours A devant quoi qu'il arrive.

Voila la suite logique :

A000 -> A999
AA000->AA999
AB000->AB999
AC000->AC999
AD000->AD999
...........->...........
AZ000->AZ999
AAA000->AAA999
AAB000->AAB999


POur l'instant je vais uniquement m'interesser de A000 jusqu'a AZ999.


En fait en y réflechissant, c'est comme les anciennes plaques d'immatriculation.

(Un numéro + deux lettres (pour les vieilles plaques hein ^^) + département)
0
Moundir76 Messages postés 281 Date d'inscription dimanche 3 octobre 2010 Statut Membre Dernière intervention 16 mai 2014
3 sept. 2013 à 14:28
ShayW, a quoi correspond le c dans
str = word & num.ToString.PadLeft(3, "0"c)
?

c'est une sorte de ToChar() ?
0
Zermelo Messages postés 378 Date d'inscription samedi 22 septembre 2012 Statut Membre Dernière intervention 13 août 2017 14
3 sept. 2013 à 10:22
Bonjour Moundir76.

Ucfoutu, que je salue, a en grande partie raison. Vous risquez fort d'avoir un code hyper bidouillé s'il ne repose pas sur des principes simples. Voici ce que je vous propose.

1) À chacun de vos numéros, vous associez un rang, à partir de zéro.
2) Pour chaque numéro, vous encodez le rang en bases variables, base 10 pour les trois digits de poids faible, base 26 pour les autres digits.
3) Les représentations des digits en base 26 vont évidemment de A à Z.
4) Vous ajoutez la lettre A devant l'encodage obtenu.

Cordialement.
1
Utilisateur anonyme
3 sept. 2013 à 12:04
Salut
un Formulaire Form1, une Textbox Saisie et un bouton de commandes Suivant
Insérer le code qui suit

Valider la saisie dans la Textbox par la touche Entrée
Incrémenter avec le bouton
Pour effacer la Textbox Saisie cliquer dedans


Public Class Form1

    Private errchar As Boolean, chn As String, valide As Boolean

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        ' A000 -> A999
        ' AA000->AA999
        ' AB000->AB999
        ' AC000->AC999
        ' AD000->AD999
        ' ...........->...........
        ' AZ000->AZ999
        ' AAA000->AAA999
        ' AAB000->AAB999
        Saisie.Text = ""

    End Sub

    Private Sub Saisie_Click(sender As Object, e As EventArgs) Handles Saisie.Click

        ' on efface la zone de texte en cliquant dedans
        Saisie.Text = ""

    End Sub

    Private Sub Saisie_KeyPress(sender As Object, e As KeyPressEventArgs) Handles Saisie.KeyPress

        Dim caractere As String

        valide = False
        If e.KeyChar <> Convert.ToChar(13) Then Exit Sub
        valide = True
        Saisie.Text = Saisie.Text.ToUpper
        chn = Saisie.Text
        errchar = False
        If chn.Length < 4 Then
            MessageBox.Show("La saisie doit comporter au moins 4 caractères")
            Saisie.Text = ""
            errchar = True
        End If
        For i = 0 To chn.Length - 4
            caractere = chn.Substring(i, 1)
            If caractere > "Z" Or caractere < "A" Then
                MessageBox.Show("Seuls les 3 derniers caractères doivent être des chiffres : ceux avant doivent être des lettres")
                Saisie.Text = ""
                errchar = True
                Exit For
            End If
        Next i
        If errchar = True Then Exit Sub
        chn = chn.Substring(chn.Length - 3)
        For i = 0 To chn.Length - 1
            caractere = chn.Substring(i, 1)
            If caractere > "9" Or caractere < "0" Then
                MessageBox.Show("Vous ne devez tapez que des chiffres pour les 3 derniers caractères")
                Saisie.Text = ""
                errchar = True
                Exit For
            End If
        Next
        If errchar = False Then Increment()

    End Sub

    Private Sub Suivant_Click(sender As Object, e As EventArgs) Handles Suivant.Click

        Increment()

    End Sub

    Private Sub Increment()

        Dim valeur3 As Integer, chn3 As String, chnlettre As String, lettrefin As String, position As Integer
        Dim alphabet As String = "ABCDEFGHIJKLMNOPQRSTUVWXZ"

        If errchar = True Then
            MessageBox.Show("L'erreur à la saisie précédente n'a pas été corrigée ")
            Exit Sub
        End If
        chn = Saisie.Text

        ' test sur la valeur des trois chiffres
        valeur3 = Convert.ToInt32(chn.Substring(chn.Length - 3))
        If valeur3 < 999 Then
            valeur3 = valeur3 + 1
            chn3 = valeur3.ToString
            If chn3.Length < 3 Then chn3 = New String("0", 3 - chn3.Length) & chn3
            Saisie.Text = Saisie.Text.Substring(0, Saisie.Text.Length - 3) & chn3
        Else
            chn3 = "000"
            chnlettre = chn.Substring(0, chn.Length - 3)  ' on récupère les lettres
            If chnlettre.Length = 1 Then
                ' on insère le deuxième A pour la première fois
                Saisie.Text = "AA" & chn3
            Else
                chnlettre = chnlettre.Substring(1, chnlettre.Length - 1)
                lettrefin = chnlettre.Substring(chnlettre.Length - 1, 1)
                If lettrefin = "Z" Then
                    lettrefin = "AA" ' le Z devient A et on rajoute un A à la suite 
                Else
                    position = alphabet.IndexOf(lettrefin)
                    lettrefin = alphabet.Substring(position + 1, 1)
                End If
                If chnlettre.Length = 1 Then
                    Saisie.Text = "A" & lettrefin & "000"
                Else
                    Saisie.Text = "A" & chnlettre.Substring(0, chnlettre.Length - 1) & lettrefin & "000"
                End If
            End If
        End If
        Saisie.Refresh()

    End Sub

End Class
1
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
3 sept. 2013 à 16:57
Salut
une autre proposition

Private Function GetNextID(ByVal lastID As String) As String
' rend le prochain id  
        Dim word, ch, acc As String
        Dim flag As Boolean
        Dim num As Int64

        num = Convert.ToInt64(lastID.Substring(lastID.Length - 3, 3))
        word = lastID.Substring(0, lastID.Length - 3)
        If num < 999 Then
            num += 1
            Return word & num.ToString.PadLeft(3, "0"c)
        Else
            num = 0
            ch = word.Substring(1)
            flag = False
            acc = String.Empty
            If ch <> String.Empty AndAlso Convert.ToInt32(ch(ch.Length - 1)) < Convert.ToInt32("Z"c) Then
                Return "A" & ch.Substring(0, ch.Length - 1) & Convert.ToChar(Convert.ToInt32(ch(ch.Length - 1)) + 1).ToString & num.ToString.PadLeft(3, "0"c)
            Else
                For iter As Integer = ch.Length To 1 Step -1
                    If Convert.ToInt32(ch(iter - 1)) = Convert.ToInt32("Z"c) Then
                        acc = String.Concat(acc, "A")
                    Else
                        If Not flag Then
                            acc = Convert.ToChar(Convert.ToInt32(ch(iter - 1)) + 1) & acc & num.ToString.PadLeft(3, "0"c)
                            flag = True
                        Else
                            acc = "A" & ch.Substring(0, 1) & acc
                        End If

                    End If
                Next
                If Not flag Then
                    Return "AA" & acc & num.ToString.PadLeft(3, "0"c)
                Else
                    Return "A" & acc
                End If
            End If

        End If

    End Function


à tester
1
Moundir76 Messages postés 281 Date d'inscription dimanche 3 octobre 2010 Statut Membre Dernière intervention 16 mai 2014
4 sept. 2013 à 11:18
Salut ShayW,
Ton code fonctionne aussi parfaitement et je t'en remercie !

Cependant, peux tu me dire a quoi correspond les c que tu mets apres une chaine de caracteres ?

Comme ici :
Return word & num.ToString.PadLeft(3, "0"c)
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
Modifié par cs_ShayW le 4/09/2013 à 11:36
la méthode padleft à deux overload
padleft(int32)
padleft(int32,char)
donc le deuxieme parametre doit etre un char la raison qu'on écrit un c après la chaine de caractères en fait qui doit contenir un seul caractère
pour le convertir en char
0
Moundir76 Messages postés 281 Date d'inscription dimanche 3 octobre 2010 Statut Membre Dernière intervention 16 mai 2014
4 sept. 2013 à 11:39
Donc le c permet de faire un "ToChar()" ?
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
4 sept. 2013 à 12:11
plutot convert.tochar("3")
on ne peut pas écrire "3".tochar ,la class string n'a pas de méthode tochar meme si ton string contient un seul caractère
soit on écrit
  Dim num As Int32
        Dim str As String
        num = 1
        str = num.ToString.PadLeft(3, Convert.ToChar("0"))
       'ou 
         str = num.ToString.PadLeft(3, "0"c)


attention avec le convert.tochar si j'écris
Convert.ToChar("00") il n' y a pas d'erreur de compilation mais
une exception sera relevé
mais
PadLeft(3, "00"c) il y a une erreur de compilation
0
Moundir76 Messages postés 281 Date d'inscription dimanche 3 octobre 2010 Statut Membre Dernière intervention 16 mai 2014
4 sept. 2013 à 12:37
D'accord, j'ai appris quelquechose alors avec ce 'c'.
Merci beaucoup !
A+
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Zermelo Messages postés 378 Date d'inscription samedi 22 septembre 2012 Statut Membre Dernière intervention 13 août 2017 14
2 sept. 2013 à 17:14
Bonjour Moundir76.

Si j'ai bien compris, vous limitez à 3 le nombre de chiffres. Mais vous ne dites rien sur le nombre de lettres. Pourquoi ?
Cordialement.
0
Moundir76 Messages postés 281 Date d'inscription dimanche 3 octobre 2010 Statut Membre Dernière intervention 16 mai 2014
3 sept. 2013 à 08:22
Bonjour Zermelo,

Voilà, il faut la lettre 'A' (et toujours la lettre A pour commencer l'id) suivi de 3 chiffres.
Quand on arrive a 999, on rajoute une deuxieme lettre.

A000 -> A999
AA000->AA999
AB000->AB999
AC000->AC999


Pardonnez moi si je n'ai pas été assez clair dès le départ.

Cordialement.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
2 sept. 2013 à 19:11
Bonjour,
Une incrémentation qui passe par une décomposition d'une chaîne de caractères ne peut qu'alourdir l'exécution et on en voit mal la raison éventuelle.
0
Moundir76 Messages postés 281 Date d'inscription dimanche 3 octobre 2010 Statut Membre Dernière intervention 16 mai 2014
3 sept. 2013 à 08:18
Bonjour ucfoutu,

La raison est que c'est une directive ...

Les articles doivent être toujours identifié avec un A devant et 3 digits derriere... et ce doit toujours être un A en premier, et ensuite on rajoute une lettre ....

Je sais bien que ce n'est pas la meilleure solution, mais c'est une directive non négociable...
0
Utilisateur anonyme
3 sept. 2013 à 12:41
Pour Zermelo

A000 -> A999
AA000->AA999
AB000->AB999
AC000->AC999
AD000->AD999
...........->...........
AZ000->AZ999 ' on ne passe pas à BA000 (le Z devient A et on rajoute un A pour faire AAA
AAA000->AAA999
AAB000->AAB999

dans cette suite logique donnée par Moundir76 on s'aperçoit que c'est uniquement la dernière lettre qui est "incrémentée" si il y a 2 lettres ou plus !

Donc l'idée de base 26 ne me semble pas bonne car elle "incrémenterait" toutes les lettres avec retenue si on dépasse Z : le Z deviendrait A et la lettre précédente serait "incrémentée"
0
Zermelo Messages postés 378 Date d'inscription samedi 22 septembre 2012 Statut Membre Dernière intervention 13 août 2017 14
3 sept. 2013 à 13:02
Bonjour codeagogo.

Ce que vous dites est juste. Mais je ne suis pas sûr que Moundir76 soit bien fixé sur la règle d'incrémentation. À lui de décider.
De toute manière, je ne donnerai pas de code tout fait, car ce serait contraire à l'esprit de ce forum.

Cordialement.
0
Utilisateur anonyme
3 sept. 2013 à 14:00
Bonjour Zermelo
il faut dire que je me suis intéressé à son problème un peu par défi !
Ayant trouvé une solution qui est difficilement explicable je lui ai fourni un exemple !
A lui de l'adapter à son cas précis
0
Moundir76 Messages postés 281 Date d'inscription dimanche 3 octobre 2010 Statut Membre Dernière intervention 16 mai 2014
Modifié par Moundir76 le 3/09/2013 à 14:38
Messieurs,

Merci à vous deux pour vos réponses. J'ai bien compris votre logique Zemerlo. Je suis cependant fixé à la règle cité plus haut "Toujours commencer par un A. Pour commencer, je vais uniquement faire de A000 à AZ999.

Codeagogo, merci pour t'être penché sur mon problème et avoir trouvé une solution !


Zermelo, quand vous dites que ce n'est pas l'esprit du forum, je ne suis pas tout a fait d'accord avec vous. C'est un forum d'entraide, certes, et on ne vient pas chercher une solution toute prête comme certains demandent "il me faut un code pour une calculatrice" par exemple.....

Cependant, cela fait 2-3 ans que j'ai commencé le VB.NET et au début certaines personnes m'ont aidé en me donnant carrement un bout de leur programme.

Le copier/coller est stupide. Cependant, cela m'a permis de réflechir à la solution proposée et de la comprendre. L'essentiel n'est pas de trouver soi même, mais de comprendre ce que l'on a dans son programme et être capable de le refaire ultérieurement.

Donc non, codeagogo ne fait rien qui va a l'encontre de l'esprit du forum !

Vous pouvez regarder mes autres discussions, et voir que même quand on me donne un code tout fait, j'ai énormement de questions pour comprendre.

Evidemment, ceci n'est pas pareil pour tout le monde ni pour tous les cas !

Cordialement.
0
Zermelo Messages postés 378 Date d'inscription samedi 22 septembre 2012 Statut Membre Dernière intervention 13 août 2017 14
3 sept. 2013 à 15:44
À Moundir76.

Je ne suis pas sûr que vous ayez complètement compris "ma" logique. En effet, son quatrième alinéa fait que la règle "toujours commencer par un A" est satisfaite.

Vous pouvez observer que codagogo a bien vu que je ne le visais pas en disant que je refusais de donner un code tout fait : il a précisé "à lui de l'adapter à son cas précis".

En ce qui me concerne, je serais prêt à donner les codes d'encodage/décodage à base variable, à charge pour vous de les adapter à votre cas précis.

Cordialement
0
Moundir76 Messages postés 281 Date d'inscription dimanche 3 octobre 2010 Statut Membre Dernière intervention 16 mai 2014
3 sept. 2013 à 16:00
Si si j'ai très bien compris, j'ai aussi compris qu'il fallait l'adapter, en ajoutant un "A" devant le résultat.

Je n'ai nul besoin de code, sauf quand vraiment je n'arrive à rien. Avec les information que vous m'avez données, ainsi que celles des autres, j'ai tout pour réussir et avancer !

Encore merci,

Bonne fin de journée
0
Utilisateur anonyme
3 sept. 2013 à 16:05
Moundir76

Dans mon code nul besoin de rajouter quoi que soit devant !
C'est la sub Increment() qui fait tout le boulot !
je dépose un code test sur le site à ton intention
0
Rejoignez-nous