Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Une fonction plus simple que celle-ci

3 réponses
Avatar
Papy Frenchie
voici une fonction que j'ai créé fonctionnant très bien
mais donc j'aimerais savoir s'il y a moyen de simplifier nettement la chose.
j'ai une table qui s'appelle t2cour où un champ numérique à pour nom
NumIntDep
cette table est dans le même fichier mdb

ce qui me déplait (je n'ai peut être pas le choix) c'est les déclarations du
type SET
pas facilement controlable et les dim des adodb.recordset
ainsi que la libération de la fonction en mémoire

y a t'il moyen de faire bien plus simple pour la même efficacité ?


Cette fonction me permet de créer un compteur automatique pour le suivi
d'une base courrier où l'utilisateur
doit toujours mettre un numéro d'enregistrement du format 200300001
de cette manière on peut se rendre compte que la base permet 100000
enregistrement maximum par an
et passe automatiquement à 200400001 l'année suivante

Function NumDepart()
On Error GoTo ErreurHic
'd'abord j'ouvre une pseudo connection
Dim cnn As ADODB.Connection
Dim Recherche As ADODB.Recordset

' précise l'objet comme étant une base virtuelle

Dim rst As New ADODB.Recordset
' precise que nous sommes dans le projet en cours
Set cnn = CurrentProject.Connection
' variable de la requete sql
Dim StrSql As String
Dim Compteur As Variant
Compteur = Year(Now) * 100000


StrSql = "SELECT Max(t2cour.NumIntDep) AS Reponse FROM t2cour; "



rst.Open StrSql, cnn
Compteur = rst.GetString(adClipString, 1)

NumDepart = Compteur + 1

If NumDepart <= 1 Or NumDepart < (Year(Now) * 100000) Then GoTo
ErreurDepart:

rst.Close

' Détruit les variables objet.
Set rst = Nothing
Set cnn = Nothing
Set Recherche = Nothing

GoTo Fin


ErreurDepart:
NumDepart = Year(Now()) * 100000 + 1
GoTo Fin

ErreurHic:
MsgBox "impossible de créer la numérotation automatique"

Fin:
Set rst = Nothing
Set cnn = Nothing
Set Recherche = Nothing
End Function

3 réponses

Avatar
3stone
Salut,

"Papy Frenchie" a écrit
| ce qui me déplait (je n'ai peut être pas le choix) c'est les déclarations du
| type SET
| pas facilement controlable et les dim des adodb.recordset
| ainsi que la libération de la fonction en mémoire
| y a t'il moyen de faire bien plus simple pour la même efficacité ?


Moi, et cela n'engage que moi ;-) je n'aime pas les "goto" autres que pour la gestion d'erreur,
ainsi que les erreurs qui font partie du fonctionnement "normal" d'une fonction...
Je préfère prévoir tous les cas dans la fonction et garder la gestion d'erreur
pour les mauvais sorts ;o)

Avec un "Option explicit" les déclarations ne me gène pas... ni leurs libérations !

En DAO, j'aurai fait quelque chose comme ceci... (pour un NumIntDe numérique)


Function f_Code()
On Error GoTo err_Code

Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim lngMax As Long
Dim lngCode As Long

lngCode = Year(Date) * 100000

Set db = CurrentDb
Set rs = db.OpenRecordset("SELECT Max(NumIntDep) AS MaxDeNumIntDep FROM t2cour;")

lngMax = Nz(rs!MaxDeNumIntDep, 0)

If (lngMax = 0) Or (lngCode > lngMax) Then
lngCode = lngCode + 1
Else
lngCode = lngMax + 1
End If

exit_Code:
f_Code = lngCode
rs.Close: db.Close
Set rs = Nothing
Set db = Nothing
Exit Function

err_Code:
MsgBox "Table ou champ inexistant..."
Resume exit_Code

End Function



Si ca peut aider...

--
A+
Pierre (3stone) Access MVP
-------------------------------------------------------
Bien démarrer ? c'est ici http://users.skynet.be/mpfa/
( Je ne réponds pas aux emails qui concernent Access )
-------------------------------------------------------
Avatar
Papy Frenchie
Merci 3stone,
je vais m'amuser à faire des tests avec ta méthode

Papy
Avatar
3stone
re,

"Papy Frenchie"
| je vais m'amuser à faire des tests avec ta méthode

Tu peux même t'affranchir de la plupart des déclarations,
si tu utilise une fonction de domaine...


Function f_Code()
On Error GoTo err_Code
Dim lngMax As Long
Dim lngCode As Long

lngCode = Year(Date) * 100000
lngMax = Nz(DMax("NumIntDep", "t2cour"), 0)

If (lngMax = 0) Or (lngCode > lngMax) Then
lngCode = lngCode + 1
Else
lngCode = lngMax + 1
End If

exit_Code:
f_Code = lngCode
Exit Function

err_Code:
msgbox "Big problem..."
Resume exit_Code

End Function


--
A+
Pierre (3stone) Access MVP
-------------------------------------------------------
Bien démarrer ? c'est ici http://users.skynet.be/mpfa/
( Je ne réponds pas aux emails qui concernent Access )
-------------------------------------------------------