Probleme d'incrementation par code [Résolu]

Signaler
Messages postés
106
Date d'inscription
mardi 4 mars 2008
Statut
Membre
Dernière intervention
2 mai 2012
-
cs_casy
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
-
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

Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
33
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
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
33
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
Messages postés
106
Date d'inscription
mardi 4 mars 2008
Statut
Membre
Dernière intervention
2 mai 2012

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 ?
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
33
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
Messages postés
106
Date d'inscription
mardi 4 mars 2008
Statut
Membre
Dernière intervention
2 mai 2012

Bonjour,
J'utilise une base de donnée access (2003).
Messages postés
106
Date d'inscription
mardi 4 mars 2008
Statut
Membre
Dernière intervention
2 mai 2012

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
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
33
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
Messages postés
106
Date d'inscription
mardi 4 mars 2008
Statut
Membre
Dernière intervention
2 mai 2012

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.
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
33
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