begin process at 2012 02 14 10:48:08
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Visual Basic 6

 > 

Base de données

 > 

SQL

 > 

Vider une requête


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Vider une requête

mercredi 13 mai 2009 à 09:07:11 | Vider une requête

giancomo

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.
mercredi 13 mai 2009 à 09:51:43 | Re : Vider une requête

Renfield

Administrateur CodeS-SourceS
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
mercredi 13 mai 2009 à 15:06:23 | Re : Vider une requête

giancomo

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.
jeudi 14 mai 2009 à 02:26:43 | Re : Vider une requête

LIBRE_MAX

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.

      


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


jeudi 14 mai 2009 à 11:14:13 | Re : Vider une requête

giancomo

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.
jeudi 14 mai 2009 à 14:02:59 | Re : Vider une requête

LIBRE_MAX

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

      


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


jeudi 14 mai 2009 à 14:19:47 | Re : Vider une requête

LIBRE_MAX

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.

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


jeudi 14 mai 2009 à 15:22:09 | Re : Vider une requête

giancomo

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???
jeudi 14 mai 2009 à 16:28:37 | Re : Vider une requête

LIBRE_MAX

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)

 								

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




Cette discussion est classée dans : access, tab, sec, sqlcmd, protos


Répondre à ce message

Sujets en rapport avec ce message

access 2002 Déplacement avec la touche TAB [ par gandalfgris ] Bonjour, j'ai un petit soucis j'ai dans un formulaire 2 ou 3 sous formulaires. mais quand on se deplace avec la touche TAB de champs a champs, si on r Requête access [ par 4u4me4us ] Help, I need somebody, Help, not just anybody, Help, you know I need someone, help.Bonjour, Je voudrais créer un "recordset" avec les enregistrements Sendkeys et options pour une combo [ par bubuchette ] Salut tout le monde! Me voila reparti pour une nouvelle journée d'Access 2007 avec deux trois petites questions!! Bon la premiere: A propos des Sen Access et les indexs tabulation avec la touche TAB [ par annelise ] Bonjour, g développé une application sous Access gérée avec des formulaires.Tres simple donc pour passer d un champs a l autre avec la touche TAB, j a Graph ne s'affichent pas [ par giancomo ] Bonjour,J'essaie d'appliquer un code vba qui me permet de générer des graphiques sans réellement créer de requête (c'etait là tout l'objet de ce petit Comment arrêter une MACRO [ par ivdz ] Bonjour,Je voudrais savoir comment arrêter une macro Access, si une table TAB est vide, dans une fonction VB ou (autre solution) comment tester dans l Synchroniser une table access avec les contact outlook. [ par jff27 ] J'ai une table client (Nom, prenom, adresse etc...)Aprés une saisie de client, il faudrait qu'il apparaise dans les contact outlook.Peut on vraiment p mot de passe sous access [ par kFar ] j'ai dans ma base access une table contenant des mots de passe. j'ai appliqué le masque de saisie mot de passe sur le champ correspondant, ainsi on ne Format de Base de Donnée ... non reconnu [ par Rmoummed ] Salut a tous!je viens de faire un base avec access 2000, quand j utilise le controle "Data" fournit avec vb6 il me met un message d'erreur à l executi Pb Acces et MsComm [ par Ptitlutin ] Bonjour,je cherche à communiquer sur un port série Com1, a partir d'Access.Mais quand je souhaite utiliser le composant de communication, un message m


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,967 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales