Probleme d'incrementation par code

Résolu
bruce207 Messages postés 106 Date d'inscription mardi 4 mars 2008 Statut Membre Dernière intervention 2 mai 2012 - 23 avril 2008 à 21:01
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 - 7 août 2008 à 17:54
Bonjour,
mon probleme est le suivant : j'ai tapé le code suivant qui va dans ma base dans le dernier enregistrement le trouve (ici des matricules ex REC1, REC2, . . .RECn), si le recorset n'est pas vide, renvoie sa longueur et en fonction de la longueur donné lui attribue (incremente) un nouveau numéro et l'affiche dans le textbox à l'ouverture de la feuille.
Form Activate()
'Instanciation de variable
Set rst = New ADODB.Recordset
Set cnx = New ADODB.Connection
'Procédure de connection
Call Connexion(cnx)
rst.Open"SELECT * FROM recu", cnx, adOpenKeyset, adLockOptimistic, adCmdText
If rst.RecordCount <> 0Then
        rst.MoveLast
        Num = Len(rst!mat_rec)
        SelectCase Num
        Case4
        i = Right(rst!mat_rec, 1)
        i = i + 1
        txtrec(0).Text = "REC" & i
        i = rst!num_rec + 1
        txtrec(1).Text = i
        Case5
        i = Right(rst!mat_rec, 2)
        i = i + 1
        txtrec(0).Text = "REC" & i
        i = rst!num_rec + 1
        txtrec(1).Text = i
        .
.
.
.
        Case14
        i = Right(rst!mat_rec, 11)
        i = i + 1
        txtrec(0).Text = "REC" & i
        i = rst!num_rec + 1
        txtrec(1).Text = i
        EndSelect
.
.


Le truc c'est que ça marche jusqu'au N°9 et s'arrete au N°10. J'ai regardé dans la base et je me suis rendu compte que le matricule REC10 se trouve juste apres REC1 (en 2eme position). J'utilise access 2003 et j'aimerais savoir comment faire pour que REC10 revienne en dernier position pour que mon code s'execute correctement ou sinon comment faire pour continuer d'incrementer mes matricules et resoudre ce probleme.
Merci d'avance<!-- / message --><!-- END TEMPLATE: bbcode_code -->

9 réponses

cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
26 avril 2008 à 16:43
Ok, si tu es sous Access2003 il vaudrait peut-etre mieux utiliser la syntaxe VBA alors plutot que la syntaxe TRANSACT/SQL

Essaye avec cette requette :
SELECT * FROM recu ORDER BY CINT(MID(mat_rec,4))

c'est la même que l'autre mais avec des noms de fonctions VBA

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #    http://aide-office-vba.monforum.com/index.php
3
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
23 avril 2008 à 21:35
Dans la mesure ou ton champ dans la base est de type alphanumérique tu ne pourras le trier que dans l'ordre alphabétique, c'est à dire caractère par caractère.
Ainsi tous les REC1xxxxxxxxxxxxxxxxxxxxxxxx se trouveront toujours avant les REC2, parce que sur le 4eme caractère 1 est avant 2 dans l'ordre alphabétique.

Regarde si une requette de ce style ne passerait pas chez toi :
SELECT * FROM recu ORDER BY CONVERT(int,SUBSTRING(mat_rec,4,999999999))

Ensuite tu peux largement simplifer ton code. Pourquoi faire un select case avec tous les cas imaginables :

Form Activate()
'Instanciation de variable
Set rst = New ADODB.Recordset
Set cnx = New ADODB.Connection
'Procédure de connection
Call Connexion(cnx)
rst.Open"SELECT * FROM recu ORDER BY CONVERT(int,SUBSTRING(mat_rec,4,999999999))", cnx, adOpenKeyset, adLockOptimistic, adCmdText
If rst.RecordCount <> 0Then
    rst.MoveLast
    i = Mid(rst!mat_rec,4)   ' Remplace tout ton Select Case
    i = i + 1
    txtrec(0).Text = "REC" & i
    i = rst!num_rec + 1
    txtrec(1).Text = i
end if
......

