OVH Cloud OVH Cloud

probléme avec find et recordset

4 réponses
Avatar
gminot
J'ai un probléme de fond à savoir j'ai réalise un planning avec table
> liée sur un AS400 avec liaison ODBC client access avec une vue
> journalier, hebdo et mensuel . Pour que mon application fonctionne
> correctement j'importe les données dans une table avec select into .
>
> temps affichag journalier : 4s pour import 30 enreg + 1s de traitement
> temps affichage hebdo: 5 s pour import 150 enreg + 2 s de traitement
> temps afficahge mensuel : 7 s pour import 500 enreg + 3 s de
> traitement .
>
> J'ai donc voulu pour gagner du temps travailler et surtout travailler
> en direct soit avec un recordset + find pour rechercher mes valeurs
> sachant que je reboucle 23 fois par jour et la c'est une catatrophe 3 mn pour
> afficher .
> j'ai essaye la methode querydef soit temporaire soit avec un nom avec
> recherche par dlookup le résultat est similaire .
>
> je ne comprend pas ses ecarts et surtout j'ai l'impression que je
> retourne cherché la valeur mon enreg à chaque traitement alors que
> j'ai ma requete qui filtre correctement
>
> Qui donc peut m'expliquer la base à savoir ou se trouve les données
> quand on fait une requete ect
>
>
> Merci d'avance

4 réponses

Avatar
Daniel Carollo
Bonjour Gilles!

A vue de nez, il y a pas mal de variables sur lesquelles on ne se penche pas
tres souvent dans votre probleme.
La premiere question a se poser est au niveau des elements de base. La
structure de vos tables est-elle propice a des recherches rapides (index au
bons endroits et a jour)? Utilisez-vous ces index lors des recherches?
Deuxiemement au niveau des pilotes ODBC: utilisez-vous la version adaptee a
votre OS et a votre version d'Access?
Troisiemement, la facon d'ouvrir votre recordset: allez-vous faire des
modifications dans les donnees? Si non, ouvrez-vous bien le recordset en
mode Snapshot (cela permet souvent de gagner beaucoup de temps). Ou est
place votre curseur? Il est souvent plus rapide d'avoir le curseur sur le
serveur, et de recuperer les enregistrements un par un quand il s'agit de
faire des recherches (en tout cas sur Oracle, SQL Server et Progress, je
n'ai encore jamais fait de comparaisons avec un AS400).
Ces choix (que l'on ne fait pas souvent sur une base Access locale,
parcequ'ils ont peu d'influence sur la performance) deviennent critiques des
que le serveur se trouve de l'autre cote d'une barriere technologique.
Quatriemement, quelle technologies utilisez-vous pour communiquer avec le
serveur? ODBC est la plus lente de toutes (en regle generale). N'existe-t-il
pas un OLE DB provider pour votre base? RDO pourrait peut-etre vous
permettre d'aller plus vite, au cout de quelque complexite...
L'administrateur de la base sur l'AS400 peut-il vous donner les valeurs des
indicateurs de performance de la base que vous utilisez?
La seule methode que je peux preconiser est d'essayer toutes les
combinaisons qui ont un sens, en faisant des mesures de temps rigoureuses,
et de faire les choix en fonction des resultats obtenus. C'est long, mais
quand il n'y a pas de recette instantannee toute faite pour resoudre les
problemes, c'est la seule facon de proceder.

Bonne continuation.

--
Daniel :-)

Computing Technologies International - www.computing-tech.com - We
provide solutions...

"gilles" wrote in message
news:
J'ai un probléme de fond à savoir j'ai réalise un planning avec table
liée sur un AS400 avec liaison ODBC client access avec une vue
journalier, hebdo et mensuel . Pour que mon application fonctionne
correctement j'importe les données dans une table avec select into .

temps affichag journalier : 4s pour import 30 enreg + 1s de traitement
temps affichage hebdo: 5 s pour import 150 enreg + 2 s de traitement
temps afficahge mensuel : 7 s pour import 500 enreg + 3 s de
traitement .

J'ai donc voulu pour gagner du temps travailler et surtout travailler
en direct soit avec un recordset + find pour rechercher mes valeurs
sachant que je reboucle 23 fois par jour et la c'est une catatrophe 3 mn
pour


afficher .
j'ai essaye la methode querydef soit temporaire soit avec un nom avec
recherche par dlookup le résultat est similaire .

je ne comprend pas ses ecarts et surtout j'ai l'impression que je
retourne cherché la valeur mon enreg à chaque traitement alors que
j'ai ma requete qui filtre correctement

Qui donc peut m'expliquer la base à savoir ou se trouve les données
quand on fait une requete ect


Merci d'avance




Avatar
gminot
deja merci daniel car je ne trouvais pas beaucoup d'aide à mon
probléme .

Pour détailler un peu

1/ ma table comporte des index , NUMINTER ( N°intervention ) ,
NUMLIGNE ( N° ligne ) , dates et matricule technicien

2/ j'utilise client ACCESS pour mon driver ODBC, je pense que c'est
bon car dans mon application j'ai de multiples formulaires de type
base client fournisseur compta ect .. qui fonctionne correctement .

3/ pour le record set, c'est la que je coince un peu . En effet je
fais aucune modification sur la table pour l'affichage de mon planning
seulement de la visu . Je ne connais pas snapshot je vais me
documenter . Tu trouveras ci dessous un extrait de mon code pour
exemple

'chargement table

matable = "SELECT NINTER, MATRI2,DATES,PRIORI,COLOR, STATIN INTO
PRODACCESS_AGENDA3 FROM PRODACCESS_AGENDA WHERE "
Moncritère = "AGENCE= " & "'" & agenceencours1 & "'" & " AND DATES
Like " & "'" & D1 & "'" & " AND STATIN<>'15' Or AGENCE = " & "'" &
agenceencours1 & "'" & " AND DATES Like " & "'" & D1 + 1 & "'" & " AND
STATIN<>'15' Or AGENCE = " & "'" & agenceencours1 & "'" & " AND DATES
Like " & "'" & D1 + 2 & "'" & " AND STATIN<>'15' Or AGENCE = " & " '"
& agenceencours1 & "'" & " AND DATES Like " & "'" & D1 + 3 & "'" & "
AND STATIN<>'15' Or AGENCE = " & "'" & agenceencours1 & "'" & " AND
DATES Like " & "'" & D1 + 4 & "'" & " AND STATIN<>'15' Or AGENCE = " &
"'" & agenceencours1 & "'" & " AND DATES Like " & "'" & D1 + 5 & "'" &
" AND STATIN<>'15'"
MonJeuEnreg = matable & Moncritère
DoCmd.SetWarnings False
DoCmd.RunSQL MonJeuEnreg

' définition recordset

monsql = "SELECT * FROM PRODACCESS_AGENDA3 "
MonJeuEnreg = monsql
Set rst = bds.OpenRecordset(MonJeuEnreg)

'semaine

D2 = DatePart("w", D1, vbMonday)
If D2 = 1 Then
Me("SS" & Format(D3, "00")) = "Planning pour la Semaine N° " &
Format(D1, "ww")
End If

Do Until DatePart("w", D1, vbMonday) = 1
D1 = DateAdd("d", -1, D1)
Me("SS" & Format(D3, "00")) = "Planning pour la Semaine N° " &
Format(D1, "ww")
Loop

'jour

D1 = DateSerial(Year(Me![scrCDate]), month(Me![scrCDate]),
day(Me![scrCDate]))
D2 = DatePart("w", D1, vbMonday)
Do Until DatePart("w", D1, vbMonday) = 1
D1 = DateAdd("d", -1, D1)
Loop

Me![scr1Date] = D1
D3 = 1

Do Until D3 > 5

Me("DD" & Format(D3, "00")) = " " & day(D1)
If month(D1) <> month(Me![scrCDate]) Then
Me("DD" & Format(D3, "00")).ForeColor = 8421504
Else
Me("DD" & Format(D3, "00")).ForeColor = 16777215
If D1 = jour Then
Me("DD" & Format(D3, "00")).BackColor = 255
End If
End If


'numero intervention et technicien

T1 = 1

Do Until T1 > 23

'remise à zero des couleurs et N° inter

Me("T" & T1 & "M" & Format(D3, "00")).BackColor = 16777215
Me("T" & T1 & "A" & Format(D3, "00")).BackColor = 16777215
Me("T" & T1 & "S" & Format(D3, "00")).BackColor = 16777215
Me("T" & T1 & "M" & Format(D3, "00")) = ""
Me("T" & T1 & "A" & Format(D3, "00")) = ""
Me("T" & T1 & "S" & Format(D3, "00")) = ""

'technicien

TECHNICIEN:

MATRICULE = Left(agenceencours1, 1) & Format(T1, "00")
TECHNICIEN = DLookup("NOMTEC", "PRODACCESS_PERSONNEL2", "[RESER2]
= " & "'" & Trim([MATRICULE]) & "'")
PRENOM = DLookup("PRNTEC", "PRODACCESS_PERSONNEL2", "[RESER2] = "
& "'" & Trim([MATRICULE]) & "'")
Me("NOM" & T1) = Trim([TECHNICIEN]) & " " & Trim([PRENOM])
ZONE = DLookup("ZONE", "PRODACCESS_PERSONNEL2", "[RESER2] = " &
"'" & Trim([MATRICULE]) & "'")
Me("ZONE" & T1) = Trim([ZONE])
If rst.BOF Then
GoTo jourferie
End If

'couleur et numero intevention priorite1

rst.FindFirst ("[MATRI2] = " & [MATRICULE] & " And [PRIORI] = '1'
AND DATES like " & "'" & D1 & "*'")
If rst.NoMatch Then
NUMINTER = 0
GoTo finpriorite1
Else
NUMINTER = rst!NINTER
Me("T" & T1 & "M" & Format(D3, "00")) = [NUMINTER]
If IsNull(NUMINTER) Then
NUMINTER = 0
End If
STATINT1 = rst!STATIN
COULEUR = rst!COLOR
End If
If IsNull(COULEUR) Then
COULEUR = 0
End If
Select Case COULEUR
Case 2
Me("T" & T1 & "M" & Format(D3, "00")).BackColor = 3355647
If Trim(STATINT1) = "01" Then
Me("T" & T1 & "M" & Format(D3, "00")).ForeColor = 16777215
GoTo fincouleurpriorite1
End If
If Trim(STATINT1) = "08" Or Trim(STATINT1) = "11" Or
Trim(STATINT1) = "12" Or Trim(STATINT1) = "13" Or Trim(STATINT1) "14" Then
Me("T" & T1 & "M" & Format(D3, "00")).ForeColor = 12632256
Else
Me("T" & T1 & "M" & Format(D3, "00")).ForeColor = 0
End If
GoTo fincouleurpriorite1
Case 3
Me("T" & T1 & "M" & Format(D3, "00")).BackColor = 5242879
If Trim(STATINT1) = "01" Then
Me("T" & T1 & "M" & Format(D3, "00")).ForeColor = 255
GoTo fincouleurpriorite1
End If
If Trim(STATINT1) = "08" Or Trim(STATINT1) = "11" Or
Trim(STATINT1) = "12" Or Trim(STATINT1) = "13" Or Trim(STATINT1) "14" Then
Me("T" & T1 & "M" & Format(D3, "00")).ForeColor = 12632256
Else
Me("T" & T1 & "M" & Format(D3, "00")).ForeColor = 0
End If
GoTo fincouleurpriorite1


ect....

si tu peu me conseiller, j'en serai ravi

D'autre part as tu des consils sur les liaisons autres qur ODBC car la
je suis largué

Encore merci de ta réponse et à bientot j'espére


"Daniel Carollo" wrote in message news:...
Bonjour Gilles!

A vue de nez, il y a pas mal de variables sur lesquelles on ne se penche pas
tres souvent dans votre probleme.
La premiere question a se poser est au niveau des elements de base. La
structure de vos tables est-elle propice a des recherches rapides (index au
bons endroits et a jour)? Utilisez-vous ces index lors des recherches?
Deuxiemement au niveau des pilotes ODBC: utilisez-vous la version adaptee a
votre OS et a votre version d'Access?
Troisiemement, la facon d'ouvrir votre recordset: allez-vous faire des
modifications dans les donnees? Si non, ouvrez-vous bien le recordset en
mode Snapshot (cela permet souvent de gagner beaucoup de temps). Ou est
place votre curseur? Il est souvent plus rapide d'avoir le curseur sur le
serveur, et de recuperer les enregistrements un par un quand il s'agit de
faire des recherches (en tout cas sur Oracle, SQL Server et Progress, je
n'ai encore jamais fait de comparaisons avec un AS400).
Ces choix (que l'on ne fait pas souvent sur une base Access locale,
parcequ'ils ont peu d'influence sur la performance) deviennent critiques des
que le serveur se trouve de l'autre cote d'une barriere technologique.
Quatriemement, quelle technologies utilisez-vous pour communiquer avec le
serveur? ODBC est la plus lente de toutes (en regle generale). N'existe-t-il
pas un OLE DB provider pour votre base? RDO pourrait peut-etre vous
permettre d'aller plus vite, au cout de quelque complexite...
L'administrateur de la base sur l'AS400 peut-il vous donner les valeurs des
indicateurs de performance de la base que vous utilisez?
La seule methode que je peux preconiser est d'essayer toutes les
combinaisons qui ont un sens, en faisant des mesures de temps rigoureuses,
et de faire les choix en fonction des resultats obtenus. C'est long, mais
quand il n'y a pas de recette instantannee toute faite pour resoudre les
problemes, c'est la seule facon de proceder.

Bonne continuation.

--
Daniel :-)

Computing Technologies International - www.computing-tech.com - We
provide solutions...

"gilles" wrote in message
news:
J'ai un probléme de fond à savoir j'ai réalise un planning avec table
liée sur un AS400 avec liaison ODBC client access avec une vue
journalier, hebdo et mensuel . Pour que mon application fonctionne
correctement j'importe les données dans une table avec select into .

temps affichag journalier : 4s pour import 30 enreg + 1s de traitement
temps affichage hebdo: 5 s pour import 150 enreg + 2 s de traitement
temps afficahge mensuel : 7 s pour import 500 enreg + 3 s de
traitement .

J'ai donc voulu pour gagner du temps travailler et surtout travailler
en direct soit avec un recordset + find pour rechercher mes valeurs
sachant que je reboucle 23 fois par jour et la c'est une catatrophe 3 mn
pour


afficher .
j'ai essaye la methode querydef soit temporaire soit avec un nom avec
recherche par dlookup le résultat est similaire .

je ne comprend pas ses ecarts et surtout j'ai l'impression que je
retourne cherché la valeur mon enreg à chaque traitement alors que
j'ai ma requete qui filtre correctement

Qui donc peut m'expliquer la base à savoir ou se trouve les données
quand on fait une requete ect


Merci d'avance






Avatar
Daniel Carollo
Bonsoir Gilles!

Je n'ai regarde votre code qu'en diagonale, parcequ'il fait un peu mal aux
yeux...

A priori, l'index sur la date ne sert a rien: les clauses DATES LIKE
"Patali-Patala" vont forcer un scan de la table. C'est probablement la
premiere cause de lenteur.
Ensuite, vous faites cinq fois la meme chose (cinq fois plus lent?)...

Pourquoi ne pas vous servir d'une clause du genre:

WHERE DATES BETWEEN D1 AND (D1 + 5) AND Agence = AgenceEnCours AND STATIN <>
'15' ?
Un peu plus aise sur les yeux, et probablement plus rapide a l'execution.
L'operateur Like est a fuir comme la peste.

Vous faites une copie des donnees de la table du serveur dans une table
locale. Je ne suis pas sur que ce soit une bonne chose. En general, les
serveurs de bases de donnees dedies sont plutot plus performants qu'Access.
Avez-vous des index sur cette table locale?

Enfin, je vous conseille de lire l'aide en ligne sur OpenRecordset, il y a
des parametres qui vous permettrons d'affiner la ligne
Set rst = bds.OpenRecordset(MonJeuEnreg)


Pour une boucle du genre ci-dessous, executee au moins 24 x 5 fois, il y a
une methode un peu plus propre de le faire.

Do Until T1 > 23
Me("T" & T1 & "M" & Format(D3, "00")).BackColor = 16777215
Me("T" & T1 & "A" & Format(D3, "00")).BackColor = 16777215
Me("T" & T1 & "S" & Format(D3, "00")).BackColor = 16777215
Me("T" & T1 & "M" & Format(D3, "00")) = ""
Me("T" & T1 & "A" & Format(D3, "00")) = ""
Me("T" & T1 & "S" & Format(D3, "00")) = ""


Sachez tout d'abord que la syntaxe Me("MonNomDeControle") est tres
gourmande. Si on doit l'utiliser plusieurs fois (en particulier dans une
boucle), il vaut mieux creer un objet qui pointe sur ce controle, du genre:

Dim ctrl as Control

Do Until T1 > 23
Set crtl = Me("T" & T1 & "M" & Format(D3,"00"))
with ctrl
.backColor = 16777215
.value = ""
end with
...

Enfin, dans le traitement du technicien, vous faites trois DLookup qui vont
chercher les informations des techniciens dans la meme table. Un recordset
aurait permis de recuperer ca d'un coup d'un seul.

Vous parsemez votre code de Trim() pour des variables que vous venez de
creer. C'est totalement inutile (sauf a faire perdre du temps).

Vous ouvrez un Recordset sans ordonner les donnees. Vous retrouvez vos
petits comment?
Le FindFirst va aller se promener dans le recordset dans tous les sens. Il
eut mieux valu mettre une clause d'ordre dans la definition du recordset, et
de le balayer dans un seul sens (ce qui est plus rapide, cela nous permet
d'utiliser un recordset de type forwardOnly). L'utilisation de la fonction
Nz() vous aurait permis de vous affranchir de tests dans la boucle de
traitement, ce qui ameliorerait la rapidite d'execution, et la lecture du
code par le non-initie. Et de grace, laissez tomber la syntaxe "Like" pour
les dates, c'est d'une aberration qui frole l'infini. Vous la tenez d'ou
cette syntaxe?
Je verrai bien quelque chose du genre:

If Not FillTempTable (agenceencours1, D1, '15') then
msgbox "Erreur de remplissage de la table temporaire", vbCritical,
"Erreur critique"
end sub
else
SetupSemaine
SetupCouleurs
SetupInterventions
monsql = "SELECT MonChamp1, MonChamp2, NZ(MonChamp3), NZ(MOnChamp4) etc.
" & _
" FROM PRODACCESS_AGENDA3 ORDER BY ..."
MonJeuEnreg = monsql
Set rst = bds.OpenRecordset(MonJeuEnreg, dbOpenForwardOnly ,,
dbReadOnly)
with rst
if .EOF Then
msgbox "Pas d'enregistrements", vbInformation, "Erreur?"
else
do until .EOF
SetTechnician(.Matricule)
ProcessColour(.Color)
ProcessStatint(.Statint)
ProcessWhatever(.MonChamp)
.MoveNext
loop
end if
end with
end if

Une remarque d'ordre general: ca sert a quoi d'avoir des langages qui
permettent la programmation structuree si on ecrit du code aussi cochon que
ca?

Pour en venir a votre probleme particulier, remplir une ribambelle de
controles Access pour faire une gestion de planning n'est pas tres
intelligent. Il y a des controles ActiveX qui permettent de faire les choses
tres proprement, et qui sont justement adaptes a ce genre de travail.

Bonne continuation...

--
Daniel :-)

Computing Technologies International - www.computing-tech.com - We
provide solutions...


"gilles" wrote in message
news:
deja merci daniel car je ne trouvais pas beaucoup d'aide à mon
probléme .

Pour détailler un peu

1/ ma table comporte des index , NUMINTER ( N°intervention ) ,
NUMLIGNE ( N° ligne ) , dates et matricule technicien

2/ j'utilise client ACCESS pour mon driver ODBC, je pense que c'est
bon car dans mon application j'ai de multiples formulaires de type
base client fournisseur compta ect .. qui fonctionne correctement .

3/ pour le record set, c'est la que je coince un peu . En effet je
fais aucune modification sur la table pour l'affichage de mon planning
seulement de la visu . Je ne connais pas snapshot je vais me
documenter . Tu trouveras ci dessous un extrait de mon code pour
exemple

'chargement table

matable = "SELECT NINTER, MATRI2,DATES,PRIORI,COLOR, STATIN INTO
PRODACCESS_AGENDA3 FROM PRODACCESS_AGENDA WHERE "
Moncritère = "AGENCE= " & "'" & agenceencours1 & "'" & " AND DATES
Like " & "'" & D1 & "'" & " AND STATIN<>'15' Or AGENCE = " & "'" &
agenceencours1 & "'" & " AND DATES Like " & "'" & D1 + 1 & "'" & " AND
STATIN<>'15' Or AGENCE = " & "'" & agenceencours1 & "'" & " AND DATES
Like " & "'" & D1 + 2 & "'" & " AND STATIN<>'15' Or AGENCE = " & " '"
& agenceencours1 & "'" & " AND DATES Like " & "'" & D1 + 3 & "'" & "
AND STATIN<>'15' Or AGENCE = " & "'" & agenceencours1 & "'" & " AND
DATES Like " & "'" & D1 + 4 & "'" & " AND STATIN<>'15' Or AGENCE = " &
"'" & agenceencours1 & "'" & " AND DATES Like " & "'" & D1 + 5 & "'" &
" AND STATIN<>'15'"
MonJeuEnreg = matable & Moncritère
DoCmd.SetWarnings False
DoCmd.RunSQL MonJeuEnreg

' définition recordset

monsql = "SELECT * FROM PRODACCESS_AGENDA3 "
MonJeuEnreg = monsql
Set rst = bds.OpenRecordset(MonJeuEnreg)

'semaine

D2 = DatePart("w", D1, vbMonday)
If D2 = 1 Then
Me("SS" & Format(D3, "00")) = "Planning pour la Semaine N° " &
Format(D1, "ww")
End If

Do Until DatePart("w", D1, vbMonday) = 1
D1 = DateAdd("d", -1, D1)
Me("SS" & Format(D3, "00")) = "Planning pour la Semaine N° " &
Format(D1, "ww")
Loop

'jour

D1 = DateSerial(Year(Me![scrCDate]), month(Me![scrCDate]),
day(Me![scrCDate]))
D2 = DatePart("w", D1, vbMonday)
Do Until DatePart("w", D1, vbMonday) = 1
D1 = DateAdd("d", -1, D1)
Loop

Me![scr1Date] = D1
D3 = 1

Do Until D3 > 5

Me("DD" & Format(D3, "00")) = " " & day(D1)
If month(D1) <> month(Me![scrCDate]) Then
Me("DD" & Format(D3, "00")).ForeColor = 8421504
Else
Me("DD" & Format(D3, "00")).ForeColor = 16777215
If D1 = jour Then
Me("DD" & Format(D3, "00")).BackColor = 255
End If
End If


'numero intervention et technicien

T1 = 1

Do Until T1 > 23

'remise à zero des couleurs et N° inter

Me("T" & T1 & "M" & Format(D3, "00")).BackColor = 16777215
Me("T" & T1 & "A" & Format(D3, "00")).BackColor = 16777215
Me("T" & T1 & "S" & Format(D3, "00")).BackColor = 16777215
Me("T" & T1 & "M" & Format(D3, "00")) = ""
Me("T" & T1 & "A" & Format(D3, "00")) = ""
Me("T" & T1 & "S" & Format(D3, "00")) = ""

'technicien

TECHNICIEN:

MATRICULE = Left(agenceencours1, 1) & Format(T1, "00")
TECHNICIEN = DLookup("NOMTEC", "PRODACCESS_PERSONNEL2", "[RESER2]
= " & "'" & Trim([MATRICULE]) & "'")
PRENOM = DLookup("PRNTEC", "PRODACCESS_PERSONNEL2", "[RESER2] = "
& "'" & Trim([MATRICULE]) & "'")
Me("NOM" & T1) = Trim([TECHNICIEN]) & " " & Trim([PRENOM])
ZONE = DLookup("ZONE", "PRODACCESS_PERSONNEL2", "[RESER2] = " &
"'" & Trim([MATRICULE]) & "'")
Me("ZONE" & T1) = Trim([ZONE])
If rst.BOF Then
GoTo jourferie
End If

'couleur et numero intevention priorite1

rst.FindFirst ("[MATRI2] = " & [MATRICULE] & " And [PRIORI] = '1'
AND DATES like " & "'" & D1 & "*'")
If rst.NoMatch Then
NUMINTER = 0
GoTo finpriorite1
Else
NUMINTER = rst!NINTER
Me("T" & T1 & "M" & Format(D3, "00")) = [NUMINTER]
If IsNull(NUMINTER) Then
NUMINTER = 0
End If
STATINT1 = rst!STATIN
COULEUR = rst!COLOR
End If
If IsNull(COULEUR) Then
COULEUR = 0
End If
Select Case COULEUR
Case 2
Me("T" & T1 & "M" & Format(D3, "00")).BackColor = 3355647
If Trim(STATINT1) = "01" Then
Me("T" & T1 & "M" & Format(D3, "00")).ForeColor = 16777215
GoTo fincouleurpriorite1
End If
If Trim(STATINT1) = "08" Or Trim(STATINT1) = "11" Or
Trim(STATINT1) = "12" Or Trim(STATINT1) = "13" Or Trim(STATINT1) > "14" Then
Me("T" & T1 & "M" & Format(D3, "00")).ForeColor = 12632256
Else
Me("T" & T1 & "M" & Format(D3, "00")).ForeColor = 0
End If
GoTo fincouleurpriorite1
Case 3
Me("T" & T1 & "M" & Format(D3, "00")).BackColor = 5242879
If Trim(STATINT1) = "01" Then
Me("T" & T1 & "M" & Format(D3, "00")).ForeColor = 255
GoTo fincouleurpriorite1
End If
If Trim(STATINT1) = "08" Or Trim(STATINT1) = "11" Or
Trim(STATINT1) = "12" Or Trim(STATINT1) = "13" Or Trim(STATINT1) > "14" Then
Me("T" & T1 & "M" & Format(D3, "00")).ForeColor = 12632256
Else
Me("T" & T1 & "M" & Format(D3, "00")).ForeColor = 0
End If
GoTo fincouleurpriorite1


ect....

si tu peu me conseiller, j'en serai ravi

D'autre part as tu des consils sur les liaisons autres qur ODBC car la
je suis largué

Encore merci de ta réponse et à bientot j'espére



Avatar
gminot
Bonjour daniel


merci de vos conseils, j'ai utilisé le snapshot et cela fonctionne
sans importer les données dans une table . Le gain en temps est faible
mais cela semble plus propre .

Je vais me mettre à appliquer vos conseils pour essayer de gagner en
temps . Toutefois si j'ai utilisé like avec * patipatata c'est que le
driver ODBC ne reconnait pas le format date correctement .

Je vais retravailler toutefois cela et je ne manquerais pas de vous
donner des nouvelles prochainement


Merci et à bientot

Gilles








"Daniel Carollo" wrote in message news:<O0Ie#...
Bonsoir Gilles!

Je n'ai regarde votre code qu'en diagonale, parcequ'il fait un peu mal aux
yeux...

A priori, l'index sur la date ne sert a rien: les clauses DATES LIKE
"Patali-Patala" vont forcer un scan de la table. C'est probablement la
premiere cause de lenteur.
Ensuite, vous faites cinq fois la meme chose (cinq fois plus lent?)...

Pourquoi ne pas vous servir d'une clause du genre:

WHERE DATES BETWEEN D1 AND (D1 + 5) AND Agence = AgenceEnCours AND STATIN <>
'15' ?
Un peu plus aise sur les yeux, et probablement plus rapide a l'execution.
L'operateur Like est a fuir comme la peste.

Vous faites une copie des donnees de la table du serveur dans une table
locale. Je ne suis pas sur que ce soit une bonne chose. En general, les
serveurs de bases de donnees dedies sont plutot plus performants qu'Access.
Avez-vous des index sur cette table locale?

Enfin, je vous conseille de lire l'aide en ligne sur OpenRecordset, il y a
des parametres qui vous permettrons d'affiner la ligne
Set rst = bds.OpenRecordset(MonJeuEnreg)


Pour une boucle du genre ci-dessous, executee au moins 24 x 5 fois, il y a
une methode un peu plus propre de le faire.

Do Until T1 > 23
Me("T" & T1 & "M" & Format(D3, "00")).BackColor = 16777215
Me("T" & T1 & "A" & Format(D3, "00")).BackColor = 16777215
Me("T" & T1 & "S" & Format(D3, "00")).BackColor = 16777215
Me("T" & T1 & "M" & Format(D3, "00")) = ""
Me("T" & T1 & "A" & Format(D3, "00")) = ""
Me("T" & T1 & "S" & Format(D3, "00")) = ""


Sachez tout d'abord que la syntaxe Me("MonNomDeControle") est tres
gourmande. Si on doit l'utiliser plusieurs fois (en particulier dans une
boucle), il vaut mieux creer un objet qui pointe sur ce controle, du genre:

Dim ctrl as Control

Do Until T1 > 23
Set crtl = Me("T" & T1 & "M" & Format(D3,"00"))
with ctrl
.backColor = 16777215
.value = ""
end with
...

Enfin, dans le traitement du technicien, vous faites trois DLookup qui vont
chercher les informations des techniciens dans la meme table. Un recordset
aurait permis de recuperer ca d'un coup d'un seul.

Vous parsemez votre code de Trim() pour des variables que vous venez de
creer. C'est totalement inutile (sauf a faire perdre du temps).

Vous ouvrez un Recordset sans ordonner les donnees. Vous retrouvez vos
petits comment?
Le FindFirst va aller se promener dans le recordset dans tous les sens. Il
eut mieux valu mettre une clause d'ordre dans la definition du recordset, et
de le balayer dans un seul sens (ce qui est plus rapide, cela nous permet
d'utiliser un recordset de type forwardOnly). L'utilisation de la fonction
Nz() vous aurait permis de vous affranchir de tests dans la boucle de
traitement, ce qui ameliorerait la rapidite d'execution, et la lecture du
code par le non-initie. Et de grace, laissez tomber la syntaxe "Like" pour
les dates, c'est d'une aberration qui frole l'infini. Vous la tenez d'ou
cette syntaxe?
Je verrai bien quelque chose du genre:

If Not FillTempTable (agenceencours1, D1, '15') then
msgbox "Erreur de remplissage de la table temporaire", vbCritical,
"Erreur critique"
end sub
else
SetupSemaine
SetupCouleurs
SetupInterventions
monsql = "SELECT MonChamp1, MonChamp2, NZ(MonChamp3), NZ(MOnChamp4) etc.
" & _
" FROM PRODACCESS_AGENDA3 ORDER BY ..."
MonJeuEnreg = monsql
Set rst = bds.OpenRecordset(MonJeuEnreg, dbOpenForwardOnly ,,
dbReadOnly)
with rst
if .EOF Then
msgbox "Pas d'enregistrements", vbInformation, "Erreur?"
else
do until .EOF
SetTechnician(.Matricule)
ProcessColour(.Color)
ProcessStatint(.Statint)
ProcessWhatever(.MonChamp)
.MoveNext
loop
end if
end with
end if

Une remarque d'ordre general: ca sert a quoi d'avoir des langages qui
permettent la programmation structuree si on ecrit du code aussi cochon que
ca?

Pour en venir a votre probleme particulier, remplir une ribambelle de
controles Access pour faire une gestion de planning n'est pas tres
intelligent. Il y a des controles ActiveX qui permettent de faire les choses
tres proprement, et qui sont justement adaptes a ce genre de travail.

Bonne continuation...

--
Daniel :-)

Computing Technologies International - www.computing-tech.com - We
provide solutions...


"gilles" wrote in message
news:
deja merci daniel car je ne trouvais pas beaucoup d'aide à mon
probléme .

Pour détailler un peu

1/ ma table comporte des index , NUMINTER ( N°intervention ) ,
NUMLIGNE ( N° ligne ) , dates et matricule technicien

2/ j'utilise client ACCESS pour mon driver ODBC, je pense que c'est
bon car dans mon application j'ai de multiples formulaires de type
base client fournisseur compta ect .. qui fonctionne correctement .

3/ pour le record set, c'est la que je coince un peu . En effet je
fais aucune modification sur la table pour l'affichage de mon planning
seulement de la visu . Je ne connais pas snapshot je vais me
documenter . Tu trouveras ci dessous un extrait de mon code pour
exemple

'chargement table

matable = "SELECT NINTER, MATRI2,DATES,PRIORI,COLOR, STATIN INTO
PRODACCESS_AGENDA3 FROM PRODACCESS_AGENDA WHERE "
Moncritère = "AGENCE= " & "'" & agenceencours1 & "'" & " AND DATES
Like " & "'" & D1 & "'" & " AND STATIN<>'15' Or AGENCE = " & "'" &
agenceencours1 & "'" & " AND DATES Like " & "'" & D1 + 1 & "'" & " AND
STATIN<>'15' Or AGENCE = " & "'" & agenceencours1 & "'" & " AND DATES
Like " & "'" & D1 + 2 & "'" & " AND STATIN<>'15' Or AGENCE = " & " '"
& agenceencours1 & "'" & " AND DATES Like " & "'" & D1 + 3 & "'" & "
AND STATIN<>'15' Or AGENCE = " & "'" & agenceencours1 & "'" & " AND
DATES Like " & "'" & D1 + 4 & "'" & " AND STATIN<>'15' Or AGENCE = " &
"'" & agenceencours1 & "'" & " AND DATES Like " & "'" & D1 + 5 & "'" &
" AND STATIN<>'15'"
MonJeuEnreg = matable & Moncritère
DoCmd.SetWarnings False
DoCmd.RunSQL MonJeuEnreg

' définition recordset

monsql = "SELECT * FROM PRODACCESS_AGENDA3 "
MonJeuEnreg = monsql
Set rst = bds.OpenRecordset(MonJeuEnreg)

'semaine

D2 = DatePart("w", D1, vbMonday)
If D2 = 1 Then
Me("SS" & Format(D3, "00")) = "Planning pour la Semaine N° " &
Format(D1, "ww")
End If

Do Until DatePart("w", D1, vbMonday) = 1
D1 = DateAdd("d", -1, D1)
Me("SS" & Format(D3, "00")) = "Planning pour la Semaine N° " &
Format(D1, "ww")
Loop

'jour

D1 = DateSerial(Year(Me![scrCDate]), month(Me![scrCDate]),
day(Me![scrCDate]))
D2 = DatePart("w", D1, vbMonday)
Do Until DatePart("w", D1, vbMonday) = 1
D1 = DateAdd("d", -1, D1)
Loop

Me![scr1Date] = D1
D3 = 1

Do Until D3 > 5

Me("DD" & Format(D3, "00")) = " " & day(D1)
If month(D1) <> month(Me![scrCDate]) Then
Me("DD" & Format(D3, "00")).ForeColor = 8421504
Else
Me("DD" & Format(D3, "00")).ForeColor = 16777215
If D1 = jour Then
Me("DD" & Format(D3, "00")).BackColor = 255
End If
End If


'numero intervention et technicien

T1 = 1

Do Until T1 > 23

'remise à zero des couleurs et N° inter

Me("T" & T1 & "M" & Format(D3, "00")).BackColor = 16777215
Me("T" & T1 & "A" & Format(D3, "00")).BackColor = 16777215
Me("T" & T1 & "S" & Format(D3, "00")).BackColor = 16777215
Me("T" & T1 & "M" & Format(D3, "00")) = ""
Me("T" & T1 & "A" & Format(D3, "00")) = ""
Me("T" & T1 & "S" & Format(D3, "00")) = ""

'technicien

TECHNICIEN:

MATRICULE = Left(agenceencours1, 1) & Format(T1, "00")
TECHNICIEN = DLookup("NOMTEC", "PRODACCESS_PERSONNEL2", "[RESER2]
= " & "'" & Trim([MATRICULE]) & "'")
PRENOM = DLookup("PRNTEC", "PRODACCESS_PERSONNEL2", "[RESER2] = "
& "'" & Trim([MATRICULE]) & "'")
Me("NOM" & T1) = Trim([TECHNICIEN]) & " " & Trim([PRENOM])
ZONE = DLookup("ZONE", "PRODACCESS_PERSONNEL2", "[RESER2] = " &
"'" & Trim([MATRICULE]) & "'")
Me("ZONE" & T1) = Trim([ZONE])
If rst.BOF Then
GoTo jourferie
End If

'couleur et numero intevention priorite1

rst.FindFirst ("[MATRI2] = " & [MATRICULE] & " And [PRIORI] = '1'
AND DATES like " & "'" & D1 & "*'")
If rst.NoMatch Then
NUMINTER = 0
GoTo finpriorite1
Else
NUMINTER = rst!NINTER
Me("T" & T1 & "M" & Format(D3, "00")) = [NUMINTER]
If IsNull(NUMINTER) Then
NUMINTER = 0
End If
STATINT1 = rst!STATIN
COULEUR = rst!COLOR
End If
If IsNull(COULEUR) Then
COULEUR = 0
End If
Select Case COULEUR
Case 2
Me("T" & T1 & "M" & Format(D3, "00")).BackColor = 3355647
If Trim(STATINT1) = "01" Then
Me("T" & T1 & "M" & Format(D3, "00")).ForeColor = 16777215
GoTo fincouleurpriorite1
End If
If Trim(STATINT1) = "08" Or Trim(STATINT1) = "11" Or
Trim(STATINT1) = "12" Or Trim(STATINT1) = "13" Or Trim(STATINT1) > > "14" Then
Me("T" & T1 & "M" & Format(D3, "00")).ForeColor = 12632256
Else
Me("T" & T1 & "M" & Format(D3, "00")).ForeColor = 0
End If
GoTo fincouleurpriorite1
Case 3
Me("T" & T1 & "M" & Format(D3, "00")).BackColor = 5242879
If Trim(STATINT1) = "01" Then
Me("T" & T1 & "M" & Format(D3, "00")).ForeColor = 255
GoTo fincouleurpriorite1
End If
If Trim(STATINT1) = "08" Or Trim(STATINT1) = "11" Or
Trim(STATINT1) = "12" Or Trim(STATINT1) = "13" Or Trim(STATINT1) > > "14" Then
Me("T" & T1 & "M" & Format(D3, "00")).ForeColor = 12632256
Else
Me("T" & T1 & "M" & Format(D3, "00")).ForeColor = 0
End If
GoTo fincouleurpriorite1


ect....

si tu peu me conseiller, j'en serai ravi

D'autre part as tu des consils sur les liaisons autres qur ODBC car la
je suis largué

Encore merci de ta réponse et à bientot j'espére