Vider une requête

giancomo Messages postés 15 Date d'inscription lundi 4 mai 2009 Statut Membre Dernière intervention 19 juin 2009 - 13 mai 2009 à 09:07
LIBRE_MAX Messages postés 1402 Date d'inscription mardi 1 mai 2007 Statut Membre Derniè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.

8 réponses

Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
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

Me.Graphique10.Requery
End If
End Sub
0
giancomo Messages postés 15 Date d'inscription lundi 4 mai 2009 Statut Membre Dernière intervention 19 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.
0
LIBRE_MAX Messages postés 1402 Date d'inscription mardi 1 mai 2007 Statut Membre Dernière intervention 7 octobre 2012 6
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.

      
<hr />


[] Ce qui va sans dire. va mieux en le disant.


<hr />
0
giancomo Messages postés 15 Date d'inscription lundi 4 mai 2009 Statut Membre Dernière intervention 19 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 & """))"

Graphique10.RowSource = SQLCmd1.SQL
Me.Graphique10.Requery

End Sub

Merci bien dans tous les cas pour ta réponse.

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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
LIBRE_MAX Messages postés 1402 Date d'inscription mardi 1 mai 2007 Statut Membre Dernière intervention 7 octobre 2012 6
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)
   
    idx.Fields.Append idx.CreateField(xIndex)
    idx.Primary = True
    tbl.Indexes.Append idx


'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


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 < (#" & date_bidon & "#))"




      
<hr />



[] Ce qui va sans dire. va mieux en le disant.


<hr />
0
LIBRE_MAX Messages postés 1402 Date d'inscription mardi 1 mai 2007 Statut Membre Dernière intervention 7 octobre 2012 6
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 />

[] Ce qui va sans dire. va mieux en le disant.

<hr />
0
giancomo Messages postés 15 Date d'inscription lundi 4 mai 2009 Statut Membre Dernière intervention 19 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???
0
LIBRE_MAX Messages postés 1402 Date d'inscription mardi 1 mai 2007 Statut Membre Dernière intervention 7 octobre 2012 6
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)





<hr />




[] Ce qui va sans dire. va mieux en le disant.


<hr />
0
Rejoignez-nous