giancomo
Messages postés15Date d'inscriptionlundi 4 mai 2009StatutMembreDernière intervention19 juin 2009
-
13 mai 2009 à 09:07
LIBRE_MAX
Messages postés1402Date d'inscriptionmardi 1 mai 2007StatutMembreDernière intervention 7 octobre 2012
-
14 mai 2009 à 16:28
Bonjour à tous,
Je travaille actuellement sur la création d'une interface de contrôle de procédé qui consiste à la création de formulaire intégrant les mesures du procédé sur lequel je travaille.
Je bloque sur un problème d'affichage de graphique. Je rempli une requête via VBA, et celle ci est la source d'un graphique dans mon formulaire. Mais je voudrai qu'à l'ouverture de mon formulaire, le graphique n'affiche rien. Or il affiche les résultats de ma précédente requête sans que j'actualise les paramètres à rentrer dans le formulaire. Je cherche un moyen de vider ma requête à l'ouverture ou à la fermeture du formulaire,de sorte qu'il n'y aura rien à afficher, et les personnes utilisant ce formulaire devront obligatoirement rentrer les données nécessaire pour que mon graph s'affiche. Voici le code que j'ai crée pour actualiser mon graph :
Private Sub Commande13_Click()
Dim SQLCmd As DAO.QueryDef
Set SQLCmd = CurrentDb.QueryDefs!QUERY_GRAPH_SECONDE_CNG1
SQLCmd.SQL = "SELECT PROTOS_TAB_SEC_ACCESS_CNG1.DAT, PROTOS_TAB_SEC_ACCESS_CNG1.II, PROTOS_TAB_SEC_ACCESS_CNG1.RI, PROTOS_TAB_SEC_ACCESS_CNG1.HCADRI, PROTOS_TAB_SEC_ACCESS_CNG1.CDOMD, PROTOS_TAB_SEC_ACCESS_CNG1.UI"
SQLCmd.SQL = SQLCmd.SQL + " FROM PROTOS_TAB_SEC_ACCESS_CNG1"
SQLCmd.SQL = SQLCmd.SQL + " WHERE (PROTOS_TAB_SEC_ACCESS_CNG1.DAT between (#" & Me.date_deb & "#) AND (#" & Me.date_fin & "#))"
Set SQLCmd = Nothing
If Me.date_fin.Value - Me.date_deb.Value > 1 / 24 Then
MsgBox ("Intervalle trop grand Demander moins d'une heure")
ElseIf Me.date_fin.Value And Me.date_deb.Value < Date - 30 Then
MsgBox ("Données trop anciennes demander moins d'un mois")
Else: Me.Graphique10.Requery
End If
End Sub
La ligne "Set SQLCmd = Nothing" devrait régler mon problème (d'aprés ce que j'en avais compris), mais il n'en est rien, j'ai toujours un graphique qui s'affichent avant que je l'ai actualisé avec les paramètres à mettre dans mon formulaire. J'ai essayé de programmer une commande pour vider le requête à la sortie, mais j'y arrive pas (je suis un super débutant dans la matière), je n'arrive qu'à programmer la supression de la requête, je n'ai pas trouvé la commande qui me permet de simplement la vider (car si cette requete est supprimer le code bug).
Voilà; j'espère m'être bien fait comprendre. Si quelqu'un a la solution de mon problème, je le remercie d'avance pour l'aide qu'il pourra me procurer.
A bientot.
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 13 mai 2009 à 09:51
tu fais un lien (reference) entre une requete de ta base, et un objet QueryDef.
Set SQLCmd = Nothing rompt ce lien. Pourtant... ta requête existe toujours dans ta base.
a noter que tes dates devraient être formatées yyyy-mm-dd ...
sans pouvoir tester, je dirai de repartir sur d'autres bases:
Private Sub Commande13_Click()
Dim SQLCmd As DAO.QueryDef
If Me.date_fin.Value - Me.date_deb.Value > 1 / 24 Then
MsgBox ("Intervalle trop grand Demander moins d'une heure")
ElseIf Me.date_fin.Value And Me.date_deb.Value < Date - 30 Then
MsgBox ("Données trop anciennes demander moins d'un mois")
Else
On Error Resume Next
Set SQLCmd = CurrentDb.QueryDefs!QUERY_GRAPH_SECONDE_CNG1
On Error Goto 0
If Not Nothing Is SQLCmd Then
SQLCmd.SQL = "SELECT DAT, II, RI, HCADRI, CDOMD, UI " & _
"FROM PROTOS_TAB_SEC_ACCESS_CNG1 " & _
"WHERE DAT BETWEEN #" & Format$(Me.date_deb, "yyyy-mm-dd hh:nn:ss" & "# AND #" & format$(Me.date_fin, "yyyy-mm-dd hh:nn:ss") & "#"
SQLCmd.Close
giancomo
Messages postés15Date d'inscriptionlundi 4 mai 2009StatutMembreDernière intervention19 juin 2009 13 mai 2009 à 15:06
Merci d'avoir répondu si vite Renfield.
Je m'explique un peu. A la base, mon but est de m'affranchir des requêtes d'access pour alimenter la source de mon graph. J'ai fait une erreur en mettant comme source une requête existante. La méthode .rowsource. a l'air de marcher, mais j'arrive pas à faire tourner le code sans la ligne : Set SQLCmd = CurrentDb.QueryDefs!QUERY_GRAPH_SECONDE_CNG1. Alors que techniquement je n'en ai pas besoin, puisque ma requete est généré depuis mon code.
Voici le code utilisé :
Dim SQLCmd As DAO.QueryDef
If Me.date_fin.Value - Me.date_deb.Value > 1 / 24 Then
MsgBox ("Intervalle trop grand Demander moins d'une heure")
Set SQLCmd = Nothing
ElseIf Me.date_fin.Value And Me.date_deb.Value < Date - 30 Then
MsgBox ("Données trop anciennes demander moins d'un mois")
Set SQLCmd = Nothing
Else
On Error Resume Next
Set SQLCmd = CurrentDb.QueryDefs!QUERY_GRAPH_SECONDE_CNG1
On Error GoTo 0
End If
If Not Nothing Is SQLCmd Then
SQLCmd.SQL = "SELECT PROTOS_TAB_SEC_ACCESS_CNG1.DAT, PROTOS_TAB_SEC_ACCESS_CNG1.II, PROTOS_TAB_SEC_ACCESS_CNG1.RI, PROTOS_TAB_SEC_ACCESS_CNG1.HCADRI, PROTOS_TAB_SEC_ACCESS_CNG1.CDOMD, PROTOS_TAB_SEC_ACCESS_CNG1.UI"
SQLCmd.SQL = SQLCmd.SQL + " FROM PROTOS_TAB_SEC_ACCESS_CNG1"
SQLCmd.SQL = SQLCmd.SQL + " WHERE (PROTOS_TAB_SEC_ACCESS_CNG1.DAT between (#" & Me.date_deb & "#) AND (#" & Me.date_fin & "#))"
SQLCmd.Close
Graphique10.RowSource = SQLCmd.SQL
Me.Graphique10.Requery
End If
End Sub
Maintenant, je cherche à empecher la mise à jour de mon graphique lorsque j'ouvre mon formulaire car apparement ça fait ramer un peu le tout. Là je teste ça sur un formulaire ayant un seul graph, mais je veux l'appliquer à des formulaires contenant une vingtaine de graph. Car ces formulaires mettent un temps fou à s'ouvrir ou se fermer. Et on m'a expliquer que c parce que dans mes requetes d'origine (que j'avais créer sous access), il y'a un appel à des données que l'on met formulaire (les dates et un numéro de cuve le plus souvent, parce que ça va afficher selon une période et une cuve). Donc, je voulais supprimer cette étape en écrivant ma requête directement dans le code.
Ca marche, mais il me reste ces soucis qui sont l'apparation de la précédente recherche lorsque j'ouvre le formulaire (sans rentrer aucun paramètre) et la ligne de code dont je veux m'affranchir.
Ce que je fais a l'air trés proche de l'utilisation d'un Recordset auquel je n'ai rien compris, mais apparement ça peut m'aider.
mes messages sont un peu long, mais c pour qu'il n'y ait pas d'ambiguité.
Merci encore pour ton aide.
P.S. : je n'ai pas pigé le problème sur mes dates, ça marche trés bien lorsque je le fais à ma manière, si je fais tourner ton code avec "yyyy-mm-dd hh:nn:ss", il comprend plus rien.
LIBRE_MAX
Messages postés1402Date d'inscriptionmardi 1 mai 2007StatutMembreDernière intervention 7 octobre 20126 14 mai 2009 à 02:26
Salut,
Pourquoi ne pas construire ta requete à partir d' une table temporaire, identique à PROTOS_TAB_SEC_ACCESS_CNG1
que tu pourras :
-vider avant le chargement du formuliare.
"Delete * From Tmp"
et
-réemplir en temps voulu
"Insert Into Tmp Select * From PROTOS_TAB_SEC_ACCESS_CNG1
WHERE (PROTOS_TAB_SEC_ACCESS_CNG1.DAT between (#" & Me.date_deb & "#) AND (#" & Me.date_fin & "#))"
-
Ainsi :
SQLCmd.SQL = "SELECT Tmp.DAT, Tmp.II, Tmp.RI, Tmp.HCADRI, Tmp.CDOMD, Tmp.UI FROM Tmp"
mettra à jour ton graph selon que ta Tmp est vide ou pas.
giancomo
Messages postés15Date d'inscriptionlundi 4 mai 2009StatutMembreDernière intervention19 juin 2009 14 mai 2009 à 11:14
Libre_max, t'a tout à fait compris mon problème, je vais essayer ta méthode. Je voulais savoir est ce qu'il faut que je crée cette table temporaire, parce que, la fonction delete va me la supprimer donc je devrai faire en sorte de la créer dans ma requete (j'avais tester avec une sorte de requête temporaire, et ça m'a supprimer ma requete lorsque je suis sortie du formulaire, j'avais placé la fonction delete avec la procédure de sortie du formulaire). Il n'existe pas une fonction pour simplement vider cette table temporaire?
Si t'as le temps, tu peux juste me placer les lignes de suppression de table dans le code, ci dessous, je vais tester mais il se pourrait que je misère un peu.
Private Sub Commande35_Click()
Dim SQLCmd1 As New DAO.QueryDef
SQLCmd1.SQL = "SELECT PROTOS_TAB_POSTES.DAT, PROTOS_TAB_POSTES.CP_SANMO, PROTOS_TAB_POSTES.CP_SURTA"
SQLCmd1.SQL = SQLCmd1.SQL + " FROM PROTOS_TAB_POSTES"
SQLCmd1.SQL = SQLCmd1.SQL + " WHERE (PROTOS_TAB_POSTES.DAT between (#" & Me.date_deb & "#) AND (#" & Me.date_fin & "#)) AND ((PROTOS_TAB_POSTES.COD_CUV)=(""" & Me.CUVE & """))"
Tant qu'on y est, j'ai un autre problème un peu moins chiant je pense mais qui me rend un peu fou.
J'avais fait une procédure qui me permettait de bloquer l'affichage d'un graph lorsque les paramètres spécifiés n'étaient pas bon (le code va suivre). Mais c avant que je mette en place le système de requête inséré dans le code vba (je placai ce code de blocage sur mes paramètre aux même puisque la mise à jour du graph se faisait lorsqu'on changeait un paramètre). ET ca marchait, puisque aprés le message d'erreur le graph restait vide. Mais maintenant, il me met bien le message d'erreur par contre il essaie quand même de générer le graph. Je sais pas où est l'erreur dans ce code :
Private Sub Commande13_Click()
Dim SQLCmd As New DAO.QueryDef
If Me.date_fin.Value - Me.date_deb.Value > 1 / 24 Then
MsgBox ("Intervalle trop grand Demander moins d'une heure")
Set SQLCmd = Nothing
ElseIf Me.date_fin.Value And Me.date_deb.Value < Date - 30 Then
MsgBox ("Données trop anciennes demander moins d'un mois")
Set SQLCmd = Nothing
Else
Me.Graphique10.Requery
On Error Resume Next
Exit Sub
End If
SQLCmd.SQL = "SELECT PROTOS_TAB_SEC_ACCESS_CNG1.DAT, PROTOS_TAB_SEC_ACCESS_CNG1.II, PROTOS_TAB_SEC_ACCESS_CNG1.RI, PROTOS_TAB_SEC_ACCESS_CNG1.HCADRI, PROTOS_TAB_SEC_ACCESS_CNG1.CDOMD, PROTOS_TAB_SEC_ACCESS_CNG1.UI"
SQLCmd.SQL = SQLCmd.SQL + " FROM PROTOS_TAB_SEC_ACCESS_CNG1"
SQLCmd.SQL = SQLCmd.SQL + " WHERE (PROTOS_TAB_SEC_ACCESS_CNG1.DAT between (#" & Me.date_deb & "#) AND (#" & Me.date_fin & "#))"
SQLCmd.Close
Graphique10.RowSource = SQLCmd.SQL
End Sub
Voilà, si y'a quelqu'un qui peut m'aider ce serait cool. Merci.
Vous n’avez pas trouvé la réponse que vous recherchez ?
LIBRE_MAX
Messages postés1402Date d'inscriptionmardi 1 mai 2007StatutMembreDernière intervention 7 octobre 20126 14 mai 2009 à 14:02
"..est ce qu'il faut que je crée cette table temporaire ?"
Oui. la créer mais dans la base elle-même.Cette table doit exister dans la base au même titre
que ta table principale ROTOS_TAB_SEC_ACCESS_CNG1
et avec la même structure que celle-ci.
"..delete va me la supprimer"
Non,"Delete * From Temporaire" supprime uniquement les enregistrements.
Autrement dit, elle vide la table.
NB:Si tu n' as pas acces à ta base et que tu ne peux pas la modifier, tu peux toujours la cloner par code:
Public Sub ClonerTable(xSource, xDestination, xIndex)
Dim tbl As TableDef
Dim Fld As Field
Dim idx As Index
Dim xdata As Recordset
Dim xnom As String
Dim xtype As Variant
Dim xtaille As Double
Dim j As Integer
Dim k As Integer
'Creer Table destination
Set tbl = xDB.CreateTableDef(xDestination)
'creer un recordset
Set xdata = xDB.OpenRecordset(xSource, dbOpenTable)
'nombre de champ de la table source
k = xdata.Fields.Count
'creer autant de champ dans la table destination et
'leur attribuer les propriétés des champs de la table source
For j = 1 To k
xnom = xdata.Fields(j - 1).Name
xtype = xdata.Fields(j - 1).Type
xtaille = xdata.Fields(j - 1).Size
Set Fld = tbl.CreateField(xnom, xtype, xtaille)
tbl.Fields.Append Fld
Set Fld = Nothing
Next j
'Creer la cle primaire
Set idx = tbl.CreateIndex(xIndex)
'ajouter la table destination à la collection des tables
'de la base de donées en cour
xDB.TableDefs.Append tbl
Set tbl = Nothing
Set idx = Nothing
Set xdata = Nothing
End Sub
Ce code permet donc de cloner ta table principale et la table ainsi crééeé existera de façon permanente dans ta base dès lors que tu exécutera ce code.Arranges toi donc pour ne l' exécuter qu' une seule fois.Ou alors places un test avant de lancer la fonction pour savoir si la table éxiste déjà ou pas.
Au fait sans devoir toucher à ta base, voici un exemple
de requete qui ne risque pas de renvoyer quelque chose.
Il suffit de faire dans le critère, une référence à une date bidon, genre 01/01/1111
LIBRE_MAX
Messages postés1402Date d'inscriptionmardi 1 mai 2007StatutMembreDernière intervention 7 octobre 20126 14 mai 2009 à 14:19
Je viens de comprendre ce qui t' as induit en erreur.
Ce que je veux dire par Table Temporaire non pas une table ephèmère (ou jetable :-), mais une table permanente qu' on vide et qu' on remplit.
<hr />
giancomo
Messages postés15Date d'inscriptionlundi 4 mai 2009StatutMembreDernière intervention19 juin 2009 14 mai 2009 à 15:22
Interessant comme méthode, néanmoins, je sais pas trop par quoi remplacer xIndex lorsque je veux cloner la table.
xSource ça doit être le nom de la table, xDestination ça doit être le nom de la table acceuillant les nouvelles données, tu me dis si je me trompe???
A part ces variable il n'y a rien à changer non???
LIBRE_MAX
Messages postés1402Date d'inscriptionmardi 1 mai 2007StatutMembreDernière intervention 7 octobre 20126 14 mai 2009 à 16:28
xIndex c' est le numéro ordinal de ton champ cle primaire.
Si ta cle correspond au premier champ par exemple, xIndex sera egale à 0.
Si c' est le 2ième, ça sera 1....
Si ta table n' est pas indexée, tu peux t' en passer.
Mets juste en commentaire la partie de code correspondante
Autre chose à remplacer :
xDB par CurrentDB, ou alors déclares
xDB As DataBase.
Set xDB=DBEngine.Workspaces(0).OpenDatabase(CheminDeLaBase)