OVH Cloud OVH Cloud

Soustraction dans un recordset

21 réponses
Avatar
LeSoviet
Je renseigne un champ sur click d'un bouton via un recordset :

Dim rst As DAO.Recordset
Dim db As database
Dim t As String

t =3D Me.ElapsedTime.Value

Set db =3D CurrentDb
Set rst =3D db.OpenRecordset("Table1", dbOpenDynaset)
With rst
.AddNew
.fields("Champ1") =3D t
.Update
End With
rst.Close
Set rst =3D Nothing


J'aimerai sur ce m=EAme click qu'un autre champ (champ2) soit =E9galement
renseign=E9 par la soustraction de l'enregistrement nouvellement cr=E9=E9
(Champ1 avec Max(ID)) et de l'enregistrement pr=E9c=E9dent(Champ1 avec
Max(ID)-1).

Voici la structure de ma table
ID----Champ1-------Champ2
1------213243
2------876746
3------553451
4------876367
5------454546


Merci pour vos conseils

10 réponses

1 2 3
Avatar
Eric
Bonjour,

Il te faut faire un test lors de l'ajout d'enregistrement pour le calcul
de champ2, juste avant de récupérer par DLookup() la valeur précédente.
Ne sachant pas comment est organisé ton code, un truc du genre:

With rst
.addnew
.Fields("Champ1")=t
If .fields("Id") >1 then
' ici la récupération de la valeur précédente
' et le calcul de la différence qui peut faire l'objet
' d'une fonction
.Field("Champ2)=...
Else
.Fields("Champ2)=0
End If
.Update
End With

PS: si tu utilises une fonction pour la récupération et le calcul de la
valeur de la différence et que tu testes dans cette fonction l'existence
d'un enregistrement précédent, fonction qui retournera 0 si pas de
précédent ou une valeur, dans ce cas là tu peux faire l'économie du test
dans la routine d'écriture :

With rst
.addnew
.Fields("Champ1")=t
.Field("Champ2)=fnCalculDifférence(...)
.Update
End With



Bonjour,

J'ai un message d'erreur sur le premier click du bouton « Erreur
3021 : Aucun enregistrement en cours ».

Normal, puisqu'il n'y a pas de valeurs précédentes pour ID et les
Champs 1 et 2.

Comment contourner le pb ?
Où dois-je placer ce code parmi le code du bouton pour que les Champs
1 et 2 correspondant à la même valeur d'ID soient insérés dans Table1?

Merci d'avance pour votre aide





--
A+
Eric
http://www.mpfa.info/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr

Avatar
LeSoviet
Bonsoir,

Bon, ben, je crois qu'il faut savoir reconnaître certaines de ses
limites et je pense que les miennes sont atteintes. J'ai essayé de
créer une fonction fnCalculDifférence comme l'a suggéré Eric (histo ire
que le code du formulaire soit plus propre et parce qu'il faut bien
commencer un jour), sans succès.
Je suis alors revenu dans le code du formulaire en mixant le code de
Jessy avec les conseils d'Eric mais j'ai toujours une erreur :
"Utilisation incorrecte de Null" au moment du tout 1er click (tout le
code de cette discussion est sur l'évènement OnClick de MonBouton). Le
vbe pointe sur cette ligne : strTimeLast = DLookup("Champ1", "Table1",
"ID=" & LeMax - 1). J'ai déclaré LeMax As Long

J'ai fait un petit test quand même lorsque Table1 a quelques
enregistrements. Les Champs 1 et 2 se renseignent bien pour le même ID
mais la soustraction entre les valeurs de Champ1 où ID = n avec celle
de Champ1 où Id = n-1 ne correspond pas du tout à la réalité.


Merci d'avance pour votre aide, et votre patience...
Avatar
Jessy Sempere
Bonjour

Pour ce qui est de la valeur antérieure inexistante lors du premier clique,
normalement il te suffit d'encadrer le dLookUp par la fonction Nz() qui te
retournera 0 (ou une valeur perso) si la valeur est null, essais :

strTimeLast = Nz(DLookup("Champ1", "Table1", "ID=" & LeMax - 1),"00:00:00:00")

Sinon, visiblement le calcul de la différence ne semble pas bon ???
Le code que je t'avais donné a été fait vite fait et en plus sans Access
alors... j'ai pu me tromper... ;-))

Bon peux-tu juste nous refaire un point sur l'ensemble de ta démarche :
1°) Tu as créé une fonction pour le calcul de la différence (si oui, peux-tu
nous la mettre)
2°) Tu as fait une fonction LeMax() ?
3°) Que lances-tu comme code sur clique du bouton ?