---- Sevyc64  (alias Casy) ---- <hr size ="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #    http://aide-office-vba.monforum.com/index.php
0
bruce207 Messages postés 106 Date d'inscription mardi 4 mars 2008 Statut Membre Dernière intervention 2 mai 2012
25 avril 2008 à 18:59
Bonjour,
j'ai essayé le code que tu m'as donné mais le debogeur s'arrete sur la ligne :
rst.Open"SELECT * FROM recu ORDER BY CONVERT(int,SUBSTRING(mat_rec,4,999999999))", cnx, adOpenKeyset, adLockOptimistic, adCmdText
et m'affiche le message suivant :
Erreur d'exécution'-2147467259(80004005)':
la méthode 'Open' de l'objet'_Recordset'a échoué
Que faire ?
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
25 avril 2008 à 21:02
tu es sur quel type de base ?

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #    http://aide-office-vba.monforum.com/index.php
0

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

Posez votre question
bruce207 Messages postés 106 Date d'inscription mardi 4 mars 2008 Statut Membre Dernière intervention 2 mai 2012
26 avril 2008 à 15:48
Bonjour,
J'utilise une base de donnée access (2003).
0
bruce207 Messages postés 106 Date d'inscription mardi 4 mars 2008 Statut Membre Dernière intervention 2 mai 2012
5 août 2008 à 15:15
Bonjour,
vu que mon application va gerer un grand nombre d'information, j'ai changé de bdd, maintenant j'utilise une bdd MySQL et le probleme d'incrementation se pose egalement avec la nouvelle bdd. Quand je met le code suivant :
'Instanciation de variable
Set rst = New ADODB.Recordset
Set cnx = New ADODB.Connection
'Procédure de connection
Call Connexion(cnx)
rst.Open"SELECT * FROM recu ORDER BY CONVERT(int,SUBSTRING(mat_rec,4,999999999))", cnx, adOpenKeyset, adLockOptimistic, adCmdText
If rst.RecordCount <> 0Then
    rst.MoveLast
    i = Mid(rst!mat_rec,4)   ' Remplace tout ton Select Case
    i = i + 1
    txtrec(0).Text = "REC" & i
    i = rst!num_rec + 1
    txtrec(1).Text = i
end if
......

j'ai le message d'erreur suivant qui pointe toujours sur la meme ligne:
Erreur d'exécution '-2147217900
....for the right syntax to use near 'int, SUBSTRING(mat_rec,4,9999999))' at line 1

je voudrais savoir comment faire pour y remedier
Merci d'avance
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
6 août 2008 à 20:50
Il semblerait apparement que avec MySQL, l'instruction Convert s'utilise un peu différemment

Essaye avec la requette suivante :

SELECT * FROM recu ORDER BY CONVERT(SUBSTRING(mat_rec,4,999999999), SIGNED)

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #    http://aide-office-vba.monforum.com/index.php
0
bruce207 Messages postés 106 Date d'inscription mardi 4 mars 2008 Statut Membre Dernière intervention 2 mai 2012
7 août 2008 à 14:49
Bonjour,


la requete marche mais elle s'arrete à la ligne en bleue





'Instanciation de variable


Set rst = New ADODB.Recordset
Set cnx = New ADODB.Connection
'Procédure de connection
Call Connexion(cnx)
rst.Open"SELECT * FROM recu ORDER BY CONVERT(SUBSTRING(mat_rec,4,999999999), SIGNED)", cnx, adOpenKeyset, adLockOptimistic, adCmdText
If rst.RecordCount <> 0Then
    rst.MoveLast
    i = Mid(rst!mat_rec,4)   
    i = i + 1
    txtrec(0).Text = "REC" & i
    i = rst!num_rec + 1
    txtrec(1).Text = i
end if
......



Et j'ai le message d'erreur suivant :

Erreur d'exécution '458':
La variable utilise un type Automation non géré par Visual Basic

et je signale que le type de num_rec est définie par mediumint(8) unsigned.
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
7 août 2008 à 17:54
Effectivement, c'est probablement le type mediumint qui n'est pas compris.

Il faudrait probablement faire une convertion mais je ne sais pas où. Je n'ai pas MySQL sous la main pour faire des tests.

Essaye, voir si ça marche, ceci :
    i = CInt(rst!num_rec) + 1

Sinon, il faudrait peut-etre faire la conversion dans le select.

SELECT CAST(num_rec AS SIGNED), mat_rec FROM recu ORDER BY CONVERT(SUBSTRING(mat_rec,4,999999999), SIGNED)

J'avoue ne pas pouvoir t'aider plus à ce niveau.

---- Sevyc64  (alias Casy) ---- <hr size ="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #    http://aide-office-vba.monforum.com/index.php
0
Rejoignez-nous