OVH Cloud OVH Cloud

requete

1 réponse
Avatar
carine
Bonjour,
J'ai une table Pneus contenant des immatriculations et des=20
dates de changement de pneus, plusieurs dates pour une=20
m=EAme immatriculation
Je souhaite savoir quel vehicule a consomm=E9 le plus de=20
pneu : faire la difference des dates et recuperer=20
l'immatriculation qui a le plus petit intervalle.
Je n'arrive pas a faire une requete qui marche.
Auriez-vous une id=E9e(m=EAme en vb)
Merci

1 réponse

Avatar
Hervé
Salut Carine,
La proc ci-dessous est un peu tirée par les cheveux mais je n'est rien
trouvé d'autre (pas trop habitué à Access et c'est la 1ère fois que
j'interviens dans ce groupe). Admettons que tu est dans ta table "Pneus" un
champ "Immatriculation", un champ "DateAncien" (date du précédent
remplacement) et un champ "DateNouveau" (date du nouveau remplacement) au
format date bien évidemment, adapte si les noms sont diff. La proc
fonctionne de la manière suivante :
1 Ouvre une connection (avec ADO)
2 dimensionne le tableau par rapport au nombre d'enregistrements
3 récupère la différence en nombre de jours entre les 2 champs de dates
4 récupère l'immatriculation correspondante
5 ferme la connection
6 effectue un tri croissant dans le tableau
7 affiche le résultat dans un MsgBox
Tu peux boucler sur le tableau si tu veux avoir les résultats afficher dans
l'ordre. L'exemple de la boucle qui est en commantaire affiche le résultat
dans la fenêtre d'exécution (Ctrl+G).

Pour le test, à mettre dans un module standard :

Private Sub DiffDate()
Dim ConnectBD As ADODB.Connection
Dim Rs As ADODB.Recordset
Dim Tbl()
Dim I As Integer
Dim ChaineSQL As String

ChaineSQL = "SELECT Immatriculation, DateAncien, DateNouveau "
ChaineSQL = ChaineSQL & "FROM Pneus "
ChaineSQL = ChaineSQL & "ORDER BY Immatriculation"

Set ConnectBD = CurrentProject.Connection
Set Rs = New ADODB.Recordset

With Rs
.CursorType = adOpenKeyset
.LockType = adLockOptimistic
.Open ChaineSQL, ConnectBD
ReDim Tbl(1 To .RecordCount, 1 To 2)
Do While Not .EOF
I = I + 1
'en nombre de jours >"d"
Tbl(I, 1) = DateDiff("d", .Fields("DateAncien"), _
.Fields("DateNouveau"))
Tbl(I, 2) = .Fields("Immatriculation")
.MoveNext
Loop
End With

Rs.Close

'tri le tableau en ordre croissant
Tri Tbl()

'utilise une boucle dans ce genre pour avoir l'ordre
'd'usure
'For I = 1 To UBound(Tbl, 1)
' Debug.Print "Immatriculation : " & Tbl(I, 2) _
' & ", Durée en Jours : " & Tbl(I, 1)
'Next

MsgBox "La voiture qui a le plus usée " _
& "ses pneus, est immatriculée : " _
& vbCrLf & UCase(Tbl(1, 2)) & vbCrLf _
& "Son train de pneus a été usé en " & Tbl(1, 1) & " jours !"

Set ConnectBD = Nothing
Set Rs = Nothing
Erase Tbl
End Sub

Sub Tri(Tbl())
Dim Tempo1, Tempo2
Dim I As Integer, J As Integer
'éffectue un tri croissant
For I = 1 To UBound(Tbl) - 1
For J = I + 1 To UBound(Tbl)
If Tbl(I, 1) > Tbl(J, 1) Then
Tempo1 = Tbl(J, 1)
Tempo2 = Tbl(J, 2)
Tbl(J, 1) = Tbl(I, 1)
Tbl(J, 2) = Tbl(I, 2)
Tbl(I, 1) = Tempo1
Tbl(I, 2) = Tempo2
End If
Next J
Next I
End Sub

Hervé.

"carine" a écrit dans le message news:
010c01c35d0a$b5f90d80$
Bonjour,
J'ai une table Pneus contenant des immatriculations et des
dates de changement de pneus, plusieurs dates pour une
même immatriculation
Je souhaite savoir quel vehicule a consommé le plus de
pneu : faire la difference des dates et recuperer
l'immatriculation qui a le plus petit intervalle.
Je n'arrive pas a faire une requete qui marche.
Auriez-vous une idée(même en vb)
Merci