Je pense que ça ne fera pas de mal de refaire le point.

PS : On a tous des limites mais il est toujours possible de les exploser ;-)

@+
Jessy Sempere
------------------------------------
Site @ccess : http://access.fr.free.fr/
Pour l''''efficacité de tous :
http://www.mpfa.info/
------------------------------------



Bonsoir,

Bon, ben, je crois qu'il faut savoir reconnaître certaines de ses
limites et je pense que les miennes sont atteintes. J'ai essayé de
créer une fonction fnCalculDifférence comme l'a suggéré Eric (histoire
que le code du formulaire soit plus propre et parce qu'il faut bien
commencer un jour), sans succès.
Je suis alors revenu dans le code du formulaire en mixant le code de
Jessy avec les conseils d'Eric mais j'ai toujours une erreur :
"Utilisation incorrecte de Null" au moment du tout 1er click (tout le
code de cette discussion est sur l'évènement OnClick de MonBouton). Le
vbe pointe sur cette ligne : strTimeLast = DLookup("Champ1", "Table1",
"ID=" & LeMax - 1). J'ai déclaré LeMax As Long

J'ai fait un petit test quand même lorsque Table1 a quelques
enregistrements. Les Champs 1 et 2 se renseignent bien pour le même ID
mais la soustraction entre les valeurs de Champ1 où ID = n avec celle
de Champ1 où Id = n-1 ne correspond pas du tout à la réalité.


Merci d'avance pour votre aide, et votre patience...




Avatar
Eric
Bonjour,

Comme tu travailles avec des millisecondes, je modifierai ainsi le code
ainsi, en supposant que tu as conservé les même noms des contrôles et
des variables donnés soit par Microsoft soit par Jessy.
Il intègre une fonction à laquelle tu passes en argument le temps ecoulé
et l'Id de l'enregistrement en cours d'écriture. Pas de trou dans l'Id
NumAuto et utilisation de la fonction Nz() dans le cas où tu es sur le
1er enregistrement à écrire.

1- La fonction pourrait être, en reprenant le traitement de Jessy, en
partant du principe qu'il n'y a pas de trou dans la numérotation d'Id :

Function fCalculDifference(UnTemps As String, UnId As Long) As String
Dim strTimeLast As String
Dim strTimeDiff As String
Dim sngTimeLast As Single
Dim sngTimeNew As Single
Dim sngTimeDiff As Single
' *** Utilisation de Nz() et pas de trou de Numérotation
' *** Si pas de précédent alors strTimeLast= "00:00:00:000"
strTimeLast = Nz(DLookup("champ1", "Table1", "Id=" & UnId - 1),
"00:00:00:000")
sngTimeLast = (Left(strTimeLast, 2) * 3600000) + _
(Mid(strTimeLast, 4, 2) * 60000) + _
(Mid(strTimeLast, 7, 2) * 1000) + _
Right(strTimeLast, 3)
sngTimeNew = (Left(UnTemps, 2) * 3600000) + _
(Mid(UnTemps, 4, 2) * 60000) + _
(Mid(UnTemps, 7, 2) * 1000) + Right(UnTemps, 3)

sngTimeDiff = sngTimeNew - sngTimeLast
strTimeDiff = Format((sngTimeDiff 3600000), "00") _
& ":" & Format((sngTimeDiff 60000) Mod 60, "00") _
& ":" & Format((sngTimeDiff 1000) Mod 60, "00") _
& ":" & Format((sngTimeDiff Mod 1000), "000")
fCalculDifference = strTimeDiff
End Function

2 - Les autres modifs sont les suivantes : (je te done le code entier),
procédures tirées du site

Private Sub Form_Timer()
Dim Hours As String
Dim Minutes As String
Dim Seconds As String
Dim MilliSec As String
Dim Msg As String
Dim ElapsedMilliSec As Long

ElapsedMilliSec = (GetTickCount() - StartTickCount) + _
TotalElapsedMilliSec

Hours = Format((ElapsedMilliSec 3600000), "00")
Minutes = Format((ElapsedMilliSec 60000) Mod 60, "00")
Seconds = Format((ElapsedMilliSec 1000) Mod 60, "00")
' ******* Modif de la ligne ci-dessous *******
MilliSec = Format((ElapsedMilliSec Mod 1000), "000")
Me!ElapsedTime = Hours & ":" & Minutes & ":" & Seconds & ":" _
& MilliSec
End Sub

Private Sub btnReset_Click()
TotalElapsedMilliSec = 0
' ******* Modif de la ligne ci-dessous *******
Me!ElapsedTime = "00:00:00:000"
End Sub

3 - La procédure avec appel de la fonction fCalculDifference

Private Sub btnStartStop_Click()
Dim rst As DAO.Recordset
Dim db As database
Dim t As String
If Me.TimerInterval = 0 Then
StartTickCount = GetTickCount()
Me.TimerInterval = 15
Me!btnStartStop.Caption = "Stop"
Me!btnReset.Enabled = False
Else
TotalElapsedMilliSec = TotalElapsedMilliSec + _
(GetTickCount() - StartTickCount)
Me.TimerInterval = 0
Me!btnStartStop.Caption = "Start"
Me!btnReset.Enabled = True
t = Me.ElapsedTime.Value
Set db = CurrentDb
Set rst = db.OpenRecordset("Table1", dbOpenDynaset)
With rst
.AddNew ' Incrémente l'Id
.Fields("Champ1") = t ' affecte la valeur courante
' Appel de la fonction fCalculDifference pour champ2
.Fields("Champ2") = fCalculDifference(t, !Id)
.Update ' mise à jour
End With
rst.Close
Set rst = Nothing
End If
End Sub

Normalement ca devrait tourner. Par contre si le temps T+1 est inférieur
au temps T, il te faudra corriger la mise en forme avant écriture dans
la table, problème de signe '-' sur les secondes, millisecondes. Je te
laisse faire.



Bonsoir,

Bon, ben, je crois qu'il faut savoir reconnaître certaines de ses
limites et je pense que les miennes sont atteintes. J'ai essayé de
créer une fonction fnCalculDifférence comme l'a suggéré Eric (histoire
que le code du formulaire soit plus propre et parce qu'il faut bien
commencer un jour), sans succès.
Je suis alors revenu dans le code du formulaire en mixant le code de
Jessy avec les conseils d'Eric mais j'ai toujours une erreur :
"Utilisation incorrecte de Null" au moment du tout 1er click (tout le
code de cette discussion est sur l'évènement OnClick de MonBouton). Le
vbe pointe sur cette ligne : strTimeLast = DLookup("Champ1", "Table1",
"ID=" & LeMax - 1). J'ai déclaré LeMax As Long

J'ai fait un petit test quand même lorsque Table1 a quelques
enregistrements. Les Champs 1 et 2 se renseignent bien pour le même ID
mais la soustraction entre les valeurs de Champ1 où ID = n avec celle
de Champ1 où Id = n-1 ne correspond pas du tout à la réalité.


Merci d'avance pour votre aide, et votre patience...



--
A+
Eric
http://www.mpfa.info/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr

Avatar
LeSoviet
Bonjour à vous 2,

j'était en train de vous envoyer "mon" code. Vu vos réponses, je teste
et reviens vous dire ce qu'il en est.

Merci bcp pour ce que vous faites.
Avatar
Jessy Sempere
Re,

Et voilà, on fait tous les 2 mumuse...
Il y avait une erreur dans mon code initial, il fallait multiplier les
millisecondes par 10.

Voici une fonction à placer dans un module standard de ta base
- strTimeStart est la valeur précédente de champ1
- strTimeEnd est la valeur en cours de champ1
- et ftimeDiff te retournera la valeur à mettre dans champ 2

*********************************************
Function fTimeDiff(strTimeStart As String, strTimeEnd As String) As String
'** Différence entre 2 Timer au format texte hh:nn:ss:mm

Dim tabTimeStart As Variant
Dim tabTimeEnd As Variant
Dim lngTimeStart As Long
Dim lngTimeEnd As Long
Dim lngTimeDiff As Long

tabTimeStart = Split(strTimeStart, ":")
tabTimeEnd = Split(strTimeEnd, ":")

lngTimeStart = tabTimeStart(0) * 3600000 + _
tabTimeStart(1) * 60000 + _
tabTimeStart(2) * 1000 + _
tabTimeStart(3) * 10

lngTimeEnd = tabTimeEnd(0) * 3600000 + _
tabTimeEnd(1) * 60000 + _
tabTimeEnd(2) * 1000 + _
tabTimeEnd(3) * 10

lngTimeDiff = lngTimeEnd - lngTimeStart

fTimeDiff = Format((lngTimeDiff 3600000), "00") _
& ":" & Format((lngTimeDiff 60000) Mod 60, "00") _
& ":" & Format((lngTimeDiff 1000) Mod 60, "00") _
& ":" & Format((lngTimeDiff Mod 1000) / 10, "00")

End Function
*********************************************
Ensuite,

@+
Jessy Sempere
------------------------------------
Site @ccess : http://access.fr.free.fr/
Pour l''''efficacité de tous :
http://www.mpfa.info/
------------------------------------



Bonjour,

Comme tu travailles avec des millisecondes, je modifierai ainsi le code
ainsi, en supposant que tu as conservé les même noms des contrôles et
des variables donnés soit par Microsoft soit par Jessy.
Il intègre une fonction à laquelle tu passes en argument le temps ecoulé
et l'Id de l'enregistrement en cours d'écriture. Pas de trou dans l'Id
NumAuto et utilisation de la fonction Nz() dans le cas où tu es sur le
1er enregistrement à écrire.

1- La fonction pourrait être, en reprenant le traitement de Jessy, en
partant du principe qu'il n'y a pas de trou dans la numérotation d'Id :

Function fCalculDifference(UnTemps As String, UnId As Long) As String
Dim strTimeLast As String
Dim strTimeDiff As String
Dim sngTimeLast As Single
Dim sngTimeNew As Single
Dim sngTimeDiff As Single
' *** Utilisation de Nz() et pas de trou de Numérotation
' *** Si pas de précédent alors strTimeLast= "00:00:00:000"
strTimeLast = Nz(DLookup("champ1", "Table1", "Id=" & UnId - 1),
"00:00:00:000")
sngTimeLast = (Left(strTimeLast, 2) * 3600000) + _
(Mid(strTimeLast, 4, 2) * 60000) + _
(Mid(strTimeLast, 7, 2) * 1000) + _
Right(strTimeLast, 3)
sngTimeNew = (Left(UnTemps, 2) * 3600000) + _
(Mid(UnTemps, 4, 2) * 60000) + _
(Mid(UnTemps, 7, 2) * 1000) + Right(UnTemps, 3)

sngTimeDiff = sngTimeNew - sngTimeLast
strTimeDiff = Format((sngTimeDiff 3600000), "00") _
& ":" & Format((sngTimeDiff 60000) Mod 60, "00") _
& ":" & Format((sngTimeDiff 1000) Mod 60, "00") _
& ":" & Format((sngTimeDiff Mod 1000), "000")
fCalculDifference = strTimeDiff
End Function

2 - Les autres modifs sont les suivantes : (je te done le code entier),
procédures tirées du site

Private Sub Form_Timer()
Dim Hours As String
Dim Minutes As String
Dim Seconds As String
Dim MilliSec As String
Dim Msg As String
Dim ElapsedMilliSec As Long

ElapsedMilliSec = (GetTickCount() - StartTickCount) + _
TotalElapsedMilliSec

Hours = Format((ElapsedMilliSec 3600000), "00")
Minutes = Format((ElapsedMilliSec 60000) Mod 60, "00")
Seconds = Format((ElapsedMilliSec 1000) Mod 60, "00")
' ******* Modif de la ligne ci-dessous *******
MilliSec = Format((ElapsedMilliSec Mod 1000), "000")
Me!ElapsedTime = Hours & ":" & Minutes & ":" & Seconds & ":" _
& MilliSec
End Sub

Private Sub btnReset_Click()
TotalElapsedMilliSec = 0
' ******* Modif de la ligne ci-dessous *******
Me!ElapsedTime = "00:00:00:000"
End Sub

3 - La procédure avec appel de la fonction fCalculDifference

Private Sub btnStartStop_Click()
Dim rst As DAO.Recordset
Dim db As database
Dim t As String
If Me.TimerInterval = 0 Then
StartTickCount = GetTickCount()
Me.TimerInterval = 15
Me!btnStartStop.Caption = "Stop"
Me!btnReset.Enabled = False
Else
TotalElapsedMilliSec = TotalElapsedMilliSec + _
(GetTickCount() - StartTickCount)
Me.TimerInterval = 0
Me!btnStartStop.Caption = "Start"
Me!btnReset.Enabled = True
t = Me.ElapsedTime.Value
Set db = CurrentDb
Set rst = db.OpenRecordset("Table1", dbOpenDynaset)
With rst
.AddNew ' Incrémente l'Id
.Fields("Champ1") = t ' affecte la valeur courante
' Appel de la fonction fCalculDifference pour champ2
.Fields("Champ2") = fCalculDifference(t, !Id)
.Update ' mise à jour
End With
rst.Close
Set rst = Nothing
End If
End Sub

Normalement ca devrait tourner. Par contre si le temps T+1 est inférieur
au temps T, il te faudra corriger la mise en forme avant écriture dans
la table, problème de signe '-' sur les secondes, millisecondes. Je te
laisse faire.



Bonsoir,

Bon, ben, je crois qu'il faut savoir reconnaître certaines de ses
limites et je pense que les miennes sont atteintes. J'ai essayé de
créer une fonction fnCalculDifférence comme l'a suggéré Eric (histoire
que le code du formulaire soit plus propre et parce qu'il faut bien
commencer un jour), sans succès.
Je suis alors revenu dans le code du formulaire en mixant le code de
Jessy avec les conseils d'Eric mais j'ai toujours une erreur :
"Utilisation incorrecte de Null" au moment du tout 1er click (tout le
code de cette discussion est sur l'évènement OnClick de MonBouton). Le
vbe pointe sur cette ligne : strTimeLast = DLookup("Champ1", "Table1",
"ID=" & LeMax - 1). J'ai déclaré LeMax As Long

J'ai fait un petit test quand même lorsque Table1 a quelques
enregistrements. Les Champs 1 et 2 se renseignent bien pour le même ID
mais la soustraction entre les valeurs de Champ1 où ID = n avec celle
de Champ1 où Id = n-1 ne correspond pas du tout à la réalité.


Merci d'avance pour votre aide, et votre patience...



--
A+
Eric
http://www.mpfa.info/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr




Avatar
LeSoviet
Bonsoir,

désolé de na pas avoir répondu plus tôt, pb de connexion.

Un grand merci à vous 2. Vos propositions fonctionnent parfaitement.
Pour remonter quelques post plus haut, mon pb avec la mise en place
d'une fonction est précisément ce qui est contenu entre les
parenthèses, après le nom de la fonction. Je n'arrive pas savoir
précisément quoi déclarer.

Par contre, j'essaie de sortir un graphique sur un état à partir des
données enregistrées dans Table1. Pour l'instant, ça coince je pense
du fait que les valeurs soient déclarées en string. Est-ce que vous
confirmer ? Dans ce cas, est-il possible de créer un graphe faisant
appel par exemple aux valeurs de sngTimeNew (pour le code d'Eric) ou
lngTimeStart (pour le code de Jessy), à partir du moment où elles sont
sauvegardées dans Champ4 par ex, et d'afficher dans le graphe les
valeurs de Champ1 ?

Encore merci pour votre aide
Avatar
Eric
Bonsoir,

Dans la fonction de Jessy :
Function fTimeDiff(strTimeStart As String, strTimeEnd As String) As String
la fonction attend 2 arguments de type Texte qui sont Le Temps de

départ(strTimeStart) et le temps de fin(strTimeEnd). Il te suffit pour
le savoir de regarder les arguments de la fonction et leur type voire de
regarder comment ces arguments sont préfixés. Jessy les fait précéder de
str où str est l'abréviation de STRing.

Dans celle que je t'ai communiquée:
Function fCalculDifference(UnTemps As String, UnId As Long) As String
(dont l'essentiel revient à Jessy, j'ai pas changé grand chose)

Elle attends en premier argument une variable de type string qui
correspond à un temps, d'où son nom (UnTemps) et en 2ème un ID qui est
déclaré en Long car il s'agit d'un NuméroAuto. (Pour mémoire, tu
stockais le temps sous forme de chaine de caractères - String)

Oui pour faire un graphique, des données String c'est pas top.
Il te faut les convertir soit en Single soit en Long. Donc il te faut
utiliser des données numériques. Dans le graphe, il faut faire appel au
champ4 puisqu'il contient les données converties en nombre.



Bonsoir,

désolé de na pas avoir répondu plus tôt, pb de connexion.

Un grand merci à vous 2. Vos propositions fonctionnent parfaitement.
Pour remonter quelques post plus haut, mon pb avec la mise en place
d'une fonction est précisément ce qui est contenu entre les
parenthèses, après le nom de la fonction. Je n'arrive pas savoir
précisément quoi déclarer.

Par contre, j'essaie de sortir un graphique sur un état à partir des
données enregistrées dans Table1. Pour l'instant, ça coince je pense
du fait que les valeurs soient déclarées en string. Est-ce que vous
confirmer ? Dans ce cas, est-il possible de créer un graphe faisant
appel par exemple aux valeurs de sngTimeNew (pour le code d'Eric) ou
lngTimeStart (pour le code de Jessy), à partir du moment où elles sont
sauvegardées dans Champ4 par ex, et d'afficher dans le graphe les
valeurs de Champ1 ?

Encore merci pour votre aide



--
A+
Eric
http://www.mpfa.info/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr

Avatar
Jessy Sempere
Bonsoir

Alors pour la façon d'utiliser la fonction avec ses arguments, il te suffit
de faire dans ton instruction où tu mets à jour ton recordset :

.fields("champ2") = fTimeDiff(dlookup("champ1", "Table1", "Id=" &
Me.id-1),t)

Sinon pour ton graphique, effectivement le problème vient de ton format de
texte qui ne peut pas être interprété "simplement" comme une donnée
numérique...
C'est pour ça que je te conseillais dès le départ de stocker la vrai valeur
du timer et non le format texte... Si tu as ces vrai valeurs, normalement
ton graphique fonctionnera.

@+
Jessy Sempere
------------------------------------
Site @ccess : http://access.fr.free.fr/
Pour l'efficacité de tous :
http://www.mpfa.info/
------------------------------------
"LeSoviet" a écrit dans le message de news:

Bonsoir,

désolé de na pas avoir répondu plus tôt, pb de connexion.

Un grand merci à vous 2. Vos propositions fonctionnent parfaitement.
Pour remonter quelques post plus haut, mon pb avec la mise en place
d'une fonction est précisément ce qui est contenu entre les
parenthèses, après le nom de la fonction. Je n'arrive pas savoir
précisément quoi déclarer.

Par contre, j'essaie de sortir un graphique sur un état à partir des
données enregistrées dans Table1. Pour l'instant, ça coince je pense
du fait que les valeurs soient déclarées en string. Est-ce que vous
confirmer ? Dans ce cas, est-il possible de créer un graphe faisant
appel par exemple aux valeurs de sngTimeNew (pour le code d'Eric) ou
lngTimeStart (pour le code de Jessy), à partir du moment où elles sont
sauvegardées dans Champ4 par ex, et d'afficher dans le graphe les
valeurs de Champ1 ?

Encore merci pour votre aide
Avatar
Eric
Bonsoir Jessy,

Je te laisse la suite sinon chacun va parler de ce que l'autre propose ;-) .

Bonsoir

Alors pour la façon d'utiliser la fonction avec ses arguments, il te suffit
de faire dans ton instruction où tu mets à jour ton recordset :

.fields("champ2") = fTimeDiff(dlookup("champ1", "Table1", "Id=" &
Me.id-1),t)

Sinon pour ton graphique, effectivement le problème vient de ton format de
texte qui ne peut pas être interprété "simplement" comme une donnée
numérique...
C'est pour ça que je te conseillais dès le départ de stocker la vrai valeur
du timer et non le format texte... Si tu as ces vrai valeurs, normalement
ton graphique fonctionnera.

@+
Jessy Sempere
------------------------------------
Site @ccess : http://access.fr.free.fr/
Pour l'efficacité de tous :
http://www.mpfa.info/
------------------------------------


--
A+
Eric
http://www.mpfa.info/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr

1 2 3