IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBA Access Discussion :

export docmd.OutputTo avec une condition Where


Sujet :

VBA Access

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 80
    Points : 71
    Points
    71
    Par défaut export docmd.OutputTo avec une condition Where
    Bonjour,

    Je voudrais faire un export d'un état vers Excel avec la commande OutputTo. Mais avec un filtre, du même type que pour la commande docmd.OpenReport avec l'argument WhereCondition!
    J'ai donc trouvé une solution ici :
    http://www.thescripts.com/forum/thread720974.html
    Simple et efficace, il suffit de déclarer une variable globale, lui affecter le WhereCondidion (le filtre), et appliquer ce filtre dans l'évènement Report_Open() de mon état.
    Hélas ça ne marche pas: le code n'est même pas exécuté par la commande OutputTo (genre, je met un point d'arrêt à cet endroit, le code ne s'arrête pas!?)
    Alors que ça marche très bien lorsque je l'ouvre avec docmd.OpenReport (ce qui ne me sert à rien puisque j'ai laissé l'argument WhereCondition ici)

    J'utilise Access 2003 en format APD et une base SQL-server 2000...

  2. #2
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 399
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 399
    Points : 2 221
    Points
    2 221
    Par défaut
    bonjour,

    y'a probablement plus simple, mais j'ai pas trouvé...
    On appelle une fonction qui sauve le filtre dans l'état, puis on fait OutputTo et enfin on supprime le filtre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Dim sNomEtat As String, sMonFiltre As String
    sNomEtat = "Test"
    sMonFiltre = "MonChamp = xx"
    If FiltreEtat(sNomEtat, sMonFiltre) Then 'On sauve le filtre dans l'état
       DoCmd.OutputTo acOutputReport, sNomEtat, acFormatSNP, "c:\MonChemin\test.snp"
       FiltreEtat sNomEtat 'On supprime le filtre
    End If
    Et le code de la fonction FiltreEtat :
    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
     
    Public Function FiltreEtat(ByVal NomEtat As String, Optional ByVal Filtre As String) As Boolean
       Dim oEtat As Report
       On Error GoTo fin
       DoCmd.OpenReport NomEtat, acViewDesign, , , acHidden
       Set oEtat = Reports(NomEtat)
       If Len(Filtre) > 0 Then
          oEtat.Filter = Filtre
          oEtat.FilterOn = True
       Else
          oEtat.Filter = vbNullString
          oEtat.FilterOn = False
       End If
       DoCmd.Close acReport, NomEtat, acSaveYes
       FiltreEtat = True
    fin:
       Set oEtat = Nothing
    End Function
    cordialement,

    Philippe

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 80
    Points : 71
    Points
    71
    Par défaut
    Bonjour Philben et merci pour ton attention,

    mais ça ne marchera pas lorsque je compilerai en ADE, on ne peut pas ouvrir en modification un état une fois compilé...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DoCmd.OpenReport NomEtat, acViewDesign, , , acHidden
    (avec l'option acHidden peut etre? je testerais quand meme par acquis de conscience...)

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour

    Pourquoi ne fais-tu pas l'export en prenant la requête qui alimente ton état et la clause Where ?

    Cela ne t'apportera rien de plus d'exporter l'Etat.

    Et dans ce cas utilises plutôt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DoCmd.TransfertSpreadSheet...
    Starec

  5. #5
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 399
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 399
    Points : 2 221
    Points
    2 221
    Par défaut
    bonjour,

    une solution via DAO pour modifier par le code la clause WHERE d'une requete de sélection stockée :
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
    '---------------------------------------------------------------------------------------
    ' Procédure    : LetWhereRequete [Function]
    ' Retour       : Boolean
    ' Auteur       : PhilBen
    ' Version      : 1.0
    ' Création/Maj : Le samedi 26 janvier 2008
    ' Objet        : Ajouter, modifier, supprimer une clause WHERE
    '              : dans une requête Selection stockée
    ' Remarque     : Nécessite d'activer la référence DAO
    ' Historique   :
    '---------------------------------------------------------------------------------------
    Public Function LetWhereRequete(ByVal Requete As String, Optional ByVal NewWhere As String) As Boolean
       Const csWHERE As String = "WHERE "
       Dim oDb As DAO.Database
       Dim oQdf As DAO.QueryDef
       Dim avCherche As Variant
       Dim sSql As String
       Dim i As Integer, iDebWhere As Integer, iFinWhere As Integer, iLenNewWhere As Integer
     
       On Error GoTo fin
     
       Set oDb = CurrentDb
       Set oQdf = oDb.QueryDefs(Requete)
       sSql = oQdf.sql
       avCherche = Array("GROUP BY ", "ORDER BY ", ";")
     
       For i = LBound(avCherche) To UBound(avCherche)
          iFinWhere = InStrRev(sSql, avCherche(i))
          If iFinWhere Then Exit For
       Next i
     
       iDebWhere = InStrRev(sSql, csWHERE)
       NewWhere = Trim$(NewWhere)
       iLenNewWhere = Len(NewWhere)
     
       If iLenNewWhere Then NewWhere = " " & csWHERE & NewWhere & " "
       If iDebWhere = 0 Then iDebWhere = iFinWhere
     
       sSql = Left$(sSql, iDebWhere - 1) & NewWhere & Mid$(sSql, iFinWhere)
       oQdf.sql = sSql
       LetWhereRequete = True
    fin:
       Set oQdf = Nothing
       Set oDb = Nothing
    End Function
    Utilisation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    'Ajouter ou modifier la clause WHERE
    Debug.Print LetWhereRequete("NomRequete", "MonChamp='azerty'") 
    ' Supprimer la clause WHERE
    Debug.Print LetWhereRequete("NomRequete")
    bonne journée

    Philippe

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 80
    Points : 71
    Points
    71
    Par défaut
    Citation Envoyé par Starec Voir le message
    Bonjour

    Pourquoi ne fais-tu pas l'export en prenant la requête qui alimente ton état et la clause Where ?

    Cela ne t'apportera rien de plus d'exporter l'Etat.

    Et dans ce cas utilises plutôt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DoCmd.TransfertSpreadSheet...
    Starec
    c'est précisément ce que j'essaye de faire mais la requête n'existe nulle part ailleurs que dans l'état (ce n'est ni une table ni une vue SQL-server) c'est pour ça que j'utilise cette commande OutputTo.

    Citation Envoyé par philben Voir le message
    bonjour,

    une solution via DAO pour modifier par le code la clause WHERE d'une requete de sélection stockée :...
    comme je disais, je suis en ADO sur sql-server alors ça ne s'applique pas...
    J'ai finalement trouvé cette solution: afficher, exporter l'objet actif (donc en conservant le filtre appliqué à l'ouverture) puis fermeture

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        ' TEST export direct
        DoCmd.OpenReport Report, acViewPreview, , WhereCondition
        DoCmd.OutputTo acOutputReport, , acFormatXLS, XlsFilename, True
        DoCmd.Close acReport, Report, acSaveNo

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème de requête avec une condition IN
    Par sorcer1 dans le forum Langage SQL
    Réponses: 5
    Dernier message: 20/10/2005, 11h56
  2. [RCP] pb d'export du produit avec une librairie
    Par nuandafr dans le forum Eclipse Platform
    Réponses: 1
    Dernier message: 19/08/2005, 12h08
  3. envoyer submit avec une condition !
    Par delphinote dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 01/07/2005, 15h52
  4. [super requete] Dumper un model avec une clause where
    Par elievar dans le forum Langage SQL
    Réponses: 3
    Dernier message: 16/03/2005, 17h05
  5. Fonction MAX dans une condition WHERE
    Par borgfabr dans le forum Langage SQL
    Réponses: 4
    Dernier message: 12/10/2004, 16h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo