Bonjour à tous.
est-il possible d'automatiser une requête, avec une sorte de "timer" pour que celle-ci se reproduise à intervalle régulier, sans intervention de l'utilisateur.
Si oui, quelle piste à explorer..?
Bonjour à tous.
est-il possible d'automatiser une requête, avec une sorte de "timer" pour que celle-ci se reproduise à intervalle régulier, sans intervention de l'utilisateur.
Si oui, quelle piste à explorer..?
Salut,
Avec du VBA...
Et dans ton code pour la requête :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 Public Sub Attendre(Optional iSecondes As Integer = 0, Optional bHrglass As Boolean = True) Dim lfin As Long If bHrglass = True Then DoCmd.Hourglass bHrglass lfin = Timer + iSecondes Do DoEvents Loop Until Timer >= lfin If bHrglass = True Then DoCmd.Hourglass False End Sub
@+.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 Timer1: Attendre (30 * 60) 'attente de 30mn DoCmd.OpenQuery "REQUETE" GoTo Timer1
bonjour,
et merci zoom61 pour cette piste de travail.
dans cette hypothèse, Access doit rester "ouvert" en permanence bien sur.
Par contre, je ne comprends pas bien, la requêteSQL doit être crée en VBA..?
Merci
Non, DoCmd.OpenQuery "REQUETE", c'est la commande qui permet d'appeler une requête.
@+.
Re bonjour,
et re-merci !
malgré tout, je crois qu'il va falloir que je passe quand même par le vba, car j'ai besoin d'une requête qui selon le résutat envoie un e-mail à une ou plusieurs adresses définies au départ avec comme contenu le résultat de la requête.
En clair, j'ai une table qui se nomme "reactifs_volatils" avec des champs:
"ReactRef", "React_Utilisation", "React_Valeur".
cette table est mise à jour plusieurs centaine de fois par jour par des dizaines d'utilisateurs.
Mon but est de déclancher l'envoi d'un mail auto si la valeur de "React_Valeur"est > à 2 avec dans le mail un message du style:
Attention : pour "ReacRef"et React_Utilisation", la valeur est supérieure à 2("React_Valeur")
je souhaiterais que cette procédure se répète toutes les 30 minutes par exemple.
Je crois qu créer la requête en vba est trop dur pour moi..
Voici le code pour exécuter une requête en VBA :
Code vba : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 SQL = "SELECT ReactRef, React_Utilisation, React_Valeur FROM reactifs_volatils" Set oSQL = CurrentDb.OpenRecordset(SQL) Do Until oSQL.EOF If Dir(oSQL("React_Valeur")) > 2 Then 'Commande d'envoi des mails End If oSQL.MoveNext Loop
@+.
je rougis de mon ignorance..!!
mais où dois-je placer ces codes..?
faut-il que je crée un module à cet effet..?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 Timer1: Attendre (30 * 60) 'attente de 30mn SQL = "SELECT ReactRef, React_Utilisation, React_Valeur FROM reactifs_volatils" Set oSQL = CurrentDb.OpenRecordset(SQL) Do Until oSQL.EOF If Dir(oSQL("React_Valeur")) > 2 Then 'Commande d'envoi des mails End If oSQL.MoveNext LoopSQL GoTo Timer1
oui,
j'ai bien fait ça, j'ai bien compris la structure de l'ensemble,
mais je ne sais pas où placer cet ensemble pour que ça fonctionne...
dans insertion/module..?
Oui, dans un module ou derrière l'évènement onclick() d'un bouton
Bonjour,
alors j'ai créé un module que j'ai nommé "query".
et dans ce module j'ai mis:
il ne se passe rien..ça ne marche pas.!!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 Public Sub Attendre(Optional iSecondes As Integer = 0, Optional bHrglass As Boolean = True) Dim lfin As Long If bHrglass = True Then DoCmd.Hourglass bHrglass lfin = Timer + iSecondes Do DoEvents Loop Until Timer >= lfin If bHrglass = True Then DoCmd.Hourglass False End Sub Private Sub query() Timer1: Attendre (30 * 60) 'attente de 30mn 'DoCmd.OpenQuery "REQUETE" SQL = "ma requête dont j'ai fait un copié/collé du SQL généré" Set oSQL = CurrentDb.OpenRecordset(SQL) Do Until oSQL.EOF If Dir(oSQL("React_Valeur")) > 2 Then 'Commande d'envoi des mails MsgBox ("ok ça marche") End If oSQL.MoveNext Loop GoTo Timer1 End Sub
je ne sais pas pourquoi..ça doit surement venir du fait que je n'ai pas tout compris..
Il faut que tu mettes le code du module query dans un formulaire sur l'évènement chargement et surtout laisser ton formulaire ouvert.
@+.
encore merci pour l'aide et le soutien..
donc j'ai laissé dans un module nommé "query"
j'ai créé un formulaire (Formulaire1)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 Public Sub Attendre(Optional iSecondes As Integer = 0, Optional bHrglass As Boolean = True) Dim lfin As Long If bHrglass = True Then DoCmd.Hourglass bHrglass lfin = Timer + iSecondes Do DoEvents Loop Until Timer >= lfin If bHrglass = True Then DoCmd.Hourglass False End Sub
dans lequel j'ai mis sur Form_Load:
j'ai modifié le timer pour que le test se fasse toutes les minutes afin de ne pas attendre trop longtemps..
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 Private Sub Form_Load() Timer1: Attendre (1 * 60) 'attente de 1mn 'DoCmd.OpenQuery "REQUETE" SQL = "ma requête dont j'ai fait un copié/collé du SQL généré" Set oSQL = CurrentDb.OpenRecordset(SQL) Do Until oSQL.EOF If Dir(oSQL("React_Valeur")) > 2 Then 'Commande d'envoi des mails MsgBox ("CA MARCHE") End If oSQL.MoveNext Loop GoTo Timer1 End Sub
Lorsque je lance l'ouverture de mon formulaire, il ne se passe rien, il ne s'affiche pas...juste un sablier/attente puis au bout d'1 minute,
message "Erreur d'exécution 3061" trop peu d'arguments: 1 attendu
au débogage, j'ai un pb sur cette ligne
ça vient du sql de ma requête..? elle marche bien pourtant en mode "normal"
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Set oSQL = CurrentDb.OpenRecordset(SQL)
Fait voir ton code SQL !
@+.
Ci dessous le SQL de ma reqête.
ça ne correspond pas à celui du modèle initial (c'est la requête définitive)
et je souhaite déclancher l'envoi mail si on trouve des valeurs >2 dans le champ "terseForm" de la table PtLabresult" donc
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2SQL = "SELECT dbo_D_Encounter.lastName AS Nom, dbo_D_Encounter.firstName AS Prénom, dbo_PtLabResult.terseForm AS INR, dbo_PtLabResult.chartTime AS [Date/heure INR], dbo_PtCensus.clinicalUnitId FROM ((dbo_D_Encounter INNER JOIN dbo_PtLabResult ON dbo_D_Encounter.encounterId = dbo_PtLabResult.encounterId) INNER JOIN dbo_D_Attribute ON dbo_PtLabResult.attributeId = dbo_D_Attribute.attributeId) INNER JOIN dbo_PtCensus ON dbo_D_Encounter.encounterId = dbo_PtCensus.encounterId WHERE (((dbo_PtCensus.clinicalUnitId)=6) AND ((dbo_PtCensus.outTime) Is Null) AND ((dbo_D_Attribute.shortLabel)=inr));"
Code : Sélectionner tout - Visualiser dans une fenêtre à part If Dir(oSQL("terseForm")) > 2 Then
Salut,
Remplace ((dbo_D_Attribute.shortLabel)=inr)) par ((dbo_D_Attribute.shortLabel)='inr')) !
@+.
j'ai maintenant Erreur d'exécution 3265 / élément non trouvé dans cette collection..
Tu as mis If Dir(oSQL("terseForm")) > 2 Then, cela ne serait pas plutôt If Dir(oSQL("INR")) > 2 Then
@+.
à vrai dire, j'avais essayé de passer INR comme paramètre et j'avais eu comme message d'erreur:
Erreur d'exécution 13 / Incompatibilité de type.
A bien y réfléchir, cela ne peut 'il pas venir du fait que les résultats sont des nombres à virgules avec 2 décimales tandis que dans la requête SQL en VBA on a mis un point..?
seulement ça plante si je remplace le point par virgule..
Oups, c'est moi, il faut mettre If oSQL("INR") > 2 Then.
@+.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager